• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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