19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.preference; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.AlertDialog; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Dialog; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 341d458570757e607f0dc11fb0e963017916ac0701Amith Yamasaniimport android.view.Window; 351d458570757e607f0dc11fb0e963017916ac0701Amith Yamasaniimport android.view.WindowManager; 361d458570757e607f0dc11fb0e963017916ac0701Amith Yamasaniimport android.view.inputmethod.InputMethodManager; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A base class for {@link Preference} objects that are 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dialog-based. These preferences will, when clicked, open a dialog showing the 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * actual preference controls. 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#DialogPreference_dialogTitle 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#DialogPreference_dialogMessage 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#DialogPreference_dialogIcon 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#DialogPreference_dialogLayout 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#DialogPreference_positiveButtonText 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#DialogPreference_negativeButtonText 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class DialogPreference extends Preference implements 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DialogInterface.OnClickListener, DialogInterface.OnDismissListener, 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PreferenceManager.OnActivityDestroyListener { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private AlertDialog.Builder mBuilder; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CharSequence mDialogTitle; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CharSequence mDialogMessage; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mDialogIcon; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CharSequence mPositiveButtonText; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CharSequence mNegativeButtonText; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDialogLayoutResId; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** The dialog, if it is showing. */ 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Dialog mDialog; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Which button was clicked. */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mWhichButtonClicked; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DialogPreference(Context context, AttributeSet attrs, int defStyle) { 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = context.obtainStyledAttributes(attrs, 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.DialogPreference, defStyle, 0); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialogTitle = a.getString(com.android.internal.R.styleable.DialogPreference_dialogTitle); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDialogTitle == null) { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Fallback on the regular title of the preference 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (the one that is seen in the list) 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialogTitle = getTitle(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialogMessage = a.getString(com.android.internal.R.styleable.DialogPreference_dialogMessage); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialogIcon = a.getDrawable(com.android.internal.R.styleable.DialogPreference_dialogIcon); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPositiveButtonText = a.getString(com.android.internal.R.styleable.DialogPreference_positiveButtonText); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNegativeButtonText = a.getString(com.android.internal.R.styleable.DialogPreference_negativeButtonText); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialogLayoutResId = a.getResourceId(com.android.internal.R.styleable.DialogPreference_dialogLayout, 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialogLayoutResId); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DialogPreference(Context context, AttributeSet attrs) { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, com.android.internal.R.attr.dialogPreferenceStyle); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the title of the dialog. This will be shown on subsequent dialogs. 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dialogTitle The title. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDialogTitle(CharSequence dialogTitle) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialogTitle = dialogTitle; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setDialogTitle(CharSequence) 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dialogTitleResId The dialog title as a resource. 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDialogTitle(int dialogTitleResId) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDialogTitle(getContext().getString(dialogTitleResId)); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the title to be shown on subsequent dialogs. 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The title. 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getDialogTitle() { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDialogTitle; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the message of the dialog. This will be shown on subsequent dialogs. 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This message forms the content View of the dialog and conflicts with 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * list-based dialogs, for example. If setting a custom View on a dialog via 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setDialogLayoutResource(int)}, include a text View with ID 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.id#message} and it will be populated with this message. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dialogMessage The message. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDialogMessage(CharSequence dialogMessage) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialogMessage = dialogMessage; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setDialogMessage(CharSequence) 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dialogMessageResId The dialog message as a resource. 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDialogMessage(int dialogMessageResId) { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDialogMessage(getContext().getString(dialogMessageResId)); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the message to be shown on subsequent dialogs. 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The message. 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getDialogMessage() { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDialogMessage; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the icon of the dialog. This will be shown on subsequent dialogs. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dialogIcon The icon, as a {@link Drawable}. 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDialogIcon(Drawable dialogIcon) { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialogIcon = dialogIcon; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the icon (resource ID) of the dialog. This will be shown on 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * subsequent dialogs. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dialogIconRes The icon, as a resource ID. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDialogIcon(int dialogIconRes) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialogIcon = getContext().getResources().getDrawable(dialogIconRes); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the icon to be shown on subsequent dialogs. 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The icon, as a {@link Drawable}. 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getDialogIcon() { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDialogIcon; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the text of the positive button of the dialog. This will be shown on 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * subsequent dialogs. 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param positiveButtonText The text of the positive button. 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPositiveButtonText(CharSequence positiveButtonText) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPositiveButtonText = positiveButtonText; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setPositiveButtonText(CharSequence) 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param positiveButtonTextResId The positive button text as a resource. 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPositiveButtonText(int positiveButtonTextResId) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPositiveButtonText(getContext().getString(positiveButtonTextResId)); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the text of the positive button to be shown on subsequent 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dialogs. 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The text of the positive button. 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getPositiveButtonText() { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPositiveButtonText; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the text of the negative button of the dialog. This will be shown on 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * subsequent dialogs. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param negativeButtonText The text of the negative button. 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setNegativeButtonText(CharSequence negativeButtonText) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNegativeButtonText = negativeButtonText; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setNegativeButtonText(CharSequence) 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param negativeButtonTextResId The negative button text as a resource. 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setNegativeButtonText(int negativeButtonTextResId) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setNegativeButtonText(getContext().getString(negativeButtonTextResId)); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the text of the negative button to be shown on subsequent 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dialogs. 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The text of the negative button. 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence getNegativeButtonText() { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNegativeButtonText; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the layout resource that is inflated as the {@link View} to be shown 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as the content View of subsequent dialogs. 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dialogLayoutResId The layout resource ID to be inflated. 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setDialogMessage(CharSequence) 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDialogLayoutResource(int dialogLayoutResId) { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialogLayoutResId = dialogLayoutResId; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the layout resource that is used as the content View for 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * subsequent dialogs. 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The layout resource. 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDialogLayoutResource() { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDialogLayoutResId; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Prepares the dialog builder to be shown when the preference is clicked. 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use this to set custom properties on the dialog. 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Do not {@link AlertDialog.Builder#create()} or 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link AlertDialog.Builder#show()}. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onClick() { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showDialog(null); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Shows the dialog associated with this Preference. This is normally initiated 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * automatically on clicking on the preference. Call this method if you need to 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * show the dialog on some other event. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param state Optional instance state to restore on the dialog 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void showDialog(Bundle state) { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context context = getContext(); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWhichButtonClicked = DialogInterface.BUTTON2; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuilder = new AlertDialog.Builder(context) 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setTitle(mDialogTitle) 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setIcon(mDialogIcon) 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setPositiveButton(mPositiveButtonText, this) 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setNegativeButton(mNegativeButtonText, this); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View contentView = onCreateDialogView(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (contentView != null) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onBindDialogView(contentView); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuilder.setView(contentView); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuilder.setMessage(mDialogMessage); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onPrepareDialogBuilder(mBuilder); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getPreferenceManager().registerOnActivityDestroyListener(this); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Create the dialog 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Dialog dialog = mDialog = mBuilder.create(); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state != null) { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dialog.onRestoreInstanceState(state); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3031d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani if (needInputMethod()) { 3041d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani requestInputMethod(dialog); 3051d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dialog.setOnDismissListener(this); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dialog.show(); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3091d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani 3101d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani /** 3111d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani * Returns whether the preference needs to display a soft input method when the dialog 3121d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani * is displayed. Default is false. Subclasses should override this method if they need 3131d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani * the soft input method brought up automatically. 3141d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani * @hide 3151d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani */ 3161d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani protected boolean needInputMethod() { 3171d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani return false; 3181d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani } 3191d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani 3201d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani /** 3211d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani * Sets the required flags on the dialog window to enable input method window to show up. 3221d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani */ 3231d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani private void requestInputMethod(Dialog dialog) { 3241d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani Window window = dialog.getWindow(); 3251d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE | 3261d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 3271d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani } 3281d458570757e607f0dc11fb0e963017916ac0701Amith Yamasani 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates the content view for the dialog (if a custom content view is 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * required). By default, it inflates the dialog layout resource if it is 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * set. 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The content View for the dialog. 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setLayoutResource(int) 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected View onCreateDialogView() { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDialogLayoutResId == 0) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context.LAYOUT_INFLATER_SERVICE); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return inflater.inflate(mDialogLayoutResId, null); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Binds views in the content View of the dialog to data. 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Make sure to call through to the superclass implementation. 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view The content View of the dialog, if it is custom. 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onBindDialogView(View view) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View dialogMessageView = view.findViewById(com.android.internal.R.id.message); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dialogMessageView != null) { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final CharSequence message = getDialogMessage(); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int newVisibility = View.GONE; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!TextUtils.isEmpty(message)) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dialogMessageView instanceof TextView) { 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((TextView) dialogMessageView).setText(message); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newVisibility = View.VISIBLE; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dialogMessageView.getVisibility() != newVisibility) { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dialogMessageView.setVisibility(newVisibility); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(DialogInterface dialog, int which) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWhichButtonClicked = which; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onDismiss(DialogInterface dialog) { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getPreferenceManager().unregisterOnActivityDestroyListener(this); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialog = null; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onDialogClosed(mWhichButtonClicked == DialogInterface.BUTTON_POSITIVE); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when the dialog is dismissed and should be used to save data to 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link SharedPreferences}. 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param positiveResult Whether the positive button was clicked (true), or 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the negative button was clicked or the dialog was canceled (false). 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDialogClosed(boolean positiveResult) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the dialog that is shown by this preference. 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The dialog, or null if a dialog is not being shown. 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Dialog getDialog() { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDialog; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onActivityDestroy() { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDialog == null || !mDialog.isShowing()) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDialog.dismiss(); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Parcelable onSaveInstanceState() { 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Parcelable superState = super.onSaveInstanceState(); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDialog == null || !mDialog.isShowing()) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return superState; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SavedState myState = new SavedState(superState); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project myState.isDialogShowing = true; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project myState.dialogBundle = mDialog.onSaveInstanceState(); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return myState; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onRestoreInstanceState(Parcelable state) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == null || !state.getClass().equals(SavedState.class)) { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Didn't save state for us in onSaveInstanceState 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(state); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState myState = (SavedState) state; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(myState.getSuperState()); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (myState.isDialogShowing) { 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showDialog(myState.dialogBundle); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class SavedState extends BaseSavedState { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isDialogShowing; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle dialogBundle; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState(Parcel source) { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isDialogShowing = source.readInt() == 1; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dialogBundle = source.readBundle(); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.writeToParcel(dest, flags); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(isDialogShowing ? 1 : 0); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeBundle(dialogBundle); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState(Parcelable superState) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(superState); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<SavedState> CREATOR = 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Parcelable.Creator<SavedState>() { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState createFromParcel(Parcel in) { 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState(in); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState[] newArray(int size) { 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState[size]; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 480