Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2182809 authored by Menghan Li's avatar Menghan Li
Browse files

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
parent 3f677476
Loading
Loading
Loading
Loading
+41 −15
Original line number Diff line number Diff line
@@ -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);
        if (isWindowMagnificationSupported(getContext())) {
            // LINT.IfChange(preference_list)
            addMagnificationModeSetting(generalCategory);
            addFollowTypingSetting(generalCategory);
            addOneFingerPanningSetting(generalCategory);
            addAlwaysOnSetting(generalCategory);
            addJoystickSetting(generalCategory);
        // LINT.ThenChange(search_data)
            // 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) {
+62 −6
Original line number Diff line number Diff line
@@ -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<String> expectedSearchKeys = List.of(
        final List<String> 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<SearchIndexableRaw> 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<String> 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<String> 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<String> niks = ToggleScreenMagnificationPreferenceFragment
                .SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext);
        final List<SearchIndexableRaw> 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<String> 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<String> 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);
    }