| /* | |
| * Copyright (C) 2015 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| package com.android.settings.accessibility; | |
| import android.content.res.Resources; | |
| import android.os.Bundle; | |
| import android.provider.Settings; | |
| import android.support.v7.preference.Preference; | |
| import android.view.View; | |
| import android.view.accessibility.AccessibilityManager; | |
| import android.widget.Switch; | |
| import com.android.internal.logging.MetricsProto.MetricsEvent; | |
| import com.android.settings.R; | |
| import com.android.settings.SeekBarPreference; | |
| import com.android.settings.widget.SwitchBar; | |
| /** | |
| * Fragment for preference screen for settings related to Automatically click after mouse stops | |
| * feature. | |
| */ | |
| public class ToggleAutoclickPreferenceFragment extends ToggleFeaturePreferenceFragment | |
| implements SwitchBar.OnSwitchChangeListener, Preference.OnPreferenceChangeListener { | |
| /** Min allowed autoclick delay value. */ | |
| private static final int MIN_AUTOCLICK_DELAY = 200; | |
| /** Max allowed autoclick delay value. */ | |
| private static final int MAX_AUTOCLICK_DELAY = 1000; | |
| /** | |
| * Allowed autoclick delay values are discrete. This is the difference between two allowed | |
| * values. | |
| */ | |
| private static final int AUTOCLICK_DELAY_STEP = 100; | |
| /** | |
| * Resource ids from which autoclick preference summaries should be derived. The strings have | |
| * placeholder for integer delay value. | |
| */ | |
| private static final int[] mAutoclickPreferenceSummaries = { | |
| R.plurals.accessibilty_autoclick_preference_subtitle_extremely_short_delay, | |
| R.plurals.accessibilty_autoclick_preference_subtitle_very_short_delay, | |
| R.plurals.accessibilty_autoclick_preference_subtitle_short_delay, | |
| R.plurals.accessibilty_autoclick_preference_subtitle_long_delay, | |
| R.plurals.accessibilty_autoclick_preference_subtitle_very_long_delay | |
| }; | |
| /** | |
| * Seek bar preference for autoclick delay value. The seek bar has values between 0 and | |
| * number of possible discrete autoclick delay values. These will have to be converted to actual | |
| * delay values before saving them in settings. | |
| */ | |
| private SeekBarPreference mDelay; | |
| /** | |
| * Gets string that should be used as a autoclick preference summary for provided autoclick | |
| * delay. | |
| * @param resources Resources from which string should be retrieved. | |
| * @param delay Delay for whose value summary should be retrieved. | |
| */ | |
| static CharSequence getAutoclickPreferenceSummary(Resources resources, int delay) { | |
| int summaryIndex = getAutoclickPreferenceSummaryIndex(delay); | |
| return resources.getQuantityString( | |
| mAutoclickPreferenceSummaries[summaryIndex], delay, delay); | |
| } | |
| /** | |
| * Finds index of the summary that should be used for the provided autoclick delay. | |
| */ | |
| private static int getAutoclickPreferenceSummaryIndex(int delay) { | |
| if (delay <= MIN_AUTOCLICK_DELAY) { | |
| return 0; | |
| } | |
| if (delay >= MAX_AUTOCLICK_DELAY) { | |
| return mAutoclickPreferenceSummaries.length - 1; | |
| } | |
| int rangeSize = (MAX_AUTOCLICK_DELAY - MIN_AUTOCLICK_DELAY) / | |
| (mAutoclickPreferenceSummaries.length - 1); | |
| return (delay - MIN_AUTOCLICK_DELAY) / rangeSize; | |
| } | |
| @Override | |
| protected void onPreferenceToggled(String preferenceKey, boolean enabled) { | |
| Settings.Secure.putInt(getContentResolver(), preferenceKey, enabled ? 1 : 0); | |
| mDelay.setEnabled(enabled); | |
| } | |
| @Override | |
| protected int getMetricsCategory() { | |
| return MetricsEvent.ACCESSIBILITY_TOGGLE_AUTOCLICK; | |
| } | |
| @Override | |
| public void onCreate(Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| addPreferencesFromResource(R.xml.accessibility_autoclick_settings); | |
| int delay = Settings.Secure.getInt( | |
| getContentResolver(), Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY, | |
| AccessibilityManager.AUTOCLICK_DELAY_DEFAULT); | |
| // Initialize seek bar preference. Sets seek bar size to the number of possible delay | |
| // values. | |
| mDelay = (SeekBarPreference) findPreference("autoclick_delay"); | |
| mDelay.setMax(delayToSeekBarProgress(MAX_AUTOCLICK_DELAY)); | |
| mDelay.setProgress(delayToSeekBarProgress(delay)); | |
| mDelay.setOnPreferenceChangeListener(this); | |
| } | |
| @Override | |
| protected void onInstallSwitchBarToggleSwitch() { | |
| super.onInstallSwitchBarToggleSwitch(); | |
| int value = Settings.Secure.getInt(getContentResolver(), | |
| Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED, 0); | |
| mSwitchBar.setCheckedInternal(value == 1); | |
| mSwitchBar.addOnSwitchChangeListener(this); | |
| mDelay.setEnabled(value == 1); | |
| } | |
| @Override | |
| protected void onRemoveSwitchBarToggleSwitch() { | |
| super.onRemoveSwitchBarToggleSwitch(); | |
| mSwitchBar.removeOnSwitchChangeListener(this); | |
| } | |
| @Override | |
| public void onSwitchChanged(Switch switchView, boolean isChecked) { | |
| onPreferenceToggled(Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED, isChecked); | |
| } | |
| @Override | |
| public void onViewCreated(View view, Bundle savedInstanceState) { | |
| super.onViewCreated(view, savedInstanceState); | |
| setTitle(getString(R.string.accessibility_autoclick_preference_title)); | |
| } | |
| @Override | |
| public boolean onPreferenceChange(Preference preference, Object newValue) { | |
| if (preference == mDelay && newValue instanceof Integer) { | |
| Settings.Secure.putInt(getContentResolver(), | |
| Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY, | |
| seekBarProgressToDelay((int)newValue)); | |
| return true; | |
| } | |
| return false; | |
| } | |
| /** | |
| * Converts seek bar preference progress value to autoclick delay associated with it. | |
| */ | |
| private int seekBarProgressToDelay(int progress) { | |
| return progress * AUTOCLICK_DELAY_STEP + MIN_AUTOCLICK_DELAY; | |
| } | |
| /** | |
| * Converts autoclick delay value to seek bar preference progress values that represents said | |
| * delay. | |
| */ | |
| private int delayToSeekBarProgress(int delay) { | |
| return (delay - MIN_AUTOCLICK_DELAY) / AUTOCLICK_DELAY_STEP; | |
| } | |
| } |