From d2d1801e3b54614166038163fc0ce2f1451836b8 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Tue, 2 Jul 2019 00:20:35 +0800 Subject: [PATCH] Separate long press timeout preference controller form accessibility Bug: 135056871 Test: manual, robotests Change-Id: If49e4336b3461ec2a9568b8652c5aab0ff64ecfe --- res/xml/accessibility_settings.xml | 3 +- .../accessibility/AccessibilitySettings.java | 51 +--------- ...tLongPressTimeoutPreferenceController.java | 96 +++++++++++++++++++ ...gPressTimeoutPreferenceControllerTest.java | 78 +++++++++++++++ 4 files changed, 177 insertions(+), 51 deletions(-) create mode 100644 src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceControllerTest.java diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml index 7f1f6c4fd88..ec8e31d0a05 100644 --- a/res/xml/accessibility_settings.xml +++ b/res/xml/accessibility_settings.xml @@ -114,7 +114,8 @@ android:title="@string/accessibility_long_press_timeout_preference_title" android:entries="@array/long_press_timeout_selector_titles" android:entryValues="@array/long_press_timeout_selector_values" - android:persistent="false"/> + android:persistent="false" + settings:controller="com.android.settings.accessibility.SelectLongPressTimeoutPreferenceController"/> mLongPressTimeoutValueToTitleMap = new HashMap<>(); - private final Handler mHandler = new Handler(); private final Runnable mUpdateRunnable = new Runnable() { @@ -183,7 +176,6 @@ public class AccessibilitySettings extends DashboardFragment implements private SwitchPreference mToggleLargePointerIconPreference; private SwitchPreference mToggleDisableAnimationsPreference; - private ListPreference mSelectLongPressTimeoutPreference; private Preference mDisplayMagnificationPreferenceScreen; private Preference mDisplayDaltonizerPreferenceScreen; private Preference mHearingAidPreference; @@ -194,8 +186,6 @@ public class AccessibilitySettings extends DashboardFragment implements private DarkUIPreferenceController mDarkUIPreferenceController; private LiveCaptionPreferenceController mLiveCaptionPreferenceController; - private int mLongPressTimeoutDefault; - private DevicePolicyManager mDpm; /** @@ -271,22 +261,6 @@ public class AccessibilitySettings extends DashboardFragment implements super.onStop(); } - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (mSelectLongPressTimeoutPreference == preference) { - handleLongPressTimeoutPreferenceChange((String) newValue); - return true; - } - return false; - } - - private void handleLongPressTimeoutPreferenceChange(String stringValue) { - Settings.Secure.putInt(getContentResolver(), - Settings.Secure.LONG_PRESS_TIMEOUT, Integer.parseInt(stringValue)); - mSelectLongPressTimeoutPreference.setSummary( - mLongPressTimeoutValueToTitleMap.get(stringValue)); - } - @Override public boolean onPreferenceTreeClick(Preference preference) { if (mHearingAidPreferenceController.handlePreferenceTreeClick(preference)) { @@ -344,22 +318,6 @@ public class AccessibilitySettings extends DashboardFragment implements mToggleDisableAnimationsPreference = (SwitchPreference) findPreference(TOGGLE_DISABLE_ANIMATIONS); - // Long press timeout. - mSelectLongPressTimeoutPreference = - (ListPreference) findPreference(SELECT_LONG_PRESS_TIMEOUT_PREFERENCE); - mSelectLongPressTimeoutPreference.setOnPreferenceChangeListener(this); - if (mLongPressTimeoutValueToTitleMap.size() == 0) { - String[] timeoutValues = getResources().getStringArray( - R.array.long_press_timeout_selector_values); - mLongPressTimeoutDefault = Integer.parseInt(timeoutValues[0]); - String[] timeoutTitles = getResources().getStringArray( - R.array.long_press_timeout_selector_titles); - final int timeoutValueCount = timeoutValues.length; - for (int i = 0; i < timeoutValueCount; i++) { - mLongPressTimeoutValueToTitleMap.put(timeoutValues[i], timeoutTitles[i]); - } - } - // Hearing Aid. mHearingAidPreference = findPreference(HEARING_AID_PREFERENCE); mHearingAidPreferenceController.displayPreference(getPreferenceScreen()); @@ -590,13 +548,6 @@ public class AccessibilitySettings extends DashboardFragment implements // Dark Mode mDarkUIPreferenceController.updateState(mDarkUIModePreference); - // Long press timeout. - final int longPressTimeout = Settings.Secure.getInt(getContentResolver(), - Settings.Secure.LONG_PRESS_TIMEOUT, mLongPressTimeoutDefault); - String value = String.valueOf(longPressTimeout); - mSelectLongPressTimeoutPreference.setValue(value); - mSelectLongPressTimeoutPreference.setSummary(mLongPressTimeoutValueToTitleMap.get(value)); - mHearingAidPreferenceController.updateState(mHearingAidPreference); mLiveCaptionPreferenceController.updateState(mLiveCaptionPreference); diff --git a/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceController.java b/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceController.java new file mode 100644 index 00000000000..e5532c599a1 --- /dev/null +++ b/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceController.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2019 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.Context; +import android.provider.Settings; + +import androidx.preference.ListPreference; +import androidx.preference.Preference; + +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; + +import java.util.HashMap; +import java.util.Map; + +public class SelectLongPressTimeoutPreferenceController extends BasePreferenceController implements + Preference.OnPreferenceChangeListener { + + private final Map mLongPressTimeoutValueToTitleMap; + private int mLongPressTimeoutDefault; + + public SelectLongPressTimeoutPreferenceController(Context context, String preferenceKey) { + super(context, preferenceKey); + mLongPressTimeoutValueToTitleMap = new HashMap<>(); + initLongPressTimeoutValueToTitleMap(); + } + + @Override + public int getAvailabilityStatus() { + return AVAILABLE; + } + + @Override + public boolean onPreferenceChange(Preference preference, Object object) { + if (!(preference instanceof ListPreference)) { + return false; + } + final ListPreference listPreference = (ListPreference) preference; + final int newValue = Integer.parseInt((String) object); + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.LONG_PRESS_TIMEOUT, newValue); + updateState(listPreference); + return true; + + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + if (!(preference instanceof ListPreference)) { + return; + } + final ListPreference listPreference = (ListPreference) preference; + listPreference.setValue(getLongPressTimeoutValue()); + } + + @Override + public CharSequence getSummary() { + return mLongPressTimeoutValueToTitleMap.get(getLongPressTimeoutValue()); + } + + private String getLongPressTimeoutValue() { + final int longPressTimeout = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.LONG_PRESS_TIMEOUT, mLongPressTimeoutDefault); + return String.valueOf(longPressTimeout); + } + + private void initLongPressTimeoutValueToTitleMap() { + if (mLongPressTimeoutValueToTitleMap.size() == 0) { + final String[] timeoutValues = mContext.getResources().getStringArray( + R.array.long_press_timeout_selector_values); + mLongPressTimeoutDefault = Integer.parseInt(timeoutValues[0]); + final String[] timeoutTitles = mContext.getResources().getStringArray( + R.array.long_press_timeout_selector_titles); + final int timeoutValueCount = timeoutValues.length; + for (int i = 0; i < timeoutValueCount; i++) { + mLongPressTimeoutValueToTitleMap.put(timeoutValues[i], timeoutTitles[i]); + } + } + } +} diff --git a/tests/robotests/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceControllerTest.java new file mode 100644 index 00000000000..1bdfb41a9ee --- /dev/null +++ b/tests/robotests/src/com/android/settings/accessibility/SelectLongPressTimeoutPreferenceControllerTest.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2019 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 static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.provider.Settings; + +import com.android.settings.core.BasePreferenceController; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class SelectLongPressTimeoutPreferenceControllerTest { + private static final int VALID_VALUE = 1500; + private static final int INVALID_VALUE = 0; + private static final int DEFAULT_VALUE = 400; + + private Context mContext; + private SelectLongPressTimeoutPreferenceController mController; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mController = new SelectLongPressTimeoutPreferenceController(mContext, "press_timeout"); + } + + @Test + public void getAvailabilityStatus_byDefault_shouldReturnAvailable() { + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + public void getSummary_byDefault_shouldReturnShort() { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.LONG_PRESS_TIMEOUT, DEFAULT_VALUE); + final String expected = "Short"; + + assertThat(mController.getSummary()).isEqualTo(expected); + } + + @Test + public void getSummary_validValue_shouldReturnLong() { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.LONG_PRESS_TIMEOUT, VALID_VALUE); + final String expected = "Long"; + + assertThat(mController.getSummary()).isEqualTo(expected); + } + + @Test + public void getSummary_invalidValue_shouldReturnNull() { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.LONG_PRESS_TIMEOUT, INVALID_VALUE); + + assertThat(mController.getSummary()).isNull(); + } +}