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