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 android.app.Fragment; 20c6669ca63299219d815464129dac051ab2404286Dianne Hackbornimport android.app.FragmentBreadCrumbs; 213a57fb9e9c4f205ca6bd4f036b3080f92588d16dDianne Hackbornimport android.app.FragmentManager; 22aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadlerimport android.app.FragmentTransaction; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ListActivity; 24b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.content.Context; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 2650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackbornimport android.content.res.Resources; 27b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.content.res.TypedArray; 28b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.content.res.XmlResourceParser; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 32a21e3da55940e239addd80bf379091a1d85d006fDianne Hackbornimport android.os.Parcel; 33a21e3da55940e239addd80bf379091a1d85d006fDianne Hackbornimport android.os.Parcelable; 3419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ngimport android.text.TextUtils; 35b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.util.AttributeSet; 3650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackbornimport android.util.TypedValue; 37b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.util.Xml; 38b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.view.LayoutInflater; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 40405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasaniimport android.view.View.OnClickListener; 4139725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunneimport android.view.ViewGroup; 42a21e3da55940e239addd80bf379091a1d85d006fDianne Hackbornimport android.widget.AbsListView; 43b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.widget.ArrayAdapter; 4439725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunneimport android.widget.BaseAdapter; 4519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ngimport android.widget.Button; 465c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackbornimport android.widget.FrameLayout; 47b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.widget.ImageView; 48b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.widget.ListView; 49b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.widget.TextView; 50b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 5139725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunneimport com.android.internal.util.XmlUtils; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasaniimport org.xmlpull.v1.XmlPullParser; 54405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasaniimport org.xmlpull.v1.XmlPullParserException; 55405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani 5639725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunneimport java.io.IOException; 5739725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunneimport java.util.ArrayList; 5839725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunneimport java.util.List; 5939725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunne 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 61b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * This is the base class for an activity to show a hierarchy of preferences 62b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * to the user. Prior to {@link android.os.Build.VERSION_CODES#HONEYCOMB} 63b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * this class only allowed the display of a single set of preference; this 64b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * functionality should now be found in the new {@link PreferenceFragment} 65b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * class. If you are using PreferenceActivity in its old mode, the documentation 66b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * there applies to the deprecated APIs here. 67b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 6839725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunne * <p>This activity shows one or more headers of preferences, each of which 69b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * is associated with a {@link PreferenceFragment} to display the preferences 70b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * of that header. The actual layout and display of these associations can 71b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * however vary; currently there are two major approaches it may take: 72b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 73b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <ul> 74b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <li>On a small screen it may display only the headers as a single list 75b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * when first launched. Selecting one of the header items will re-launch 76b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * the activity with it only showing the PreferenceFragment of that header. 77b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <li>On a large screen in may display both the headers and current 78b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceFragment together as panes. Selecting a header item switches 79b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * to showing the correct PreferenceFragment for that item. 80b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * </ul> 81b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 82b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>Subclasses of PreferenceActivity should implement 83b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * {@link #onBuildHeaders} to populate the header list with the desired 84b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * items. Doing this implicitly switches the class into its new "headers 85b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * + fragments" mode rather than the old style of just showing a single 86b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * preferences list. 87cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * 88cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * <div class="special reference"> 89cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * <h3>Developer Guides</h3> 90cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * <p>For information about using {@code PreferenceActivity}, 91cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * read the <a href="{@docRoot}guide/topics/ui/settings.html">Settings</a> 92cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * guide.</p> 93cdd0c59a0108036895796dcb2bea69ff5eef26caScott Main * </div> 94b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 95b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <a name="SampleCode"></a> 96b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <h3>Sample Code</h3> 97b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 98b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>The following sample code shows a simple preference activity that 99b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * has two different sets of preferences. The implementation, consisting 100b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * of the activity itself as well as its two preference fragments is:</p> 101b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 102b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/preference/PreferenceWithHeaders.java 103b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * activity} 10419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng * 105b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>The preference_headers resource describes the headers to be displayed 106b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * and the fragments associated with them. It is: 107b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 108b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * {@sample development/samples/ApiDemos/res/xml/preference_headers.xml headers} 109b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 110b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * <p>The first header is shown by Prefs1Fragment, which populates itself 111b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * from the following XML resource:</p> 112b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * 113b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * {@sample development/samples/ApiDemos/res/xml/fragmented_preferences.xml preferences} 114b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * 115b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * <p>Note that this XML resource contains a preference screen holding another 116b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * fragment, the Prefs1FragmentInner implemented here. This allows the user 117b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * to traverse down a hierarchy of preferences; pressing back will pop each 118b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * fragment off the stack to return to the previous preferences. 119b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * 120b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * <p>See {@link PreferenceFragment} for information on implementing the 121b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * fragments themselves. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class PreferenceActivity extends ListActivity implements 124b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn PreferenceManager.OnPreferenceTreeClickListener, 125b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn PreferenceFragment.OnPreferenceStartFragmentCallback { 12619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 1278fc552e695701ff9bc64d5adca0f06a47f0f9f37Svetoslav Ganov private static final String TAG = "PreferenceActivity"; 1288fc552e695701ff9bc64d5adca0f06a47f0f9f37Svetoslav Ganov 129a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // Constants for state save/restore 130a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn private static final String HEADERS_TAG = ":android:headers"; 131a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn private static final String CUR_HEADER_TAG = ":android:cur_header"; 132a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn private static final String PREFERENCES_TAG = ":android:preferences"; 13319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 134b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 135b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * When starting this activity, the invoking Intent can contain this extra 136b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * string to specify which fragment should be initially displayed. 137364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani * <p/>Starting from Key Lime Pie, when this argument is passed in, the PreferenceActivity 138364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani * will call isValidFragment() to confirm that the fragment class name is valid for this 139364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani * activity. 140b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 141b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public static final String EXTRA_SHOW_FRAGMENT = ":android:show_fragment"; 142b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 143b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 144b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * When starting this activity and using {@link #EXTRA_SHOW_FRAGMENT}, 145e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * this extra can also be specified to supply a Bundle of arguments to pass 146b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * to that fragment when it is instantiated during the initial creation 147b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * of PreferenceActivity. 148b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 149b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public static final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":android:show_fragment_args"; 150b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 151b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 152e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * When starting this activity and using {@link #EXTRA_SHOW_FRAGMENT}, 153e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * this extra can also be specify to supply the title to be shown for 154e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * that fragment. 155e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn */ 156e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn public static final String EXTRA_SHOW_FRAGMENT_TITLE = ":android:show_fragment_title"; 157e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn 158e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn /** 159e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * When starting this activity and using {@link #EXTRA_SHOW_FRAGMENT}, 160e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * this extra can also be specify to supply the short title to be shown for 161e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * that fragment. 162e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn */ 163e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn public static final String EXTRA_SHOW_FRAGMENT_SHORT_TITLE 164e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn = ":android:show_fragment_short_title"; 165e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn 166e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn /** 167b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * When starting this activity, the invoking Intent can contain this extra 168b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * boolean that the header list should not be displayed. This is most often 169b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * used in conjunction with {@link #EXTRA_SHOW_FRAGMENT} to launch 170b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * the activity to display a specific fragment that the user has navigated 171b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * to. 172b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 173b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public static final String EXTRA_NO_HEADERS = ":android:no_headers"; 174b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 175b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn private static final String BACK_STACK_PREFS = ":android:prefs"; 176b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn 17719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // extras that allow any preference activity to be launched as part of a wizard 17819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 17919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // show Back and Next buttons? takes boolean parameter 18019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // Back will then return RESULT_CANCELED and Next RESULT_OK 18119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng private static final String EXTRA_PREFS_SHOW_BUTTON_BAR = "extra_prefs_show_button_bar"; 18219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 18309dbf1844016682ed461d080e32a43d0086e767dFreeman Ng // add a Skip button? 18409dbf1844016682ed461d080e32a43d0086e767dFreeman Ng private static final String EXTRA_PREFS_SHOW_SKIP = "extra_prefs_show_skip"; 18509dbf1844016682ed461d080e32a43d0086e767dFreeman Ng 18619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // specify custom text for the Back or Next buttons, or cause a button to not appear 18719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // at all by setting it to null 18819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng private static final String EXTRA_PREFS_SET_NEXT_TEXT = "extra_prefs_set_next_text"; 18919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng private static final String EXTRA_PREFS_SET_BACK_TEXT = "extra_prefs_set_back_text"; 19019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 191b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // --- State for new mode when showing a list of headers + prefs fragment 192b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 193b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private final ArrayList<Header> mHeaders = new ArrayList<Header>(); 194b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 1955c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn private FrameLayout mListFooter; 1965c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn 1973c9f519f898f8fc809550199ea823c0225c682a8Amith Yamasani private ViewGroup mPrefsContainer; 198b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 199c6669ca63299219d815464129dac051ab2404286Dianne Hackborn private FragmentBreadCrumbs mFragmentBreadCrumbs; 200c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 201b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private boolean mSinglePane; 202b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 203a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn private Header mCurHeader; 204a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 205b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // --- State for old mode when showing a single preference list 20619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PreferenceManager mPreferenceManager; 20819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 209e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell private Bundle mSavedInstanceState; 210e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell 211b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // --- Common state 212b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 213b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private Button mNextButton; 214b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 215b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio private int mPreferenceHeaderItemResId = 0; 216b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio private boolean mPreferenceHeaderRemoveEmptyIcon = false; 217b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The starting request code given out to preference framework. 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FIRST_REQUEST_CODE = 100; 22219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 2233e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn private static final int MSG_BIND_PREFERENCES = 1; 2243e449ce00ed2d3b271e50bc7a52798f630973bf1Dianne Hackborn private static final int MSG_BUILD_HEADERS = 2; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Handler mHandler = new Handler() { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 229a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn case MSG_BIND_PREFERENCES: { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bindPreferences(); 231a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } break; 232a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn case MSG_BUILD_HEADERS: { 233a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn ArrayList<Header> oldHeaders = new ArrayList<Header>(mHeaders); 234a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn mHeaders.clear(); 235b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn onBuildHeaders(mHeaders); 23639725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunne if (mAdapter instanceof BaseAdapter) { 23739725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunne ((BaseAdapter) mAdapter).notifyDataSetChanged(); 23883681eb6003d69f095547d10bdd96822e30432c2Andrew Stadler } 2395c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn Header header = onGetNewHeader(); 2405c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn if (header != null && header.fragment != null) { 241a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn Header mappedHeader = findBestMatchingHeader(header, oldHeaders); 242a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (mappedHeader == null || mCurHeader != mappedHeader) { 243a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn switchToHeader(header); 244a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 245a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } else if (mCurHeader != null) { 246a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn Header mappedHeader = findBestMatchingHeader(mCurHeader, mHeaders); 247a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (mappedHeader != null) { 248a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn setSelectedHeader(mappedHeader); 249a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 2505c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn } 251a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } break; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 256468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler private static class HeaderAdapter extends ArrayAdapter<Header> { 257468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler private static class HeaderViewHolder { 258468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler ImageView icon; 259468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler TextView title; 260468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler TextView summary; 261468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler } 262b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 263b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private LayoutInflater mInflater; 264b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio private int mLayoutResId; 265b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio private boolean mRemoveIconIfEmpty; 266b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 267b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio public HeaderAdapter(Context context, List<Header> objects, int layoutResId, 268b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio boolean removeIconBehavior) { 269b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn super(context, 0, objects); 270b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 271b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio mLayoutResId = layoutResId; 272b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio mRemoveIconIfEmpty = removeIconBehavior; 273b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 274b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 275b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Override 276b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public View getView(int position, View convertView, ViewGroup parent) { 277b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn HeaderViewHolder holder; 278b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn View view; 279b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 280b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (convertView == null) { 281b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio view = mInflater.inflate(mLayoutResId, parent, false); 282b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn holder = new HeaderViewHolder(); 283468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler holder.icon = (ImageView) view.findViewById(com.android.internal.R.id.icon); 284468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler holder.title = (TextView) view.findViewById(com.android.internal.R.id.title); 285468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler holder.summary = (TextView) view.findViewById(com.android.internal.R.id.summary); 286b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn view.setTag(holder); 287b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } else { 288b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn view = convertView; 289468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler holder = (HeaderViewHolder) view.getTag(); 290b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 291b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 292468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler // All view fields must be updated every time, because the view may be recycled 293b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Header header = getItem(position); 294b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio if (mRemoveIconIfEmpty) { 295b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio if (header.iconRes == 0) { 296b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio holder.icon.setVisibility(View.GONE); 297b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio } else { 298b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio holder.icon.setVisibility(View.VISIBLE); 299b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio holder.icon.setImageResource(header.iconRes); 300b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio } 301b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio } else { 302b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio holder.icon.setImageResource(header.iconRes); 303b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio } 30450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn holder.title.setText(header.getTitle(getContext().getResources())); 30550ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn CharSequence summary = header.getSummary(getContext().getResources()); 30650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (!TextUtils.isEmpty(summary)) { 307468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler holder.summary.setVisibility(View.VISIBLE); 30850ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn holder.summary.setText(summary); 30950ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } else { 31050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn holder.summary.setVisibility(View.GONE); 311468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler } 312b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 313b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return view; 314b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 315b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 316b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 317b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 318a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * Default value for {@link Header#id Header.id} indicating that no 319a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * identifier value is set. All other values (including those below -1) 320a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * are valid. 321a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn */ 322a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn public static final long HEADER_ID_UNDEFINED = -1; 323364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani 324a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn /** 325b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Description of a single Header item that the user can select. 326b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 327a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn public static final class Header implements Parcelable { 328a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn /** 329a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * Identifier for this header, to correlate with a new list when 330a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * it is updated. The default value is 331a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * {@link PreferenceActivity#HEADER_ID_UNDEFINED}, meaning no id. 332a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * @attr ref android.R.styleable#PreferenceHeader_id 333a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn */ 334a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn public long id = HEADER_ID_UNDEFINED; 335a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 336b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 33750ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * Resource ID of title of the header that is shown to the user. 33850ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * @attr ref android.R.styleable#PreferenceHeader_title 33950ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn */ 34050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn public int titleRes; 34150ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn 34250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn /** 343b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Title of the header that is shown to the user. 344b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * @attr ref android.R.styleable#PreferenceHeader_title 345b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 346468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler public CharSequence title; 347b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 348b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 34950ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * Resource ID of optional summary describing what this header controls. 35050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * @attr ref android.R.styleable#PreferenceHeader_summary 35150ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn */ 35250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn public int summaryRes; 35350ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn 35450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn /** 355b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Optional summary describing what this header controls. 356b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * @attr ref android.R.styleable#PreferenceHeader_summary 357b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 358468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler public CharSequence summary; 359b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 360b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 36150ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * Resource ID of optional text to show as the title in the bread crumb. 36250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * @attr ref android.R.styleable#PreferenceHeader_breadCrumbTitle 36350ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn */ 36450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn public int breadCrumbTitleRes; 36550ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn 36650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn /** 367c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Optional text to show as the title in the bread crumb. 368c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * @attr ref android.R.styleable#PreferenceHeader_breadCrumbTitle 369c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 370c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public CharSequence breadCrumbTitle; 371c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 372c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 37350ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * Resource ID of optional text to show as the short title in the bread crumb. 37450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * @attr ref android.R.styleable#PreferenceHeader_breadCrumbShortTitle 37550ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn */ 37650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn public int breadCrumbShortTitleRes; 37750ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn 37850ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn /** 379c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Optional text to show as the short title in the bread crumb. 380c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * @attr ref android.R.styleable#PreferenceHeader_breadCrumbShortTitle 381c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 382c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public CharSequence breadCrumbShortTitle; 383c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 384c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 385b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Optional icon resource to show for this header. 386b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * @attr ref android.R.styleable#PreferenceHeader_icon 387b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 388468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler public int iconRes; 389b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 390b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 391b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Full class name of the fragment to display when this header is 392b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * selected. 393b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn * @attr ref android.R.styleable#PreferenceHeader_fragment 394b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 395468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler public String fragment; 396b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 397b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 398b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Optional arguments to supply to the fragment when it is 399b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * instantiated. 400b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 401468c3230dafc2d131bdeded7b5a6825988166244Andrew Stadler public Bundle fragmentArguments; 4025c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn 4035c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn /** 4045c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn * Intent to launch when the preference is selected. 4055c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn */ 4065c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn public Intent intent; 407a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 408a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn /** 409a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * Optional additional data for use by subclasses of PreferenceActivity. 410a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn */ 411a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn public Bundle extras; 412a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 413a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn public Header() { 41439725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunne // Empty 415a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 416a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 41750ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn /** 41850ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * Return the currently set title. If {@link #titleRes} is set, 41950ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * this resource is loaded from <var>res</var> and returned. Otherwise 42050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * {@link #title} is returned. 42150ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn */ 42250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn public CharSequence getTitle(Resources res) { 42350ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (titleRes != 0) { 42450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn return res.getText(titleRes); 42550ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 42650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn return title; 42750ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 42850ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn 42950ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn /** 43050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * Return the currently set summary. If {@link #summaryRes} is set, 43150ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * this resource is loaded from <var>res</var> and returned. Otherwise 43250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * {@link #summary} is returned. 43350ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn */ 43450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn public CharSequence getSummary(Resources res) { 43550ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (summaryRes != 0) { 43650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn return res.getText(summaryRes); 43750ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 4389d0718042f7c0a50d825c621f82ce9a92071f07aDianne Hackborn return summary; 43950ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 44050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn 44150ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn /** 44250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * Return the currently set bread crumb title. If {@link #breadCrumbTitleRes} is set, 44350ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * this resource is loaded from <var>res</var> and returned. Otherwise 44450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * {@link #breadCrumbTitle} is returned. 44550ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn */ 44650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn public CharSequence getBreadCrumbTitle(Resources res) { 44750ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (breadCrumbTitleRes != 0) { 44850ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn return res.getText(breadCrumbTitleRes); 44950ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 45050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn return breadCrumbTitle; 45150ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 45250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn 45350ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn /** 45450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * Return the currently set bread crumb short title. If 45550ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * {@link #breadCrumbShortTitleRes} is set, 45650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * this resource is loaded from <var>res</var> and returned. Otherwise 45750ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn * {@link #breadCrumbShortTitle} is returned. 45850ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn */ 45950ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn public CharSequence getBreadCrumbShortTitle(Resources res) { 46050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (breadCrumbShortTitleRes != 0) { 46150ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn return res.getText(breadCrumbShortTitleRes); 46250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 46350ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn return breadCrumbShortTitle; 46450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 46550ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn 466a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn @Override 467a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn public int describeContents() { 468a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn return 0; 469a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 470a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 471a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn @Override 472a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn public void writeToParcel(Parcel dest, int flags) { 473a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn dest.writeLong(id); 47450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn dest.writeInt(titleRes); 475a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn TextUtils.writeToParcel(title, dest, flags); 47650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn dest.writeInt(summaryRes); 477a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn TextUtils.writeToParcel(summary, dest, flags); 47850ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn dest.writeInt(breadCrumbTitleRes); 479c6669ca63299219d815464129dac051ab2404286Dianne Hackborn TextUtils.writeToParcel(breadCrumbTitle, dest, flags); 48050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn dest.writeInt(breadCrumbShortTitleRes); 481c6669ca63299219d815464129dac051ab2404286Dianne Hackborn TextUtils.writeToParcel(breadCrumbShortTitle, dest, flags); 482a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn dest.writeInt(iconRes); 483a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn dest.writeString(fragment); 484a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn dest.writeBundle(fragmentArguments); 485a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (intent != null) { 486a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn dest.writeInt(1); 487a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn intent.writeToParcel(dest, flags); 488a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } else { 489a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn dest.writeInt(0); 490a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 491a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn dest.writeBundle(extras); 492a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 493a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 494a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn public void readFromParcel(Parcel in) { 495a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn id = in.readLong(); 49650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn titleRes = in.readInt(); 497a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn title = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 49850ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn summaryRes = in.readInt(); 499a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn summary = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 50050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn breadCrumbTitleRes = in.readInt(); 501c6669ca63299219d815464129dac051ab2404286Dianne Hackborn breadCrumbTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 50250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn breadCrumbShortTitleRes = in.readInt(); 503c6669ca63299219d815464129dac051ab2404286Dianne Hackborn breadCrumbShortTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 504a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn iconRes = in.readInt(); 505a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn fragment = in.readString(); 506a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn fragmentArguments = in.readBundle(); 507a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (in.readInt() != 0) { 508a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn intent = Intent.CREATOR.createFromParcel(in); 509a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 510a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn extras = in.readBundle(); 511a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 512a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 513a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn Header(Parcel in) { 514a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn readFromParcel(in); 515a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 516a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 517a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn public static final Creator<Header> CREATOR = new Creator<Header>() { 518a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn public Header createFromParcel(Parcel source) { 519a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn return new Header(source); 520a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 521a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn public Header[] newArray(int size) { 522a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn return new Header[size]; 523a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 524a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn }; 525b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 526b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onCreate(savedInstanceState); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 531b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio // Theming for the PreferenceActivity layout and for the Preference Header(s) layout 532b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio TypedArray sa = obtainStyledAttributes(null, 533b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio com.android.internal.R.styleable.PreferenceActivity, 534b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio com.android.internal.R.attr.preferenceActivityStyle, 535b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio 0); 536b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio 537b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio final int layoutResId = sa.getResourceId( 538b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio com.android.internal.R.styleable.PreferenceActivity_layout, 539b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio com.android.internal.R.layout.preference_list_content); 540b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio 541b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio mPreferenceHeaderItemResId = sa.getResourceId( 542b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio com.android.internal.R.styleable.PreferenceActivity_headerLayout, 543b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio com.android.internal.R.layout.preference_header_item); 544b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio mPreferenceHeaderRemoveEmptyIcon = sa.getBoolean( 545b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio com.android.internal.R.styleable.PreferenceActivity_headerRemoveIconIfEmpty, 546b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio false); 547b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio 548b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio sa.recycle(); 549b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio 550b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio setContentView(layoutResId); 55119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 5525c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn mListFooter = (FrameLayout)findViewById(com.android.internal.R.id.list_footer); 5533c9f519f898f8fc809550199ea823c0225c682a8Amith Yamasani mPrefsContainer = (ViewGroup) findViewById(com.android.internal.R.id.prefs_frame); 554b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn boolean hidingHeaders = onIsHidingHeaders(); 555b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mSinglePane = hidingHeaders || !onIsMultiPane(); 556b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn String initialFragment = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT); 557b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn Bundle initialArguments = getIntent().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS); 558e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn int initialTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_TITLE, 0); 559e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn int initialShortTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_SHORT_TITLE, 0); 560b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 561a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (savedInstanceState != null) { 562a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // We are restarting from a previous saved state; used that to 563a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // initialize, instead of starting fresh. 564a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn ArrayList<Header> headers = savedInstanceState.getParcelableArrayList(HEADERS_TAG); 565a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (headers != null) { 566a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn mHeaders.addAll(headers); 567a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn int curHeader = savedInstanceState.getInt(CUR_HEADER_TAG, 56839725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunne (int) HEADER_ID_UNDEFINED); 569a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (curHeader >= 0 && curHeader < mHeaders.size()) { 570a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn setSelectedHeader(mHeaders.get(curHeader)); 571a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 572a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 573b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 574b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } else { 575a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (initialFragment != null && mSinglePane) { 576a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // If we are just showing a fragment, we want to run in 577a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // new fragment mode, but don't need to compute and show 578a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // the headers. 579a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn switchToHeader(initialFragment, initialArguments); 580e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn if (initialTitle != 0) { 581e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn CharSequence initialTitleStr = getText(initialTitle); 582e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn CharSequence initialShortTitleStr = initialShortTitle != 0 583e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn ? getText(initialShortTitle) : null; 584e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn showBreadCrumbs(initialTitleStr, initialShortTitleStr); 585e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn } 586a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 587a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } else { 588a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // We need to try to build the headers. 589a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn onBuildHeaders(mHeaders); 590a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 591a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // If there are headers, then at this point we need to show 592a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // them and, depending on the screen, we may also show in-line 593a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // the currently selected preference fragment. 594a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (mHeaders.size() > 0) { 595a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (!mSinglePane) { 596a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (initialFragment == null) { 597a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn Header h = onGetInitialHeader(); 598a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn switchToHeader(h); 599a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } else { 600a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn switchToHeader(initialFragment, initialArguments); 601a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 602b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 603b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 604a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 605a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 606b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 607a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // The default configuration is to only show the list view. Adjust 608a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // visibility for other configurations. 609a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (initialFragment != null && mSinglePane) { 610a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // Single pane, showing just a prefs fragment. 61105fbc31ed9c6ac13a7aeddc176f19a5c17217e30Amith Yamasani findViewById(com.android.internal.R.id.headers).setVisibility(View.GONE); 612a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn mPrefsContainer.setVisibility(View.VISIBLE); 61334905a9808a63e8b671b8e9c4a20c6e1ca470b36Dianne Hackborn if (initialTitle != 0) { 6148fc552e695701ff9bc64d5adca0f06a47f0f9f37Svetoslav Ganov CharSequence initialTitleStr = getText(initialTitle); 6158fc552e695701ff9bc64d5adca0f06a47f0f9f37Svetoslav Ganov CharSequence initialShortTitleStr = initialShortTitle != 0 61634905a9808a63e8b671b8e9c4a20c6e1ca470b36Dianne Hackborn ? getText(initialShortTitle) : null; 6178fc552e695701ff9bc64d5adca0f06a47f0f9f37Svetoslav Ganov showBreadCrumbs(initialTitleStr, initialShortTitleStr); 61834905a9808a63e8b671b8e9c4a20c6e1ca470b36Dianne Hackborn } 619a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } else if (mHeaders.size() > 0) { 620b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio setListAdapter(new HeaderAdapter(this, mHeaders, mPreferenceHeaderItemResId, 621b22be6fcf2689a7de3795f406678caf73180a990Fabrice Di Meglio mPreferenceHeaderRemoveEmptyIcon)); 622a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (!mSinglePane) { 623a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // Multi-pane. 624a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn getListView().setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); 625d0fa371f276fde32d81c037006941bc93da0bb03Dianne Hackborn if (mCurHeader != null) { 626d0fa371f276fde32d81c037006941bc93da0bb03Dianne Hackborn setSelectedHeader(mCurHeader); 627d0fa371f276fde32d81c037006941bc93da0bb03Dianne Hackborn } 628a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn mPrefsContainer.setVisibility(View.VISIBLE); 629a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 630a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } else { 631b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // If there are no headers, we are in the old "just show a screen 632b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // of preferences" mode. 633405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani setContentView(com.android.internal.R.layout.preference_list_content_single); 6348da35290693d404b482104abc5f696f6cfd58a2cAmith Yamasani mListFooter = (FrameLayout) findViewById(com.android.internal.R.id.list_footer); 6353c9f519f898f8fc809550199ea823c0225c682a8Amith Yamasani mPrefsContainer = (ViewGroup) findViewById(com.android.internal.R.id.prefs); 636a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn mPreferenceManager = new PreferenceManager(this, FIRST_REQUEST_CODE); 637a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn mPreferenceManager.setOnPreferenceTreeClickListener(this); 638b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 639b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 64019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // see if we should show Back/Next buttons 64119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng Intent intent = getIntent(); 64219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng if (intent.getBooleanExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, false)) { 64319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 64419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng findViewById(com.android.internal.R.id.button_bar).setVisibility(View.VISIBLE); 64519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 64619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng Button backButton = (Button)findViewById(com.android.internal.R.id.back_button); 64719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng backButton.setOnClickListener(new OnClickListener() { 64819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng public void onClick(View v) { 64919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng setResult(RESULT_CANCELED); 65019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng finish(); 65119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 65219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng }); 65309dbf1844016682ed461d080e32a43d0086e767dFreeman Ng Button skipButton = (Button)findViewById(com.android.internal.R.id.skip_button); 65409dbf1844016682ed461d080e32a43d0086e767dFreeman Ng skipButton.setOnClickListener(new OnClickListener() { 65509dbf1844016682ed461d080e32a43d0086e767dFreeman Ng public void onClick(View v) { 65609dbf1844016682ed461d080e32a43d0086e767dFreeman Ng setResult(RESULT_OK); 65709dbf1844016682ed461d080e32a43d0086e767dFreeman Ng finish(); 65809dbf1844016682ed461d080e32a43d0086e767dFreeman Ng } 65909dbf1844016682ed461d080e32a43d0086e767dFreeman Ng }); 66019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng mNextButton = (Button)findViewById(com.android.internal.R.id.next_button); 66119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng mNextButton.setOnClickListener(new OnClickListener() { 66219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng public void onClick(View v) { 66319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng setResult(RESULT_OK); 66419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng finish(); 66519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 66619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng }); 66719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 66819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // set our various button parameters 66919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng if (intent.hasExtra(EXTRA_PREFS_SET_NEXT_TEXT)) { 67019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_NEXT_TEXT); 67119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng if (TextUtils.isEmpty(buttonText)) { 67219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng mNextButton.setVisibility(View.GONE); 67319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 67419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng else { 67519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng mNextButton.setText(buttonText); 67619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 67719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 67819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng if (intent.hasExtra(EXTRA_PREFS_SET_BACK_TEXT)) { 67919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_BACK_TEXT); 68019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng if (TextUtils.isEmpty(buttonText)) { 68119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng backButton.setVisibility(View.GONE); 68219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 68319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng else { 68419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng backButton.setText(buttonText); 68519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 68619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 68709dbf1844016682ed461d080e32a43d0086e767dFreeman Ng if (intent.getBooleanExtra(EXTRA_PREFS_SHOW_SKIP, false)) { 68809dbf1844016682ed461d080e32a43d0086e767dFreeman Ng skipButton.setVisibility(View.VISIBLE); 68909dbf1844016682ed461d080e32a43d0086e767dFreeman Ng } 69019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 691b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 692b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 693b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 694291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * Returns true if this activity is currently showing the header list. 695291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn */ 696291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn public boolean hasHeaders() { 697291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn return getListView().getVisibility() == View.VISIBLE 698291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn && mPreferenceManager == null; 699291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn } 700291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn 701291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn /** 702423d48bbba074ee1d0d7b09f4e9e074a6944edbaAmith Yamasani * Returns the Header list 703423d48bbba074ee1d0d7b09f4e9e074a6944edbaAmith Yamasani * @hide 704423d48bbba074ee1d0d7b09f4e9e074a6944edbaAmith Yamasani */ 705423d48bbba074ee1d0d7b09f4e9e074a6944edbaAmith Yamasani public List<Header> getHeaders() { 706423d48bbba074ee1d0d7b09f4e9e074a6944edbaAmith Yamasani return mHeaders; 707423d48bbba074ee1d0d7b09f4e9e074a6944edbaAmith Yamasani } 708423d48bbba074ee1d0d7b09f4e9e074a6944edbaAmith Yamasani 709423d48bbba074ee1d0d7b09f4e9e074a6944edbaAmith Yamasani /** 710291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * Returns true if this activity is showing multiple panes -- the headers 711291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * and a preference fragment. 712291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn */ 713291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn public boolean isMultiPane() { 714291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn return hasHeaders() && mPrefsContainer.getVisibility() == View.VISIBLE; 715291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn } 716291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn 717291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn /** 718b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Called to determine if the activity should run in multi-pane mode. 719b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * The default implementation returns true if the screen is large 720b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * enough. 721b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 722b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public boolean onIsMultiPane() { 723405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani boolean preferMultiPane = getResources().getBoolean( 724405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani com.android.internal.R.bool.preferences_prefer_dual_pane); 725405c1af75607fafdb1d6faf34e13e032e4934787Amith Yamasani return preferMultiPane; 726b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 727b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 728b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 729291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * Called to determine whether the header list should be hidden. 730291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * The default implementation returns the 731291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * value given in {@link #EXTRA_NO_HEADERS} or false if it is not supplied. 732291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * This is set to false, for example, when the activity is being re-launched 733291905e34a7f0ae03c68fb2c1b8c34b92d447fbfDianne Hackborn * to show a particular preference activity. 734b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 735b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public boolean onIsHidingHeaders() { 736b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn return getIntent().getBooleanExtra(EXTRA_NO_HEADERS, false); 737b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 738b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 739b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 740b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Called to determine the initial header to be shown. The default 741b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * implementation simply returns the fragment of the first header. Note 742b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * that the returned Header object does not actually need to exist in 743b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * your header list -- whatever its fragment is will simply be used to 744b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * show for the initial UI. 745b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 746b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public Header onGetInitialHeader() { 74719470ecc0f3fa4f95fd55db722cb8e43e956da5eDianne Hackborn for (int i=0; i<mHeaders.size(); i++) { 74819470ecc0f3fa4f95fd55db722cb8e43e956da5eDianne Hackborn Header h = mHeaders.get(i); 74919470ecc0f3fa4f95fd55db722cb8e43e956da5eDianne Hackborn if (h.fragment != null) { 75019470ecc0f3fa4f95fd55db722cb8e43e956da5eDianne Hackborn return h; 75119470ecc0f3fa4f95fd55db722cb8e43e956da5eDianne Hackborn } 75219470ecc0f3fa4f95fd55db722cb8e43e956da5eDianne Hackborn } 75319470ecc0f3fa4f95fd55db722cb8e43e956da5eDianne Hackborn throw new IllegalStateException("Must have at least one header with a fragment"); 754b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 755b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 756b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 7575c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn * Called after the header list has been updated ({@link #onBuildHeaders} 7585c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn * has been called and returned due to {@link #invalidateHeaders()}) to 7595c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn * specify the header that should now be selected. The default implementation 7605c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn * returns null to keep whatever header is currently selected. 7615c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn */ 7625c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn public Header onGetNewHeader() { 7635c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn return null; 7645c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn } 7655c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn 7665c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn /** 767b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Called when the activity needs its list of headers build. By 768b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * implementing this and adding at least one item to the list, you 769b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * will cause the activity to run in its modern fragment mode. Note 770b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * that this function may not always be called; for example, if the 771b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * activity has been asked to display a particular fragment without 772b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * the header list, there is no need to build the headers. 773b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 774b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>Typical implementations will use {@link #loadHeadersFromResource} 775b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * to fill in the list from a resource. 776b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 777b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param target The list in which to place the headers. 778b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 779b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public void onBuildHeaders(List<Header> target) { 78039725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunne // Should be overloaded by subclasses 781b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 782b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 783b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 784b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * Call when you need to change the headers being displayed. Will result 785b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * in onBuildHeaders() later being called to retrieve the new list. 786b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn */ 787b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public void invalidateHeaders() { 788b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn if (!mHandler.hasMessages(MSG_BUILD_HEADERS)) { 789b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn mHandler.sendEmptyMessage(MSG_BUILD_HEADERS); 790b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 791b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn } 792b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn 793b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn /** 794b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Parse the given XML file as a header description, adding each 795b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * parsed Header into the target list. 796b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 797b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param resid The XML resource to load and parse. 798b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param target The list in which the parsed headers should be placed. 799b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 800b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public void loadHeadersFromResource(int resid, List<Header> target) { 801b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn XmlResourceParser parser = null; 802b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn try { 803b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn parser = getResources().getXml(resid); 804b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn AttributeSet attrs = Xml.asAttributeSet(parser); 805b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 806b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn int type; 807b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 808b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn && type != XmlPullParser.START_TAG) { 80939725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunne // Parse next until start tag is found 810b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 811b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 812b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn String nodeName = parser.getName(); 813def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (!"preference-headers".equals(nodeName)) { 814b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn throw new RuntimeException( 815def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn "XML document must start with <preference-headers> tag; found" 816b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn + nodeName + " at " + parser.getPositionDescription()); 817b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 818b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 819def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn Bundle curBundle = null; 820def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn 8215c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn final int outerDepth = parser.getDepth(); 822b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 823b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 824b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 825b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn continue; 826b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 827b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 828b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn nodeName = parser.getName(); 829def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if ("header".equals(nodeName)) { 830b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Header header = new Header(); 831b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 832f878c298e157ba81a378ba5ae3b4f23df8b1d85aAlan Viverette TypedArray sa = obtainStyledAttributes( 833f878c298e157ba81a378ba5ae3b4f23df8b1d85aAlan Viverette attrs, com.android.internal.R.styleable.PreferenceHeader); 834ed13cde1de86933f64285fa34e3a3aca80994859Amith Yamasani header.id = sa.getResourceId( 835a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn com.android.internal.R.styleable.PreferenceHeader_id, 836a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn (int)HEADER_ID_UNDEFINED); 83750ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn TypedValue tv = sa.peekValue( 838b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn com.android.internal.R.styleable.PreferenceHeader_title); 83950ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (tv != null && tv.type == TypedValue.TYPE_STRING) { 84050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (tv.resourceId != 0) { 84150ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn header.titleRes = tv.resourceId; 84250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } else { 84350ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn header.title = tv.string; 84450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 84550ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 84650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn tv = sa.peekValue( 847b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn com.android.internal.R.styleable.PreferenceHeader_summary); 84850ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (tv != null && tv.type == TypedValue.TYPE_STRING) { 84950ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (tv.resourceId != 0) { 85050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn header.summaryRes = tv.resourceId; 85150ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } else { 85250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn header.summary = tv.string; 85350ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 85450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 85550ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn tv = sa.peekValue( 856c6669ca63299219d815464129dac051ab2404286Dianne Hackborn com.android.internal.R.styleable.PreferenceHeader_breadCrumbTitle); 85750ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (tv != null && tv.type == TypedValue.TYPE_STRING) { 85850ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (tv.resourceId != 0) { 85950ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn header.breadCrumbTitleRes = tv.resourceId; 86050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } else { 86150ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn header.breadCrumbTitle = tv.string; 86250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 86350ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 86450ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn tv = sa.peekValue( 865c6669ca63299219d815464129dac051ab2404286Dianne Hackborn com.android.internal.R.styleable.PreferenceHeader_breadCrumbShortTitle); 86650ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (tv != null && tv.type == TypedValue.TYPE_STRING) { 86750ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (tv.resourceId != 0) { 86850ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn header.breadCrumbShortTitleRes = tv.resourceId; 86950ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } else { 87050ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn header.breadCrumbShortTitle = tv.string; 87150ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 87250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn } 873b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn header.iconRes = sa.getResourceId( 874b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn com.android.internal.R.styleable.PreferenceHeader_icon, 0); 875b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn header.fragment = sa.getString( 876b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn com.android.internal.R.styleable.PreferenceHeader_fragment); 877b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn sa.recycle(); 878b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 879def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (curBundle == null) { 880def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn curBundle = new Bundle(); 881def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 8825c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn 8835c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn final int innerDepth = parser.getDepth(); 8845c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 8855c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) { 8865c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 8875c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn continue; 8885c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn } 8895c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn 8905c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn String innerNodeName = parser.getName(); 8915c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn if (innerNodeName.equals("extra")) { 8925c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn getResources().parseBundleExtra("extra", attrs, curBundle); 8935c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn XmlUtils.skipCurrentTag(parser); 8945c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn 8955c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn } else if (innerNodeName.equals("intent")) { 8965c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn header.intent = Intent.parseIntent(getResources(), parser, attrs); 8975c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn 8985c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn } else { 8995c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn XmlUtils.skipCurrentTag(parser); 9005c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn } 9015c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn } 9025c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn 903def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn if (curBundle.size() > 0) { 904def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn header.fragmentArguments = curBundle; 905def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn curBundle = null; 906def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn } 907b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 908def1537e9e8d0dd190cde5310ddae8b921088c9bDianne Hackborn target.add(header); 909b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } else { 910b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn XmlUtils.skipCurrentTag(parser); 911b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 912b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 913b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 914b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } catch (XmlPullParserException e) { 915b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn throw new RuntimeException("Error parsing headers", e); 916b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } catch (IOException e) { 917b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn throw new RuntimeException("Error parsing headers", e); 918b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } finally { 919b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (parser != null) parser.close(); 920b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 921364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani } 92219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 923364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani /** 924364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani * Subclasses should override this method and verify that the given fragment is a valid type 925c2be0d61830dd867f3092923e149e0cc251cdfc5Amith Yamasani * to be attached to this activity. The default implementation returns <code>true</code> for 926c2be0d61830dd867f3092923e149e0cc251cdfc5Amith Yamasani * apps built for <code>android:targetSdkVersion</code> older than 927c2be0d61830dd867f3092923e149e0cc251cdfc5Amith Yamasani * {@link android.os.Build.VERSION_CODES#KITKAT}. For later versions, it will throw an exception. 92820915daf064f19587b8b9123de5849f91e78e59bAmith Yamasani * @param fragmentName the class name of the Fragment about to be attached to this activity. 929364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani * @return true if the fragment class name is valid for this Activity and false otherwise. 930364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani */ 931364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani protected boolean isValidFragment(String fragmentName) { 932e8222dddaf2e3da14380101e818d4254899e0c0dChet Haase if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.KITKAT) { 933a5001b94a01b3c7547b688a5091e2fdf989640d6Amith Yamasani throw new RuntimeException( 934a5001b94a01b3c7547b688a5091e2fdf989640d6Amith Yamasani "Subclasses of PreferenceActivity must override isValidFragment(String)" 935364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani + " to verify that the Fragment class is valid! " + this.getClass().getName() 936364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani + " has not checked if fragment " + fragmentName + " is valid."); 937364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani } else { 938364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani return true; 939364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani } 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9425c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn /** 9435c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn * Set a footer that should be shown at the bottom of the header list. 9445c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn */ 9455c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn public void setListFooter(View view) { 9465c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn mListFooter.removeAllViews(); 9475c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn mListFooter.addView(view, new FrameLayout.LayoutParams( 9485c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn FrameLayout.LayoutParams.MATCH_PARENT, 9495c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn FrameLayout.LayoutParams.WRAP_CONTENT)); 9505c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn } 9515c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onStop() { 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onStop(); 95519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 956b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 957b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mPreferenceManager.dispatchActivityStop(); 958b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDestroy() { 9631ebf13ef20fea56f55094a3744c9813500a55b17Hiroaki Kuriyama mHandler.removeMessages(MSG_BIND_PREFERENCES); 9641ebf13ef20fea56f55094a3744c9813500a55b17Hiroaki Kuriyama mHandler.removeMessages(MSG_BUILD_HEADERS); 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDestroy(); 966b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 967b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 968b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mPreferenceManager.dispatchActivityDestroy(); 969b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onSaveInstanceState(Bundle outState) { 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onSaveInstanceState(outState); 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 976a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (mHeaders.size() > 0) { 977a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn outState.putParcelableArrayList(HEADERS_TAG, mHeaders); 978a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (mCurHeader != null) { 979a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn int index = mHeaders.indexOf(mCurHeader); 980a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (index >= 0) { 981a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn outState.putInt(CUR_HEADER_TAG, index); 982a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 983a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 984a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 985a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 986b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 987b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn final PreferenceScreen preferenceScreen = getPreferenceScreen(); 988b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (preferenceScreen != null) { 989b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Bundle container = new Bundle(); 990b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn preferenceScreen.saveHierarchyState(container); 991b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn outState.putBundle(PREFERENCES_TAG, container); 992b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onRestoreInstanceState(Bundle state) { 998b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 999b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Bundle container = state.getBundle(PREFERENCES_TAG); 1000b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (container != null) { 1001b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn final PreferenceScreen preferenceScreen = getPreferenceScreen(); 1002b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (preferenceScreen != null) { 1003b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn preferenceScreen.restoreHierarchyState(container); 1004b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mSavedInstanceState = state; 1005b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return; 1006b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell 1010e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell // Only call this if we didn't save the instance state for later. 1011e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell // If we did save it, it will be restored when we bind the adapter. 1012e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell super.onRestoreInstanceState(state); 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onActivityResult(int requestCode, int resultCode, Intent data) { 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onActivityResult(requestCode, resultCode, data); 101819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 1019b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 1020b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mPreferenceManager.dispatchActivityResult(requestCode, resultCode, data); 1021b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onContentChanged() { 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onContentChanged(); 1027b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 1028b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 1029b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn postBindPreferences(); 1030b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 1031b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 1032b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 1033b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Override 1034b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn protected void onListItemClick(ListView l, View v, int position, long id) { 103549bdc1681e58bd01174673042c42f65bb34943ddAmith Yamasani if (!isResumed()) { 103649bdc1681e58bd01174673042c42f65bb34943ddAmith Yamasani return; 103749bdc1681e58bd01174673042c42f65bb34943ddAmith Yamasani } 1038b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn super.onListItemClick(l, v, position, id); 1039b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 1040b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mAdapter != null) { 104139725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunne Object item = mAdapter.getItem(position); 104239725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunne if (item instanceof Header) onHeaderClick((Header) item, position); 1043b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 1044b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 1045b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 1046b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 1047b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Called when the user selects an item in the header list. The default 1048e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * implementation will call either 1049e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * {@link #startWithFragment(String, Bundle, Fragment, int, int, int)} 1050a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * or {@link #switchToHeader(Header)} as appropriate. 1051b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 1052b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param header The header that was selected. 1053b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param position The header's position in the list. 1054b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 1055b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public void onHeaderClick(Header header, int position) { 10565c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn if (header.fragment != null) { 10575c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn if (mSinglePane) { 1058e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn int titleRes = header.breadCrumbTitleRes; 1059e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn int shortTitleRes = header.breadCrumbShortTitleRes; 1060e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn if (titleRes == 0) { 1061e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn titleRes = header.titleRes; 1062e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn shortTitleRes = 0; 1063e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn } 1064e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn startWithFragment(header.fragment, header.fragmentArguments, null, 0, 1065e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn titleRes, shortTitleRes); 10665c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn } else { 1067a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn switchToHeader(header); 10685c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn } 10695c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn } else if (header.intent != null) { 10705c769a47aeb399324cca7f5d449331a3bba85b52Dianne Hackborn startActivity(header.intent); 1071b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 1072b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 1073b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 1074b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 1075e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * Called by {@link #startWithFragment(String, Bundle, Fragment, int, int, int)} when 1076b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * in single-pane mode, to build an Intent to launch a new activity showing 1077b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * the selected fragment. The default implementation constructs an Intent 1078b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * that re-launches the current activity with the appropriate arguments to 1079b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * display the fragment. 1080b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * 1081b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * @param fragmentName The name of the fragment to display. 1082b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * @param args Optional arguments to supply to the fragment. 1083e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * @param titleRes Optional resource ID of title to show for this item. 108439725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunne * @param shortTitleRes Optional resource ID of short title to show for this item. 1085b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * @return Returns an Intent that can be launched to display the given 1086b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * fragment. 1087b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn */ 1088e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn public Intent onBuildStartFragmentIntent(String fragmentName, Bundle args, 1089e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn int titleRes, int shortTitleRes) { 1090b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn Intent intent = new Intent(Intent.ACTION_MAIN); 1091b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn intent.setClass(this, getClass()); 1092b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn intent.putExtra(EXTRA_SHOW_FRAGMENT, fragmentName); 1093b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args); 1094e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn intent.putExtra(EXTRA_SHOW_FRAGMENT_TITLE, titleRes); 1095e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn intent.putExtra(EXTRA_SHOW_FRAGMENT_SHORT_TITLE, shortTitleRes); 1096b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn intent.putExtra(EXTRA_NO_HEADERS, true); 1097b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn return intent; 1098b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn } 1099b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn 1100b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn /** 1101e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * Like {@link #startWithFragment(String, Bundle, Fragment, int, int, int)} 1102e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * but uses a 0 titleRes. 1103e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn */ 1104e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn public void startWithFragment(String fragmentName, Bundle args, 1105e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn Fragment resultTo, int resultRequestCode) { 1106e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn startWithFragment(fragmentName, args, resultTo, resultRequestCode, 0, 0); 1107e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn } 1108e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn 1109e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn /** 1110b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Start a new instance of this activity, showing only the given 1111b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * preference fragment. When launched in this mode, the header list 1112b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * will be hidden and the given preference fragment will be instantiated 1113b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * and fill the entire activity. 1114b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 1115b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param fragmentName The name of the fragment to display. 1116b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param args Optional arguments to supply to the fragment. 1117b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * @param resultTo Option fragment that should receive the result of 1118b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * the activity launch. 1119b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * @param resultRequestCode If resultTo is non-null, this is the request 1120b1a6e439f63e4fa2b07a4905f00b6badf58e6420Dianne Hackborn * code in which to report the result. 1121e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * @param titleRes Resource ID of string to display for the title of 1122e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * this set of preferences. 112339725ac96b68f7d2d25d10662bd9ad3189fdab77Gilles Debunne * @param shortTitleRes Resource ID of string to display for the short title of 1124e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn * this set of preferences. 1125b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 11268eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn public void startWithFragment(String fragmentName, Bundle args, 1127e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn Fragment resultTo, int resultRequestCode, int titleRes, int shortTitleRes) { 1128e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn Intent intent = onBuildStartFragmentIntent(fragmentName, args, titleRes, shortTitleRes); 11298eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (resultTo == null) { 11308eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn startActivity(intent); 11318eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } else { 11328eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn resultTo.startActivityForResult(intent, resultRequestCode); 11338eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 1134b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 1135b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 1136c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 1137c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * Change the base title of the bread crumbs for the current preferences. 1138c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * This will normally be called for you. See 1139c6669ca63299219d815464129dac051ab2404286Dianne Hackborn * {@link android.app.FragmentBreadCrumbs} for more information. 1140c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 1141c6669ca63299219d815464129dac051ab2404286Dianne Hackborn public void showBreadCrumbs(CharSequence title, CharSequence shortTitle) { 1142c6669ca63299219d815464129dac051ab2404286Dianne Hackborn if (mFragmentBreadCrumbs == null) { 11433e86040439d030e44eca4da81d0217046fcac55cAmith Yamasani View crumbs = findViewById(android.R.id.title); 11443e86040439d030e44eca4da81d0217046fcac55cAmith Yamasani // For screens with a different kind of title, don't create breadcrumbs. 1145e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn try { 1146e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn mFragmentBreadCrumbs = (FragmentBreadCrumbs)crumbs; 1147e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn } catch (ClassCastException e) { 1148cf638aceef9515728cac93a42bce552c12206142Amith Yamasani setTitle(title); 1149e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn return; 1150e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn } 11513c9f519f898f8fc809550199ea823c0225c682a8Amith Yamasani if (mFragmentBreadCrumbs == null) { 1152e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn if (title != null) { 1153e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn setTitle(title); 11543c9f519f898f8fc809550199ea823c0225c682a8Amith Yamasani } 1155e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn return; 1156c57406cdfa1925c3474e87865c51950b76ee0347Jim Miller } 11573ec7bac9a0c262882d6ca2985f4dc3ecc42489c0Amith Yamasani if (mSinglePane) { 11583ec7bac9a0c262882d6ca2985f4dc3ecc42489c0Amith Yamasani mFragmentBreadCrumbs.setVisibility(View.GONE); 11593ec7bac9a0c262882d6ca2985f4dc3ecc42489c0Amith Yamasani // Hide the breadcrumb section completely for single-pane 11603ec7bac9a0c262882d6ca2985f4dc3ecc42489c0Amith Yamasani View bcSection = findViewById(com.android.internal.R.id.breadcrumb_section); 11613ec7bac9a0c262882d6ca2985f4dc3ecc42489c0Amith Yamasani if (bcSection != null) bcSection.setVisibility(View.GONE); 1162cf638aceef9515728cac93a42bce552c12206142Amith Yamasani setTitle(title); 11633ec7bac9a0c262882d6ca2985f4dc3ecc42489c0Amith Yamasani } 11643c9f519f898f8fc809550199ea823c0225c682a8Amith Yamasani mFragmentBreadCrumbs.setMaxVisible(2); 11653c9f519f898f8fc809550199ea823c0225c682a8Amith Yamasani mFragmentBreadCrumbs.setActivity(this); 1166c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 1167cf638aceef9515728cac93a42bce552c12206142Amith Yamasani if (mFragmentBreadCrumbs.getVisibility() != View.VISIBLE) { 1168cf638aceef9515728cac93a42bce552c12206142Amith Yamasani setTitle(title); 1169cf638aceef9515728cac93a42bce552c12206142Amith Yamasani } else { 1170cf638aceef9515728cac93a42bce552c12206142Amith Yamasani mFragmentBreadCrumbs.setTitle(title, shortTitle); 1171cf638aceef9515728cac93a42bce552c12206142Amith Yamasani mFragmentBreadCrumbs.setParentTitle(null, null, null); 1172cf638aceef9515728cac93a42bce552c12206142Amith Yamasani } 1173c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani } 1174c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani 1175c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani /** 1176c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani * Should be called after onCreate to ensure that the breadcrumbs, if any, were created. 1177c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani * This prepends a title to the fragment breadcrumbs and attaches a listener to any clicks 1178c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani * on the parent entry. 1179c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani * @param title the title for the breadcrumb 1180c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani * @param shortTitle the short title for the breadcrumb 1181c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani */ 1182c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani public void setParentTitle(CharSequence title, CharSequence shortTitle, 1183c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani OnClickListener listener) { 1184c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani if (mFragmentBreadCrumbs != null) { 1185c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani mFragmentBreadCrumbs.setParentTitle(title, shortTitle, listener); 1186c9ecb73ccdab767e7904232d46b660fdd7a9aad7Amith Yamasani } 1187c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 1188c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 1189a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn void setSelectedHeader(Header header) { 1190a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn mCurHeader = header; 1191a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn int index = mHeaders.indexOf(header); 1192a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (index >= 0) { 1193a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn getListView().setItemChecked(index, true); 1194a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } else { 1195a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn getListView().clearChoices(); 1196a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 119734905a9808a63e8b671b8e9c4a20c6e1ca470b36Dianne Hackborn showBreadCrumbs(header); 119834905a9808a63e8b671b8e9c4a20c6e1ca470b36Dianne Hackborn } 119934905a9808a63e8b671b8e9c4a20c6e1ca470b36Dianne Hackborn 120034905a9808a63e8b671b8e9c4a20c6e1ca470b36Dianne Hackborn void showBreadCrumbs(Header header) { 1201c6669ca63299219d815464129dac051ab2404286Dianne Hackborn if (header != null) { 120250ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn CharSequence title = header.getBreadCrumbTitle(getResources()); 120350ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn if (title == null) title = header.getTitle(getResources()); 1204c6669ca63299219d815464129dac051ab2404286Dianne Hackborn if (title == null) title = getTitle(); 120550ed8294d366412aa739e763f5e53f1e9717c7c6Dianne Hackborn showBreadCrumbs(title, header.getBreadCrumbShortTitle(getResources())); 1206c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } else { 1207c6669ca63299219d815464129dac051ab2404286Dianne Hackborn showBreadCrumbs(getTitle(), null); 1208c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 1209c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 1210c6669ca63299219d815464129dac051ab2404286Dianne Hackborn 12115aaae37506236bf9d3c43535537bd84e54bd5df9Fabrice Di Meglio private void switchToHeaderInner(String fragmentName, Bundle args) { 12123a57fb9e9c4f205ca6bd4f036b3080f92588d16dDianne Hackborn getFragmentManager().popBackStack(BACK_STACK_PREFS, 12133a57fb9e9c4f205ca6bd4f036b3080f92588d16dDianne Hackborn FragmentManager.POP_BACK_STACK_INCLUSIVE); 1214364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani if (!isValidFragment(fragmentName)) { 1215364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani throw new IllegalArgumentException("Invalid fragment for this activity: " 1216364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani + fragmentName); 1217364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani } 1218c6669ca63299219d815464129dac051ab2404286Dianne Hackborn Fragment f = Fragment.instantiate(this, fragmentName, args); 121948e7b458694acdf3a4fc58e62437f1dbc4f29d83Dianne Hackborn FragmentTransaction transaction = getFragmentManager().beginTransaction(); 1220327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 12219ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase transaction.replace(com.android.internal.R.id.prefs, f); 1222cf407ad88bef3bc640489b300f23eaa8ea0b724eDianne Hackborn transaction.commitAllowingStateLoss(); 1223a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1224a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 1225b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 1226b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * When in two-pane mode, switch the fragment pane to show the given 1227b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * preference fragment. 1228b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 1229b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param fragmentName The name of the fragment to display. 1230b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn * @param args Optional arguments to supply to the fragment. 1231b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 1232b7a2e4772220c4b41df1260cedaf8912f4b07547Dianne Hackborn public void switchToHeader(String fragmentName, Bundle args) { 123302bc31e7b351281e7ca905dbf7ad72ec4119e2e0Brian Attwell Header selectedHeader = null; 123402bc31e7b351281e7ca905dbf7ad72ec4119e2e0Brian Attwell for (int i = 0; i < mHeaders.size(); i++) { 123502bc31e7b351281e7ca905dbf7ad72ec4119e2e0Brian Attwell if (fragmentName.equals(mHeaders.get(i).fragment)) { 123602bc31e7b351281e7ca905dbf7ad72ec4119e2e0Brian Attwell selectedHeader = mHeaders.get(i); 123702bc31e7b351281e7ca905dbf7ad72ec4119e2e0Brian Attwell break; 123802bc31e7b351281e7ca905dbf7ad72ec4119e2e0Brian Attwell } 123902bc31e7b351281e7ca905dbf7ad72ec4119e2e0Brian Attwell } 124002bc31e7b351281e7ca905dbf7ad72ec4119e2e0Brian Attwell setSelectedHeader(selectedHeader); 12415aaae37506236bf9d3c43535537bd84e54bd5df9Fabrice Di Meglio switchToHeaderInner(fragmentName, args); 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1244aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler /** 1245a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * When in two-pane mode, switch to the fragment pane to show the given 1246a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * preference fragment. 1247a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * 1248a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn * @param header The new header to display. 1249a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn */ 1250a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn public void switchToHeader(Header header) { 12518eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (mCurHeader == header) { 12528eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn // This is the header we are currently displaying. Just make sure 12538eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn // to pop the stack up to its root state. 12543a57fb9e9c4f205ca6bd4f036b3080f92588d16dDianne Hackborn getFragmentManager().popBackStack(BACK_STACK_PREFS, 12553a57fb9e9c4f205ca6bd4f036b3080f92588d16dDianne Hackborn FragmentManager.POP_BACK_STACK_INCLUSIVE); 12568eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } else { 125719470ecc0f3fa4f95fd55db722cb8e43e956da5eDianne Hackborn if (header.fragment == null) { 125819470ecc0f3fa4f95fd55db722cb8e43e956da5eDianne Hackborn throw new IllegalStateException("can't switch to header that has no fragment"); 125919470ecc0f3fa4f95fd55db722cb8e43e956da5eDianne Hackborn } 12605aaae37506236bf9d3c43535537bd84e54bd5df9Fabrice Di Meglio switchToHeaderInner(header.fragment, header.fragmentArguments); 12618eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn setSelectedHeader(header); 12628eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 1263a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1264a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 1265a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn Header findBestMatchingHeader(Header cur, ArrayList<Header> from) { 1266a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn ArrayList<Header> matches = new ArrayList<Header>(); 1267a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn for (int j=0; j<from.size(); j++) { 1268a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn Header oh = from.get(j); 1269a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (cur == oh || (cur.id != HEADER_ID_UNDEFINED && cur.id == oh.id)) { 1270a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn // Must be this one. 1271a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn matches.clear(); 1272a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn matches.add(oh); 1273a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn break; 1274a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1275a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (cur.fragment != null) { 1276a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (cur.fragment.equals(oh.fragment)) { 1277a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn matches.add(oh); 1278a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1279a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } else if (cur.intent != null) { 1280a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (cur.intent.equals(oh.intent)) { 1281a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn matches.add(oh); 1282a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1283a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } else if (cur.title != null) { 1284a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (cur.title.equals(oh.title)) { 1285a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn matches.add(oh); 1286a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1287a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1288a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1289a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn final int NM = matches.size(); 1290a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (NM == 1) { 1291a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn return matches.get(0); 1292a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } else if (NM > 1) { 1293a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn for (int j=0; j<NM; j++) { 1294a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn Header oh = matches.get(j); 1295a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (cur.fragmentArguments != null && 1296a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn cur.fragmentArguments.equals(oh.fragmentArguments)) { 1297a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn return oh; 1298a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1299a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (cur.extras != null && cur.extras.equals(oh.extras)) { 1300a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn return oh; 1301a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1302a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn if (cur.title != null && cur.title.equals(oh.title)) { 1303a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn return oh; 1304a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1305a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1306a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1307a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn return null; 1308a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn } 1309a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn 1310a21e3da55940e239addd80bf379091a1d85d006fDianne Hackborn /** 1311aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler * Start a new fragment. 1312aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler * 1313aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler * @param fragment The fragment to start 1314aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler * @param push If true, the current fragment will be pushed onto the back stack. If false, 1315aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler * the current fragment will be replaced. 1316aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler */ 1317aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler public void startPreferenceFragment(Fragment fragment, boolean push) { 131848e7b458694acdf3a4fc58e62437f1dbc4f29d83Dianne Hackborn FragmentTransaction transaction = getFragmentManager().beginTransaction(); 13198eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn transaction.replace(com.android.internal.R.id.prefs, fragment); 1320aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler if (push) { 13219ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 1322aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler transaction.addToBackStack(BACK_STACK_PREFS); 13239ff82bf2b33513052500473d0d6d025a80dcecbfChet Haase } else { 1324327fbd2c8fa294b919475feb4c74a74ee1981e02Dianne Hackborn transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 1325aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler } 1326cf407ad88bef3bc640489b300f23eaa8ea0b724eDianne Hackborn transaction.commitAllowingStateLoss(); 1327aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler } 1328aa904f48cf3e3a31cc43806fee0e17af607c7faeAndrew Stadler 1329c6669ca63299219d815464129dac051ab2404286Dianne Hackborn /** 1330a47372c8617e8817d5b57aa6ed905017e7573224Amith Yamasani * Start a new fragment containing a preference panel. If the preferences 13318eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * are being displayed in multi-pane mode, the given fragment class will 13328eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * be instantiated and placed in the appropriate pane. If running in 13338eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * single-pane mode, a new activity will be launched in which to show the 13348eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * fragment. 13358eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * 13368eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * @param fragmentClass Full name of the class implementing the fragment. 13378eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * @param args Any desired arguments to supply to the fragment. 13388eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * @param titleRes Optional resource identifier of the title of this 13398eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * fragment. 13408eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * @param titleText Optional text of the title of this fragment. 13418eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * @param resultTo Optional fragment that result data should be sent to. 13428eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * If non-null, resultTo.onActivityResult() will be called when this 13438eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * preference panel is done. The launched panel must use 13448eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * {@link #finishPreferencePanel(Fragment, int, Intent)} when done. 13458eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * @param resultRequestCode If resultTo is non-null, this is the caller's 13468eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * request code to be received with the resut. 1347c6669ca63299219d815464129dac051ab2404286Dianne Hackborn */ 13488eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn public void startPreferencePanel(String fragmentClass, Bundle args, int titleRes, 13498eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn CharSequence titleText, Fragment resultTo, int resultRequestCode) { 13508eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (mSinglePane) { 1351e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn startWithFragment(fragmentClass, args, resultTo, resultRequestCode, titleRes, 0); 13528eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } else { 13538eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn Fragment f = Fragment.instantiate(this, fragmentClass, args); 13548eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (resultTo != null) { 13558eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn f.setTargetFragment(resultTo, resultRequestCode); 13568eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 135748e7b458694acdf3a4fc58e62437f1dbc4f29d83Dianne Hackborn FragmentTransaction transaction = getFragmentManager().beginTransaction(); 13588eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn transaction.replace(com.android.internal.R.id.prefs, f); 13598eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (titleRes != 0) { 13608eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn transaction.setBreadCrumbTitle(titleRes); 13618eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } else if (titleText != null) { 13628eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn transaction.setBreadCrumbTitle(titleText); 13638eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13648eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 13658eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn transaction.addToBackStack(BACK_STACK_PREFS); 1366cf407ad88bef3bc640489b300f23eaa8ea0b724eDianne Hackborn transaction.commitAllowingStateLoss(); 13678eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 1368c6669ca63299219d815464129dac051ab2404286Dianne Hackborn } 1369364ed4dda42882b600dce48319881ff58464fcedAmith Yamasani 13708eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn /** 13718eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * Called by a preference panel fragment to finish itself. 13728eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * 13738eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * @param caller The fragment that is asking to be finished. 13748eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * @param resultCode Optional result code to send back to the original 13758eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * launching fragment. 13768eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * @param resultData Optional result data to send back to the original 13778eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn * launching fragment. 13788eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn */ 13798eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn public void finishPreferencePanel(Fragment caller, int resultCode, Intent resultData) { 13808eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (mSinglePane) { 13818eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn setResult(resultCode, resultData); 13828eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn finish(); 13838eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } else { 13843a57fb9e9c4f205ca6bd4f036b3080f92588d16dDianne Hackborn // XXX be smarter about popping the stack. 13853a57fb9e9c4f205ca6bd4f036b3080f92588d16dDianne Hackborn onBackPressed(); 13868eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (caller != null) { 13878eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn if (caller.getTargetFragment() != null) { 13888eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn caller.getTargetFragment().onActivityResult(caller.getTargetRequestCode(), 13898eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn resultCode, resultData); 13908eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13918eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13928eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13938eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn } 13948eb2e244f9b14d946ee587d0b673b866865026c0Dianne Hackborn 1395b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn @Override 1396b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) { 1397e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn startPreferencePanel(pref.getFragment(), pref.getExtras(), pref.getTitleRes(), 1398e72f237defd9956a7e2d2e2bee8cd2558c3f83dbDianne Hackborn pref.getTitle(), null, 0); 1399b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn return true; 1400b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn } 1401b3cf10ffa8ff9cac0da8b23a0d84076b3f501400Dianne Hackborn 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Posts a message to bind the preferences to the list view. 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Binding late is preferred as any custom preference types created in 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate(Bundle)} are able to have their views recycled. 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void postBindPreferences() { 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHandler.hasMessages(MSG_BIND_PREFERENCES)) return; 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.obtainMessage(MSG_BIND_PREFERENCES).sendToTarget(); 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 141219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void bindPreferences() { 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final PreferenceScreen preferenceScreen = getPreferenceScreen(); 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (preferenceScreen != null) { 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preferenceScreen.bind(getListView()); 1417e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell if (mSavedInstanceState != null) { 1418e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell super.onRestoreInstanceState(mSavedInstanceState); 1419e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell mSavedInstanceState = null; 1420e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell } 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 142319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the {@link PreferenceManager} used by this activity. 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link PreferenceManager}. 1427b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 1428b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 1429b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1431b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PreferenceManager getPreferenceManager() { 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferenceManager; 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 143519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void requirePreferenceManager() { 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferenceManager == null) { 1438b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mAdapter == null) { 1439b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn throw new RuntimeException("This should be called after super.onCreate."); 1440b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 1441b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn throw new RuntimeException( 1442b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn "Modern two-pane PreferenceActivity requires use of a PreferenceFragment"); 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the root of the preference hierarchy that this activity is showing. 144819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng * 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preferenceScreen The root {@link PreferenceScreen} of the preference hierarchy. 1450b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 1451b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 1452b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1454b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPreferenceScreen(PreferenceScreen preferenceScreen) { 1456b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn requirePreferenceManager(); 1457b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferenceManager.setPreferences(preferenceScreen) && preferenceScreen != null) { 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postBindPreferences(); 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence title = getPreferenceScreen().getTitle(); 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set the title of the activity 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (title != null) { 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setTitle(title); 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 146719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the root of the preference hierarchy that this activity is showing. 147019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng * 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link PreferenceScreen} that is the root of the preference 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hierarchy. 1473b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 1474b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 1475b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1477b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PreferenceScreen getPreferenceScreen() { 1479b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 1480b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return mPreferenceManager.getPreferenceScreen(); 1481b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 1482b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return null; 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 148419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds preferences from activities that match the given {@link Intent}. 148719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng * 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param intent The {@link Intent} to query activities. 1489b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 1490b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 1491b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1493b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addPreferencesFromIntent(Intent intent) { 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requirePreferenceManager(); 149619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPreferenceScreen(mPreferenceManager.inflateFromIntent(intent, getPreferenceScreen())); 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 149919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflates the given XML resource and adds the preference hierarchy to the current 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preference hierarchy. 150319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng * 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preferencesResId The XML resource ID to inflate. 1505b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 1506b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 1507b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1509b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addPreferencesFromResource(int preferencesResId) { 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requirePreferenceManager(); 151219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPreferenceScreen(mPreferenceManager.inflateFromResource(this, preferencesResId, 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getPreferenceScreen())); 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1519b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 1520b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 1521b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1523b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 152719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Finds a {@link Preference} based on its key. 153019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng * 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param key The key of the preference to retrieve. 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link Preference} with the key, or null. 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see PreferenceGroup#findPreference(CharSequence) 1534b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 1535b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 1536b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1538b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Preference findPreference(CharSequence key) { 154019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferenceManager == null) { 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 154419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferenceManager.findPreference(key); 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onNewIntent(Intent intent) { 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferenceManager != null) { 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferenceManager.dispatchNewIntent(intent); 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 155419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 155519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // give subclasses access to the Next button 155619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng /** @hide */ 155719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng protected boolean hasNextButton() { 155819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng return mNextButton != null; 155919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 156019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng /** @hide */ 156119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng protected Button getNextButton() { 156219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng return mNextButton; 156319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1565