PreferenceActivity.java revision b1ad5977bc8178b6d350ebe9099daded4c1ef603
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.preference; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport com.android.internal.util.XmlUtils; 20b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 21b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport org.xmlpull.v1.XmlPullParser; 22b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport org.xmlpull.v1.XmlPullParserException; 23b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 24b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.app.Fragment; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ListActivity; 26b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.content.Context; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 28b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.content.res.Configuration; 29b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.content.res.TypedArray; 30b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.content.res.XmlResourceParser; 31b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.graphics.drawable.Drawable; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 3519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ngimport android.text.TextUtils; 36b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.util.AttributeSet; 37b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.util.Log; 38b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.util.Xml; 39b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.view.LayoutInflater; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 41b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.view.ViewGroup; 4219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ngimport android.view.View.OnClickListener; 43b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.widget.ArrayAdapter; 4419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ngimport android.widget.Button; 45b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.widget.ImageView; 46b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.widget.ListView; 47b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport android.widget.TextView; 48b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 49b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport java.io.IOException; 50b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport java.util.ArrayList; 51b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackbornimport java.util.List; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 54b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * This is the base class for an activity to show a hierarchy of preferences 55b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * to the user. Prior to {@link android.os.Build.VERSION_CODES#HONEYCOMB} 56b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * this class only allowed the display of a single set of preference; this 57b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * functionality should now be found in the new {@link PreferenceFragment} 58b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * class. If you are using PreferenceActivity in its old mode, the documentation 59b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * there applies to the deprecated APIs here. 60b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 61b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>This activity shows one or more headers of preferences, each of with 62b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * is associated with a {@link PreferenceFragment} to display the preferences 63b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * of that header. The actual layout and display of these associations can 64b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * however vary; currently there are two major approaches it may take: 65b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 66b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <ul> 67b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <li>On a small screen it may display only the headers as a single list 68b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * when first launched. Selecting one of the header items will re-launch 69b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * the activity with it only showing the PreferenceFragment of that header. 70b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <li>On a large screen in may display both the headers and current 71b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceFragment together as panes. Selecting a header item switches 72b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * to showing the correct PreferenceFragment for that item. 73b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * </ul> 74b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 75b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>Subclasses of PreferenceActivity should implement 76b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * {@link #onBuildHeaders} to populate the header list with the desired 77b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * items. Doing this implicitly switches the class into its new "headers 78b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * + fragments" mode rather than the old style of just showing a single 79b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * preferences list. 80b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 81b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <a name="SampleCode"></a> 82b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <h3>Sample Code</h3> 83b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 84b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>The following sample code shows a simple preference activity that 85b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * has two different sets of preferences. The implementation, consisting 86b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * of the activity itself as well as its two preference fragments is:</p> 87b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 88b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * {@sample development/samples/ApiDemos/src/com/example/android/apis/preference/PreferenceWithHeaders.java 89b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * activity} 9019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng * 91b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>The preference_headers resource describes the headers to be displayed 92b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * and the fragments associated with them. It is: 93b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 94b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * {@sample development/samples/ApiDemos/res/xml/preference_headers.xml headers} 95b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 96b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * See {@link PreferenceFragment} for information on implementing the 97b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * fragments themselves. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class PreferenceActivity extends ListActivity implements 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PreferenceManager.OnPreferenceTreeClickListener { 101b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private static final String TAG = "PreferenceActivity"; 10219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String PREFERENCES_TAG = "android:preferences"; 10419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 105b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private static final String EXTRA_PREFS_SHOW_FRAGMENT = ":android:show_fragment"; 106b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 107b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private static final String EXTRA_PREFS_NO_HEADERS = ":android:no_headers"; 108b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 10919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // extras that allow any preference activity to be launched as part of a wizard 11019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 11119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // show Back and Next buttons? takes boolean parameter 11219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // Back will then return RESULT_CANCELED and Next RESULT_OK 11319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng private static final String EXTRA_PREFS_SHOW_BUTTON_BAR = "extra_prefs_show_button_bar"; 11419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 11519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // specify custom text for the Back or Next buttons, or cause a button to not appear 11619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // at all by setting it to null 11719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng private static final String EXTRA_PREFS_SET_NEXT_TEXT = "extra_prefs_set_next_text"; 11819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng private static final String EXTRA_PREFS_SET_BACK_TEXT = "extra_prefs_set_back_text"; 11919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 120b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // --- State for new mode when showing a list of headers + prefs fragment 121b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 122b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private final ArrayList<Header> mHeaders = new ArrayList<Header>(); 123b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 124b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private HeaderAdapter mAdapter; 125b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 126b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private View mPrefsContainer; 127b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 128b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private boolean mSinglePane; 129b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 130b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // --- State for old mode when showing a single preference list 13119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PreferenceManager mPreferenceManager; 13319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 134e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell private Bundle mSavedInstanceState; 135e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell 136b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // --- Common state 137b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 138b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private Button mNextButton; 139b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The starting request code given out to preference framework. 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FIRST_REQUEST_CODE = 100; 14419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MSG_BIND_PREFERENCES = 0; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Handler mHandler = new Handler() { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 15019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MSG_BIND_PREFERENCES: 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bindPreferences(); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 158b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private class HeaderViewHolder { 159b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn ImageView icon; 160b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn TextView title; 161b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn TextView summary; 162b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 163b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 164b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private class HeaderAdapter extends ArrayAdapter<Header> { 165b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn private LayoutInflater mInflater; 166b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 167b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public HeaderAdapter(Context context, List<Header> objects) { 168b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn super(context, 0, objects); 169b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 170b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 171b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 172b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Override 173b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public View getView(int position, View convertView, ViewGroup parent) { 174b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn HeaderViewHolder holder; 175b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn View view; 176b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 177b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (convertView == null) { 178b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn view = mInflater.inflate(com.android.internal.R.layout.preference_list_item, 179b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn parent, false); 180b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn holder = new HeaderViewHolder(); 181b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn holder.icon = (ImageView)view.findViewById( 182b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn com.android.internal.R.id.icon); 183b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn holder.title = (TextView)view.findViewById( 184b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn com.android.internal.R.id.title); 185b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn holder.summary = (TextView)view.findViewById( 186b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn com.android.internal.R.id.summary); 187b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn view.setTag(holder); 188b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } else { 189b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn view = convertView; 190b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn holder = (HeaderViewHolder)view.getTag(); 191b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 192b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 193b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Header header = getItem(position); 194b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (header.icon != null) holder.icon.setImageDrawable(header.icon); 195b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn else if (header.iconRes != 0) holder.icon.setImageResource(header.iconRes); 196b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (header.title != null) holder.title.setText(header.title); 197b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (header.summary != null) holder.summary.setText(header.summary); 198b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 199b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return view; 200b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 201b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 202b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 203b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 204b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Description of a single Header item that the user can select. 205b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 206b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public static class Header { 207b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 208b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Title of the header that is shown to the user. 209b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 210b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn CharSequence title; 211b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 212b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 213b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Optional summary describing what this header controls. 214b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 215b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn CharSequence summary; 216b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 217b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 218b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Optional icon resource to show for this header. 219b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 220b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn int iconRes; 221b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 222b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 223b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Optional icon drawable to show for this header. (If this is non-null, 224b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * the iconRes will be ignored.) 225b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 226b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Drawable icon; 227b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 228b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 229b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Full class name of the fragment to display when this header is 230b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * selected. 231b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 232b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn String fragment; 233b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 234b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onCreate(savedInstanceState); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setContentView(com.android.internal.R.layout.preference_list_content); 24019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 241b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mPrefsContainer = findViewById(com.android.internal.R.id.prefs); 242b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn boolean hidingHeaders = onIsHidingHeaders(); 243b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mSinglePane = hidingHeaders || !onIsMultiPane(); 244b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn String initialFragment = getIntent().getStringExtra(EXTRA_PREFS_SHOW_FRAGMENT); 245b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 246b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (initialFragment != null && mSinglePane) { 247b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // If we are just showing a fragment, we want to run in 248b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // new fragment mode, but don't need to compute and show 249b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // the headers. 250b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn getListView().setVisibility(View.GONE); 251b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mPrefsContainer.setVisibility(View.VISIBLE); 252b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn switchToHeader(initialFragment); 253b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 254b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } else { 255b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // We need to try to build the headers. 256b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn onBuildHeaders(mHeaders); 257b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 258b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // If there are headers, then at this point we need to show 259b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // them and, depending on the screen, we may also show in-line 260b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // the currently selected preference fragment. 261b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mHeaders.size() > 0) { 262b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mAdapter = new HeaderAdapter(this, mHeaders); 263b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn setListAdapter(mAdapter); 264b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (!mSinglePane) { 265b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mPrefsContainer.setVisibility(View.VISIBLE); 266b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn switchToHeader(initialFragment != null 267b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn ? initialFragment : onGetInitialFragment()); 268b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 269b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 270b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // If there are no headers, we are in the old "just show a screen 271b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn // of preferences" mode. 272b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } else { 273b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mPreferenceManager = new PreferenceManager(this, FIRST_REQUEST_CODE); 274b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mPreferenceManager.setOnPreferenceTreeClickListener(this); 275b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 276b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 277b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 278b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn getListView().setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 279b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 28019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // see if we should show Back/Next buttons 28119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng Intent intent = getIntent(); 28219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng if (intent.getBooleanExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, false)) { 28319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 28419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng findViewById(com.android.internal.R.id.button_bar).setVisibility(View.VISIBLE); 28519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 28619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng Button backButton = (Button)findViewById(com.android.internal.R.id.back_button); 28719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng backButton.setOnClickListener(new OnClickListener() { 28819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng public void onClick(View v) { 28919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng setResult(RESULT_CANCELED); 29019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng finish(); 29119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 29219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng }); 29319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng mNextButton = (Button)findViewById(com.android.internal.R.id.next_button); 29419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng mNextButton.setOnClickListener(new OnClickListener() { 29519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng public void onClick(View v) { 29619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng setResult(RESULT_OK); 29719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng finish(); 29819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 29919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng }); 30019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 30119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // set our various button parameters 30219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng if (intent.hasExtra(EXTRA_PREFS_SET_NEXT_TEXT)) { 30319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_NEXT_TEXT); 30419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng if (TextUtils.isEmpty(buttonText)) { 30519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng mNextButton.setVisibility(View.GONE); 30619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 30719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng else { 30819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng mNextButton.setText(buttonText); 30919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 31019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 31119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng if (intent.hasExtra(EXTRA_PREFS_SET_BACK_TEXT)) { 31219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_BACK_TEXT); 31319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng if (TextUtils.isEmpty(buttonText)) { 31419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng backButton.setVisibility(View.GONE); 31519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 31619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng else { 31719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng backButton.setText(buttonText); 31819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 31919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 32019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 321b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 322b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 323b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 324b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Called to determine if the activity should run in multi-pane mode. 325b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * The default implementation returns true if the screen is large 326b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * enough. 327b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 328b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public boolean onIsMultiPane() { 329b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Configuration config = getResources().getConfiguration(); 330b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if ((config.screenLayout&Configuration.SCREENLAYOUT_SIZE_MASK) 331b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn == Configuration.SCREENLAYOUT_SIZE_XLARGE 332b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn && config.orientation == Configuration.ORIENTATION_LANDSCAPE) { 333b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return true; 334b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 335b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return false; 336b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 337b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 338b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 339b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Called to determine whether the header list should be hidden. The 340b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * default implementation hides the list if the activity is being re-launched 341b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * when not in multi-pane mode. 342b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 343b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public boolean onIsHidingHeaders() { 344b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return getIntent().getBooleanExtra(EXTRA_PREFS_NO_HEADERS, false); 345b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 346b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 347b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 348b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Called to determine the initial fragment to be shown. The default 349b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * implementation simply returns the fragment of the first header. 350b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 351b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public String onGetInitialFragment() { 352b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return mHeaders.get(0).fragment; 353b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 354b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 355b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 356b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Called when the activity needs its list of headers build. By 357b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * implementing this and adding at least one item to the list, you 358b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * will cause the activity to run in its modern fragment mode. Note 359b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * that this function may not always be called; for example, if the 360b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * activity has been asked to display a particular fragment without 361b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * the header list, there is no need to build the headers. 362b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 363b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * <p>Typical implementations will use {@link #loadHeadersFromResource} 364b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * to fill in the list from a resource. 365b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 366b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param target The list in which to place the headers. 367b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 368b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public void onBuildHeaders(List<Header> target) { 369b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 370b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 371b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 372b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Parse the given XML file as a header description, adding each 373b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * parsed Header into the target list. 374b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 375b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param resid The XML resource to load and parse. 376b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param target The list in which the parsed headers should be placed. 377b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 378b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public void loadHeadersFromResource(int resid, List<Header> target) { 379b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn XmlResourceParser parser = null; 380b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn try { 381b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn parser = getResources().getXml(resid); 382b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn AttributeSet attrs = Xml.asAttributeSet(parser); 383b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 384b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn int type; 385b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 386b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn && type != XmlPullParser.START_TAG) { 387b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 388b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 389b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn String nodeName = parser.getName(); 390b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (!"PreferenceHeaders".equals(nodeName)) { 391b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn throw new RuntimeException( 392b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn "XML document must start with <PreferenceHeaders> tag; found" 393b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn + nodeName + " at " + parser.getPositionDescription()); 394b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 395b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 396b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn int outerDepth = parser.getDepth(); 397b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 398b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 399b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 400b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn continue; 401b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 402b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 403b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn nodeName = parser.getName(); 404b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if ("Header".equals(nodeName)) { 405b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Header header = new Header(); 406b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 407b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn TypedArray sa = getResources().obtainAttributes(attrs, 408b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn com.android.internal.R.styleable.PreferenceHeader); 409b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn header.title = sa.getText( 410b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn com.android.internal.R.styleable.PreferenceHeader_title); 411b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn header.summary = sa.getText( 412b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn com.android.internal.R.styleable.PreferenceHeader_summary); 413b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn header.iconRes = sa.getResourceId( 414b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn com.android.internal.R.styleable.PreferenceHeader_icon, 0); 415b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn header.fragment = sa.getString( 416b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn com.android.internal.R.styleable.PreferenceHeader_fragment); 417b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn sa.recycle(); 418b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 419b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn target.add(header); 420b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 421b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn XmlUtils.skipCurrentTag(parser); 422b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } else { 423b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn XmlUtils.skipCurrentTag(parser); 424b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 425b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 426b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 427b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } catch (XmlPullParserException e) { 428b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn throw new RuntimeException("Error parsing headers", e); 429b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } catch (IOException e) { 430b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn throw new RuntimeException("Error parsing headers", e); 431b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } finally { 432b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (parser != null) parser.close(); 433b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 43419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onStop() { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onStop(); 44019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 441b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 442b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mPreferenceManager.dispatchActivityStop(); 443b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDestroy() { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDestroy(); 449b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 450b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 451b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mPreferenceManager.dispatchActivityDestroy(); 452b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onSaveInstanceState(Bundle outState) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onSaveInstanceState(outState); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 460b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn final PreferenceScreen preferenceScreen = getPreferenceScreen(); 461b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (preferenceScreen != null) { 462b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Bundle container = new Bundle(); 463b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn preferenceScreen.saveHierarchyState(container); 464b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn outState.putBundle(PREFERENCES_TAG, container); 465b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onRestoreInstanceState(Bundle state) { 471b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 472b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Bundle container = state.getBundle(PREFERENCES_TAG); 473b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (container != null) { 474b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn final PreferenceScreen preferenceScreen = getPreferenceScreen(); 475b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (preferenceScreen != null) { 476b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn preferenceScreen.restoreHierarchyState(container); 477b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mSavedInstanceState = state; 478b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return; 479b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 482e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell 483e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell // Only call this if we didn't save the instance state for later. 484e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell // If we did save it, it will be restored when we bind the adapter. 485e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell super.onRestoreInstanceState(state); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onActivityResult(int requestCode, int resultCode, Intent data) { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onActivityResult(requestCode, resultCode, data); 49119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 492b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 493b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn mPreferenceManager.dispatchActivityResult(requestCode, resultCode, data); 494b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onContentChanged() { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onContentChanged(); 500b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 501b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 502b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn postBindPreferences(); 503b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 504b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 505b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 506b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Override 507b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn protected void onListItemClick(ListView l, View v, int position, long id) { 508b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn super.onListItemClick(l, v, position, id); 509b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 510b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mAdapter != null) { 511b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn onHeaderClick(mHeaders.get(position), position); 512b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 513b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 514b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 515b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 516b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Called when the user selects an item in the header list. The default 517b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * implementation will call either {@link #startWithFragment(String)} 518b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * or {@link #switchToHeader(String)} as appropriate. 519b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 520b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param header The header that was selected. 521b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param position The header's position in the list. 522b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 523b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public void onHeaderClick(Header header, int position) { 524b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mSinglePane) { 525b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn startWithFragment(header.fragment); 526b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } else { 527b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn switchToHeader(header.fragment); 528b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 529b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 530b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 531b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 532b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * Start a new instance of this activity, showing only the given 533b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * preference fragment. When launched in this mode, the header list 534b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * will be hidden and the given preference fragment will be instantiated 535b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * and fill the entire activity. 536b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 537b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param fragmentName The name of the fragment to display. 538b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 539b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public void startWithFragment(String fragmentName) { 540b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Intent intent = new Intent(Intent.ACTION_MAIN); 541b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn intent.setClass(this, getClass()); 542b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn intent.putExtra(EXTRA_PREFS_SHOW_FRAGMENT, fragmentName); 543b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn intent.putExtra(EXTRA_PREFS_NO_HEADERS, true); 544b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn startActivity(intent); 545b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 546b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 547b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn /** 548b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * When in two-pane mode, switch the fragment pane to show the given 549b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * preference fragment. 550b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 551b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @param fragmentName The name of the fragment to display. 552b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn */ 553b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn public void switchToHeader(String fragmentName) { 554b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Fragment f; 555b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn try { 556b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn f = Fragment.instantiate(this, fragmentName); 557b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } catch (Exception e) { 558b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn Log.w(TAG, "Failure instantiating fragment " + fragmentName, e); 559b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return; 560b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 561b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn openFragmentTransaction().replace(com.android.internal.R.id.prefs, f).commit(); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Posts a message to bind the preferences to the list view. 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Binding late is preferred as any custom preference types created in 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #onCreate(Bundle)} are able to have their views recycled. 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void postBindPreferences() { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHandler.hasMessages(MSG_BIND_PREFERENCES)) return; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.obtainMessage(MSG_BIND_PREFERENCES).sendToTarget(); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void bindPreferences() { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final PreferenceScreen preferenceScreen = getPreferenceScreen(); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (preferenceScreen != null) { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preferenceScreen.bind(getListView()); 579e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell if (mSavedInstanceState != null) { 580e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell super.onRestoreInstanceState(mSavedInstanceState); 581e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell mSavedInstanceState = null; 582e7fea45863afb10335cb7845aebcf2907d3c3e41Adam Powell } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the {@link PreferenceManager} used by this activity. 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link PreferenceManager}. 589b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 590b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 591b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 593b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PreferenceManager getPreferenceManager() { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferenceManager; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 59719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void requirePreferenceManager() { 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferenceManager == null) { 600b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mAdapter == null) { 601b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn throw new RuntimeException("This should be called after super.onCreate."); 602b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 603b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn throw new RuntimeException( 604b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn "Modern two-pane PreferenceActivity requires use of a PreferenceFragment"); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the root of the preference hierarchy that this activity is showing. 61019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng * 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preferenceScreen The root {@link PreferenceScreen} of the preference hierarchy. 612b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 613b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 614b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 616b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPreferenceScreen(PreferenceScreen preferenceScreen) { 618b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn requirePreferenceManager(); 619b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferenceManager.setPreferences(preferenceScreen) && preferenceScreen != null) { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postBindPreferences(); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence title = getPreferenceScreen().getTitle(); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set the title of the activity 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (title != null) { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setTitle(title); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the root of the preference hierarchy that this activity is showing. 63219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng * 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link PreferenceScreen} that is the root of the preference 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hierarchy. 635b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 636b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 637b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 639b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PreferenceScreen getPreferenceScreen() { 641b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn if (mPreferenceManager != null) { 642b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return mPreferenceManager.getPreferenceScreen(); 643b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn } 644b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn return null; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds preferences from activities that match the given {@link Intent}. 64919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng * 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param intent The {@link Intent} to query activities. 651b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 652b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 653b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 655b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addPreferencesFromIntent(Intent intent) { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requirePreferenceManager(); 65819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPreferenceScreen(mPreferenceManager.inflateFromIntent(intent, getPreferenceScreen())); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflates the given XML resource and adds the preference hierarchy to the current 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preference hierarchy. 66519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng * 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preferencesResId The XML resource ID to inflate. 667b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 668b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 669b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 671b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addPreferencesFromResource(int preferencesResId) { 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requirePreferenceManager(); 67419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPreferenceScreen(mPreferenceManager.inflateFromResource(this, preferencesResId, 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getPreferenceScreen())); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 681b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 682b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 683b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 685b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Finds a {@link Preference} based on its key. 69219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng * 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param key The key of the preference to retrieve. 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The {@link Preference} with the key, or null. 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see PreferenceGroup#findPreference(CharSequence) 696b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * 697b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * @deprecated This function is not relevant for a modern fragment-based 698b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn * PreferenceActivity. 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 700b1ad5977bc8178b6d350ebe9099daded4c1ef603Dianne Hackborn @Deprecated 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Preference findPreference(CharSequence key) { 70219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferenceManager == null) { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 70619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPreferenceManager.findPreference(key); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onNewIntent(Intent intent) { 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPreferenceManager != null) { 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPreferenceManager.dispatchNewIntent(intent); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71619ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng 71719ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng // give subclasses access to the Next button 71819ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng /** @hide */ 71919ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng protected boolean hasNextButton() { 72019ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng return mNextButton != null; 72119ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 72219ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng /** @hide */ 72319ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng protected Button getNextButton() { 72419ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng return mNextButton; 72519ea2e0d788810473136ceca46c1c28326daff5eFreeman Ng } 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 727