ShadowTabHost.java revision 340f1791e74276a7280d61893e050849cbcc323e
1203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richardpackage com.xtremelabs.robolectric.shadows; 2203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard 389e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vrankenimport android.app.Activity; 4203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richardimport android.view.View; 5203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richardimport android.widget.TabHost; 6203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richardimport com.xtremelabs.robolectric.Robolectric; 7203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richardimport com.xtremelabs.robolectric.internal.Implementation; 8203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richardimport com.xtremelabs.robolectric.internal.Implements; 9c4b51987f005f6c9df8df09abb23b83b7a4ca7daTyler Schultzimport com.xtremelabs.robolectric.internal.RealObject; 10b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz 111de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultzimport java.util.ArrayList; 121de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultzimport java.util.List; 13b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz 14b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultzimport static com.xtremelabs.robolectric.Robolectric.shadowOf; 15203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard 16203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard@SuppressWarnings({"UnusedDeclaration"}) 17203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard@Implements(TabHost.class) 18b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultzpublic class ShadowTabHost extends ShadowFrameLayout { 191de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz private List<TabHost.TabSpec> tabSpecs = new ArrayList<TabHost.TabSpec>(); 201de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz private TabHost.OnTabChangeListener listener; 211de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz private TabHost.TabSpec currentTab; 22b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz 23d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz @RealObject 24d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz TabHost realObject; 25c4b51987f005f6c9df8df09abb23b83b7a4ca7daTyler Schultz 26b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz @Implementation 27b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz public android.widget.TabHost.TabSpec newTabSpec(java.lang.String tag) { 285f52066979dd3a3eb6a0df2cd360611c50fb31ecRyan Richard TabHost.TabSpec realTabSpec = Robolectric.newInstanceOf(TabHost.TabSpec.class); 29b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz shadowOf(realTabSpec).setTag(tag); 30b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz return realTabSpec; 31b8898598e493d4df40038a501ff77f2aa437e9efMike Grafton & Tyler Schultz } 321de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz 331de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz @Implementation 341de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz public void addTab(android.widget.TabHost.TabSpec tabSpec) { 351de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz tabSpecs.add(tabSpec); 36586702db339b8f95505c3a365bf70e6891375bc7Tyler Schultz View indicatorAsView = shadowOf(tabSpec).getIndicatorAsView(); 37586702db339b8f95505c3a365bf70e6891375bc7Tyler Schultz if (indicatorAsView != null) { 38c4b51987f005f6c9df8df09abb23b83b7a4ca7daTyler Schultz realObject.addView(indicatorAsView); 39586702db339b8f95505c3a365bf70e6891375bc7Tyler Schultz } 401de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 411de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz 421de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz @Implementation 431de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz public void setCurrentTab(int index) { 441de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz currentTab = tabSpecs.get(index); 451de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz if (listener != null) { 461de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz listener.onTabChanged(currentTab.getTag()); 471de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 481de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 49203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard 50203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard @Implementation 511de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz public void setCurrentTabByTag(String tag) { 521de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz for (TabHost.TabSpec tabSpec : tabSpecs) { 531de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz if (tag.equals(tabSpec.getTag())) { 541de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz currentTab = tabSpec; 551de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 561de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 571de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz if (listener != null) { 581de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz listener.onTabChanged(currentTab.getTag()); 591de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 60203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard } 61203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard 621de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz @Implementation 63340f1791e74276a7280d61893e050849cbcc323eChris Van Vranken public String getCurrentTabTag() { 64340f1791e74276a7280d61893e050849cbcc323eChris Van Vranken return currentTab.getTag(); 65340f1791e74276a7280d61893e050849cbcc323eChris Van Vranken } 66340f1791e74276a7280d61893e050849cbcc323eChris Van Vranken 67340f1791e74276a7280d61893e050849cbcc323eChris Van Vranken @Implementation 681de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz public void setOnTabChangedListener(android.widget.TabHost.OnTabChangeListener listener) { 691de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz this.listener = listener; 701de7f9e13720debd2b8591decba18f92415d6eb6Tyler Schultz } 7189e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken @Implementation 7289e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken public View getCurrentView() { 7389e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken ShadowTabSpec ts = Robolectric.shadowOf(currentTab); 7489e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken View v = ts.getContentView(); //just get the view if it was built by a TabContentFactory 7589e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken if (v==null) { 7689e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken //otherwise findViewById 7789e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken int viewId = ts.getContentViewId(); 7889e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken if (getContext() instanceof Activity) { 7989e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken /** wasn't quite sure how to find the view here, simply using 8089e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken findViewById() wasn't enough, I had to get it though the 8189e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken Activity context.**/ 8289e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken v = ((Activity) getContext()).findViewById(viewId); 8389e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken } else { 8489e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken // throw new RuntimeException("getContext is not an Activity, unable to findViewById without an Activity context"); 8589e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken return null; 8689e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken } 8789e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken } 8889e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken return v; 8989e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken } 9089e9d844e025ab9de8ec19eaf4cb4c6022012254Chris Van Vranken 91d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz public TabHost.TabSpec getSpecByTag(String tag) { 92d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz for (TabHost.TabSpec tabSpec : tabSpecs) { 93d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz if (tag.equals(tabSpec.getTag())) { 94d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz return tabSpec; 95d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz } 96d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz } 97d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz return null; 98d7f42994405e043b092a0ccd200b107a84d38186Greg Choi & Tyler Schultz } 99203e06c477634129655bee1db352d7e574513f9cJoe Moore, Lowell Kirsh & Ryan Richard} 100