blob: 460ca964423a28b58de1c99f626b6d0838495801 [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;
21import android.app.Fragment.InstantiationException;
22import android.content.Intent;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080023import android.os.Bundle;
Amith Yamasani0e2ab4f2010-01-14 16:12:21 -080024import android.preference.Preference;
Amith Yamasanid7993472010-08-18 13:59:28 -070025import android.preference.PreferenceFragment;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080026import android.preference.PreferenceGroup;
Amith Yamasanid7993472010-08-18 13:59:28 -070027import android.preference.PreferenceScreen;
28import android.text.TextUtils;
29import android.util.Log;
30import android.view.View;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080031
Amith Yamasanid7993472010-08-18 13:59:28 -070032import java.util.ArrayList;
33
34/**
35 * Top-level settings activity to handle single pane and double pane UI layout.
36 */
37public class Settings extends Activity
38 implements PreferenceFragment.OnPreferenceStartFragmentCallback,
39 SettingsPreferenceFragment.OnStateListener {
40
41 private static final String TAG = "Settings";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080042
43 private static final String KEY_PARENT = "parent";
44 private static final String KEY_CALL_SETTINGS = "call_settings";
45 private static final String KEY_SYNC_SETTINGS = "sync_settings";
Bjorn Bringerta9d5be12009-04-27 15:16:25 +010046 private static final String KEY_SEARCH_SETTINGS = "search_settings";
Amith Yamasani0e2ab4f2010-01-14 16:12:21 -080047 private static final String KEY_DOCK_SETTINGS = "dock_settings";
Amith Yamasanid7993472010-08-18 13:59:28 -070048
Anders Hammar1b2dd9032010-04-08 10:03:50 +020049 private static final String KEY_OPERATOR_SETTINGS = "operator_settings";
50 private static final String KEY_MANUFACTURER_SETTINGS = "manufacturer_settings";
51
Amith Yamasanid7993472010-08-18 13:59:28 -070052 public static final String EXTRA_SHOW_FRAGMENT = ":settings:show_fragment";
Chouting Zhang5ee06352009-07-22 22:51:40 -050053
Amith Yamasanid7993472010-08-18 13:59:28 -070054 public static final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":settings:show_fragment_args";
Amith Yamasani0e2ab4f2010-01-14 16:12:21 -080055
Amith Yamasanid7993472010-08-18 13:59:28 -070056 // Temporary, until all top-level settings are converted to fragments
57 private static final String BACK_STACK_PREFS = ":settings:prefs";
Anders Hammar1b2dd9032010-04-08 10:03:50 +020058
Amith Yamasanid7993472010-08-18 13:59:28 -070059 private View mPrefsPane;
60 private View mMainPane;
61 private boolean mSinglePane;
62
63 private ArrayList<CharSequence> mTrail = new ArrayList<CharSequence>();
64
65 /*
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080066 @Override
67 protected void onResume() {
68 super.onResume();
69 findPreference(KEY_CALL_SETTINGS).setEnabled(!AirplaneModeEnabler.isAirplaneModeOn(this));
70 }
Amith Yamasanid7993472010-08-18 13:59:28 -070071 */
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080072
Amith Yamasanid7993472010-08-18 13:59:28 -070073 @Override
74 protected void onCreate(Bundle savedInstanceState) {
75 super.onCreate(savedInstanceState);
76 setContentView(R.layout.settings_top_level);
77 mPrefsPane = findViewById(R.id.prefs);
78 mMainPane = findViewById(R.id.top_level);
79 mSinglePane = mMainPane == null;
80 if (mSinglePane) mMainPane = mPrefsPane;
81
82 final Intent intent = getIntent();
83 String initialFragment = intent.getStringExtra(EXTRA_SHOW_FRAGMENT);
84 Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
85
86 if (mSinglePane) {
87 if (initialFragment != null) {
88 showFragment(initialFragment, initialArguments);
89 } else {
Daisuke Miyakawa0cc35e42010-08-24 15:50:43 -070090 // Intent#getCompontent() lets us get Fragment name, even when the Intent is
91 // given via <activity-alias>.
92 //
93 // e.g. When we reach here via "ChildSetting" activity-alias,
94 // we should get the name here instead of targetActivity ("Settings").
Amith Yamasanid7993472010-08-18 13:59:28 -070095 if (intent.getComponent().getClassName().equals(this.getClass().getName())) {
96 showFragment(TopLevelSettings.class.getName(), null);
97 } else {
98 showFragment(intent.getComponent().getClassName(), intent.getExtras());
99 }
100 }
101 } else {
102 if (!intent.getComponent().getClassName().equals(this.getClass().getName())) {
103 if (showFragment(intent.getComponent().getClassName(), intent.getExtras())) {
104 mMainPane.setVisibility(View.GONE);
105 }
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -0700106 } else {
107 Fragment topLevel = getFragmentManager().findFragmentById(R.id.top_level);
108 if (topLevel != null) {
109 ((TopLevelSettings) topLevel).selectFirst();
110 }
Amith Yamasanid7993472010-08-18 13:59:28 -0700111 }
112 }
113 }
114
115 boolean showFragment(Preference preference) {
116 if (mSinglePane) {
117 startWithFragment(preference.getFragment(), preference.getExtras());
118 return false;
119 } else {
120 return showFragment(preference.getFragment(), preference.getExtras());
121 }
122 }
123
124 private void startWithFragment(String fragmentName, Bundle args) {
125 Intent intent = new Intent(Intent.ACTION_MAIN);
126 intent.setClass(this, getClass());
127 intent.putExtra(EXTRA_SHOW_FRAGMENT, fragmentName);
128 intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
129 startActivity(intent);
130 }
131
132 private boolean showFragment(String fragmentClass, Bundle extras) {
133 try {
134 Fragment f = Fragment.instantiate(this, fragmentClass, extras);
135 if (f instanceof SettingsPreferenceFragment) {
136 ((SettingsPreferenceFragment) f).setOnStateListener(this);
137 }
138 getFragmentManager().openTransaction().replace(R.id.prefs, f).commit();
139 return true;
140 } catch (InstantiationException exc) {
141 Log.d(TAG, "Couldn't instantiate fragment " + fragmentClass);
142 return false;
143 }
144 }
145
146 private void addToBreadCrumbs(Fragment fragment) {
147 final CharSequence title = ((PreferenceFragment) fragment)
148 .getPreferenceScreen().getTitle();
149 if (mSinglePane) mTrail.clear();
150 if (mTrail.size() == 0 || !TextUtils.equals(title, mTrail.get(mTrail.size() - 1))) {
151 mTrail.add(title);
152 updateTitle();
153 }
154 }
155
156 private void removeFromBreadCrumbs(Fragment fragment) {
157 if (mTrail.size() > 0) {
158 mTrail.remove(mTrail.size() - 1);
159 }
160 updateTitle();
161 }
162
163 private void updateTitle() {
164 String trail = "";
165 for (CharSequence trailPart : mTrail) {
166 if (trail.length() != 0)
167 trail += " | ";
168 trail = trail + trailPart;
169 }
170 setTitle(trail);
171 }
172
173 public void onCreated(SettingsPreferenceFragment fragment) {
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -0700174 Log.d(TAG, "Fragment created " + fragment + " (name: " + fragment.getClass() + ")");
Amith Yamasanid7993472010-08-18 13:59:28 -0700175 addToBreadCrumbs(fragment);
176 }
177
178 public void onDestroyed(SettingsPreferenceFragment fragment) {
179 removeFromBreadCrumbs(fragment);
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -0700180 Log.d(TAG, "Fragment destroyed " + fragment + " (name: " + fragment.getClass() + ")");
Amith Yamasanid7993472010-08-18 13:59:28 -0700181 }
182
183 public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
184 Fragment f = Fragment.instantiate(this, pref.getFragment(), pref.getExtras());
185 if (f instanceof SettingsPreferenceFragment) {
186 ((SettingsPreferenceFragment) f).setOnStateListener(this);
187 }
188 getFragmentManager().openTransaction().replace(R.id.prefs, f)
189 .addToBackStack(BACK_STACK_PREFS).commit();
190 return true;
191 }
192
193 public static class TopLevelSettings extends PreferenceFragment {
194
195 private IconPreferenceScreen mHighlightedPreference;
196
197 @Override
198 public void onCreate(Bundle savedInstanceState) {
199 super.onCreate(savedInstanceState);
200
201 // Load the preferences from an XML resource
202 addPreferencesFromResource(R.xml.settings);
203
204 updatePreferenceList();
205 }
206
207 private void updatePreferenceList() {
208 final Activity activity = getActivity();
209 PreferenceGroup parent = (PreferenceGroup) findPreference(KEY_PARENT);
210 Utils.updatePreferenceToSpecificActivityOrRemove(activity, parent,
211 KEY_SYNC_SETTINGS, 0);
212 Utils.updatePreferenceToSpecificActivityOrRemove(activity, parent,
213 KEY_SEARCH_SETTINGS, 0);
214
215 Preference dockSettings = parent.findPreference(KEY_DOCK_SETTINGS);
216 if (activity.getResources().getBoolean(R.bool.has_dock_settings) == false
217 && dockSettings != null) {
218 parent.removePreference(dockSettings);
219 }
220
221 Utils.updatePreferenceToSpecificActivityFromMetaDataOrRemove(activity, parent,
222 KEY_OPERATOR_SETTINGS);
223 Utils.updatePreferenceToSpecificActivityFromMetaDataOrRemove(activity, parent,
224 KEY_MANUFACTURER_SETTINGS);
225 }
226
227 @Override
228 public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
229 // If it is a fragment preference, replace the prefs pane in the 2 pane UI.
230 final String fragmentClass = preference.getFragment();
231 if (fragmentClass != null) {
232 boolean showed = ((Settings) getActivity()).showFragment(preference);
233 if (showed) {
234 highlight(preference);
235 }
236 return showed;
237 }
238 return false;
239 }
240
241 void highlight(Preference preference) {
242 if (mHighlightedPreference != null) {
243 mHighlightedPreference.setHighlighted(false);
244 }
245 mHighlightedPreference = (IconPreferenceScreen) preference;
246 mHighlightedPreference.setHighlighted(true);
247 }
248
249 void selectFirst() {
250 Preference first = getPreferenceScreen().getPreference(0);
251 onPreferenceTreeClick(getPreferenceScreen(), first);
252 }
253 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800254}