From d741850f0cc6681be4072466c4c9d171d15674ae Mon Sep 17 00:00:00 2001 From: Leon Liao Date: Thu, 9 May 2019 17:26:52 +0800 Subject: [PATCH] Modify Accessibility Setting UI for timeout feature Using single timeout setting page instead of current two timeout pages to keep the user experience simple and reduce confusion. Current timeout page & API: 'Time to take action' -- Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS 'Time to read' -- Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS New timeout page & API: 'Time to take action(Accessibility timeout)' -- Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS -- Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS Bug: 132247225 Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=AccessibilityTimeoutControllerTest Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=AccessibilitySettingsTest Change-Id: I0b69682425324d3b1e0ff3f7b6e2c299b60cd215 --- res/values/arrays.xml | 9 -- res/values/strings.xml | 6 +- ...accessibility_content_timeout_settings.xml | 63 --------- res/xml/accessibility_settings.xml | 8 +- ...ilityContentTimeoutPreferenceFragment.java | 129 ------------------ ...ilityControlTimeoutPreferenceFragment.java | 4 +- .../accessibility/AccessibilitySettings.java | 14 +- .../AccessibilityTimeoutController.java | 50 +++---- .../AccessibilitySettingsTest.java | 14 +- .../AccessibilityTimeoutControllerTest.java | 18 ++- 10 files changed, 38 insertions(+), 277 deletions(-) delete mode 100644 res/xml/accessibility_content_timeout_settings.xml delete mode 100644 src/com/android/settings/accessibility/AccessibilityContentTimeoutPreferenceFragment.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index ffe0aa54535..9ac91107341 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -674,15 +674,6 @@ Accessibility volume - - - accessibility_content_timeout_default - accessibility_content_timeout_10secs - accessibility_content_timeout_30secs - accessibility_content_timeout_1min - accessibility_content_timeout_2mins - - accessibility_control_timeout_default diff --git a/res/values/strings.xml b/res/values/strings.xml index a31de98fb42..bb31a5ac416 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4872,12 +4872,10 @@ 1 minute 2 minutes - - Time to read + + Time to take action (Accessibility timeout) Time to take action - - Choose how long to show messages that you need to read, but are visible only temporarily.\n\nNot all apps support this setting. Choose how long to show messages that ask you to take action, but are visible only temporarily.\n\nNot all apps support this setting. diff --git a/res/xml/accessibility_content_timeout_settings.xml b/res/xml/accessibility_content_timeout_settings.xml deleted file mode 100644 index ea8d88ae68c..00000000000 --- a/res/xml/accessibility_content_timeout_settings.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml index b4968f8200f..d9c61b59e6a 100644 --- a/res/xml/accessibility_settings.xml +++ b/res/xml/accessibility_settings.xml @@ -77,12 +77,6 @@ android:key="toggle_disable_animations" android:title="@string/accessibility_disable_animations" /> - - sControllers = new ArrayList<>(); - - @Override - public void onCheckedChanged(Preference preference) { - for (AbstractPreferenceController controller : sControllers) { - controller.updateState(preference); - } - } - - @Override - public void onResume() { - super.onResume(); - - for (AbstractPreferenceController controller : - buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) { - ((AccessibilityTimeoutController)controller).setOnChangeListener(this); - } - } - - @Override - public void onPause() { - super.onPause(); - - for (AbstractPreferenceController controller : - buildPreferenceControllers(getPrefContext(), getSettingsLifecycle())) { - ((AccessibilityTimeoutController)controller).setOnChangeListener(null); - } - } - - @Override - public int getMetricsCategory() { - return SettingsEnums.ACCESSIBILITY; - } - - @Override - protected String getLogTag() { - return TAG; - } - - @Override - protected int getPreferenceScreenResId() { - return R.xml.accessibility_content_timeout_settings; - } - - @Override - protected List createPreferenceControllers(Context context) { - return buildPreferenceControllers(context, getSettingsLifecycle()); - } - - private static List buildPreferenceControllers(Context context, - Lifecycle lifecycle) { - if (sControllers.size() == 0) { - Resources resources = context.getResources(); - - String[] timeoutKeys = resources.getStringArray( - R.array.accessibility_timeout_content_selector_keys); - - for (int i=0; i < timeoutKeys.length; i++) { - sControllers.add(new AccessibilityTimeoutController( - context, lifecycle, timeoutKeys[i], TAG)); - } - } - return sControllers; - } - - public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider() { - @Override - public List getXmlResourcesToIndex(Context context, - boolean enabled) { - final SearchIndexableResource sir = new SearchIndexableResource(context); - sir.xmlResId = R.xml.accessibility_content_timeout_settings; - return Arrays.asList(sir); - } - - @Override - public List getNonIndexableKeys(Context context) { - final List keys = super.getNonIndexableKeys(context); - return keys; - } - - @Override - public List createPreferenceControllers( - Context context) { - return buildPreferenceControllers(context, null); - } - }; -} \ No newline at end of file diff --git a/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragment.java index a6426bfe502..df950e8faa8 100644 --- a/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityControlTimeoutPreferenceFragment.java @@ -98,7 +98,7 @@ public final class AccessibilityControlTimeoutPreferenceFragment extends Dashboa for (int i=0; i < timeoutKeys.length; i++) { sControllers.add(new AccessibilityTimeoutController( - context, lifecycle, timeoutKeys[i], TAG)); + context, lifecycle, timeoutKeys[i])); } } return sControllers; @@ -126,4 +126,4 @@ public final class AccessibilityControlTimeoutPreferenceFragment extends Dashboa return buildPreferenceControllers(context, null); } }; -} \ No newline at end of file +} diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index 148e901f63c..1dbae001f13 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -132,8 +132,6 @@ 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"; private static final String DARK_UI_MODE_PREFERENCE = @@ -727,8 +725,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements mToggleInversionPreference.getOrder() + 1); mToggleDisableAnimationsPreference.setOrder( mToggleLargePointerIconPreference.getOrder() + 1); - findPreference(ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE).setOrder( - mToggleDisableAnimationsPreference.getOrder() + 1); mToggleInversionPreference.setSummary(R.string.summary_empty); displayCategory.addPreference(mToggleInversionPreference); displayCategory.addPreference(mDisplayDaltonizerPreferenceScreen); @@ -794,8 +790,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements updateAccessibilityShortcut(mAccessibilityShortcutPreferenceScreen); - updateAccessibilityTimeoutSummary(getContentResolver(), - findPreference(ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE)); updateAccessibilityTimeoutSummary(getContentResolver(), findPreference(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE)); } @@ -806,14 +800,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements 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( + int timeoutValue = AccessibilityTimeoutController.getSecureAccessibilityTimeoutValue( resolver, AccessibilityTimeoutController.CONTROL_TIMEOUT_SETTINGS_SECURE); - } int idx = Ints.indexOf(timeoutValues, timeoutValue); pref.setSummary(timeoutSummarys[idx == -1 ? 0 : idx]); diff --git a/src/com/android/settings/accessibility/AccessibilityTimeoutController.java b/src/com/android/settings/accessibility/AccessibilityTimeoutController.java index a6c5f6fe6ce..057013c223b 100644 --- a/src/com/android/settings/accessibility/AccessibilityTimeoutController.java +++ b/src/com/android/settings/accessibility/AccessibilityTimeoutController.java @@ -36,6 +36,9 @@ import com.google.common.primitives.Ints; import java.util.HashMap; import java.util.Map; +/** + * Controller class that control accessibility time out settings. + */ public class AccessibilityTimeoutController extends AbstractPreferenceController implements LifecycleObserver, RadioButtonPreference.OnClickListener, PreferenceControllerMixin { static final String CONTENT_TIMEOUT_SETTINGS_SECURE = @@ -43,11 +46,11 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController static final String CONTROL_TIMEOUT_SETTINGS_SECURE = Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS; - // pair the preference key and timeout value + // pair the preference key and timeout value. private final Map mAccessibilityTimeoutKeyToValueMap = new HashMap<>(); + // RadioButtonPreference key, each preference represent a timeout value. private final String mPreferenceKey; - private final String mfragmentTag; private final ContentResolver mContentResolver; private final Resources mResources; private OnChangeListener mOnChangeListener; @@ -55,7 +58,7 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController private int mAccessibilityUiTimeoutValue; public AccessibilityTimeoutController(Context context, Lifecycle lifecycle, - String preferenceKey, String fragmentTag) { + String preferenceKey) { super(context); mContentResolver = context.getContentResolver(); @@ -65,7 +68,6 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController lifecycle.addObserver(this); } mPreferenceKey = preferenceKey; - mfragmentTag = fragmentTag; } protected static int getSecureAccessibilityTimeoutValue(ContentResolver resolver, String name) { @@ -84,14 +86,8 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController private Map getTimeoutValueToKeyMap() { if (mAccessibilityTimeoutKeyToValueMap.size() == 0) { - String[] timeoutKeys = null; - if (mfragmentTag.equals(AccessibilityContentTimeoutPreferenceFragment.TAG)) { - timeoutKeys = mResources.getStringArray( - R.array.accessibility_timeout_content_selector_keys); - } else if (mfragmentTag.equals(AccessibilityControlTimeoutPreferenceFragment.TAG)) { - timeoutKeys = mResources.getStringArray( + String[] timeoutKeys = mResources.getStringArray( R.array.accessibility_timeout_control_selector_keys); - } int[] timeoutValues = mResources.getIntArray( R.array.accessibility_timeout_selector_values); @@ -109,11 +105,9 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController } private void handlePreferenceChange(String value) { - if (mfragmentTag.equals(AccessibilityContentTimeoutPreferenceFragment.TAG)) { - putSecureString(Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, value); - } else if (mfragmentTag.equals(AccessibilityControlTimeoutPreferenceFragment.TAG)) { - putSecureString(Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, value); - } + // save value to both content and control timeout setting. + putSecureString(Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, value); + putSecureString(Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, value); } @Override @@ -144,16 +138,10 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController } } - 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, + private int getAccessibilityTimeoutValue() { + // get accessibility control timeout value + int timeoutValue = getSecureAccessibilityTimeoutValue(mContentResolver, CONTROL_TIMEOUT_SETTINGS_SECURE); - } return timeoutValue; } @@ -167,7 +155,7 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController public void updateState(Preference preference) { super.updateState(preference); - mAccessibilityUiTimeoutValue = getAccessibilityTimeoutValue(mfragmentTag); + mAccessibilityUiTimeoutValue = getAccessibilityTimeoutValue(); // reset RadioButton mPreference.setChecked(false); @@ -175,7 +163,13 @@ public class AccessibilityTimeoutController extends AbstractPreferenceController updatePreferenceCheckedState(preferenceValue); } - public static interface OnChangeListener { + /** + * Listener interface handles checked event. + */ + public interface OnChangeListener { + /** + * A hook that is called when preference checked. + */ void onCheckedChanged(Preference preference); } -} \ No newline at end of file +} diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java index a07ffb9f505..43bdc30b2f9 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java @@ -27,11 +27,9 @@ import android.content.Context; import android.os.Vibrator; import android.provider.Settings; -import androidx.preference.ListPreference; import androidx.preference.Preference; import com.android.settings.R; -import com.android.settings.display.DarkUIPreferenceController; import com.android.settings.testutils.XmlTestUtils; import org.junit.Before; @@ -46,8 +44,6 @@ import java.util.List; @RunWith(RobolectricTestRunner.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 static final String DARK_UI_MODE_PREFERENCE = @@ -71,9 +67,9 @@ public class AccessibilitySettingsTest { @Test public void testNonIndexableKeys_existInXmlLayout() { final List niks = AccessibilitySettings.SEARCH_INDEX_DATA_PROVIDER - .getNonIndexableKeys(mContext); + .getNonIndexableKeys(mContext); final List keys = - XmlTestUtils.getKeysFromPreferenceXml(mContext, R.xml.accessibility_settings); + XmlTestUtils.getKeysFromPreferenceXml(mContext, R.xml.accessibility_settings); assertThat(keys).containsAllIn(niks); } @@ -112,12 +108,6 @@ public class AccessibilitySettingsTest { }; 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]); diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutControllerTest.java index 531282b44f3..78916641a4e 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityTimeoutControllerTest.java @@ -45,8 +45,7 @@ import org.robolectric.RuntimeEnvironment; @RunWith(RobolectricTestRunner.class) public class AccessibilityTimeoutControllerTest implements AccessibilityTimeoutController.OnChangeListener { - private static final String PREF_KEY = "accessibility_content_timeout_30secs"; - private static String PREF_TITLE; + private static final String PREF_KEY = "accessibility_control_timeout_30secs"; private AccessibilityTimeoutController mController; @@ -62,15 +61,14 @@ public class AccessibilityTimeoutControllerTest public void setup() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; - mController = new AccessibilityTimeoutController(mContext, mock(Lifecycle.class), - PREF_KEY, AccessibilityContentTimeoutPreferenceFragment.TAG); + mController = new AccessibilityTimeoutController(mContext, mock(Lifecycle.class), PREF_KEY); mController.setOnChangeListener(this); mContentResolver = mContext.getContentResolver(); - PREF_TITLE = mContext.getResources().getString(R.string.accessibility_timeout_30secs); + String prefTitle = mContext.getResources().getString(R.string.accessibility_timeout_30secs); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mMockPref); when(mMockPref.getKey()).thenReturn(PREF_KEY); - when(mMockPref.getTitle()).thenReturn(PREF_TITLE); + when(mMockPref.getTitle()).thenReturn(prefTitle); mController.displayPreference(mScreen); } @@ -87,7 +85,7 @@ public class AccessibilityTimeoutControllerTest @Test public void updateState_notChecked() { Settings.Secure.putString(mContentResolver, - Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, "0"); + Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, "0"); mController.updateState(mMockPref); @@ -99,7 +97,7 @@ public class AccessibilityTimeoutControllerTest @Test public void updateState_checked() { Settings.Secure.putString(mContentResolver, - Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, "30000"); + Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, "30000"); mController.updateState(mMockPref); @@ -113,8 +111,8 @@ public class AccessibilityTimeoutControllerTest mController.onRadioButtonClicked(mMockPref); String accessibilityUiTimeoutValue = Settings.Secure.getString(mContentResolver, - Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS); + Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS); assertThat(accessibilityUiTimeoutValue).isEqualTo("30000"); } -} \ No newline at end of file +}