From 4983dc1227dd3fd0c5b70ca397bdb287884478dc Mon Sep 17 00:00:00 2001 From: Ben Lin Date: Fri, 15 Dec 2017 14:40:44 -0800 Subject: [PATCH] Add ability to show/hide accessibility_shortcut_preference. This adds a new boolean flag, config_show_accessibility_shortcut_preference, which when set to false will hide the accessibility shortcut preference item. Bug: 62387367 Test: make RunSettingsRoboTests ROBOTEST_FILTER=AccessibilitySettingsTest Change-Id: I3fd941695df1ad89f717f464d2383be909839a3b --- res/values/bools.xml | 3 + .../accessibility/AccessibilitySettings.java | 21 +++++- tests/robotests/res/values-mcc999/config.xml | 1 + .../AccessibilityShortcutController.java | 42 ++++++++++++ .../AccessibilitySettingsTest.java | 67 +++++++++++++++++-- 5 files changed, 127 insertions(+), 7 deletions(-) create mode 100644 tests/robotests/src/com/android/internal/accessibility/AccessibilityShortcutController.java diff --git a/res/values/bools.xml b/res/values/bools.xml index 4c1c9c2755d..5fb34fda397 100644 --- a/res/values/bools.xml +++ b/res/values/bools.xml @@ -57,4 +57,7 @@ true + + + true diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index 160176e1c19..cc72280c4e3 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -30,6 +30,7 @@ import android.os.Handler; import android.os.UserHandle; import android.provider.SearchIndexableResource; import android.provider.Settings; +import android.support.annotation.VisibleForTesting; import android.support.v14.preference.SwitchPreference; import android.support.v4.content.ContextCompat; import android.support.v7.preference.ListPreference; @@ -102,8 +103,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements "toggle_master_mono"; private static final String SELECT_LONG_PRESS_TIMEOUT_PREFERENCE = "select_long_press_timeout_preference"; - private static final String ACCESSIBILITY_SHORTCUT_PREFERENCE = - "accessibility_shortcut_preference"; private static final String CAPTIONING_PREFERENCE_SCREEN = "captioning_preference_screen"; private static final String DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN = @@ -117,6 +116,9 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN = "daltonizer_preference_screen"; + @VisibleForTesting static final String ACCESSIBILITY_SHORTCUT_PREFERENCE = + "accessibility_shortcut_preference"; + // Extras passed to sub-fragments. static final String EXTRA_PREFERENCE_KEY = "preference_key"; static final String EXTRA_CHECKED = "checked"; @@ -452,6 +454,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements // Accessibility shortcut mAccessibilityShortcutPreferenceScreen = findPreference(ACCESSIBILITY_SHORTCUT_PREFERENCE); + } private void updateAllPreferences() { @@ -668,6 +671,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements updateAutoclickSummary(mAutoclickPreferenceScreen); updateAccessibilityShortcut(mAccessibilityShortcutPreferenceScreen); + checkAccessibilityShortcutVisibility(mAccessibilityShortcutPreferenceScreen); } private void updateMagnificationSummary(Preference pref) { @@ -765,6 +769,13 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements } } + @VisibleForTesting void checkAccessibilityShortcutVisibility(Preference preference) { + if (!getContext().getResources().getBoolean( + R.bool.config_show_accessibility_shortcut_preference)) { + removePreference(ACCESSIBILITY_SHORTCUT_PREFERENCE); + } + } + private static void configureMagnificationPreferenceIfNeeded(Preference preference) { // Some devices support only a single magnification mode. In these cases, we redirect to // the magnification mode's UI directly, rather than showing a PreferenceScreen with a @@ -800,6 +811,12 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements keys.add(FONT_SIZE_PREFERENCE_SCREEN); keys.add(KEY_DISPLAY_SIZE); + // Remove Accessibility Shortcuts if it's not visible + if (!context.getResources().getBoolean( + R.bool.config_show_accessibility_shortcut_preference)) { + keys.add(ACCESSIBILITY_SHORTCUT_PREFERENCE); + } + // Duplicates in Language & Input keys.add(TTS_SETTINGS_PREFERENCE); diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml index f8f59f1db21..eedacb5f04b 100644 --- a/tests/robotests/res/values-mcc999/config.xml +++ b/tests/robotests/res/values-mcc999/config.xml @@ -23,4 +23,5 @@ false false false + false diff --git a/tests/robotests/src/com/android/internal/accessibility/AccessibilityShortcutController.java b/tests/robotests/src/com/android/internal/accessibility/AccessibilityShortcutController.java new file mode 100644 index 00000000000..aae2f8d866d --- /dev/null +++ b/tests/robotests/src/com/android/internal/accessibility/AccessibilityShortcutController.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2017 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.internal.accessibility; + +import android.content.ComponentName; + +import java.util.HashMap; +import java.util.Map; + +/** + * Fake controller to make robolectric test compile. Should be removed when Robolectric supports + * API 25. + */ +public class AccessibilityShortcutController { + + public static Map + getFrameworkShortcutFeaturesMap() { + return new HashMap<>(); + } + + public static class ToggleableFrameworkFeatureInfo { + private String mSettingKey; + + public String getSettingKey() { + return mSettingKey; + } + } +} diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java index fb32da11ccd..c721fc9e663 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java @@ -16,35 +16,92 @@ package com.android.settings.accessibility; +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; + import android.content.Context; +import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.XmlTestUtils; + +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.util.ArrayList; import java.util.List; -import static com.google.common.truth.Truth.assertThat; - @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class AccessibilitySettingsTest { + private Context mContext; + private AccessibilitySettings mFragment; + private boolean mAccessibilityShortcutPreferenceRemoved; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = spy(RuntimeEnvironment.application); + mFragment = new AccessibilitySettings() { + @Override + public Context getContext() { + return mContext; + } + + @Override + protected boolean removePreference(String key) { + if (AccessibilitySettings.ACCESSIBILITY_SHORTCUT_PREFERENCE.equals(key)) { + mAccessibilityShortcutPreferenceRemoved = true; + + return true; + } + return false; + } + }; + } + @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 testAccessibilityShortcutPreference_byDefault_shouldBeShown() { + final Preference preference = new Preference(mContext); + mFragment.checkAccessibilityShortcutVisibility(preference); + + assertThat(mAccessibilityShortcutPreferenceRemoved).isFalse(); + } + + @Test + @Config(qualifiers = "mcc999") + public void testAccessibilityShortcutPreference_ifDisabled_shouldNotBeShown() { + final Preference preference = new Preference(mContext); + mFragment.checkAccessibilityShortcutVisibility(preference); + + assertThat(mAccessibilityShortcutPreferenceRemoved).isTrue(); + } + + @Test + @Config(qualifiers = "mcc999") + public void testNonIndexableKeys_ifAccessibilityShortcutNotVisible_containsKey() { + final List niks = AccessibilitySettings.SEARCH_INDEX_DATA_PROVIDER + .getNonIndexableKeys(mContext); + + assertThat(niks).contains(AccessibilitySettings.ACCESSIBILITY_SHORTCUT_PREFERENCE); + } }