1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.app;
18
19import android.os.Bundle;
20import android.view.View;
21import android.widget.TabHost;
22import android.widget.TabWidget;
23import android.widget.TextView;
24
25/**
26 * <p>For apps developing against {@link android.os.Build.VERSION_CODES#HONEYCOMB}
27 * or later, tabs are typically presented in the UI using the new
28 * {@link ActionBar#newTab() ActionBar.newTab()} and
29 * related APIs for placing tabs within their action bar area.</p>
30 *
31 * <p>A replacement for TabActivity can also be implemented by directly using
32 * TabHost.  You will need to define a layout that correctly uses a TabHost
33 * with a TabWidget as well as an area in which to display your tab content.
34 * A typical example would be:</p>
35 *
36 * {@sample development/samples/Support4Demos/res/layout/fragment_tabs.xml complete}
37 *
38 * <p>The implementation needs to take over responsibility for switching
39 * the shown content when the user switches between tabs.
40 *
41 * {@sample development/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabs.java
42 *      complete}
43 *
44 * <p>Also see the <a href="{@docRoot}resources/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsPager.html">
45 * Fragment Tabs Pager</a> sample for an example of using the support library's ViewPager to
46 * allow the user to swipe the content to switch between tabs.</p>
47 *
48 * @deprecated New applications should use Fragments instead of this class;
49 * to continue to run on older devices, you can use the v4 support library
50 * which provides a version of the Fragment API that is compatible down to
51 * {@link android.os.Build.VERSION_CODES#DONUT}.
52 */
53@Deprecated
54public class TabActivity extends ActivityGroup {
55    private TabHost mTabHost;
56    private String mDefaultTab = null;
57    private int mDefaultTabIndex = -1;
58
59    public TabActivity() {
60    }
61
62    /**
63     * Sets the default tab that is the first tab highlighted.
64     *
65     * @param tag the name of the default tab
66     */
67    public void setDefaultTab(String tag) {
68        mDefaultTab = tag;
69        mDefaultTabIndex = -1;
70    }
71
72    /**
73     * Sets the default tab that is the first tab highlighted.
74     *
75     * @param index the index of the default tab
76     */
77    public void setDefaultTab(int index) {
78        mDefaultTab = null;
79        mDefaultTabIndex = index;
80    }
81
82    @Override
83    protected void onRestoreInstanceState(Bundle state) {
84        super.onRestoreInstanceState(state);
85        ensureTabHost();
86        String cur = state.getString("currentTab");
87        if (cur != null) {
88            mTabHost.setCurrentTabByTag(cur);
89        }
90        if (mTabHost.getCurrentTab() < 0) {
91            if (mDefaultTab != null) {
92                mTabHost.setCurrentTabByTag(mDefaultTab);
93            } else if (mDefaultTabIndex >= 0) {
94                mTabHost.setCurrentTab(mDefaultTabIndex);
95            }
96        }
97    }
98
99    @Override
100    protected void onPostCreate(Bundle icicle) {
101        super.onPostCreate(icicle);
102
103        ensureTabHost();
104
105        if (mTabHost.getCurrentTab() == -1) {
106            mTabHost.setCurrentTab(0);
107        }
108    }
109
110    @Override
111    protected void onSaveInstanceState(Bundle outState) {
112        super.onSaveInstanceState(outState);
113        String currentTabTag = mTabHost.getCurrentTabTag();
114        if (currentTabTag != null) {
115            outState.putString("currentTab", currentTabTag);
116        }
117    }
118
119    /**
120     * Updates the screen state (current list and other views) when the
121     * content changes.
122     *
123     *@see Activity#onContentChanged()
124     */
125    @Override
126    public void onContentChanged() {
127        super.onContentChanged();
128        mTabHost = (TabHost) findViewById(com.android.internal.R.id.tabhost);
129
130        if (mTabHost == null) {
131            throw new RuntimeException(
132                    "Your content must have a TabHost whose id attribute is " +
133                    "'android.R.id.tabhost'");
134        }
135        mTabHost.setup(getLocalActivityManager());
136    }
137
138    private void ensureTabHost() {
139        if (mTabHost == null) {
140            this.setContentView(com.android.internal.R.layout.tab_content);
141        }
142    }
143
144    @Override
145    protected void
146    onChildTitleChanged(Activity childActivity, CharSequence title) {
147        // Dorky implementation until we can have multiple activities running.
148        if (getLocalActivityManager().getCurrentActivity() == childActivity) {
149            View tabView = mTabHost.getCurrentTabView();
150            if (tabView != null && tabView instanceof TextView) {
151                ((TextView) tabView).setText(title);
152            }
153        }
154    }
155
156    /**
157     * Returns the {@link TabHost} the activity is using to host its tabs.
158     *
159     * @return the {@link TabHost} the activity is using to host its tabs.
160     */
161    public TabHost getTabHost() {
162        ensureTabHost();
163        return mTabHost;
164    }
165
166    /**
167     * Returns the {@link TabWidget} the activity is using to draw the actual tabs.
168     *
169     * @return the {@link TabWidget} the activity is using to draw the actual tabs.
170     */
171    public TabWidget getTabWidget() {
172        return mTabHost.getTabWidget();
173    }
174}
175