1 /* 2 * Copyright (C) 2007 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 17 package android.preference; 18 19 20 import android.annotation.UnsupportedAppUsage; 21 import android.content.Context; 22 import android.content.SharedPreferences; 23 import android.content.res.TypedArray; 24 import android.os.Parcel; 25 import android.os.Parcelable; 26 import android.text.TextUtils; 27 import android.util.AttributeSet; 28 import android.view.View; 29 import android.view.ViewGroup; 30 import android.view.ViewParent; 31 import android.widget.EditText; 32 33 /** 34 * A {@link Preference} that allows for string 35 * input. 36 * <p> 37 * It is a subclass of {@link DialogPreference} and shows the {@link EditText} 38 * in a dialog. This {@link EditText} can be modified either programmatically 39 * via {@link #getEditText()}, or through XML by setting any EditText 40 * attributes on the EditTextPreference. 41 * <p> 42 * This preference will store a string into the SharedPreferences. 43 * <p> 44 * See {@link android.R.styleable#EditText EditText Attributes}. 45 * 46 * @deprecated Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a> 47 * <a href="{@docRoot}reference/androidx/preference/package-summary.html"> 48 * Preference Library</a> for consistent behavior across all devices. For more information on 49 * using the AndroidX Preference Library see 50 * <a href="{@docRoot}guide/topics/ui/settings.html">Settings</a>. 51 */ 52 @Deprecated 53 public class EditTextPreference extends DialogPreference { 54 /** 55 * The edit text shown in the dialog. 56 */ 57 @UnsupportedAppUsage 58 private EditText mEditText; 59 60 private String mText; 61 private boolean mTextSet; 62 EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)63 public EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 64 super(context, attrs, defStyleAttr, defStyleRes); 65 66 mEditText = new EditText(context, attrs); 67 68 // Give it an ID so it can be saved/restored 69 mEditText.setId(com.android.internal.R.id.edit); 70 71 /* 72 * The preference framework and view framework both have an 'enabled' 73 * attribute. Most likely, the 'enabled' specified in this XML is for 74 * the preference framework, but it was also given to the view framework. 75 * We reset the enabled state. 76 */ 77 mEditText.setEnabled(true); 78 } 79 EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr)80 public EditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) { 81 this(context, attrs, defStyleAttr, 0); 82 } 83 EditTextPreference(Context context, AttributeSet attrs)84 public EditTextPreference(Context context, AttributeSet attrs) { 85 this(context, attrs, com.android.internal.R.attr.editTextPreferenceStyle); 86 } 87 EditTextPreference(Context context)88 public EditTextPreference(Context context) { 89 this(context, null); 90 } 91 92 /** 93 * Saves the text to the {@link SharedPreferences}. 94 * 95 * @param text The text to save 96 */ setText(String text)97 public void setText(String text) { 98 // Always persist/notify the first time. 99 final boolean changed = !TextUtils.equals(mText, text); 100 if (changed || !mTextSet) { 101 mText = text; 102 mTextSet = true; 103 persistString(text); 104 if(changed) { 105 notifyDependencyChange(shouldDisableDependents()); 106 notifyChanged(); 107 } 108 } 109 } 110 111 /** 112 * Gets the text from the {@link SharedPreferences}. 113 * 114 * @return The current preference value. 115 */ getText()116 public String getText() { 117 return mText; 118 } 119 120 @Override onBindDialogView(View view)121 protected void onBindDialogView(View view) { 122 super.onBindDialogView(view); 123 124 EditText editText = mEditText; 125 editText.setText(getText()); 126 127 ViewParent oldParent = editText.getParent(); 128 if (oldParent != view) { 129 if (oldParent != null) { 130 ((ViewGroup) oldParent).removeView(editText); 131 } 132 onAddEditTextToDialogView(view, editText); 133 } 134 } 135 136 /** 137 * Adds the EditText widget of this preference to the dialog's view. 138 * 139 * @param dialogView The dialog view. 140 */ onAddEditTextToDialogView(View dialogView, EditText editText)141 protected void onAddEditTextToDialogView(View dialogView, EditText editText) { 142 ViewGroup container = (ViewGroup) dialogView 143 .findViewById(com.android.internal.R.id.edittext_container); 144 if (container != null) { 145 container.addView(editText, ViewGroup.LayoutParams.MATCH_PARENT, 146 ViewGroup.LayoutParams.WRAP_CONTENT); 147 } 148 } 149 150 @Override onDialogClosed(boolean positiveResult)151 protected void onDialogClosed(boolean positiveResult) { 152 super.onDialogClosed(positiveResult); 153 154 if (positiveResult) { 155 String value = mEditText.getText().toString(); 156 if (callChangeListener(value)) { 157 setText(value); 158 } 159 } 160 } 161 162 @Override onGetDefaultValue(TypedArray a, int index)163 protected Object onGetDefaultValue(TypedArray a, int index) { 164 return a.getString(index); 165 } 166 167 @Override onSetInitialValue(boolean restoreValue, Object defaultValue)168 protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { 169 setText(restoreValue ? getPersistedString(mText) : (String) defaultValue); 170 } 171 172 @Override shouldDisableDependents()173 public boolean shouldDisableDependents() { 174 return TextUtils.isEmpty(mText) || super.shouldDisableDependents(); 175 } 176 177 /** 178 * Returns the {@link EditText} widget that will be shown in the dialog. 179 * 180 * @return The {@link EditText} widget that will be shown in the dialog. 181 */ getEditText()182 public EditText getEditText() { 183 return mEditText; 184 } 185 186 /** @hide */ 187 @Override needInputMethod()188 protected boolean needInputMethod() { 189 // We want the input method to show, if possible, when dialog is displayed 190 return true; 191 } 192 193 @Override onSaveInstanceState()194 protected Parcelable onSaveInstanceState() { 195 final Parcelable superState = super.onSaveInstanceState(); 196 if (isPersistent()) { 197 // No need to save instance state since it's persistent 198 return superState; 199 } 200 201 final SavedState myState = new SavedState(superState); 202 myState.text = getText(); 203 return myState; 204 } 205 206 @Override onRestoreInstanceState(Parcelable state)207 protected void onRestoreInstanceState(Parcelable state) { 208 if (state == null || !state.getClass().equals(SavedState.class)) { 209 // Didn't save state for us in onSaveInstanceState 210 super.onRestoreInstanceState(state); 211 return; 212 } 213 214 SavedState myState = (SavedState) state; 215 super.onRestoreInstanceState(myState.getSuperState()); 216 setText(myState.text); 217 } 218 219 private static class SavedState extends BaseSavedState { 220 String text; 221 SavedState(Parcel source)222 public SavedState(Parcel source) { 223 super(source); 224 text = source.readString(); 225 } 226 227 @Override writeToParcel(Parcel dest, int flags)228 public void writeToParcel(Parcel dest, int flags) { 229 super.writeToParcel(dest, flags); 230 dest.writeString(text); 231 } 232 SavedState(Parcelable superState)233 public SavedState(Parcelable superState) { 234 super(superState); 235 } 236 237 public static final @android.annotation.NonNull Parcelable.Creator<SavedState> CREATOR = 238 new Parcelable.Creator<SavedState>() { 239 public SavedState createFromParcel(Parcel in) { 240 return new SavedState(in); 241 } 242 243 public SavedState[] newArray(int size) { 244 return new SavedState[size]; 245 } 246 }; 247 } 248 249 } 250