blob: 94e7329979868befb4ce178817a6c0a6cb117329 [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 {
90 if (intent.getComponent().getClassName().equals(this.getClass().getName())) {
91 showFragment(TopLevelSettings.class.getName(), null);
92 } else {
93 showFragment(intent.getComponent().getClassName(), intent.getExtras());
94 }
95 }
96 } else {
97 if (!intent.getComponent().getClassName().equals(this.getClass().getName())) {
98 if (showFragment(intent.getComponent().getClassName(), intent.getExtras())) {
99 mMainPane.setVisibility(View.GONE);
100 }
101 }
102 Fragment topLevel = getFragmentManager().findFragmentById(R.id.top_level);
103 if (topLevel != null) {
104 ((TopLevelSettings) topLevel).selectFirst();
105 }
106 }
107 }
108
109 boolean showFragment(Preference preference) {
110 if (mSinglePane) {
111 startWithFragment(preference.getFragment(), preference.getExtras());
112 return false;
113 } else {
114 return showFragment(preference.getFragment(), preference.getExtras());
115 }
116 }
117
118 private void startWithFragment(String fragmentName, Bundle args) {
119 Intent intent = new Intent(Intent.ACTION_MAIN);
120 intent.setClass(this, getClass());
121 intent.putExtra(EXTRA_SHOW_FRAGMENT, fragmentName);
122 intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
123 startActivity(intent);
124 }
125
126 private boolean showFragment(String fragmentClass, Bundle extras) {
127 try {
128 Fragment f = Fragment.instantiate(this, fragmentClass, extras);
129 if (f instanceof SettingsPreferenceFragment) {
130 ((SettingsPreferenceFragment) f).setOnStateListener(this);
131 }
132 getFragmentManager().openTransaction().replace(R.id.prefs, f).commit();
133 return true;
134 } catch (InstantiationException exc) {
135 Log.d(TAG, "Couldn't instantiate fragment " + fragmentClass);
136 return false;
137 }
138 }
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) {
168 Log.d(TAG, "Fragment created " + fragment);
169 addToBreadCrumbs(fragment);
170 }
171
172 public void onDestroyed(SettingsPreferenceFragment fragment) {
173 removeFromBreadCrumbs(fragment);
174 Log.d(TAG, "Fragment destroyed " + fragment);
175 }
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);
206 Utils.updatePreferenceToSpecificActivityOrRemove(activity, parent,
207 KEY_SEARCH_SETTINGS, 0);
208
209 Preference dockSettings = parent.findPreference(KEY_DOCK_SETTINGS);
210 if (activity.getResources().getBoolean(R.bool.has_dock_settings) == false
211 && dockSettings != null) {
212 parent.removePreference(dockSettings);
213 }
214
215 Utils.updatePreferenceToSpecificActivityFromMetaDataOrRemove(activity, parent,
216 KEY_OPERATOR_SETTINGS);
217 Utils.updatePreferenceToSpecificActivityFromMetaDataOrRemove(activity, parent,
218 KEY_MANUFACTURER_SETTINGS);
219 }
220
221 @Override
222 public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
223 // If it is a fragment preference, replace the prefs pane in the 2 pane UI.
224 final String fragmentClass = preference.getFragment();
225 if (fragmentClass != null) {
226 boolean showed = ((Settings) getActivity()).showFragment(preference);
227 if (showed) {
228 highlight(preference);
229 }
230 return showed;
231 }
232 return false;
233 }
234
235 void highlight(Preference preference) {
236 if (mHighlightedPreference != null) {
237 mHighlightedPreference.setHighlighted(false);
238 }
239 mHighlightedPreference = (IconPreferenceScreen) preference;
240 mHighlightedPreference.setHighlighted(true);
241 }
242
243 void selectFirst() {
244 Preference first = getPreferenceScreen().getPreference(0);
245 onPreferenceTreeClick(getPreferenceScreen(), first);
246 }
247 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800248}