From 2457f46fa8214009a8374be1da502ce2c10d1dad Mon Sep 17 00:00:00 2001 From: Leon Liao Date: Thu, 29 Nov 2018 22:54:07 +0800 Subject: [PATCH] Add summary with accessibility timeout item Add summary with accessibility timeout item in Accessibility Settings. This summary describe its level to time limit of Accessibility timeout feature. Bug: 119283926 Test: atest AccessibilitySettingsTest Test: atest AccessibilityTimeoutControllerTest Test: make RunSettingsRoboTests Change-Id: I86c096e6f4adb62150e1ff2af4c22afac240b41e --- res/values/arrays.xml | 9 ++ .../accessibility/AccessibilitySettings.java | 33 +++++++ .../AccessibilityTimeoutController.java | 36 ++++++-- .../AccessibilitySettingsTest.java | 91 ++++++++++++++++--- 4 files changed, 147 insertions(+), 22 deletions(-) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 0ddd3ea9ce6..33976a6b86b 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -701,6 +701,15 @@ 120000 + + + @string/accessibility_timeout_default + @string/accessibility_timeout_10secs + @string/accessibility_timeout_30secs + @string/accessibility_timeout_1min + @string/accessibility_timeout_2mins + + diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index 65b0e86b50d..d6590fa041f 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -21,6 +21,7 @@ import static android.os.Vibrator.VibrationIntensity; import android.accessibilityservice.AccessibilityServiceInfo; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; @@ -63,6 +64,8 @@ import com.android.settingslib.RestrictedPreference; import com.android.settingslib.accessibility.AccessibilityUtils; import com.android.settingslib.search.SearchIndexable; +import com.google.common.primitives.Ints; + import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -125,6 +128,11 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements "vibration_preference_screen"; private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN = "daltonizer_preference"; + private static final String ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE = + "accessibility_content_timeout_preference_fragment"; + private static final String ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE = + "accessibility_control_timeout_preference_fragment"; + // Extras passed to sub-fragments. static final String EXTRA_PREFERENCE_KEY = "preference_key"; @@ -718,6 +726,31 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements updateAutoclickSummary(mAutoclickPreferenceScreen); updateAccessibilityShortcut(mAccessibilityShortcutPreferenceScreen); + + updateAccessibilityTimeoutSummary(getContentResolver(), + findPreference(ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE)); + updateAccessibilityTimeoutSummary(getContentResolver(), + findPreference(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE)); + } + + void updateAccessibilityTimeoutSummary(ContentResolver resolver, Preference pref) { + + String[] timeoutSummarys = getResources().getStringArray( + R.array.accessibility_timeout_summaries); + int[] timeoutValues = getResources().getIntArray( + R.array.accessibility_timeout_selector_values); + + int timeoutValue = 0; + if (pref.getKey().equals(ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE)) { + timeoutValue = AccessibilityTimeoutController.getSecureAccessibilityTimeoutValue( + resolver, AccessibilityTimeoutController.CONTENT_TIMEOUT_SETTINGS_SECURE); + } else if (pref.getKey().equals(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE)) { + timeoutValue = AccessibilityTimeoutController.getSecureAccessibilityTimeoutValue( + resolver, AccessibilityTimeoutController.CONTROL_TIMEOUT_SETTINGS_SECURE); + } + + int idx = Ints.indexOf(timeoutValues, timeoutValue); + pref.setSummary(timeoutSummarys[idx == -1 ? 0 : idx]); } private void updateMagnificationSummary(Preference pref) { diff --git a/src/com/android/settings/accessibility/AccessibilityTimeoutController.java b/src/com/android/settings/accessibility/AccessibilityTimeoutController.java index 2995df542ee..d933d923b21 100644 --- a/src/com/android/settings/accessibility/AccessibilityTimeoutController.java +++ b/src/com/android/settings/accessibility/AccessibilityTimeoutController.java @@ -31,6 +31,8 @@ import com.android.settings.widget.RadioButtonPreference; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.google.common.primitives.Ints; + import java.lang.Integer; import java.util.HashMap; @@ -38,6 +40,10 @@ import java.util.Map; public class AccessibilityTimeoutController extends AbstractPreferenceController implements LifecycleObserver, RadioButtonPreference.OnClickListener, PreferenceControllerMixin { + static final String CONTENT_TIMEOUT_SETTINGS_SECURE = + Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS; + static final String CONTROL_TIMEOUT_SETTINGS_SECURE = + Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS; // pair the preference key and timeout value private final Map mAccessibilityTimeoutKeyToValueMap = new HashMap<>(); @@ -64,6 +70,15 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController mfragmentTag = fragmentTag; } + protected static int getSecureAccessibilityTimeoutValue(ContentResolver resolver, String name) { + String timeOutSec = Settings.Secure.getString(resolver, name); + if (timeOutSec == null) { + return 0; + } + Integer timeOutValue = Ints.tryParse(timeOutSec); + return timeOutValue == null ? 0 : timeOutValue; + } + public void setOnChangeListener(OnChangeListener listener) { mOnChangeListener = listener; } @@ -131,16 +146,17 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController } } - protected void getAccessibilityUiValue() { - String timeoutValue = null; - if (mfragmentTag.equals(AccessibilityContentTimeoutPreferenceFragment.TAG)) { - timeoutValue = Settings.Secure.getString(mContentResolver, - Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS); - } else if (mfragmentTag.equals(AccessibilityControlTimeoutPreferenceFragment.TAG)) { - timeoutValue = Settings.Secure.getString(mContentResolver, - Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS); + private int getAccessibilityTimeoutValue(String fragmentTag) { + int timeoutValue = 0; + // two kinds of Secure value, one is content timeout, the other is control timeout. + if (AccessibilityContentTimeoutPreferenceFragment.TAG.equals(fragmentTag)) { + timeoutValue = getSecureAccessibilityTimeoutValue(mContentResolver, + CONTENT_TIMEOUT_SETTINGS_SECURE); + } else if (AccessibilityControlTimeoutPreferenceFragment.TAG.equals(fragmentTag)) { + timeoutValue = getSecureAccessibilityTimeoutValue(mContentResolver, + CONTROL_TIMEOUT_SETTINGS_SECURE); } - mAccessibilityUiTimeoutValue = timeoutValue == null? 0: Integer.parseInt(timeoutValue); + return timeoutValue; } protected void updatePreferenceCheckedState(int value) { @@ -153,7 +169,7 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController public void updateState(Preference preference) { super.updateState(preference); - getAccessibilityUiValue(); + mAccessibilityUiTimeoutValue = getAccessibilityTimeoutValue(mfragmentTag); // reset RadioButton mPreference.setChecked(false); diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java index cb2aa8b1914..00980ade201 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java @@ -18,10 +18,10 @@ package com.android.settings.accessibility; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; +import android.content.ContentResolver; import android.content.Context; import android.os.Vibrator; import android.provider.Settings; @@ -32,6 +32,7 @@ import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.XmlTestUtils; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; @@ -42,31 +43,43 @@ import java.util.List; @RunWith(SettingsRobolectricTestRunner.class) public class AccessibilitySettingsTest { + private static final String VIBRATION_PREFERENCE_SCREEN = "vibration_preference_screen"; + private static final String ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE = + "accessibility_content_timeout_preference_fragment"; + private static final String ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE = + "accessibility_control_timeout_preference_fragment"; + + private Context mContext; + private ContentResolver mContentResolver; + private AccessibilitySettings mSettings; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; + mContentResolver = mContext.getContentResolver(); + mSettings = spy(new AccessibilitySettings()); + doReturn(mContext).when(mSettings).getContext(); + } @Test public void testNonIndexableKeys_existInXmlLayout() { - final Context context = RuntimeEnvironment.application; final List niks = AccessibilitySettings.SEARCH_INDEX_DATA_PROVIDER - .getNonIndexableKeys(context); + .getNonIndexableKeys(mContext); final List keys = new ArrayList<>(); - keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(context, R.xml.accessibility_settings)); + keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(mContext, R.xml.accessibility_settings)); assertThat(keys).containsAllIn(niks); } @Test public void testUpdateVibrationSummary_shouldUpdateSummary() { - MockitoAnnotations.initMocks(this); - final Context mContext = RuntimeEnvironment.application; - final AccessibilitySettings mSettings = spy(new AccessibilitySettings()); - final Preference mVibrationPreferenceScreen = new Preference(mContext); - doReturn(mVibrationPreferenceScreen).when(mSettings).findPreference(anyString()); + doReturn(mVibrationPreferenceScreen).when(mSettings).findPreference( + VIBRATION_PREFERENCE_SCREEN); - doReturn(mContext).when(mSettings).getContext(); - - mVibrationPreferenceScreen.setKey("vibration_preference_screen"); + mVibrationPreferenceScreen.setKey(VIBRATION_PREFERENCE_SCREEN); Settings.System.putInt(mContext.getContentResolver(), Settings.System.NOTIFICATION_VIBRATION_INTENSITY, @@ -81,4 +94,58 @@ public class AccessibilitySettingsTest { VibrationIntensityPreferenceController.getIntensityString(mContext, Vibrator.VIBRATION_INTENSITY_OFF)); } + + @Test + public void testUpdateAccessibilityTimeoutSummary_shouldUpdateSummary() { + String[] testingValues = {null, "0", "10000", "30000", "60000", "120000"}; + int[] exceptedResIds = {R.string.accessibility_timeout_default, + R.string.accessibility_timeout_default, + R.string.accessibility_timeout_10secs, + R.string.accessibility_timeout_30secs, + R.string.accessibility_timeout_1min, + R.string.accessibility_timeout_2mins + }; + + for (int i = 0; i < testingValues.length; i++) { + Settings.Secure.putString(mContentResolver, + Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, testingValues[i]); + + verifyAccessibilityTimeoutSummary(ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE, + exceptedResIds[i]); + + Settings.Secure.putString(mContentResolver, + Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, testingValues[i]); + + verifyAccessibilityTimeoutSummary(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE, + exceptedResIds[i]); + } + } + + @Test + public void testUpdateAccessibilityControlTimeoutSummary_invalidData_shouldUpdateSummary() { + String[] testingValues = {"-9009", "98277466643738977979666555536362343", "Hello,a prank"}; + + for (String value : testingValues) { + Settings.Secure.putString(mContentResolver, + Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, value); + + verifyAccessibilityTimeoutSummary(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE, + R.string.accessibility_timeout_default); + + Settings.Secure.putString(mContentResolver, + Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, value); + + verifyAccessibilityTimeoutSummary(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE, + R.string.accessibility_timeout_default); + } + } + + private void verifyAccessibilityTimeoutSummary(String preferenceKey, int resId) { + final Preference preference = new Preference(mContext); + doReturn(preference).when(mSettings).findPreference(preferenceKey); + preference.setKey(preferenceKey); + mSettings.updateAccessibilityTimeoutSummary(mContentResolver, preference); + + assertThat(preference.getSummary()).isEqualTo(mContext.getResources().getString(resId)); + } }