• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 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 import android.compat.annotation.UnsupportedAppUsage;
20 import android.content.Context;
21 import android.content.res.TypedArray;
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 import android.util.AttributeSet;
25 import android.view.KeyEvent;
26 import android.view.View;
27 import android.widget.SeekBar;
28 import android.widget.SeekBar.OnSeekBarChangeListener;
29 
30 /**
31  * @hide
32  *
33  * @deprecated Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
34  *      <a href="{@docRoot}reference/androidx/preference/package-summary.html">
35  *      Preference Library</a> for consistent behavior across all devices. For more information on
36  *      using the AndroidX Preference Library see
37  *      <a href="{@docRoot}guide/topics/ui/settings.html">Settings</a>.
38  */
39 @Deprecated
40 public class SeekBarPreference extends Preference
41         implements OnSeekBarChangeListener {
42 
43     private int mProgress;
44     private int mMax;
45     private boolean mTrackingTouch;
46 
SeekBarPreference( Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)47     public SeekBarPreference(
48             Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
49         super(context, attrs, defStyleAttr, defStyleRes);
50 
51         TypedArray a = context.obtainStyledAttributes(
52                 attrs, com.android.internal.R.styleable.ProgressBar, defStyleAttr, defStyleRes);
53         setMax(a.getInt(com.android.internal.R.styleable.ProgressBar_max, mMax));
54         a.recycle();
55 
56         a = context.obtainStyledAttributes(attrs,
57                 com.android.internal.R.styleable.SeekBarPreference, defStyleAttr, defStyleRes);
58         final int layoutResId = a.getResourceId(
59                 com.android.internal.R.styleable.SeekBarPreference_layout,
60                 com.android.internal.R.layout.preference_widget_seekbar);
61         a.recycle();
62 
63         setLayoutResource(layoutResId);
64     }
65 
66     @UnsupportedAppUsage
SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr)67     public SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) {
68         this(context, attrs, defStyleAttr, 0);
69     }
70 
71     @UnsupportedAppUsage
SeekBarPreference(Context context, AttributeSet attrs)72     public SeekBarPreference(Context context, AttributeSet attrs) {
73         this(context, attrs, com.android.internal.R.attr.seekBarPreferenceStyle);
74     }
75 
76     @UnsupportedAppUsage
SeekBarPreference(Context context)77     public SeekBarPreference(Context context) {
78         this(context, null);
79     }
80 
81     @Override
onBindView(View view)82     protected void onBindView(View view) {
83         super.onBindView(view);
84         SeekBar seekBar = (SeekBar) view.findViewById(
85                 com.android.internal.R.id.seekbar);
86         seekBar.setOnSeekBarChangeListener(this);
87         seekBar.setMax(mMax);
88         seekBar.setProgress(mProgress);
89         seekBar.setEnabled(isEnabled());
90     }
91 
92     @Override
onSetInitialValue(boolean restoreValue, Object defaultValue)93     protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
94         setProgress(restoreValue ? getPersistedInt(mProgress)
95                 : (Integer) defaultValue);
96     }
97 
98     @Override
onGetDefaultValue(TypedArray a, int index)99     protected Object onGetDefaultValue(TypedArray a, int index) {
100         return a.getInt(index, 0);
101     }
102 
103     @Override
onKey(View v, int keyCode, KeyEvent event)104     public boolean onKey(View v, int keyCode, KeyEvent event) {
105         if (event.getAction() != KeyEvent.ACTION_DOWN) {
106             return false;
107         }
108 
109         SeekBar seekBar = (SeekBar) v.findViewById(com.android.internal.R.id.seekbar);
110         if (seekBar == null) {
111             return false;
112         }
113         return seekBar.onKeyDown(keyCode, event);
114     }
115 
setMax(int max)116     public void setMax(int max) {
117         if (max != mMax) {
118             mMax = max;
119             notifyChanged();
120         }
121     }
122 
setProgress(int progress)123     public void setProgress(int progress) {
124         setProgress(progress, true);
125     }
126 
setProgress(int progress, boolean notifyChanged)127     private void setProgress(int progress, boolean notifyChanged) {
128         if (progress > mMax) {
129             progress = mMax;
130         }
131         if (progress < 0) {
132             progress = 0;
133         }
134         if (progress != mProgress) {
135             mProgress = progress;
136             persistInt(progress);
137             if (notifyChanged) {
138                 notifyChanged();
139             }
140         }
141     }
142 
getProgress()143     public int getProgress() {
144         return mProgress;
145     }
146 
147     /**
148      * Persist the seekBar's progress value if callChangeListener
149      * returns true, otherwise set the seekBar's progress to the stored value
150      */
syncProgress(SeekBar seekBar)151     void syncProgress(SeekBar seekBar) {
152         int progress = seekBar.getProgress();
153         if (progress != mProgress) {
154             if (callChangeListener(progress)) {
155                 setProgress(progress, false);
156             } else {
157                 seekBar.setProgress(mProgress);
158             }
159         }
160     }
161 
162     @Override
onProgressChanged( SeekBar seekBar, int progress, boolean fromUser)163     public void onProgressChanged(
164             SeekBar seekBar, int progress, boolean fromUser) {
165         if (fromUser && !mTrackingTouch) {
166             syncProgress(seekBar);
167         }
168     }
169 
170     @Override
onStartTrackingTouch(SeekBar seekBar)171     public void onStartTrackingTouch(SeekBar seekBar) {
172         mTrackingTouch = true;
173     }
174 
175     @Override
onStopTrackingTouch(SeekBar seekBar)176     public void onStopTrackingTouch(SeekBar seekBar) {
177         mTrackingTouch = false;
178         if (seekBar.getProgress() != mProgress) {
179             syncProgress(seekBar);
180         }
181     }
182 
183     @Override
onSaveInstanceState()184     protected Parcelable onSaveInstanceState() {
185         /*
186          * Suppose a client uses this preference type without persisting. We
187          * must save the instance state so it is able to, for example, survive
188          * orientation changes.
189          */
190 
191         final Parcelable superState = super.onSaveInstanceState();
192         if (isPersistent()) {
193             // No need to save instance state since it's persistent
194             return superState;
195         }
196 
197         // Save the instance state
198         final SavedState myState = new SavedState(superState);
199         myState.progress = mProgress;
200         myState.max = mMax;
201         return myState;
202     }
203 
204     @Override
onRestoreInstanceState(Parcelable state)205     protected void onRestoreInstanceState(Parcelable state) {
206         if (!state.getClass().equals(SavedState.class)) {
207             // Didn't save state for us in onSaveInstanceState
208             super.onRestoreInstanceState(state);
209             return;
210         }
211 
212         // Restore the instance state
213         SavedState myState = (SavedState) state;
214         super.onRestoreInstanceState(myState.getSuperState());
215         mProgress = myState.progress;
216         mMax = myState.max;
217         notifyChanged();
218     }
219 
220     /**
221      * SavedState, a subclass of {@link BaseSavedState}, will store the state
222      * of MyPreference, a subclass of Preference.
223      * <p>
224      * It is important to always call through to super methods.
225      */
226     private static class SavedState extends BaseSavedState {
227         int progress;
228         int max;
229 
SavedState(Parcel source)230         public SavedState(Parcel source) {
231             super(source);
232 
233             // Restore the click counter
234             progress = source.readInt();
235             max = source.readInt();
236         }
237 
238         @Override
writeToParcel(Parcel dest, int flags)239         public void writeToParcel(Parcel dest, int flags) {
240             super.writeToParcel(dest, flags);
241 
242             // Save the click counter
243             dest.writeInt(progress);
244             dest.writeInt(max);
245         }
246 
SavedState(Parcelable superState)247         public SavedState(Parcelable superState) {
248             super(superState);
249         }
250 
251         @SuppressWarnings("unused")
252         public static final @android.annotation.NonNull Parcelable.Creator<SavedState> CREATOR =
253                 new Parcelable.Creator<SavedState>() {
254             public SavedState createFromParcel(Parcel in) {
255                 return new SavedState(in);
256             }
257 
258             public SavedState[] newArray(int size) {
259                 return new SavedState[size];
260             }
261         };
262     }
263 }
264