• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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 com.android.settings.accessibility;
18 
19 import android.content.Context;
20 import android.widget.SeekBar;
21 
22 import androidx.annotation.NonNull;
23 import androidx.preference.PreferenceScreen;
24 
25 import com.android.settings.core.BasePreferenceController;
26 import com.android.settings.widget.LabeledSeekBarPreference;
27 
28 /**
29  * The controller of {@link LabeledSeekBarPreference} that listens to display size and font size
30  * settings changes and updates preview size threshold smoothly.
31  */
32 class PreviewSizeSeekBarController extends BasePreferenceController implements
33         TextReadingResetController.ResetStateListener {
34     private final PreviewSizeData<? extends Number> mSizeData;
35     private boolean mSeekByTouch;
36     private ProgressInteractionListener mInteractionListener;
37     private LabeledSeekBarPreference mSeekBarPreference;
38 
39     private final SeekBar.OnSeekBarChangeListener mSeekBarChangeListener =
40             new SeekBar.OnSeekBarChangeListener() {
41                 @Override
42                 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
43                     mInteractionListener.notifyPreferenceChanged();
44 
45                     if (!mSeekByTouch && mInteractionListener != null) {
46                         mInteractionListener.onProgressChanged();
47                     }
48 
49                 }
50 
51                 @Override
52                 public void onStartTrackingTouch(SeekBar seekBar) {
53                     mSeekByTouch = true;
54                 }
55 
56                 @Override
57                 public void onStopTrackingTouch(SeekBar seekBar) {
58                     mSeekByTouch = false;
59 
60                     if (mInteractionListener != null) {
61                         mInteractionListener.onEndTrackingTouch();
62                     }
63                 }
64             };
65 
PreviewSizeSeekBarController(Context context, String preferenceKey, @NonNull PreviewSizeData<? extends Number> sizeData)66     PreviewSizeSeekBarController(Context context, String preferenceKey,
67             @NonNull PreviewSizeData<? extends Number> sizeData) {
68         super(context, preferenceKey);
69         mSizeData = sizeData;
70     }
71 
setInteractionListener(ProgressInteractionListener interactionListener)72     void setInteractionListener(ProgressInteractionListener interactionListener) {
73         mInteractionListener = interactionListener;
74     }
75 
76     @Override
getAvailabilityStatus()77     public int getAvailabilityStatus() {
78         return AVAILABLE;
79     }
80 
81     @Override
displayPreference(PreferenceScreen screen)82     public void displayPreference(PreferenceScreen screen) {
83         super.displayPreference(screen);
84 
85         final int dataSize = mSizeData.getValues().size();
86         final int initialIndex = mSizeData.getInitialIndex();
87         mSeekBarPreference = screen.findPreference(getPreferenceKey());
88         mSeekBarPreference.setMax(dataSize - 1);
89         mSeekBarPreference.setProgress(initialIndex);
90         mSeekBarPreference.setContinuousUpdates(true);
91         mSeekBarPreference.setOnSeekBarChangeListener(mSeekBarChangeListener);
92     }
93 
94     @Override
resetState()95     public void resetState() {
96         final int defaultProgress = mSizeData.getValues().indexOf(mSizeData.getDefaultValue());
97         mSeekBarPreference.setProgress(defaultProgress);
98     }
99 
100 
101     /**
102      * Interface for callbacks when users interact with the seek bar.
103      */
104     interface ProgressInteractionListener {
105 
106         /**
107          * Called when the progress is changed.
108          */
notifyPreferenceChanged()109         void notifyPreferenceChanged();
110 
111         /**
112          * Called when the progress is changed without tracking touch.
113          */
onProgressChanged()114         void onProgressChanged();
115 
116         /**
117          * Called when the seek bar is end tracking.
118          */
onEndTrackingTouch()119         void onEndTrackingTouch();
120     }
121 }
122