1203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richardpackage com.xtremelabs.robolectric.shadows; 2203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard 3c1b8caab0dd09b14cb1f7a9ad87adb37fb69b0b0Jan Berkelimport android.R; 489e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vrankenimport android.app.Activity; 5203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richardimport android.view.View; 6203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richardimport android.widget.TabHost; 7071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vrankenimport android.widget.TabHost.TabSpec; 8c1b8caab0dd09b14cb1f7a9ad87adb37fb69b0b0Jan Berkelimport android.widget.TabWidget; 9203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richardimport com.xtremelabs.robolectric.Robolectric; 10203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richardimport com.xtremelabs.robolectric.internal.Implementation; 11203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richardimport com.xtremelabs.robolectric.internal.Implements; 12c4b51987f005f6c9df8df09abb23b83b7a4ca7daTyler Schultzimport com.xtremelabs.robolectric.internal.RealObject; 13b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz 141de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultzimport java.util.ArrayList; 151de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultzimport java.util.List; 16b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz 17b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultzimport static com.xtremelabs.robolectric.Robolectric.shadowOf; 18203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard 19203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard@SuppressWarnings({"UnusedDeclaration"}) 20203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard@Implements(TabHost.class) 21b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultzpublic class ShadowTabHost extends ShadowFrameLayout { 221de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz private List<TabHost.TabSpec> tabSpecs = new ArrayList<TabHost.TabSpec>(); 231de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz private TabHost.OnTabChangeListener listener; 24071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken private int currentTab = -1; 25b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz 26d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz @RealObject 27d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz TabHost realObject; 28c4b51987f005f6c9df8df09abb23b83b7a4ca7daTyler Schultz 29b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz @Implementation 30b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz public android.widget.TabHost.TabSpec newTabSpec(java.lang.String tag) { 31071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken TabSpec realTabSpec = Robolectric.newInstanceOf(TabHost.TabSpec.class); 32b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz shadowOf(realTabSpec).setTag(tag); 33b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz return realTabSpec; 34b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz } 351de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz 361de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz @Implementation 371de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz public void addTab(android.widget.TabHost.TabSpec tabSpec) { 381de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz tabSpecs.add(tabSpec); 39586702db339b8f95505c3a365bf70e6891375bc7Tyler Schultz View indicatorAsView = shadowOf(tabSpec).getIndicatorAsView(); 40586702db339b8f95505c3a365bf70e6891375bc7Tyler Schultz if (indicatorAsView != null) { 41c4b51987f005f6c9df8df09abb23b83b7a4ca7daTyler Schultz realObject.addView(indicatorAsView); 42586702db339b8f95505c3a365bf70e6891375bc7Tyler Schultz } 431de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 441de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz 451de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz @Implementation 461de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz public void setCurrentTab(int index) { 4758a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz currentTab = index; 481de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz if (listener != null) { 49071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken listener.onTabChanged(getCurrentTabTag()); 501de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 511de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 52203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard 53203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard @Implementation 541de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz public void setCurrentTabByTag(String tag) { 5558a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz for (int x = 0; x < tabSpecs.size(); x++) { 5658a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz TabSpec tabSpec = tabSpecs.get(x); 575a6a2d260647a53c321577959b6ea9d01e15e913Jan Berkel if (tabSpec.getTag().equals(tag)) { 58071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken currentTab = x; 591de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 601de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 611de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz if (listener != null) { 62071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken listener.onTabChanged(getCurrentTabTag()); 631de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 64203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard } 6558a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz 66071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken @Implementation 67071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken public int getCurrentTab() { 6858a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz if (currentTab == -1 && tabSpecs.size() > 0) currentTab = 0; 69071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken return currentTab; 70071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken } 7158a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz 72071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken public TabSpec getCurrentTabSpec() { 7358a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz return tabSpecs.get(getCurrentTab()); 74071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken } 75203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard 761de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz @Implementation 77340f1791e74276a7280d61893e050849cbcc323eChris Van Vranken public String getCurrentTabTag() { 7858a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz int i = getCurrentTab(); 79ac6dae52996af804256f5d6b1ab7a89b87ab2879Chris Van Vranken if (i >= 0 && i < tabSpecs.size()) { 80ac6dae52996af804256f5d6b1ab7a89b87ab2879Chris Van Vranken return tabSpecs.get(i).getTag(); 81071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken } 82071401caa7aba78946889c3fceccd73f37e8d259Chris Van Vranken return null; 83340f1791e74276a7280d61893e050849cbcc323eChris Van Vranken } 8458a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz 85340f1791e74276a7280d61893e050849cbcc323eChris Van Vranken @Implementation 861de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz public void setOnTabChangedListener(android.widget.TabHost.OnTabChangeListener listener) { 871de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz this.listener = listener; 881de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 8958a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz 9089e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken @Implementation 9189e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken public View getCurrentView() { 9258a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz ShadowTabSpec ts = Robolectric.shadowOf(getCurrentTabSpec()); 9358a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz View v = ts.getContentView(); 9458a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz if (v == null) { 9558a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz int viewId = ts.getContentViewId(); 9658a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz if (getContext() instanceof Activity) { 9758a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz v = ((Activity) getContext()).findViewById(viewId); 9858a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz } else { 9958a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz return null; 10058a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz } 10158a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz } 10258a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz return v; 10389e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken } 10458a4bd2e73e8806be1138a03d027f9b42158a453Joe Moore & Tyler Schultz 105c1b8caab0dd09b14cb1f7a9ad87adb37fb69b0b0Jan Berkel @Implementation 106c1b8caab0dd09b14cb1f7a9ad87adb37fb69b0b0Jan Berkel public TabWidget getTabWidget() { 107c1b8caab0dd09b14cb1f7a9ad87adb37fb69b0b0Jan Berkel if (context instanceof Activity) { 108c1b8caab0dd09b14cb1f7a9ad87adb37fb69b0b0Jan Berkel return (TabWidget) ((Activity)context).findViewById(R.id.tabs); 109c1b8caab0dd09b14cb1f7a9ad87adb37fb69b0b0Jan Berkel } else { 110c1b8caab0dd09b14cb1f7a9ad87adb37fb69b0b0Jan Berkel return null; 111c1b8caab0dd09b14cb1f7a9ad87adb37fb69b0b0Jan Berkel } 112c1b8caab0dd09b14cb1f7a9ad87adb37fb69b0b0Jan Berkel } 113c1b8caab0dd09b14cb1f7a9ad87adb37fb69b0b0Jan Berkel 114d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz public TabHost.TabSpec getSpecByTag(String tag) { 115d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz for (TabHost.TabSpec tabSpec : tabSpecs) { 116d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz if (tag.equals(tabSpec.getTag())) { 117d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz return tabSpec; 118d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz } 119d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz } 120d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz return null; 121d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz } 122203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard} 123