blob: b9af7ce3ee80d1d71f6e8b5f56679cbfd1f3f593 [file] [log] [blame]
ChenJean7afc1fa2020-01-03 14:32:34 +08001/*
2 * Copyright (C) 2020 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 com.android.settings.accessibility;
18
19import static android.content.Context.MODE_PRIVATE;
20
21import android.content.ContentResolver;
22import android.content.Context;
23import android.content.SharedPreferences;
24import android.content.res.Resources;
25import android.provider.Settings;
26import android.util.ArrayMap;
ChenJean7afc1fa2020-01-03 14:32:34 +080027
28import androidx.lifecycle.LifecycleObserver;
29import androidx.preference.Preference;
30import androidx.preference.PreferenceScreen;
31
32import com.android.settings.R;
33import com.android.settings.core.BasePreferenceController;
34import com.android.settings.core.PreferenceControllerMixin;
ChenJean7afc1fa2020-01-03 14:32:34 +080035import com.android.settingslib.core.lifecycle.Lifecycle;
ChenJean62aab022020-02-05 19:08:38 +080036import com.android.settingslib.widget.LayoutPreference;
ChenJean7afc1fa2020-01-03 14:32:34 +080037import com.android.settingslib.widget.RadioButtonPreference;
38
39import java.util.Map;
40
41/**
42 * Controller class that controls accessibility autoclick settings.
43 */
44public class ToggleAutoclickPreferenceController extends BasePreferenceController implements
ChenJean62aab022020-02-05 19:08:38 +080045 LifecycleObserver, RadioButtonPreference.OnClickListener, PreferenceControllerMixin {
ChenJean7afc1fa2020-01-03 14:32:34 +080046
47 private static final String CONTROL_AUTOCLICK_DELAY_SECURE =
48 Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY;
ChenJean62aab022020-02-05 19:08:38 +080049 private static final String KEY_AUTOCLICK_CUSTOM_SEEKBAR = "autoclick_custom_seekbar";
50 static final String KEY_DELAY_MODE = "delay_mode";
ChenJean7afc1fa2020-01-03 14:32:34 +080051
ChenJean7afc1fa2020-01-03 14:32:34 +080052 private static final int AUTOCLICK_OFF_MODE = 0;
53 private static final int AUTOCLICK_CUSTOM_MODE = 2000;
54
55 // Pair the preference key and autoclick mode value.
56 private final Map<String, Integer> mAccessibilityAutoclickKeyToValueMap = new ArrayMap<>();
57
58 private SharedPreferences mSharedPreferences;
59 private final ContentResolver mContentResolver;
60 private final Resources mResources;
61 private OnChangeListener mOnChangeListener;
62 private RadioButtonPreference mDelayModePref;
63
64 /**
65 * Seek bar preference for autoclick delay value. The seek bar has values between 0 and
66 * number of possible discrete autoclick delay values. These will have to be converted to actual
67 * delay values before saving them in settings.
68 */
ChenJean62aab022020-02-05 19:08:38 +080069 private LayoutPreference mSeekBerPreference;
ChenJean7afc1fa2020-01-03 14:32:34 +080070 private int mCurrentUiAutoClickMode;
71
72 public ToggleAutoclickPreferenceController(Context context, String preferenceKey) {
73 super(context, preferenceKey);
74
75 mSharedPreferences = context.getSharedPreferences(context.getPackageName(), MODE_PRIVATE);
76 mContentResolver = context.getContentResolver();
77 mResources = context.getResources();
78
79 setAutoclickModeToKeyMap();
80 }
81
82 public ToggleAutoclickPreferenceController(Context context, Lifecycle lifecycle,
83 String preferenceKey) {
84 super(context, preferenceKey);
85
86 mSharedPreferences = context.getSharedPreferences(context.getPackageName(), MODE_PRIVATE);
87 mContentResolver = context.getContentResolver();
88 mResources = context.getResources();
89
90 setAutoclickModeToKeyMap();
91
92 if (lifecycle != null) {
93 lifecycle.addObserver(this);
94 }
95 }
96
97 public void setOnChangeListener(OnChangeListener listener) {
98 mOnChangeListener = listener;
99 }
100
101 @Override
102 public int getAvailabilityStatus() {
103 return AVAILABLE;
104 }
105
106 @Override
107 public void displayPreference(PreferenceScreen screen) {
108 super.displayPreference(screen);
109
110 mDelayModePref = (RadioButtonPreference)
111 screen.findPreference(getPreferenceKey());
112 mDelayModePref.setOnClickListener(this);
ChenJean62aab022020-02-05 19:08:38 +0800113 mSeekBerPreference = (LayoutPreference) screen.findPreference(KEY_AUTOCLICK_CUSTOM_SEEKBAR);
ChenJean7afc1fa2020-01-03 14:32:34 +0800114 updateState((Preference) mDelayModePref);
115 }
116
117 @Override
118 public void onRadioButtonClicked(RadioButtonPreference preference) {
menghanli771163f2020-04-16 22:33:06 +0800119 final int value = mAccessibilityAutoclickKeyToValueMap.get(mPreferenceKey);
ChenJean7afc1fa2020-01-03 14:32:34 +0800120 handleRadioButtonPreferenceChange(value);
121 if (mOnChangeListener != null) {
122 mOnChangeListener.onCheckedChanged(mDelayModePref);
123 }
124 }
125
126 private void updatePreferenceCheckedState(int mode) {
127 if (mCurrentUiAutoClickMode == mode) {
128 mDelayModePref.setChecked(true);
129 }
130 }
131
132 private void updatePreferenceVisibleState(int mode) {
ChenJean62aab022020-02-05 19:08:38 +0800133 mSeekBerPreference.setVisible(mCurrentUiAutoClickMode == mode);
ChenJean7afc1fa2020-01-03 14:32:34 +0800134 }
135
136 @Override
137 public void updateState(Preference preference) {
138 super.updateState(preference);
139
menghanli771163f2020-04-16 22:33:06 +0800140 final boolean enabled = Settings.Secure.getInt(mContext.getContentResolver(),
141 Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED, 0) == 1;
142
143 mCurrentUiAutoClickMode =
144 enabled ? getSharedPreferenceForAutoClickMode() : AUTOCLICK_OFF_MODE;
ChenJean7afc1fa2020-01-03 14:32:34 +0800145
146 // Reset RadioButton.
147 mDelayModePref.setChecked(false);
menghanli771163f2020-04-16 22:33:06 +0800148 final int mode = mAccessibilityAutoclickKeyToValueMap.get(mDelayModePref.getKey());
ChenJean7afc1fa2020-01-03 14:32:34 +0800149 updatePreferenceCheckedState(mode);
150 updatePreferenceVisibleState(mode);
151 }
152
ChenJean7afc1fa2020-01-03 14:32:34 +0800153 /** Listener interface handles checked event. */
154 public interface OnChangeListener {
155 /**
156 * A hook that is called when preference checked.
157 */
158 void onCheckedChanged(Preference preference);
159 }
160
161 private void setAutoclickModeToKeyMap() {
menghanli771163f2020-04-16 22:33:06 +0800162 final String[] autoclickKeys = mResources.getStringArray(
ChenJean7afc1fa2020-01-03 14:32:34 +0800163 R.array.accessibility_autoclick_control_selector_keys);
164
menghanli771163f2020-04-16 22:33:06 +0800165 final int[] autoclickValues = mResources.getIntArray(
ChenJean7afc1fa2020-01-03 14:32:34 +0800166 R.array.accessibility_autoclick_selector_values);
167
168 final int autoclickValueCount = autoclickValues.length;
169 for (int i = 0; i < autoclickValueCount; i++) {
170 mAccessibilityAutoclickKeyToValueMap.put(autoclickKeys[i], autoclickValues[i]);
171 }
172 }
173
174 private void handleRadioButtonPreferenceChange(int preference) {
menghanli771163f2020-04-16 22:33:06 +0800175 putSecureInt(Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED,
176 (preference != AUTOCLICK_OFF_MODE) ? /* enabled */ 1 : /* disabled */ 0);
ChenJean7afc1fa2020-01-03 14:32:34 +0800177
178 mSharedPreferences.edit().putInt(KEY_DELAY_MODE, preference).apply();
179
menghanli771163f2020-04-16 22:33:06 +0800180 if (preference != AUTOCLICK_CUSTOM_MODE) {
181 putSecureInt(CONTROL_AUTOCLICK_DELAY_SECURE, preference);
ChenJean7afc1fa2020-01-03 14:32:34 +0800182 }
ChenJean7afc1fa2020-01-03 14:32:34 +0800183 }
184
185 private void putSecureInt(String name, int value) {
186 Settings.Secure.putInt(mContentResolver, name, value);
187 }
188
ChenJean7afc1fa2020-01-03 14:32:34 +0800189 private int getSharedPreferenceForAutoClickMode() {
menghanli771163f2020-04-16 22:33:06 +0800190 return mSharedPreferences.getInt(KEY_DELAY_MODE, AUTOCLICK_CUSTOM_MODE);
ChenJean7afc1fa2020-01-03 14:32:34 +0800191 }
192}