PreferenceActivity.java revision 3e449ce00ed2d3b271e50bc7a52798f630973bf1
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.preference;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport com.android.internal.util.XmlUtils;
20b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
21b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport org.xmlpull.v1.XmlPullParser;
22b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport org.xmlpull.v1.XmlPullParserException;
23b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
24b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.app.Fragment;
25aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadlerimport android.app.FragmentTransaction;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ListActivity;
27b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.content.Context;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
29b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.content.res.Configuration;
30b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.content.res.TypedArray;
31b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.content.res.XmlResourceParser;
32b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.graphics.drawable.Drawable;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
3619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ngimport android.text.TextUtils;
37b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.util.AttributeSet;
38b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.util.Xml;
39b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.view.LayoutInflater;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
4119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ngimport android.view.View.OnClickListener;
42aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadlerimport android.view.ViewGroup;
43b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.widget.ArrayAdapter;
4419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ngimport android.widget.Button;
455c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackbornimport android.widget.FrameLayout;
46b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.widget.ImageView;
47b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.widget.ListView;
48b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.widget.TextView;
49b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
50b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport java.io.IOException;
51b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport java.util.ArrayList;
52b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport java.util.List;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
55b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * This is the base class for an activity to show a hierarchy of preferences
56b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * to the user.  Prior to {@link android.os.Build.VERSION_CODES#HONEYCOMB}
57b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * this class only allowed the display of a single set of preference; this
58b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * functionality should now be found in the new {@link PreferenceFragment}
59b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * class.  If you are using PreferenceActivity in its old mode, the documentation
60b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * there applies to the deprecated APIs here.
61b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn *
62b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>This activity shows one or more headers of preferences, each of with
63b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * is associated with a {@link PreferenceFragment} to display the preferences
64b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * of that header.  The actual layout and display of these associations can
65b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * however vary; currently there are two major approaches it may take:
66b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn *
67b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <ul>
68b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <li>On a small screen it may display only the headers as a single list
69b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * when first launched.  Selecting one of the header items will re-launch
70b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * the activity with it only showing the PreferenceFragment of that header.
71b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <li>On a large screen in may display both the headers and current
72b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceFragment together as panes.  Selecting a header item switches
73b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * to showing the correct PreferenceFragment for that item.
74b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * </ul>
75b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn *
76b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>Subclasses of PreferenceActivity should implement
77b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * {@link #onBuildHeaders} to populate the header list with the desired
78b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * items.  Doing this implicitly switches the class into its new "headers
79b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * + fragments" mode rather than the old style of just showing a single
80b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * preferences list.
81b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn *
82b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <a name="SampleCode"></a>
83b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <h3>Sample Code</h3>
84b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn *
85b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>The following sample code shows a simple preference activity that
86b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * has two different sets of preferences.  The implementation, consisting
87b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * of the activity itself as well as its two preference fragments is:</p>
88b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn *
89b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/preference/PreferenceWithHeaders.java
90b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn *      activity}
9119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng *
92b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>The preference_headers resource describes the headers to be displayed
93b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * and the fragments associated with them.  It is:
94b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn *
95b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * {@sample development/samples/ApiDemos/res/xml/preference_headers.xml headers}
96b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn *
97b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * <p>The first header is shown by Prefs1Fragment, which populates itself
98b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * from the following XML resource:</p>
99b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn *
100b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * {@sample development/samples/ApiDemos/res/xml/fragmented_preferences.xml preferences}
101b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn *
102b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * <p>Note that this XML resource contains a preference screen holding another
103b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * fragment, the Prefs1FragmentInner implemented here.  This allows the user
104b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * to traverse down a hierarchy of preferences; pressing back will pop each
105b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * fragment off the stack to return to the previous preferences.
106b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn *
107b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * <p>See {@link PreferenceFragment} for information on implementing the
108b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * fragments themselves.
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class PreferenceActivity extends ListActivity implements
111b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn        PreferenceManager.OnPreferenceTreeClickListener,
112b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn        PreferenceFragment.OnPreferenceStartFragmentCallback {
113b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    private static final String TAG = "PreferenceActivity";
11419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String PREFERENCES_TAG = "android:preferences";
11619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
117b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
118b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * When starting this activity, the invoking Intent can contain this extra
119b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * string to specify which fragment should be initially displayed.
120b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
121b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public static final String EXTRA_SHOW_FRAGMENT = ":android:show_fragment";
122b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
123b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
124b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * When starting this activity and using {@link #EXTRA_SHOW_FRAGMENT},
125b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * this extra can also be specify to supply a Bundle of arguments to pass
126b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * to that fragment when it is instantiated during the initial creation
127b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * of PreferenceActivity.
128b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
129b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public static final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":android:show_fragment_args";
130b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
131b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
132b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * When starting this activity, the invoking Intent can contain this extra
133b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * boolean that the header list should not be displayed.  This is most often
134b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * used in conjunction with {@link #EXTRA_SHOW_FRAGMENT} to launch
135b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * the activity to display a specific fragment that the user has navigated
136b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * to.
137b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
138b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public static final String EXTRA_NO_HEADERS = ":android:no_headers";
139b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
140b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn    private static final String BACK_STACK_PREFS = ":android:prefs";
141b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn
14219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    // extras that allow any preference activity to be launched as part of a wizard
14319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
14419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    // show Back and Next buttons? takes boolean parameter
14519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    // Back will then return RESULT_CANCELED and Next RESULT_OK
14619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    private static final String EXTRA_PREFS_SHOW_BUTTON_BAR = "extra_prefs_show_button_bar";
14719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
14809dbf1844016682ed461d080e32a43d0086e767dFreeman Ng    // add a Skip button?
14909dbf1844016682ed461d080e32a43d0086e767dFreeman Ng    private static final String EXTRA_PREFS_SHOW_SKIP = "extra_prefs_show_skip";
15009dbf1844016682ed461d080e32a43d0086e767dFreeman Ng
15119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    // specify custom text for the Back or Next buttons, or cause a button to not appear
15219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    // at all by setting it to null
15319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    private static final String EXTRA_PREFS_SET_NEXT_TEXT = "extra_prefs_set_next_text";
15419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    private static final String EXTRA_PREFS_SET_BACK_TEXT = "extra_prefs_set_back_text";
15519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
156b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    // --- State for new mode when showing a list of headers + prefs fragment
157b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
158b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    private final ArrayList<Header> mHeaders = new ArrayList<Header>();
159b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
160b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    private HeaderAdapter mAdapter;
161b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
1625c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn    private FrameLayout mListFooter;
1635c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn
164b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    private View mPrefsContainer;
165b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
166b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    private boolean mSinglePane;
167b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
168b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    // --- State for old mode when showing a single preference list
16919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PreferenceManager mPreferenceManager;
17119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
172e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell    private Bundle mSavedInstanceState;
173e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell
174b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    // --- Common state
175b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
176b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    private Button mNextButton;
177b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The starting request code given out to preference framework.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int FIRST_REQUEST_CODE = 100;
18219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
1833e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn    private static final int MSG_BIND_PREFERENCES = 1;
1843e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn    private static final int MSG_BUILD_HEADERS = 2;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Handler mHandler = new Handler() {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void handleMessage(Message msg) {
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (msg.what) {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case MSG_BIND_PREFERENCES:
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bindPreferences();
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
192b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                case MSG_BUILD_HEADERS:
193b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    onBuildHeaders(mHeaders);
194b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    mAdapter.notifyDataSetChanged();
1955c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                    Header header = onGetNewHeader();
1965c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                    if (header != null && header.fragment != null) {
1975c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                        switchToHeader(header.fragment, header.fragmentArguments);
1985c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                    }
199b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    break;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
204468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler    private static class HeaderAdapter extends ArrayAdapter<Header> {
205468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler        private static class HeaderViewHolder {
206468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler            ImageView icon;
207468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler            TextView title;
208468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler            TextView summary;
209468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler        }
210b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
211b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        private LayoutInflater mInflater;
212b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
213b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        public HeaderAdapter(Context context, List<Header> objects) {
214b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            super(context, 0, objects);
215b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
216b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        }
217b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
218b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        @Override
219b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        public View getView(int position, View convertView, ViewGroup parent) {
220b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            HeaderViewHolder holder;
221b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            View view;
222b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
223b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            if (convertView == null) {
224b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                view = mInflater.inflate(com.android.internal.R.layout.preference_list_item,
225b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                        parent, false);
226b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                holder = new HeaderViewHolder();
227468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler                holder.icon = (ImageView) view.findViewById(com.android.internal.R.id.icon);
228468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler                holder.title = (TextView) view.findViewById(com.android.internal.R.id.title);
229468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler                holder.summary = (TextView) view.findViewById(com.android.internal.R.id.summary);
230b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                view.setTag(holder);
231b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            } else {
232b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                view = convertView;
233468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler                holder = (HeaderViewHolder) view.getTag();
234b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            }
235b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
236468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler            // All view fields must be updated every time, because the view may be recycled
237b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            Header header = getItem(position);
238468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler            if (header.icon == null) {
239468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler                holder.icon.setImageDrawable(null);
240468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler                holder.icon.setImageResource(header.iconRes);
241468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler            } else {
242468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler                holder.icon.setImageResource(0);
243468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler                holder.icon.setImageDrawable(header.icon);
244468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler            }
245468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler            holder.title.setText(header.title);
246468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler            if (TextUtils.isEmpty(header.summary)) {
247468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler                holder.summary.setVisibility(View.GONE);
248468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler            } else {
249468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler                holder.summary.setVisibility(View.VISIBLE);
250468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler                holder.summary.setText(header.summary);
251468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler            }
252b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
253b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            return view;
254b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        }
255b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    }
256b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
257b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    /**
258b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * Description of a single Header item that the user can select.
259b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     */
260b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    public static class Header {
261b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        /**
262b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn         * Title of the header that is shown to the user.
263b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn         * @attr ref android.R.styleable#PreferenceHeader_title
264b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn         */
265468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler        public CharSequence title;
266b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
267b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        /**
268b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn         * Optional summary describing what this header controls.
269b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn         * @attr ref android.R.styleable#PreferenceHeader_summary
270b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn         */
271468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler        public CharSequence summary;
272b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
273b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        /**
274b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn         * Optional icon resource to show for this header.
275b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn         * @attr ref android.R.styleable#PreferenceHeader_icon
276b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn         */
277468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler        public int iconRes;
278b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
279b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        /**
280b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn         * Optional icon drawable to show for this header.  (If this is non-null,
281b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn         * the iconRes will be ignored.)
282b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn         */
283468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler        public Drawable icon;
284b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
285b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        /**
286b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn         * Full class name of the fragment to display when this header is
287b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn         * selected.
288b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn         * @attr ref android.R.styleable#PreferenceHeader_fragment
289b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn         */
290468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler        public String fragment;
291b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
292b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        /**
293b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn         * Optional arguments to supply to the fragment when it is
294b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn         * instantiated.
295b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn         */
296468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler        public Bundle fragmentArguments;
2975c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn
2985c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn        /**
2995c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn         * Intent to launch when the preference is selected.
3005c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn         */
3015c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn        public Intent intent;
302b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    }
303b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onCreate(savedInstanceState);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setContentView(com.android.internal.R.layout.preference_list_content);
30919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
3105c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn        mListFooter = (FrameLayout)findViewById(com.android.internal.R.id.list_footer);
311b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        mPrefsContainer = findViewById(com.android.internal.R.id.prefs);
312b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        boolean hidingHeaders = onIsHidingHeaders();
313b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        mSinglePane = hidingHeaders || !onIsMultiPane();
314b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        String initialFragment = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
315b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        Bundle initialArguments = getIntent().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
316b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
317b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        if (initialFragment != null && mSinglePane) {
318b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            // If we are just showing a fragment, we want to run in
319b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            // new fragment mode, but don't need to compute and show
320b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            // the headers.
321b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            getListView().setVisibility(View.GONE);
322b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            mPrefsContainer.setVisibility(View.VISIBLE);
323b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            switchToHeader(initialFragment, initialArguments);
324b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
325b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        } else {
326b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            // We need to try to build the headers.
327b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            onBuildHeaders(mHeaders);
328b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
329b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            // If there are headers, then at this point we need to show
330b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            // them and, depending on the screen, we may also show in-line
331b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            // the currently selected preference fragment.
332b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            if (mHeaders.size() > 0) {
333b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                mAdapter = new HeaderAdapter(this, mHeaders);
334b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                setListAdapter(mAdapter);
335b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                if (!mSinglePane) {
336b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    mPrefsContainer.setVisibility(View.VISIBLE);
337def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                    if (initialFragment == null) {
338b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                        Header h = onGetInitialHeader();
339b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                        initialFragment = h.fragment;
340b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                        initialArguments = h.fragmentArguments;
341b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    }
342b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn                    switchToHeader(initialFragment, initialArguments);
343b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                }
344b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
345b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            // If there are no headers, we are in the old "just show a screen
346b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            // of preferences" mode.
347b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            } else {
348b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                mPreferenceManager = new PreferenceManager(this, FIRST_REQUEST_CODE);
349b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                mPreferenceManager.setOnPreferenceTreeClickListener(this);
350b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            }
351b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        }
352b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
353b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        getListView().setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
354b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
35519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng        // see if we should show Back/Next buttons
35619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng        Intent intent = getIntent();
35719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng        if (intent.getBooleanExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, false)) {
35819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
35919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng            findViewById(com.android.internal.R.id.button_bar).setVisibility(View.VISIBLE);
36019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
36119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng            Button backButton = (Button)findViewById(com.android.internal.R.id.back_button);
36219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng            backButton.setOnClickListener(new OnClickListener() {
36319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                public void onClick(View v) {
36419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                    setResult(RESULT_CANCELED);
36519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                    finish();
36619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                }
36719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng            });
36809dbf1844016682ed461d080e32a43d0086e767dFreeman Ng            Button skipButton = (Button)findViewById(com.android.internal.R.id.skip_button);
36909dbf1844016682ed461d080e32a43d0086e767dFreeman Ng            skipButton.setOnClickListener(new OnClickListener() {
37009dbf1844016682ed461d080e32a43d0086e767dFreeman Ng                public void onClick(View v) {
37109dbf1844016682ed461d080e32a43d0086e767dFreeman Ng                    setResult(RESULT_OK);
37209dbf1844016682ed461d080e32a43d0086e767dFreeman Ng                    finish();
37309dbf1844016682ed461d080e32a43d0086e767dFreeman Ng                }
37409dbf1844016682ed461d080e32a43d0086e767dFreeman Ng            });
37519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng            mNextButton = (Button)findViewById(com.android.internal.R.id.next_button);
37619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng            mNextButton.setOnClickListener(new OnClickListener() {
37719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                public void onClick(View v) {
37819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                    setResult(RESULT_OK);
37919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                    finish();
38019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                }
38119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng            });
38219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
38319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng            // set our various button parameters
38419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng            if (intent.hasExtra(EXTRA_PREFS_SET_NEXT_TEXT)) {
38519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_NEXT_TEXT);
38619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                if (TextUtils.isEmpty(buttonText)) {
38719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                    mNextButton.setVisibility(View.GONE);
38819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                }
38919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                else {
39019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                    mNextButton.setText(buttonText);
39119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                }
39219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng            }
39319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng            if (intent.hasExtra(EXTRA_PREFS_SET_BACK_TEXT)) {
39419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_BACK_TEXT);
39519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                if (TextUtils.isEmpty(buttonText)) {
39619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                    backButton.setVisibility(View.GONE);
39719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                }
39819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                else {
39919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                    backButton.setText(buttonText);
40019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng                }
40119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng            }
40209dbf1844016682ed461d080e32a43d0086e767dFreeman Ng            if (intent.getBooleanExtra(EXTRA_PREFS_SHOW_SKIP, false)) {
40309dbf1844016682ed461d080e32a43d0086e767dFreeman Ng                skipButton.setVisibility(View.VISIBLE);
40409dbf1844016682ed461d080e32a43d0086e767dFreeman Ng            }
40519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng        }
406b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    }
407b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
408b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    /**
409291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * Returns true if this activity is currently showing the header list.
410291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     */
411291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn    public boolean hasHeaders() {
412291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn        return getListView().getVisibility() == View.VISIBLE
413291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn                && mPreferenceManager == null;
414291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn    }
415291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn
416291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn    /**
417291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * Returns true if this activity is showing multiple panes -- the headers
418291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * and a preference fragment.
419291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     */
420291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn    public boolean isMultiPane() {
421291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn        return hasHeaders() && mPrefsContainer.getVisibility() == View.VISIBLE;
422291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn    }
423291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn
424291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn    /**
425b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * Called to determine if the activity should run in multi-pane mode.
426b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * The default implementation returns true if the screen is large
427b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * enough.
428b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     */
429b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    public boolean onIsMultiPane() {
430b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        Configuration config = getResources().getConfiguration();
431b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        if ((config.screenLayout&Configuration.SCREENLAYOUT_SIZE_MASK)
432b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                == Configuration.SCREENLAYOUT_SIZE_XLARGE
433b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                && config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
434b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            return true;
435b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        }
436b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        return false;
437b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    }
438b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
439b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    /**
440291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * Called to determine whether the header list should be hidden.
441291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * The default implementation returns the
442291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * value given in {@link #EXTRA_NO_HEADERS} or false if it is not supplied.
443291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * This is set to false, for example, when the activity is being re-launched
444291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn     * to show a particular preference activity.
445b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     */
446b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    public boolean onIsHidingHeaders() {
447b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return getIntent().getBooleanExtra(EXTRA_NO_HEADERS, false);
448b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    }
449b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
450b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    /**
451b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Called to determine the initial header to be shown.  The default
452b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * implementation simply returns the fragment of the first header.  Note
453b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * that the returned Header object does not actually need to exist in
454b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * your header list -- whatever its fragment is will simply be used to
455b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * show for the initial UI.
456b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     */
457b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public Header onGetInitialHeader() {
458b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        return mHeaders.get(0);
459b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    }
460b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
461b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    /**
4625c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn     * Called after the header list has been updated ({@link #onBuildHeaders}
4635c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn     * has been called and returned due to {@link #invalidateHeaders()}) to
4645c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn     * specify the header that should now be selected.  The default implementation
4655c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn     * returns null to keep whatever header is currently selected.
4665c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn     */
4675c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn    public Header onGetNewHeader() {
4685c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn        return null;
4695c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn    }
4705c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn
4715c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn    /**
472b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * Called when the activity needs its list of headers build.  By
473b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * implementing this and adding at least one item to the list, you
474b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * will cause the activity to run in its modern fragment mode.  Note
475b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * that this function may not always be called; for example, if the
476b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * activity has been asked to display a particular fragment without
477b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * the header list, there is no need to build the headers.
478b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
479b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * <p>Typical implementations will use {@link #loadHeadersFromResource}
480b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * to fill in the list from a resource.
481b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
482b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @param target The list in which to place the headers.
483b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     */
484b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    public void onBuildHeaders(List<Header> target) {
485b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    }
486b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
487b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    /**
488b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * Call when you need to change the headers being displayed.  Will result
489b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * in onBuildHeaders() later being called to retrieve the new list.
490b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     */
491b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public void invalidateHeaders() {
492b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        if (!mHandler.hasMessages(MSG_BUILD_HEADERS)) {
493b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn            mHandler.sendEmptyMessage(MSG_BUILD_HEADERS);
494b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        }
495b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    }
496b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn
497b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    /**
498b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * Parse the given XML file as a header description, adding each
499b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * parsed Header into the target list.
500b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
501b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @param resid The XML resource to load and parse.
502b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @param target The list in which the parsed headers should be placed.
503b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     */
504b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    public void loadHeadersFromResource(int resid, List<Header> target) {
505b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        XmlResourceParser parser = null;
506b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        try {
507b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            parser = getResources().getXml(resid);
508b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            AttributeSet attrs = Xml.asAttributeSet(parser);
509b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
510b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            int type;
511b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
512b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    && type != XmlPullParser.START_TAG) {
513b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            }
514b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
515b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            String nodeName = parser.getName();
516def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            if (!"preference-headers".equals(nodeName)) {
517b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                throw new RuntimeException(
518def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        "XML document must start with <preference-headers> tag; found"
519b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                        + nodeName + " at " + parser.getPositionDescription());
520b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            }
521b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
522def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn            Bundle curBundle = null;
523def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn
5245c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn            final int outerDepth = parser.getDepth();
525b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
526b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                   && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
527b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
528b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    continue;
529b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                }
530b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
531b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                nodeName = parser.getName();
532def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                if ("header".equals(nodeName)) {
533b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    Header header = new Header();
534b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
535b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    TypedArray sa = getResources().obtainAttributes(attrs,
536b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                            com.android.internal.R.styleable.PreferenceHeader);
537b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    header.title = sa.getText(
538b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                            com.android.internal.R.styleable.PreferenceHeader_title);
539b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    header.summary = sa.getText(
540b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                            com.android.internal.R.styleable.PreferenceHeader_summary);
541b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    header.iconRes = sa.getResourceId(
542b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                            com.android.internal.R.styleable.PreferenceHeader_icon, 0);
543b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    header.fragment = sa.getString(
544b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                            com.android.internal.R.styleable.PreferenceHeader_fragment);
545b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    sa.recycle();
546b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
547def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                    if (curBundle == null) {
548def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        curBundle = new Bundle();
549def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                    }
5505c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn
5515c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                    final int innerDepth = parser.getDepth();
5525c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                    while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
5535c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                           && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) {
5545c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                        if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
5555c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                            continue;
5565c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                        }
5575c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn
5585c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                        String innerNodeName = parser.getName();
5595c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                        if (innerNodeName.equals("extra")) {
5605c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                            getResources().parseBundleExtra("extra", attrs, curBundle);
5615c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                            XmlUtils.skipCurrentTag(parser);
5625c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn
5635c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                        } else if (innerNodeName.equals("intent")) {
5645c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                            header.intent = Intent.parseIntent(getResources(), parser, attrs);
5655c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn
5665c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                        } else {
5675c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                            XmlUtils.skipCurrentTag(parser);
5685c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                        }
5695c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                    }
5705c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn
571def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                    if (curBundle.size() > 0) {
572def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        header.fragmentArguments = curBundle;
573def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                        curBundle = null;
574def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                    }
575b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
576def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                    target.add(header);
577b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                } else {
578b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    XmlUtils.skipCurrentTag(parser);
579b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                }
580b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            }
581b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
582b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        } catch (XmlPullParserException e) {
583b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            throw new RuntimeException("Error parsing headers", e);
584b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        } catch (IOException e) {
585b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            throw new RuntimeException("Error parsing headers", e);
586b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        } finally {
587b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            if (parser != null) parser.close();
588b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        }
58919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5925c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn    /**
5935c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn     * Set a footer that should be shown at the bottom of the header list.
5945c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn     */
5955c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn    public void setListFooter(View view) {
5965c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn        mListFooter.removeAllViews();
5975c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn        mListFooter.addView(view, new FrameLayout.LayoutParams(
5985c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                FrameLayout.LayoutParams.MATCH_PARENT,
5995c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                FrameLayout.LayoutParams.WRAP_CONTENT));
6005c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn    }
6015c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onStop() {
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onStop();
60519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
606b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        if (mPreferenceManager != null) {
607b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            mPreferenceManager.dispatchActivityStop();
608b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        }
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onDestroy() {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onDestroy();
614b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
615b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        if (mPreferenceManager != null) {
616b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            mPreferenceManager.dispatchActivityDestroy();
617b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        }
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onSaveInstanceState(Bundle outState) {
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onSaveInstanceState(outState);
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
624b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        if (mPreferenceManager != null) {
625b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            final PreferenceScreen preferenceScreen = getPreferenceScreen();
626b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            if (preferenceScreen != null) {
627b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                Bundle container = new Bundle();
628b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                preferenceScreen.saveHierarchyState(container);
629b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                outState.putBundle(PREFERENCES_TAG, container);
630b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            }
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestoreInstanceState(Bundle state) {
636b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        if (mPreferenceManager != null) {
637b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            Bundle container = state.getBundle(PREFERENCES_TAG);
638b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            if (container != null) {
639b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                final PreferenceScreen preferenceScreen = getPreferenceScreen();
640b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                if (preferenceScreen != null) {
641b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    preferenceScreen.restoreHierarchyState(container);
642b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    mSavedInstanceState = state;
643b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    return;
644b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
647e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell
648e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell        // Only call this if we didn't save the instance state for later.
649e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell        // If we did save it, it will be restored when we bind the adapter.
650e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell        super.onRestoreInstanceState(state);
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onActivityResult(requestCode, resultCode, data);
65619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
657b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        if (mPreferenceManager != null) {
658b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            mPreferenceManager.dispatchActivityResult(requestCode, resultCode, data);
659b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        }
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onContentChanged() {
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onContentChanged();
665b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
666b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        if (mPreferenceManager != null) {
667b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            postBindPreferences();
668b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        }
669b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    }
670b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
671b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    @Override
672b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    protected void onListItemClick(ListView l, View v, int position, long id) {
673b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        super.onListItemClick(l, v, position, id);
674b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
675b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        if (mAdapter != null) {
676b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            onHeaderClick(mHeaders.get(position), position);
677b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        }
678b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    }
679b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
680b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    /**
681b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * Called when the user selects an item in the header list.  The default
68272dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru     * implementation will call either {@link #startWithFragment(String, Bundle)}
68372dc780f57b4396b808032d592c41d35644a3277Jean-Baptiste Queru     * or {@link #switchToHeader(String, Bundle)} as appropriate.
684b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
685b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @param header The header that was selected.
686b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @param position The header's position in the list.
687b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     */
688b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    public void onHeaderClick(Header header, int position) {
6895c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn        if (header.fragment != null) {
6905c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn            if (mSinglePane) {
6915c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                startWithFragment(header.fragment, header.fragmentArguments);
6925c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn            } else {
6935c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn                switchToHeader(header.fragment, header.fragmentArguments);
6945c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn            }
6955c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn        } else if (header.intent != null) {
6965c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn            startActivity(header.intent);
697b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        }
698b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    }
699b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
700b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    /**
701b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * Start a new instance of this activity, showing only the given
702b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * preference fragment.  When launched in this mode, the header list
703b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * will be hidden and the given preference fragment will be instantiated
704b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * and fill the entire activity.
705b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
706b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @param fragmentName The name of the fragment to display.
707b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @param args Optional arguments to supply to the fragment.
708b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     */
709b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public void startWithFragment(String fragmentName, Bundle args) {
710b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        Intent intent = new Intent(Intent.ACTION_MAIN);
711b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        intent.setClass(this, getClass());
712b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        intent.putExtra(EXTRA_SHOW_FRAGMENT, fragmentName);
713b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
714b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        intent.putExtra(EXTRA_NO_HEADERS, true);
715b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        startActivity(intent);
716b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    }
717b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
718b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    /**
719b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * When in two-pane mode, switch the fragment pane to show the given
720b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * preference fragment.
721b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
722b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @param fragmentName The name of the fragment to display.
723b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn     * @param args Optional arguments to supply to the fragment.
724b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     */
725b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn    public void switchToHeader(String fragmentName, Bundle args) {
726def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        getFragmentManager().popBackStack(BACK_STACK_PREFS, POP_BACK_STACK_INCLUSIVE);
727b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn
728b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn        Fragment f = Fragment.instantiate(this, fragmentName, args);
729def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        getFragmentManager().openTransaction().replace(
730def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn                com.android.internal.R.id.prefs, f).commit();
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
733aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler    /**
734aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler     * Start a new fragment.
735aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler     *
736aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler     * @param fragment The fragment to start
737aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler     * @param push If true, the current fragment will be pushed onto the back stack.  If false,
738aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler     * the current fragment will be replaced.
739aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler     */
740aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler    public void startPreferenceFragment(Fragment fragment, boolean push) {
741aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler        FragmentTransaction transaction = getFragmentManager().openTransaction();
742aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler        transaction.replace(com.android.internal.R.id.prefs, fragment);
743aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler        if (push) {
744aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler            transaction.addToBackStack(BACK_STACK_PREFS);
745aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler        }
746aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler        transaction.commit();
747aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler    }
748aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler
749b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn    @Override
750b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn    public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
751def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn        Fragment f = Fragment.instantiate(this, pref.getFragment(), pref.getExtras());
752aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler        startPreferenceFragment(f, true);
753b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn        return true;
754b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn    }
755b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Posts a message to bind the preferences to the list view.
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Binding late is preferred as any custom preference types created in
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreate(Bundle)} are able to have their views recycled.
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void postBindPreferences() {
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mHandler.hasMessages(MSG_BIND_PREFERENCES)) return;
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHandler.obtainMessage(MSG_BIND_PREFERENCES).sendToTarget();
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
76619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void bindPreferences() {
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final PreferenceScreen preferenceScreen = getPreferenceScreen();
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (preferenceScreen != null) {
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            preferenceScreen.bind(getListView());
771e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell            if (mSavedInstanceState != null) {
772e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell                super.onRestoreInstanceState(mSavedInstanceState);
773e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell                mSavedInstanceState = null;
774e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell            }
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
77719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the {@link PreferenceManager} used by this activity.
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The {@link PreferenceManager}.
781b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
782b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @deprecated This function is not relevant for a modern fragment-based
783b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * PreferenceActivity.
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
785b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    @Deprecated
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PreferenceManager getPreferenceManager() {
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager;
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
78919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void requirePreferenceManager() {
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPreferenceManager == null) {
792b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            if (mAdapter == null) {
793b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                throw new RuntimeException("This should be called after super.onCreate.");
794b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            }
795b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            throw new RuntimeException(
796b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn                    "Modern two-pane PreferenceActivity requires use of a PreferenceFragment");
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the root of the preference hierarchy that this activity is showing.
80219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng     *
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param preferenceScreen The root {@link PreferenceScreen} of the preference hierarchy.
804b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
805b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @deprecated This function is not relevant for a modern fragment-based
806b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * PreferenceActivity.
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
808b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    @Deprecated
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
810b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        requirePreferenceManager();
811b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPreferenceManager.setPreferences(preferenceScreen) && preferenceScreen != null) {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            postBindPreferences();
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CharSequence title = getPreferenceScreen().getTitle();
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Set the title of the activity
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (title != null) {
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setTitle(title);
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
82119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the root of the preference hierarchy that this activity is showing.
82419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng     *
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The {@link PreferenceScreen} that is the root of the preference
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         hierarchy.
827b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
828b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @deprecated This function is not relevant for a modern fragment-based
829b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * PreferenceActivity.
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
831b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    @Deprecated
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PreferenceScreen getPreferenceScreen() {
833b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        if (mPreferenceManager != null) {
834b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn            return mPreferenceManager.getPreferenceScreen();
835b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        }
836b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn        return null;
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
83819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adds preferences from activities that match the given {@link Intent}.
84119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng     *
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param intent The {@link Intent} to query activities.
843b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
844b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @deprecated This function is not relevant for a modern fragment-based
845b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * PreferenceActivity.
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
847b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    @Deprecated
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addPreferencesFromIntent(Intent intent) {
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        requirePreferenceManager();
85019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setPreferenceScreen(mPreferenceManager.inflateFromIntent(intent, getPreferenceScreen()));
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
85319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Inflates the given XML resource and adds the preference hierarchy to the current
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * preference hierarchy.
85719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng     *
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param preferencesResId The XML resource ID to inflate.
859b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
860b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @deprecated This function is not relevant for a modern fragment-based
861b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * PreferenceActivity.
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
863b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    @Deprecated
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addPreferencesFromResource(int preferencesResId) {
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        requirePreferenceManager();
86619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setPreferenceScreen(mPreferenceManager.inflateFromResource(this, preferencesResId,
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getPreferenceScreen()));
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
873b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
874b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @deprecated This function is not relevant for a modern fragment-based
875b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * PreferenceActivity.
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
877b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    @Deprecated
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
88119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Finds a {@link Preference} based on its key.
88419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng     *
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param key The key of the preference to retrieve.
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The {@link Preference} with the key, or null.
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see PreferenceGroup#findPreference(CharSequence)
888b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     *
889b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * @deprecated This function is not relevant for a modern fragment-based
890b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn     * PreferenceActivity.
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
892b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn    @Deprecated
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Preference findPreference(CharSequence key) {
89419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPreferenceManager == null) {
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
89819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPreferenceManager.findPreference(key);
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onNewIntent(Intent intent) {
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPreferenceManager != null) {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPreferenceManager.dispatchNewIntent(intent);
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
90819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng
90919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    // give subclasses access to the Next button
91019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    /** @hide */
91119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    protected boolean hasNextButton() {
91219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng        return mNextButton != null;
91319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    }
91419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    /** @hide */
91519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    protected Button getNextButton() {
91619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng        return mNextButton;
91719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng    }
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
919