1package com.xtremelabs.robolectric.shadows;
2
3import android.R;
4import android.app.Activity;
5import android.view.View;
6import android.widget.TabHost;
7import android.widget.TabHost.TabSpec;
8import android.widget.TabWidget;
9import com.xtremelabs.robolectric.Robolectric;
10import com.xtremelabs.robolectric.internal.Implementation;
11import com.xtremelabs.robolectric.internal.Implements;
12import com.xtremelabs.robolectric.internal.RealObject;
13
14import java.util.ArrayList;
15import java.util.List;
16
17import static com.xtremelabs.robolectric.Robolectric.shadowOf;
18
19@SuppressWarnings({"UnusedDeclaration"})
20@Implements(TabHost.class)
21public class ShadowTabHost extends ShadowFrameLayout {
22    private List<TabHost.TabSpec> tabSpecs = new ArrayList<TabHost.TabSpec>();
23    private TabHost.OnTabChangeListener listener;
24    private int currentTab = -1;
25
26    @RealObject
27    TabHost realObject;
28
29    @Implementation
30    public android.widget.TabHost.TabSpec newTabSpec(java.lang.String tag) {
31        TabSpec realTabSpec = Robolectric.newInstanceOf(TabHost.TabSpec.class);
32        shadowOf(realTabSpec).setTag(tag);
33        return realTabSpec;
34    }
35
36    @Implementation
37    public void addTab(android.widget.TabHost.TabSpec tabSpec) {
38        tabSpecs.add(tabSpec);
39        View indicatorAsView = shadowOf(tabSpec).getIndicatorAsView();
40        if (indicatorAsView != null) {
41            realObject.addView(indicatorAsView);
42        }
43    }
44
45    @Implementation
46    public void setCurrentTab(int index) {
47        currentTab = index;
48        if (listener != null) {
49            listener.onTabChanged(getCurrentTabTag());
50        }
51    }
52
53    @Implementation
54    public void setCurrentTabByTag(String tag) {
55        for (int x = 0; x < tabSpecs.size(); x++) {
56            TabSpec tabSpec = tabSpecs.get(x);
57            if (tabSpec.getTag().equals(tag)) {
58                currentTab = x;
59            }
60        }
61        if (listener != null) {
62            listener.onTabChanged(getCurrentTabTag());
63        }
64    }
65
66    @Implementation
67    public int getCurrentTab() {
68        if (currentTab == -1 && tabSpecs.size() > 0) currentTab = 0;
69        return currentTab;
70    }
71
72    public TabSpec getCurrentTabSpec() {
73        return tabSpecs.get(getCurrentTab());
74    }
75
76    @Implementation
77    public String getCurrentTabTag() {
78        int i = getCurrentTab();
79        if (i >= 0 && i < tabSpecs.size()) {
80            return tabSpecs.get(i).getTag();
81        }
82        return null;
83    }
84
85    @Implementation
86    public void setOnTabChangedListener(android.widget.TabHost.OnTabChangeListener listener) {
87        this.listener = listener;
88    }
89
90    @Implementation
91    public View getCurrentView() {
92        ShadowTabSpec ts = Robolectric.shadowOf(getCurrentTabSpec());
93        View v = ts.getContentView();
94        if (v == null) {
95            int viewId = ts.getContentViewId();
96            if (getContext() instanceof Activity) {
97                v = ((Activity) getContext()).findViewById(viewId);
98            } else {
99                return null;
100            }
101        }
102        return v;
103    }
104
105    @Implementation
106    public TabWidget getTabWidget() {
107        if (context instanceof Activity) {
108            return (TabWidget) ((Activity)context).findViewById(R.id.tabs);
109        } else {
110            return null;
111        }
112    }
113
114    public TabHost.TabSpec getSpecByTag(String tag) {
115        for (TabHost.TabSpec tabSpec : tabSpecs) {
116            if (tag.equals(tabSpec.getTag())) {
117                return tabSpec;
118            }
119        }
120        return null;
121    }
122}
123