From e2182809022ccb75597dcbb9544785ae99336dd9 Mon Sep 17 00:00:00 2001 From: Menghan Li Date: Thu, 9 Jan 2025 07:00:17 +0000 Subject: [PATCH] Add HaTS entrypoint for Magnification page This entry point allows users to access and adjust Magnification settings for low vision accessibility. Visibility is controlled by the aconfig flag and SurveyFeatureProvider#isSurveyAvailable. NO_IFTTT=Revisit preference_list scope Bug: 380346799 Test: atest ToggleScreenMagnificationPreferenceFragmentTest Flag: com.android.server.accessibility.enable_low_vision_hats Change-Id: I81a55487734fe7b139391a6c95834c7313e54d7a --- ...ScreenMagnificationPreferenceFragment.java | 56 +++++++++++---- ...enMagnificationPreferenceFragmentTest.java | 68 +++++++++++++++++-- 2 files changed, 103 insertions(+), 21 deletions(-) diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java index 73b31c33d6f..fef83ae2ef1 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java @@ -196,20 +196,17 @@ public class ToggleScreenMagnificationPreferenceFragment extends @Override protected void initSettingsPreference() { - // If the device doesn't support window magnification feature, it should hide the - // settings preference. - if (!isWindowMagnificationSupported(getContext())) { - return; - } - final PreferenceCategory generalCategory = findPreference(KEY_GENERAL_CATEGORY); - // LINT.IfChange(preference_list) - addMagnificationModeSetting(generalCategory); - addFollowTypingSetting(generalCategory); - addOneFingerPanningSetting(generalCategory); - addAlwaysOnSetting(generalCategory); - addJoystickSetting(generalCategory); - // LINT.ThenChange(search_data) + if (isWindowMagnificationSupported(getContext())) { + // LINT.IfChange(preference_list) + addMagnificationModeSetting(generalCategory); + addFollowTypingSetting(generalCategory); + addOneFingerPanningSetting(generalCategory); + addAlwaysOnSetting(generalCategory); + addJoystickSetting(generalCategory); + // LINT.ThenChange(:search_data) + } + addFeedbackSetting(generalCategory); } @Override @@ -346,6 +343,14 @@ public class ToggleScreenMagnificationPreferenceFragment extends return pref; } + private static Preference createFeedbackPreference(Context context) { + final Preference pref = new Preference(context); + pref.setTitle(R.string.accessibility_feedback_title); + pref.setSummary(R.string.accessibility_feedback_summary); + pref.setKey(MagnificationFeedbackPreferenceController.PREF_KEY); + return pref; + } + private static boolean isJoystickSupported() { return DeviceConfig.getBoolean( DeviceConfig.NAMESPACE_WINDOW_MANAGER, @@ -371,6 +376,21 @@ public class ToggleScreenMagnificationPreferenceFragment extends addPreferenceController(joystickPreferenceController); } + private void addFeedbackSetting(PreferenceCategory generalCategory) { + if (!Flags.enableLowVisionHats()) { + return; + } + + final Preference feedbackPreference = createFeedbackPreference(getPrefContext()); + generalCategory.addPreference(feedbackPreference); + + final MagnificationFeedbackPreferenceController magnificationFeedbackPreferenceController = + new MagnificationFeedbackPreferenceController(getContext(), this, + MagnificationFeedbackPreferenceController.PREF_KEY); + magnificationFeedbackPreferenceController.displayPreference(getPreferenceScreen()); + addPreferenceController(magnificationFeedbackPreferenceController); + } + @Override public void showDialog(int dialogId) { super.showDialog(dialogId); @@ -773,7 +793,8 @@ public class ToggleScreenMagnificationPreferenceFragment extends createFollowTypingPreference(context), createOneFingerPanningPreference(context), createAlwaysOnPreference(context), - createJoystickPreference(context) + createJoystickPreference(context), + createFeedbackPreference(context) ) .forEach(pref -> rawData.add(createPreferenceSearchData(context, pref))); @@ -810,9 +831,14 @@ public class ToggleScreenMagnificationPreferenceFragment extends niks.add(MagnificationJoystickPreferenceController.PREF_KEY); } } + + if (!Flags.enableLowVisionHats()) { + niks.add(MagnificationFeedbackPreferenceController.PREF_KEY); + } + return niks; } - // LINT.ThenChange(preference_list) + // LINT.ThenChange(:preference_list) private SearchIndexableRaw createPreferenceSearchData( Context context, Preference pref) { diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java index 0b385941997..863452fb645 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentTest.java @@ -336,6 +336,26 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { assertThat(switchPreference.isChecked()).isFalse(); } + @Test + @EnableFlags(Flags.FLAG_ENABLE_LOW_VISION_HATS) + public void onResume_enableLowVisionHaTS_feedbackPreferenceShouldReturnNotNull() { + mFragController.create(R.id.main_content, /* bundle= */ null).start().resume(); + + final Preference feedbackPreference = mFragController.get().findPreference( + MagnificationFeedbackPreferenceController.PREF_KEY); + assertThat(feedbackPreference).isNotNull(); + } + + @Test + @DisableFlags(Flags.FLAG_ENABLE_LOW_VISION_HATS) + public void onResume_disableLowVisionHaTS_feedbackPreferenceShouldReturnNull() { + mFragController.create(R.id.main_content, /* bundle= */ null).start().resume(); + + final Preference feedbackPreference = mFragController.get().findPreference( + MagnificationFeedbackPreferenceController.PREF_KEY); + assertThat(feedbackPreference).isNull(); + } + @Test public void onResume_haveRegisterToSpecificUris() { ShadowContentResolver shadowContentResolver = Shadows.shadowOf( @@ -893,13 +913,14 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { @Test @EnableFlags(com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) public void getRawDataToIndex_returnsAllPreferenceKeys() { - List expectedSearchKeys = List.of( + final List expectedSearchKeys = List.of( KEY_MAGNIFICATION_SHORTCUT_PREFERENCE, MagnificationModePreferenceController.PREF_KEY, MagnificationFollowTypingPreferenceController.PREF_KEY, MagnificationOneFingerPanningPreferenceController.PREF_KEY, MagnificationAlwaysOnPreferenceController.PREF_KEY, - MagnificationJoystickPreferenceController.PREF_KEY); + MagnificationJoystickPreferenceController.PREF_KEY, + MagnificationFeedbackPreferenceController.PREF_KEY); final List rawData = ToggleScreenMagnificationPreferenceFragment .SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, true); @@ -910,8 +931,7 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { @Test @EnableFlags(com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH) - public void - getNonIndexableKeys_windowMagnificationNotSupported_onlyShortcutPreferenceSearchable() { + public void getNonIndexableKeys_windowMagnificationNotSupported_onlyShortcutSearchable() { setWindowMagnificationSupported(false, false); final List niks = ToggleScreenMagnificationPreferenceFragment @@ -920,7 +940,8 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { .SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, true); // Expect all search data, except the shortcut preference, to be in NIKs. final List expectedNiks = rawData.stream().map(raw -> raw.key) - .filter(key -> !key.equals(KEY_MAGNIFICATION_SHORTCUT_PREFERENCE)).toList(); + .filter(key -> !key.equals(KEY_MAGNIFICATION_SHORTCUT_PREFERENCE)) + .toList(); // In NonIndexableKeys == not searchable assertThat(niks).containsExactlyElementsIn(expectedNiks); @@ -929,7 +950,32 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { @Test @EnableFlags({ com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH, - Flags.FLAG_ENABLE_MAGNIFICATION_ONE_FINGER_PANNING_GESTURE}) + Flags.FLAG_ENABLE_LOW_VISION_HATS}) + public void + getNonIndexableKeys_windowMagnificationNotSupportedHatsOn_shortcutFeedbackSearchable() { + setWindowMagnificationSupported(false, false); + + final List niks = ToggleScreenMagnificationPreferenceFragment + .SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext); + final List rawData = ToggleScreenMagnificationPreferenceFragment + .SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(mContext, true); + // Expect all search data, except the shortcut preference and feedback preference, to be in + // NIKs. + final List expectedNiks = rawData.stream().map(raw -> raw.key) + .filter(key -> + !key.equals(KEY_MAGNIFICATION_SHORTCUT_PREFERENCE) + && !key.equals(MagnificationFeedbackPreferenceController.PREF_KEY)) + .toList(); + + // In NonIndexableKeys == not searchable + assertThat(niks).containsExactlyElementsIn(expectedNiks); + } + + @Test + @EnableFlags({ + com.android.settings.accessibility.Flags.FLAG_FIX_A11Y_SETTINGS_SEARCH, + Flags.FLAG_ENABLE_MAGNIFICATION_ONE_FINGER_PANNING_GESTURE, + Flags.FLAG_ENABLE_LOW_VISION_HATS}) public void getNonIndexableKeys_hasShortcutAndAllFeaturesEnabled_allItemsSearchable() { setMagnificationTripleTapEnabled(true); setAlwaysOnSupported(true); @@ -991,6 +1037,16 @@ public class ToggleScreenMagnificationPreferenceFragmentTest { assertThat(niks).contains(MagnificationJoystickPreferenceController.PREF_KEY); } + @Test + @DisableFlags(Flags.FLAG_ENABLE_LOW_VISION_HATS) + public void getNonIndexableKeys_hatsNotSupported_notSearchable() { + final List niks = ToggleScreenMagnificationPreferenceFragment + .SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext); + + // In NonIndexableKeys == not searchable + assertThat(niks).contains(MagnificationFeedbackPreferenceController.PREF_KEY); + } + private void putStringIntoSettings(String key, String componentName) { Settings.Secure.putString(mContext.getContentResolver(), key, componentName); }