blob: f7e3b02d61818e708c5c8610de34e3909a63fc7a [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
19import android.app.Dialog;
20import android.app.DialogFragment;
Daisuke Miyakawab5647c52010-09-10 18:04:02 -070021import android.app.Fragment;
Amith Yamasanid7993472010-08-18 13:59:28 -070022import android.content.ContentResolver;
Hung-ying Tyan0ee51e02011-01-25 16:42:14 +080023import android.content.DialogInterface;
Amith Yamasanid7993472010-08-18 13:59:28 -070024import android.content.pm.PackageManager;
Amith Yamasanid7993472010-08-18 13:59:28 -070025import android.os.Bundle;
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -070026import android.preference.PreferenceActivity;
Amith Yamasanid7993472010-08-18 13:59:28 -070027import android.preference.PreferenceFragment;
28import android.util.Log;
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -070029import android.widget.Button;
Amith Yamasanid7993472010-08-18 13:59:28 -070030
Daisuke Miyakawaf58090d2010-09-12 17:27:33 -070031/**
Amith Yamasanid7993472010-08-18 13:59:28 -070032 * Base class for Settings fragments, with some helper functions and dialog management.
33 */
Gilles Debunne64650542011-08-23 11:01:35 -070034public class SettingsPreferenceFragment extends PreferenceFragment implements DialogCreatable {
Amith Yamasanid7993472010-08-18 13:59:28 -070035
36 private static final String TAG = "SettingsPreferenceFragment";
37
38 private SettingsDialogFragment mDialogFragment;
39
Daisuke Miyakawab5647c52010-09-10 18:04:02 -070040 @Override
Amith Yamasanid7993472010-08-18 13:59:28 -070041 public void onActivityCreated(Bundle savedInstanceState) {
42 super.onActivityCreated(savedInstanceState);
Amith Yamasanid7993472010-08-18 13:59:28 -070043 }
44
Daisuke Miyakawab5647c52010-09-10 18:04:02 -070045 /*
46 * The name is intentionally made different from Activity#finish(), so that
47 * users won't misunderstand its meaning.
48 */
49 public final void finishFragment() {
50 getActivity().onBackPressed();
51 }
52
Amith Yamasanid7993472010-08-18 13:59:28 -070053 // Some helpers for functions used by the settings fragments when they were activities
54
55 /**
56 * Returns the ContentResolver from the owning Activity.
57 */
58 protected ContentResolver getContentResolver() {
59 return getActivity().getContentResolver();
60 }
61
62 /**
63 * Returns the specified system service from the owning Activity.
64 */
65 protected Object getSystemService(final String name) {
66 return getActivity().getSystemService(name);
67 }
68
69 /**
Amith Yamasanid7993472010-08-18 13:59:28 -070070 * Returns the PackageManager from the owning Activity.
71 */
72 protected PackageManager getPackageManager() {
73 return getActivity().getPackageManager();
74 }
75
Dianne Hackborn0385cf12011-01-24 16:22:13 -080076 @Override
77 public void onDetach() {
78 if (isRemoving()) {
79 if (mDialogFragment != null) {
80 mDialogFragment.dismiss();
81 mDialogFragment = null;
82 }
83 }
84 super.onDetach();
85 }
86
Amith Yamasanid7993472010-08-18 13:59:28 -070087 // Dialog management
88
89 protected void showDialog(int dialogId) {
90 if (mDialogFragment != null) {
91 Log.e(TAG, "Old dialog fragment not null!");
92 }
93 mDialogFragment = new SettingsDialogFragment(this, dialogId);
Daisuke Miyakawa21c1abc2010-09-12 15:42:56 -070094 mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId));
Amith Yamasanid7993472010-08-18 13:59:28 -070095 }
96
97 public Dialog onCreateDialog(int dialogId) {
98 return null;
99 }
100
101 protected void removeDialog(int dialogId) {
Hung-ying Tyanadc83d82011-01-24 15:05:27 +0800102 // mDialogFragment may not be visible yet in parent fragment's onResume().
103 // To be able to dismiss dialog at that time, don't check
104 // mDialogFragment.isVisible().
105 if (mDialogFragment != null && mDialogFragment.getDialogId() == dialogId) {
Amith Yamasanid7993472010-08-18 13:59:28 -0700106 mDialogFragment.dismiss();
107 }
108 mDialogFragment = null;
109 }
110
Hung-ying Tyan0ee51e02011-01-25 16:42:14 +0800111 /**
112 * Sets the OnCancelListener of the dialog shown. This method can only be
113 * called after showDialog(int) and before removeDialog(int). The method
114 * does nothing otherwise.
115 */
116 protected void setOnCancelListener(DialogInterface.OnCancelListener listener) {
117 if (mDialogFragment != null) {
118 mDialogFragment.mOnCancelListener = listener;
119 }
120 }
121
122 /**
123 * Sets the OnDismissListener of the dialog shown. This method can only be
124 * called after showDialog(int) and before removeDialog(int). The method
125 * does nothing otherwise.
126 */
127 protected void setOnDismissListener(DialogInterface.OnDismissListener listener) {
128 if (mDialogFragment != null) {
129 mDialogFragment.mOnDismissListener = listener;
130 }
131 }
132
Amith Yamasani43c69782010-12-01 09:04:36 -0800133 public static class SettingsDialogFragment extends DialogFragment {
Svetoslav Ganov749ba652010-12-09 14:53:02 -0800134 private static final String KEY_DIALOG_ID = "key_dialog_id";
135 private static final String KEY_PARENT_FRAGMENT_ID = "key_parent_fragment_id";
136
Amith Yamasanid7993472010-08-18 13:59:28 -0700137 private int mDialogId;
138
Svetoslav Ganov749ba652010-12-09 14:53:02 -0800139 private Fragment mParentFragment;
140
Hung-ying Tyan0ee51e02011-01-25 16:42:14 +0800141 private DialogInterface.OnCancelListener mOnCancelListener;
142 private DialogInterface.OnDismissListener mOnDismissListener;
143
Svetoslav Ganov749ba652010-12-09 14:53:02 -0800144 public SettingsDialogFragment() {
145 /* do nothing */
146 }
Amith Yamasanid7993472010-08-18 13:59:28 -0700147
Amith Yamasani43c69782010-12-01 09:04:36 -0800148 public SettingsDialogFragment(DialogCreatable fragment, int dialogId) {
Amith Yamasanid7993472010-08-18 13:59:28 -0700149 mDialogId = dialogId;
Svetoslav Ganov749ba652010-12-09 14:53:02 -0800150 if (!(fragment instanceof Fragment)) {
151 throw new IllegalArgumentException("fragment argument must be an instance of "
152 + Fragment.class.getName());
153 }
154 mParentFragment = (Fragment) fragment;
155 }
156
157 @Override
Dianne Hackborn300768f2011-01-27 20:39:21 -0800158 public void onSaveInstanceState(Bundle outState) {
159 super.onSaveInstanceState(outState);
160 if (mParentFragment != null) {
161 outState.putInt(KEY_DIALOG_ID, mDialogId);
162 outState.putInt(KEY_PARENT_FRAGMENT_ID, mParentFragment.getId());
163 }
164 }
165
166 @Override
167 public Dialog onCreateDialog(Bundle savedInstanceState) {
Svetoslav Ganov749ba652010-12-09 14:53:02 -0800168 if (savedInstanceState != null) {
169 mDialogId = savedInstanceState.getInt(KEY_DIALOG_ID, 0);
170 int mParentFragmentId = savedInstanceState.getInt(KEY_PARENT_FRAGMENT_ID, -1);
171 if (mParentFragmentId > -1) {
172 mParentFragment = getFragmentManager().findFragmentById(mParentFragmentId);
173 if (!(mParentFragment instanceof DialogCreatable)) {
174 throw new IllegalArgumentException(
175 KEY_PARENT_FRAGMENT_ID + " must implement "
176 + DialogCreatable.class.getName());
177 }
178 }
Amith Yamasani8875ede2011-01-31 12:46:57 -0800179 // This dialog fragment could be created from non-SettingsPreferenceFragment
180 if (mParentFragment instanceof SettingsPreferenceFragment) {
181 // restore mDialogFragment in mParentFragment
182 ((SettingsPreferenceFragment) mParentFragment).mDialogFragment = this;
183 }
Svetoslav Ganov749ba652010-12-09 14:53:02 -0800184 }
Svetoslav Ganov749ba652010-12-09 14:53:02 -0800185 return ((DialogCreatable) mParentFragment).onCreateDialog(mDialogId);
Amith Yamasanid7993472010-08-18 13:59:28 -0700186 }
187
Hung-ying Tyan0ee51e02011-01-25 16:42:14 +0800188 @Override
189 public void onCancel(DialogInterface dialog) {
190 super.onCancel(dialog);
191 if (mOnCancelListener != null) {
192 mOnCancelListener.onCancel(dialog);
193 }
194 }
195
196 @Override
197 public void onDismiss(DialogInterface dialog) {
198 super.onDismiss(dialog);
199 if (mOnDismissListener != null) {
200 mOnDismissListener.onDismiss(dialog);
201 }
202 }
Amith Yamasani8875ede2011-01-31 12:46:57 -0800203
Amith Yamasanid7993472010-08-18 13:59:28 -0700204 public int getDialogId() {
205 return mDialogId;
206 }
Hung-ying Tyan18eb39d2011-01-28 16:17:27 +0800207
208 @Override
209 public void onDetach() {
210 super.onDetach();
211
Amith Yamasani8875ede2011-01-31 12:46:57 -0800212 // This dialog fragment could be created from non-SettingsPreferenceFragment
213 if (mParentFragment instanceof SettingsPreferenceFragment) {
214 // in case the dialog is not explicitly removed by removeDialog()
215 if (((SettingsPreferenceFragment) mParentFragment).mDialogFragment == this) {
216 ((SettingsPreferenceFragment) mParentFragment).mDialogFragment = null;
217 }
Hung-ying Tyan18eb39d2011-01-28 16:17:27 +0800218 }
219 }
Amith Yamasanid7993472010-08-18 13:59:28 -0700220 }
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -0700221
222 protected boolean hasNextButton() {
Daisuke Miyakawa79c5fd92011-01-15 14:58:00 -0800223 return ((ButtonBarHandler)getActivity()).hasNextButton();
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -0700224 }
225
226 protected Button getNextButton() {
Daisuke Miyakawa79c5fd92011-01-15 14:58:00 -0800227 return ((ButtonBarHandler)getActivity()).getNextButton();
Daisuke Miyakawa9c8bde52010-08-25 11:58:37 -0700228 }
229
Daisuke Miyakawa6ebf8612010-09-10 09:48:51 -0700230 public void finish() {
231 getActivity().onBackPressed();
232 }
233
Daisuke Miyakawab5647c52010-09-10 18:04:02 -0700234 public boolean startFragment(
235 Fragment caller, String fragmentClass, int requestCode, Bundle extras) {
Daisuke Miyakawa25af1502010-09-24 11:29:31 -0700236 if (getActivity() instanceof PreferenceActivity) {
237 PreferenceActivity preferenceActivity = (PreferenceActivity)getActivity();
Gilles Debunne64650542011-08-23 11:01:35 -0700238 preferenceActivity.startPreferencePanel(fragmentClass, extras,
239 R.string.lock_settings_picker_title, null, caller, requestCode);
Daisuke Miyakawa25af1502010-09-24 11:29:31 -0700240 return true;
Daisuke Miyakawab5647c52010-09-10 18:04:02 -0700241 } else {
Daisuke Miyakawa25af1502010-09-24 11:29:31 -0700242 Log.w(TAG, "Parent isn't PreferenceActivity, thus there's no way to launch the "
243 + "given Fragment (name: " + fragmentClass + ", requestCode: " + requestCode
244 + ")");
Daisuke Miyakawab5647c52010-09-10 18:04:02 -0700245 return false;
246 }
247 }
248
Amith Yamasanid7993472010-08-18 13:59:28 -0700249}