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

Commit e4a8eb28 authored by Chun-Ku Lin's avatar Chun-Ku Lin Committed by Android (Google) Code Review
Browse files

Merge "a11y: Disable cursor following setting when it's in window only mode" into main

parents 6569589c 7d43a12f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -5486,6 +5486,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
@@ -356,6 +356,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();
    }
}