blob: 2ce0bccdd4e7ed25f9cd664686b53861ae14cc74 [file] [log] [blame]
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.settings;
18
Amith Yamasanid7993472010-08-18 13:59:28 -070019import android.app.Activity;
20import android.app.Fragment;
Amith Yamasanid7993472010-08-18 13:59:28 -070021import android.content.Intent;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080022import android.os.Bundle;
Amith Yamasani0e2ab4f2010-01-14 16:12:21 -080023import android.preference.Preference;
Amith Yamasanid7993472010-08-18 13:59:28 -070024import android.preference.PreferenceFragment;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080025import android.preference.PreferenceGroup;
Amith Yamasanid7993472010-08-18 13:59:28 -070026import android.preference.PreferenceScreen;
27import android.text.TextUtils;
28import android.util.Log;
29import android.view.View;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080030
Amith Yamasanid7993472010-08-18 13:59:28 -070031import java.util.ArrayList;
32
33/**
34 * Top-level settings activity to handle single pane and double pane UI layout.
35 */
36public class Settings extends Activity
37 implements PreferenceFragment.OnPreferenceStartFragmentCallback,
38 SettingsPreferenceFragment.OnStateListener {
39
40 private static final String TAG = "Settings";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080041
42 private static final String KEY_PARENT = "parent";
43 private static final String KEY_CALL_SETTINGS = "call_settings";
44 private static final String KEY_SYNC_SETTINGS = "sync_settings";
Bjorn Bringerta9d5be12009-04-27 15:16:25 +010045 private static final String KEY_SEARCH_SETTINGS = "search_settings";
Amith Yamasani0e2ab4f2010-01-14 16:12:21 -080046 private static final String KEY_DOCK_SETTINGS = "dock_settings";
Amith Yamasanid7993472010-08-18 13:59:28 -070047
Anders Hammar1b2dd9032010-04-08 10:03:50 +020048 private static final String KEY_OPERATOR_SETTINGS = "operator_settings";
49 private static final String KEY_MANUFACTURER_SETTINGS = "manufacturer_settings";
50
Amith Yamasanid7993472010-08-18 13:59:28 -070051 public static final String EXTRA_SHOW_FRAGMENT = ":settings:show_fragment";
Chouting Zhang5ee06352009-07-22 22:51:40 -050052
Amith Yamasanid7993472010-08-18 13:59:28 -070053 public static final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":settings:show_fragment_args";
Amith Yamasani0e2ab4f2010-01-14 16:12:21 -080054
Amith Yamasanid7993472010-08-18 13:59:28 -070055 // Temporary, until all top-level settings are converted to fragments
56 private static final String BACK_STACK_PREFS = ":settings:prefs";
Anders Hammar1b2dd9032010-04-08 10:03:50 +020057
Amith Yamasanid7993472010-08-18 13:59:28 -070058 private View mPrefsPane;
59 private View mMainPane;
60 private boolean mSinglePane;
61
62 private ArrayList<CharSequence> mTrail = new ArrayList<CharSequence>();
63
64 /*
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080065 @Override
66 protected void onResume() {
67 super.onResume();
68 findPreference(KEY_CALL_SETTINGS).setEnabled(!AirplaneModeEnabler.isAirplaneModeOn(this));
69 }
Amith Yamasanid7993472010-08-18 13:59:28 -070070 */
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080071
Amith Yamasanid7993472010-08-18 13:59:28 -070072 @Override
73 protected void onCreate(Bundle savedInstanceState) {
74 super.onCreate(savedInstanceState);
75 setContentView(R.layout.settings_top_level);
76 mPrefsPane = findViewById(R.id.prefs);
77 mMainPane = findViewById(R.id.top_level);
78 mSinglePane = mMainPane == null;
79 if (mSinglePane) mMainPane = mPrefsPane;
80
81 final Intent intent = getIntent();
82 String initialFragment = intent.getStringExtra(EXTRA_SHOW_FRAGMENT);
83 Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
84
85 if (mSinglePane) {
86 if (initialFragment != null) {
87 showFragment(initialFragment, initialArguments);
88 } else {
Daisuke Miyakawa0cc35e42010-08-24 15:50:43 -070089 // Intent#getCompontent() lets us get Fragment name, even when the Intent is
90 // given via <activity-alias>.
91 //
92 // e.g. When we reach here via "ChildSetting" activity-alias,
93 // we should get the name here instead of targetActivity ("Settings").
Amith Yamasanid7993472010-08-18 13:59:28 -070094 if (intent.getComponent().getClassName().equals(this.getClass().getName())) {
95 showFragment(TopLevelSettings.class.getName(), null);
96 } else {
97 showFragment(intent.getComponent().getClassName(), intent.getExtras());
98 }
99 }
100 } else {
101 if (!intent.getComponent().getClassName().equals(this.getClass().getName())) {
102 if (showFragment(intent.getComponent().getClassName(), intent.getExtras())) {
103 mMainPane.setVisibility(View.GONE);
104 }
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -0700105 } else {
106 Fragment topLevel = getFragmentManager().findFragmentById(R.id.top_level);
107 if (topLevel != null) {
108 ((TopLevelSettings) topLevel).selectFirst();
109 }
Amith Yamasanid7993472010-08-18 13:59:28 -0700110 }
111 }
112 }
113
114 boolean showFragment(Preference preference) {
115 if (mSinglePane) {
116 startWithFragment(preference.getFragment(), preference.getExtras());
117 return false;
118 } else {
119 return showFragment(preference.getFragment(), preference.getExtras());
120 }
121 }
122
123 private void startWithFragment(String fragmentName, Bundle args) {
124 Intent intent = new Intent(Intent.ACTION_MAIN);
125 intent.setClass(this, getClass());
126 intent.putExtra(EXTRA_SHOW_FRAGMENT, fragmentName);
127 intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
128 startActivity(intent);
129 }
130
131 private boolean showFragment(String fragmentClass, Bundle extras) {
Amith Yamasani60133dd2010-09-11 14:17:31 -0700132 Fragment f = Fragment.instantiate(this, fragmentClass, extras);
133 if (f instanceof SettingsPreferenceFragment) {
134 ((SettingsPreferenceFragment) f).setOnStateListener(this);
Amith Yamasanid7993472010-08-18 13:59:28 -0700135 }
Amith Yamasani60133dd2010-09-11 14:17:31 -0700136 getFragmentManager().openTransaction().replace(R.id.prefs, f).commit();
137 return true;
Amith Yamasanid7993472010-08-18 13:59:28 -0700138 }
139
140 private void addToBreadCrumbs(Fragment fragment) {
141 final CharSequence title = ((PreferenceFragment) fragment)
142 .getPreferenceScreen().getTitle();
143 if (mSinglePane) mTrail.clear();
144 if (mTrail.size() == 0 || !TextUtils.equals(title, mTrail.get(mTrail.size() - 1))) {
145 mTrail.add(title);
146 updateTitle();
147 }
148 }
149
150 private void removeFromBreadCrumbs(Fragment fragment) {
151 if (mTrail.size() > 0) {
152 mTrail.remove(mTrail.size() - 1);
153 }
154 updateTitle();
155 }
156
157 private void updateTitle() {
158 String trail = "";
159 for (CharSequence trailPart : mTrail) {
160 if (trail.length() != 0)
161 trail += " | ";
162 trail = trail + trailPart;
163 }
164 setTitle(trail);
165 }
166
167 public void onCreated(SettingsPreferenceFragment fragment) {
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -0700168 Log.d(TAG, "Fragment created " + fragment + " (name: " + fragment.getClass() + ")");
Amith Yamasanid7993472010-08-18 13:59:28 -0700169 addToBreadCrumbs(fragment);
170 }
171
172 public void onDestroyed(SettingsPreferenceFragment fragment) {
173 removeFromBreadCrumbs(fragment);
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -0700174 Log.d(TAG, "Fragment destroyed " + fragment + " (name: " + fragment.getClass() + ")");
Amith Yamasanid7993472010-08-18 13:59:28 -0700175 }
176
177 public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
178 Fragment f = Fragment.instantiate(this, pref.getFragment(), pref.getExtras());
179 if (f instanceof SettingsPreferenceFragment) {
180 ((SettingsPreferenceFragment) f).setOnStateListener(this);
181 }
182 getFragmentManager().openTransaction().replace(R.id.prefs, f)
183 .addToBackStack(BACK_STACK_PREFS).commit();
184 return true;
185 }
186
187 public static class TopLevelSettings extends PreferenceFragment {
188
189 private IconPreferenceScreen mHighlightedPreference;
190
191 @Override
192 public void onCreate(Bundle savedInstanceState) {
193 super.onCreate(savedInstanceState);
194
195 // Load the preferences from an XML resource
196 addPreferencesFromResource(R.xml.settings);
197
198 updatePreferenceList();
199 }
200
201 private void updatePreferenceList() {
202 final Activity activity = getActivity();
203 PreferenceGroup parent = (PreferenceGroup) findPreference(KEY_PARENT);
204 Utils.updatePreferenceToSpecificActivityOrRemove(activity, parent,
205 KEY_SYNC_SETTINGS, 0);
Amith Yamasanid7993472010-08-18 13:59:28 -0700206 Preference dockSettings = parent.findPreference(KEY_DOCK_SETTINGS);
207 if (activity.getResources().getBoolean(R.bool.has_dock_settings) == false
208 && dockSettings != null) {
209 parent.removePreference(dockSettings);
210 }
211
212 Utils.updatePreferenceToSpecificActivityFromMetaDataOrRemove(activity, parent,
213 KEY_OPERATOR_SETTINGS);
214 Utils.updatePreferenceToSpecificActivityFromMetaDataOrRemove(activity, parent,
215 KEY_MANUFACTURER_SETTINGS);
Amith Yamasani60133dd2010-09-11 14:17:31 -0700216
217 Preference callSettings = parent.findPreference(KEY_CALL_SETTINGS);
218 if (!Utils.isVoiceCapable(activity) && callSettings != null) {
219 parent.removePreference(callSettings);
220 }
Amith Yamasanid7993472010-08-18 13:59:28 -0700221 }
222
223 @Override
224 public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
225 // If it is a fragment preference, replace the prefs pane in the 2 pane UI.
226 final String fragmentClass = preference.getFragment();
227 if (fragmentClass != null) {
228 boolean showed = ((Settings) getActivity()).showFragment(preference);
229 if (showed) {
230 highlight(preference);
231 }
232 return showed;
233 }
234 return false;
235 }
236
237 void highlight(Preference preference) {
238 if (mHighlightedPreference != null) {
239 mHighlightedPreference.setHighlighted(false);
240 }
241 mHighlightedPreference = (IconPreferenceScreen) preference;
242 mHighlightedPreference.setHighlighted(true);
243 }
244
245 void selectFirst() {
246 Preference first = getPreferenceScreen().getPreference(0);
247 onPreferenceTreeClick(getPreferenceScreen(), first);
248 }
249 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800250}