1/* 2 * Copyright (C) 2015 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 android.support.v7.preference; 18 19import android.content.Context; 20import android.content.res.TypedArray; 21import android.graphics.drawable.Drawable; 22import android.support.v4.content.ContextCompat; 23import android.support.v4.content.res.TypedArrayUtils; 24import android.util.AttributeSet; 25import android.view.View; 26 27/** 28 * A base class for {@link Preference} objects that are 29 * dialog-based. These preferences will, when clicked, open a dialog showing the 30 * actual preference controls. 31 * 32 * @attr ref android.R.styleable#DialogPreference_dialogTitle 33 * @attr ref android.R.styleable#DialogPreference_dialogMessage 34 * @attr ref android.R.styleable#DialogPreference_dialogIcon 35 * @attr ref android.R.styleable#DialogPreference_dialogLayout 36 * @attr ref android.R.styleable#DialogPreference_positiveButtonText 37 * @attr ref android.R.styleable#DialogPreference_negativeButtonText 38 */ 39public abstract class DialogPreference extends Preference { 40 41 public interface TargetFragment { 42 Preference findPreference(CharSequence key); 43 } 44 45 private CharSequence mDialogTitle; 46 private CharSequence mDialogMessage; 47 private Drawable mDialogIcon; 48 private CharSequence mPositiveButtonText; 49 private CharSequence mNegativeButtonText; 50 private int mDialogLayoutResId; 51 52 public DialogPreference( 53 Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 54 super(context, attrs, defStyleAttr, defStyleRes); 55 56 final TypedArray a = context.obtainStyledAttributes(attrs, 57 R.styleable.DialogPreference, defStyleAttr, defStyleRes); 58 59 mDialogTitle = TypedArrayUtils.getString(a, R.styleable.DialogPreference_dialogTitle, 60 R.styleable.DialogPreference_android_dialogTitle); 61 if (mDialogTitle == null) { 62 // Fall back on the regular title of the preference 63 // (the one that is seen in the list) 64 mDialogTitle = getTitle(); 65 } 66 67 mDialogMessage = TypedArrayUtils.getString(a, R.styleable.DialogPreference_dialogMessage, 68 R.styleable.DialogPreference_android_dialogMessage); 69 70 mDialogIcon = TypedArrayUtils.getDrawable(a, R.styleable.DialogPreference_dialogIcon, 71 R.styleable.DialogPreference_android_dialogIcon); 72 73 mPositiveButtonText = TypedArrayUtils.getString(a, 74 R.styleable.DialogPreference_positiveButtonText, 75 R.styleable.DialogPreference_android_positiveButtonText); 76 77 mNegativeButtonText = TypedArrayUtils.getString(a, 78 R.styleable.DialogPreference_negativeButtonText, 79 R.styleable.DialogPreference_android_negativeButtonText); 80 81 mDialogLayoutResId = TypedArrayUtils.getResourceId(a, 82 R.styleable.DialogPreference_dialogLayout, 83 R.styleable.DialogPreference_android_dialogLayout, 0); 84 85 a.recycle(); 86 } 87 88 public DialogPreference(Context context, AttributeSet attrs, int defStyleAttr) { 89 this(context, attrs, defStyleAttr, 0); 90 } 91 92 public DialogPreference(Context context, AttributeSet attrs) { 93 this(context, attrs, R.attr.dialogPreferenceStyle); 94 } 95 96 public DialogPreference(Context context) { 97 this(context, null); 98 } 99 100 /** 101 * Sets the title of the dialog. This will be shown on subsequent dialogs. 102 * 103 * @param dialogTitle The title. 104 */ 105 public void setDialogTitle(CharSequence dialogTitle) { 106 mDialogTitle = dialogTitle; 107 } 108 109 /** 110 * @see #setDialogTitle(CharSequence) 111 * @param dialogTitleResId The dialog title as a resource. 112 */ 113 public void setDialogTitle(int dialogTitleResId) { 114 setDialogTitle(getContext().getString(dialogTitleResId)); 115 } 116 117 /** 118 * Returns the title to be shown on subsequent dialogs. 119 * @return The title. 120 */ 121 public CharSequence getDialogTitle() { 122 return mDialogTitle; 123 } 124 125 /** 126 * Sets the message of the dialog. This will be shown on subsequent dialogs. 127 * <p> 128 * This message forms the content View of the dialog and conflicts with 129 * list-based dialogs, for example. If setting a custom View on a dialog via 130 * {@link #setDialogLayoutResource(int)}, include a text View with ID 131 * {@link android.R.id#message} and it will be populated with this message. 132 * 133 * @param dialogMessage The message. 134 */ 135 public void setDialogMessage(CharSequence dialogMessage) { 136 mDialogMessage = dialogMessage; 137 } 138 139 /** 140 * @see #setDialogMessage(CharSequence) 141 * @param dialogMessageResId The dialog message as a resource. 142 */ 143 public void setDialogMessage(int dialogMessageResId) { 144 setDialogMessage(getContext().getString(dialogMessageResId)); 145 } 146 147 /** 148 * Returns the message to be shown on subsequent dialogs. 149 * @return The message. 150 */ 151 public CharSequence getDialogMessage() { 152 return mDialogMessage; 153 } 154 155 /** 156 * Sets the icon of the dialog. This will be shown on subsequent dialogs. 157 * 158 * @param dialogIcon The icon, as a {@link Drawable}. 159 */ 160 public void setDialogIcon(Drawable dialogIcon) { 161 mDialogIcon = dialogIcon; 162 } 163 164 /** 165 * Sets the icon (resource ID) of the dialog. This will be shown on 166 * subsequent dialogs. 167 * 168 * @param dialogIconRes The icon, as a resource ID. 169 */ 170 public void setDialogIcon(int dialogIconRes) { 171 mDialogIcon = ContextCompat.getDrawable(getContext(), dialogIconRes); 172 } 173 174 /** 175 * Returns the icon to be shown on subsequent dialogs. 176 * @return The icon, as a {@link Drawable}. 177 */ 178 public Drawable getDialogIcon() { 179 return mDialogIcon; 180 } 181 182 /** 183 * Sets the text of the positive button of the dialog. This will be shown on 184 * subsequent dialogs. 185 * 186 * @param positiveButtonText The text of the positive button. 187 */ 188 public void setPositiveButtonText(CharSequence positiveButtonText) { 189 mPositiveButtonText = positiveButtonText; 190 } 191 192 /** 193 * @see #setPositiveButtonText(CharSequence) 194 * @param positiveButtonTextResId The positive button text as a resource. 195 */ 196 public void setPositiveButtonText(int positiveButtonTextResId) { 197 setPositiveButtonText(getContext().getString(positiveButtonTextResId)); 198 } 199 200 /** 201 * Returns the text of the positive button to be shown on subsequent 202 * dialogs. 203 * 204 * @return The text of the positive button. 205 */ 206 public CharSequence getPositiveButtonText() { 207 return mPositiveButtonText; 208 } 209 210 /** 211 * Sets the text of the negative button of the dialog. This will be shown on 212 * subsequent dialogs. 213 * 214 * @param negativeButtonText The text of the negative button. 215 */ 216 public void setNegativeButtonText(CharSequence negativeButtonText) { 217 mNegativeButtonText = negativeButtonText; 218 } 219 220 /** 221 * @see #setNegativeButtonText(CharSequence) 222 * @param negativeButtonTextResId The negative button text as a resource. 223 */ 224 public void setNegativeButtonText(int negativeButtonTextResId) { 225 setNegativeButtonText(getContext().getString(negativeButtonTextResId)); 226 } 227 228 /** 229 * Returns the text of the negative button to be shown on subsequent 230 * dialogs. 231 * 232 * @return The text of the negative button. 233 */ 234 public CharSequence getNegativeButtonText() { 235 return mNegativeButtonText; 236 } 237 238 /** 239 * Sets the layout resource that is inflated as the {@link View} to be shown 240 * as the content View of subsequent dialogs. 241 * 242 * @param dialogLayoutResId The layout resource ID to be inflated. 243 * @see #setDialogMessage(CharSequence) 244 */ 245 public void setDialogLayoutResource(int dialogLayoutResId) { 246 mDialogLayoutResId = dialogLayoutResId; 247 } 248 249 /** 250 * Returns the layout resource that is used as the content View for 251 * subsequent dialogs. 252 * 253 * @return The layout resource. 254 */ 255 public int getDialogLayoutResource() { 256 return mDialogLayoutResId; 257 } 258 259 @Override 260 protected void onClick() { 261 getPreferenceManager().showDialog(this); 262 } 263 264} 265