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