blob: a2f701d05f9bc277440b03e8aeb4fd77faf08458 [file] [log] [blame]
Amith Yamasanid7993472010-08-18 13:59:28 -07001/*
2 * Copyright (C) 2010 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
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -070019import android.app.Activity;
Amith Yamasanid7993472010-08-18 13:59:28 -070020import android.app.Dialog;
21import android.app.DialogFragment;
Daisuke Miyakawab5647c52010-09-10 18:04:02 -070022import android.app.Fragment;
Amith Yamasanid7993472010-08-18 13:59:28 -070023import android.content.ContentResolver;
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -070024import android.content.Intent;
Amith Yamasanid7993472010-08-18 13:59:28 -070025import android.content.pm.PackageManager;
26import android.content.res.Resources;
27import android.os.Bundle;
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -070028import android.preference.PreferenceActivity;
Amith Yamasanid7993472010-08-18 13:59:28 -070029import android.preference.PreferenceFragment;
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -070030import android.text.TextUtils;
Amith Yamasanid7993472010-08-18 13:59:28 -070031import android.util.Log;
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -070032import android.view.View;
33import android.view.View.OnClickListener;
34import android.widget.Button;
Amith Yamasanid7993472010-08-18 13:59:28 -070035
Daisuke Miyakawaf58090d2010-09-12 17:27:33 -070036/**
Amith Yamasanid7993472010-08-18 13:59:28 -070037 * Base class for Settings fragments, with some helper functions and dialog management.
38 */
Daisuke Miyakawa21c1abc2010-09-12 15:42:56 -070039public class SettingsPreferenceFragment extends PreferenceFragment
40 implements DialogCreatable {
Amith Yamasanid7993472010-08-18 13:59:28 -070041
42 private static final String TAG = "SettingsPreferenceFragment";
43
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -070044 // Originally from PreferenceActivity.
45 private static final String EXTRA_PREFS_SHOW_BUTTON_BAR = "extra_prefs_show_button_bar";
46 private static final String EXTRA_PREFS_SHOW_SKIP = "extra_prefs_show_skip";
47 private static final String EXTRA_PREFS_SET_NEXT_TEXT = "extra_prefs_set_next_text";
48 private static final String EXTRA_PREFS_SET_BACK_TEXT = "extra_prefs_set_back_text";
49
Amith Yamasanid7993472010-08-18 13:59:28 -070050 private SettingsDialogFragment mDialogFragment;
51
Daisuke Miyakawab5647c52010-09-10 18:04:02 -070052 private int mResultCode = Activity.RESULT_CANCELED;
53 private Intent mResultData;
Amith Yamasanid7993472010-08-18 13:59:28 -070054
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -070055 private Button mNextButton;
56
Daisuke Miyakawab5647c52010-09-10 18:04:02 -070057 @Override
Amith Yamasanid7993472010-08-18 13:59:28 -070058 public void onActivityCreated(Bundle savedInstanceState) {
59 super.onActivityCreated(savedInstanceState);
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -070060 setupButtonBar();
Amith Yamasanid7993472010-08-18 13:59:28 -070061 }
62
Daisuke Miyakawab5647c52010-09-10 18:04:02 -070063 /*
64 * The name is intentionally made different from Activity#finish(), so that
65 * users won't misunderstand its meaning.
66 */
67 public final void finishFragment() {
68 getActivity().onBackPressed();
69 }
70
Amith Yamasanid7993472010-08-18 13:59:28 -070071 // Some helpers for functions used by the settings fragments when they were activities
72
73 /**
74 * Returns the ContentResolver from the owning Activity.
75 */
76 protected ContentResolver getContentResolver() {
77 return getActivity().getContentResolver();
78 }
79
80 /**
81 * Returns the specified system service from the owning Activity.
82 */
83 protected Object getSystemService(final String name) {
84 return getActivity().getSystemService(name);
85 }
86
87 /**
Amith Yamasanid7993472010-08-18 13:59:28 -070088 * Returns the PackageManager from the owning Activity.
89 */
90 protected PackageManager getPackageManager() {
91 return getActivity().getPackageManager();
92 }
93
94 // Dialog management
95
96 protected void showDialog(int dialogId) {
97 if (mDialogFragment != null) {
98 Log.e(TAG, "Old dialog fragment not null!");
99 }
100 mDialogFragment = new SettingsDialogFragment(this, dialogId);
Daisuke Miyakawa21c1abc2010-09-12 15:42:56 -0700101 mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId));
Amith Yamasanid7993472010-08-18 13:59:28 -0700102 }
103
104 public Dialog onCreateDialog(int dialogId) {
105 return null;
106 }
107
108 protected void removeDialog(int dialogId) {
109 if (mDialogFragment != null && mDialogFragment.getDialogId() == dialogId
110 && mDialogFragment.isVisible()) {
111 mDialogFragment.dismiss();
112 }
113 mDialogFragment = null;
114 }
115
Amith Yamasani43c69782010-12-01 09:04:36 -0800116 public static class SettingsDialogFragment extends DialogFragment {
Amith Yamasanid7993472010-08-18 13:59:28 -0700117 private int mDialogId;
118
Daisuke Miyakawa21c1abc2010-09-12 15:42:56 -0700119 private DialogCreatable mFragment;
Amith Yamasanid7993472010-08-18 13:59:28 -0700120
Amith Yamasani43c69782010-12-01 09:04:36 -0800121 public SettingsDialogFragment(DialogCreatable fragment, int dialogId) {
Amith Yamasanid7993472010-08-18 13:59:28 -0700122 mDialogId = dialogId;
123 mFragment = fragment;
124 }
125
126 @Override
127 public Dialog onCreateDialog(Bundle savedInstanceState) {
128 return mFragment.onCreateDialog(mDialogId);
129 }
130
131 public int getDialogId() {
132 return mDialogId;
133 }
134 }
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -0700135
136 protected boolean hasNextButton() {
137 return mNextButton != null;
138 }
139
140 protected Button getNextButton() {
141 return mNextButton;
142 }
143
Daisuke Miyakawa6ebf8612010-09-10 09:48:51 -0700144 public void finish() {
145 getActivity().onBackPressed();
146 }
147
Daisuke Miyakawab5647c52010-09-10 18:04:02 -0700148 public boolean startFragment(
149 Fragment caller, String fragmentClass, int requestCode, Bundle extras) {
Daisuke Miyakawa25af1502010-09-24 11:29:31 -0700150 if (getActivity() instanceof PreferenceActivity) {
151 PreferenceActivity preferenceActivity = (PreferenceActivity)getActivity();
Amith Yamasani928e78a2010-11-12 08:51:01 -0800152 preferenceActivity.startPreferencePanel(fragmentClass, extras, 0, null, caller,
153 requestCode);
Daisuke Miyakawa25af1502010-09-24 11:29:31 -0700154 return true;
Daisuke Miyakawab5647c52010-09-10 18:04:02 -0700155 } else {
Daisuke Miyakawa25af1502010-09-24 11:29:31 -0700156 Log.w(TAG, "Parent isn't PreferenceActivity, thus there's no way to launch the "
157 + "given Fragment (name: " + fragmentClass + ", requestCode: " + requestCode
158 + ")");
Daisuke Miyakawab5647c52010-09-10 18:04:02 -0700159 return false;
160 }
161 }
162
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -0700163 /**
164 * Sets up Button Bar possibly required in the Fragment. Probably available only in
165 * phones.
166 *
167 * Previously {@link PreferenceActivity} had the capability as hidden functionality.
168 */
169 private void setupButtonBar() {
170 // Originally from PreferenceActivity, which has had button bar inside its layout.
171 final Activity activity = getActivity();
172 final Intent intent = activity.getIntent();
173 final View buttonBar = activity.findViewById(com.android.internal.R.id.button_bar);
174 if (!intent.getBooleanExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, false) || buttonBar == null) {
175 return;
176 }
177
178 buttonBar.setVisibility(View.VISIBLE);
179 View tmpView = activity.findViewById(com.android.internal.R.id.back_button);
180 if (tmpView != null) {
181 // TODO: Assume this is pressed only in single pane, finishing current Activity.
182 try {
183 final Button backButton = (Button)tmpView;
184 backButton.setOnClickListener(new OnClickListener() {
185 public void onClick(View v) {
186 activity.setResult(Activity.RESULT_CANCELED);
187 activity.finish();
188 }
189 });
190 if (intent.hasExtra(EXTRA_PREFS_SET_BACK_TEXT)) {
191 String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_BACK_TEXT);
192 if (TextUtils.isEmpty(buttonText)) {
193 backButton.setVisibility(View.GONE);
194 }
195 else {
196 backButton.setText(buttonText);
197 }
198 }
199 } catch (ClassCastException e) {
200 Log.w(TAG, "The view originally for back_button is used not as Button. " +
201 "Ignored.");
202 }
203 }
204
205 tmpView = activity.findViewById(com.android.internal.R.id.skip_button);
206 if (tmpView != null) {
207 try {
208 final Button skipButton = (Button)tmpView;
209 skipButton.setOnClickListener(new OnClickListener() {
210 public void onClick(View v) {
211 activity.setResult(Activity.RESULT_OK);
212 activity.finish();
213 }
214 });
215 if (intent.getBooleanExtra(EXTRA_PREFS_SHOW_SKIP, false)) {
216 skipButton.setVisibility(View.VISIBLE);
217 }
218 } catch (ClassCastException e) {
219 Log.w(TAG, "The view originally for skip_button is used not as Button. " +
220 "Ignored.");
221 }
222 }
223
224 tmpView = activity.findViewById(com.android.internal.R.id.next_button);
225 if (tmpView != null) {
226 try {
227 mNextButton = (Button)tmpView;
228 mNextButton.setOnClickListener(new OnClickListener() {
229 public void onClick(View v) {
230 activity.setResult(Activity.RESULT_OK);
231 activity.finish();
232 }
233 });
234 // set our various button parameters
235 if (intent.hasExtra(EXTRA_PREFS_SET_NEXT_TEXT)) {
236 String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_NEXT_TEXT);
237 if (TextUtils.isEmpty(buttonText)) {
238 mNextButton.setVisibility(View.GONE);
239 }
240 else {
241 mNextButton.setText(buttonText);
242 }
243 }
244 } catch (ClassCastException e) {
245 Log.w(TAG, "The view originally for next_button is used not as Button. " +
246 "Ignored.");
247 mNextButton = null;
248 }
249 }
250 }
Amith Yamasanid7993472010-08-18 13:59:28 -0700251}