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

Commit 7d43a12f authored by Yongshun Liu's avatar Yongshun Liu
Browse files

a11y: Disable cursor following setting when it's in window only mode

When magnification is in window only mode, the cursor following mode
setting should be disabled. This also adds tests to make sure the
setting is enabled or disabled correctly.

Bug: 421234980
Flag: com.android.settings.accessibility.enable_magnification_cursor_following_dialog
Test: SettingsRoboTests:com.android.settings.accessibility.MagnificationCursorFollowingModePreferenceControllerTest
Change-Id: I9384d466e51ef86f6b109607e19d1379c21a27df
parent a13e7291
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -5482,6 +5482,8 @@
    <string name="accessibility_magnification_cursor_following_title">Cursor following</string>
    <!-- Header message of cursor following mode dialog for magnification. [CHAR LIMIT=none] -->
    <string name="accessibility_magnification_cursor_following_header">Choose how Magnification follows your cursor.</string>
    <!-- Summary for cursor following preference where cursor following setting is unavailable while partial-only capability. [CHAR LIMIT=none] -->
    <string name="accessibility_magnification_cursor_following_unavailable_summary">Unavailable while only magnifying part of the screen</string>
    <!-- Option title of cursor following continuous mode in the mode selection dialog. [CHAR LIMIT=none] -->
    <string name="accessibility_magnification_cursor_following_continuous">Move screen continuously as mouse moves</string>
    <!-- Option title of cursor following center mode in the mode selection dialog. [CHAR LIMIT=none] -->
+47 −1
Original line number Diff line number Diff line
@@ -19,6 +19,10 @@ import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.DialogInterface;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.provider.Settings.Secure.AccessibilityMagnificationCursorFollowingMode;
import android.text.TextUtils;
@@ -39,6 +43,10 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.DialogCreatable;
import com.android.settings.R;
import com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums;
import com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;

import java.util.ArrayList;
import java.util.List;
@@ -47,7 +55,8 @@ import java.util.List;
 * Controller that shows the magnification cursor following mode and the preference click behavior.
 */
public class MagnificationCursorFollowingModePreferenceController
        extends MagnificationBasePreferenceController implements DialogCreatable {
        extends MagnificationBasePreferenceController
        implements DialogCreatable, LifecycleObserver, OnResume, OnPause {
    static final String PREF_KEY =
            Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CURSOR_FOLLOWING_MODE;

@@ -63,6 +72,14 @@ public class MagnificationCursorFollowingModePreferenceController
    @Nullable
    private Preference mModePreference;

    final ContentObserver mContentObserver = new ContentObserver(
            new Handler(Looper.getMainLooper())) {
        @Override
        public void onChange(boolean selfChange, @Nullable Uri uri) {
            updateState(mModePreference);
        }
    };

    public MagnificationCursorFollowingModePreferenceController(@NonNull Context context,
            @NonNull String preferenceKey) {
        super(context, preferenceKey);
@@ -85,6 +102,16 @@ public class MagnificationCursorFollowingModePreferenceController
                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CURSOR_FOLLOWING_MODE_EDGE));
    }

    @Override
    public void onResume() {
        MagnificationCapabilities.registerObserver(mContext, mContentObserver);
    }

    @Override
    public void onPause() {
        MagnificationCapabilities.unregisterObserver(mContext, mContentObserver);
    }

    @Override
    public int getAvailabilityStatus() {
        return isInSetupWizard() ? CONDITIONALLY_UNAVAILABLE : AVAILABLE;
@@ -93,6 +120,10 @@ public class MagnificationCursorFollowingModePreferenceController
    @NonNull
    @Override
    public CharSequence getSummary() {
        if (mModePreference == null || !mModePreference.isEnabled()) {
            return mContext.getString(
                    R.string.accessibility_magnification_cursor_following_unavailable_summary);
        }
        return getCursorFollowingModeSummary(getCurrentMagnificationCursorFollowingMode());
    }

@@ -100,6 +131,7 @@ public class MagnificationCursorFollowingModePreferenceController
    public void displayPreference(@NonNull PreferenceScreen screen) {
        super.displayPreference(screen);
        mModePreference = screen.findPreference(getPreferenceKey());
        updateState(mModePreference);
    }

    @Override
@@ -207,6 +239,20 @@ public class MagnificationCursorFollowingModePreferenceController
                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CURSOR_FOLLOWING_MODE_CONTINUOUS);
    }

    @Override
    public void updateState(@Nullable Preference preference) {
        super.updateState(preference);

        if (preference == null) {
            return;
        }
        @MagnificationMode int mode =
                MagnificationCapabilities.getCapabilities(mContext);
        preference.setEnabled(
                mode == MagnificationMode.FULLSCREEN || mode == MagnificationMode.ALL);
        refreshSummary(preference);
    }

    static class ModeInfo extends ItemInfoArrayAdapter.ItemInfo {
        @AccessibilityMagnificationCursorFollowingMode
        public final int mMode;
+1 −0
Original line number Diff line number Diff line
@@ -355,6 +355,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends
                        MagnificationCursorFollowingModePreferenceController.PREF_KEY);
        controller.setDialogHelper(/* dialogHelper= */this);
        mMagnificationCursorFollowingModeDialogDelegate = controller;
        getSettingsLifecycle().addObserver(controller);
        controller.setInSetupWizard(mInSetupWizard);
        controller.displayPreference(getPreferenceScreen());
        addPreferenceController(controller);
+26 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.settings.accessibility;

import static com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode;

import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;

@@ -176,4 +178,28 @@ public class MagnificationCursorFollowingModePreferenceControllerTest {
        assertThat(TextUtils.equals(mController.getSummary(), mContext.getString(
                R.string.accessibility_magnification_cursor_following_edge))).isTrue();
    }

    @Test
    public void updateState_windowModeOnly_preferenceBecomesUnavailable() {
        MagnificationCapabilities.setCapabilities(mContext, MagnificationMode.WINDOW);

        mController.updateState(mModePreference);
        assertThat(mModePreference.isEnabled()).isFalse();
    }

    @Test
    public void updateState_fullscreenModeOnly_preferenceIsAvailable() {
        MagnificationCapabilities.setCapabilities(mContext, MagnificationMode.FULLSCREEN);

        mController.updateState(mModePreference);
        assertThat(mModePreference.isEnabled()).isTrue();
    }

    @Test
    public void updateState_switchMode_preferenceIsAvailable() {
        MagnificationCapabilities.setCapabilities(mContext, MagnificationMode.ALL);

        mController.updateState(mModePreference);
        assertThat(mModePreference.isEnabled()).isTrue();
    }
}