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

Commit 27607a47 authored by Daniel Norman's avatar Daniel Norman Committed by Android (Google) Code Review
Browse files

Merge "fix(magnification): make always on toggle unavailable when capabilities...

Merge "fix(magnification): make always on toggle unavailable when capabilities is window only" into main
parents ea650045 1c898252
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -24,6 +24,16 @@ flag {
  bug: "301198830"
}

flag {
  name: "hide_magnification_always_on_toggle_when_window_mode_only"
  namespace: "accessibility"
  description: "Decides whether to hide the magnification always on setting when capabilities is window mode only."
  bug: "328787031"
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}

flag {
  name: "remove_qs_tooltip_in_suw"
  namespace: "accessibility"
+2 −0
Original line number Diff line number Diff line
@@ -4764,6 +4764,8 @@
    <string name="accessibility_screen_magnification_always_on_title">Keep on while switching apps</string>
    <!-- Summary for accessibility magnifier preference where the magnifier never turns off while switching apps. [CHAR LIMIT=none] -->
    <string name="accessibility_screen_magnification_always_on_summary">Magnifier stays on and zooms out when you switch apps</string>
    <!-- Summary for accessibility magnifier preference where the always on toggle is unavailable while partial-only capability. [CHAR LIMIT=none] -->
    <string name="accessibility_screen_magnification_always_on_unavailable_summary">Unavailable while only magnifying part of the screen</string>
    <!-- Title for accessibility on-screen joystick controller preference that controls magnification position. [CHAR LIMIT=35] -->
    <string name="accessibility_screen_magnification_joystick_title">Joystick</string>
    <!-- Summary for accessibility on-screen joystick controller preference that controls magnification position. [CHAR LIMIT=none] -->
+77 −1
Original line number Diff line number Diff line
@@ -20,26 +20,73 @@ import static com.android.settings.accessibility.AccessibilityUtil.State.OFF;
import static com.android.settings.accessibility.AccessibilityUtil.State.ON;

import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;

import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

import com.android.settings.R;
import com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;

/**
 * Controller that accesses and switches the preference status of the magnification always on
 * feature, where the magnifier will not deactivate on Activity transitions; it will only zoom out
 * to 100%.
 */
public class MagnificationAlwaysOnPreferenceController extends TogglePreferenceController {
public class MagnificationAlwaysOnPreferenceController extends TogglePreferenceController
        implements LifecycleObserver, OnResume, OnPause {

    private static final String TAG =
            MagnificationAlwaysOnPreferenceController.class.getSimpleName();
    static final String PREF_KEY = Settings.Secure.ACCESSIBILITY_MAGNIFICATION_ALWAYS_ON_ENABLED;

    private Preference mPreference;

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

    public MagnificationAlwaysOnPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
    }

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

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

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        mPreference = screen.findPreference(getPreferenceKey());
        updateState(mPreference);
    }

    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
@@ -62,4 +109,33 @@ public class MagnificationAlwaysOnPreferenceController extends TogglePreferenceC
    public int getSliceHighlightMenuRes() {
        return R.string.menu_key_accessibility;
    }

    @Override
    public CharSequence getSummary() {
        if (!Flags.hideMagnificationAlwaysOnToggleWhenWindowModeOnly()) {
            return super.getSummary();
        }

        @StringRes int resId = mPreference.isEnabled()
                ? R.string.accessibility_screen_magnification_always_on_summary
                : R.string.accessibility_screen_magnification_always_on_unavailable_summary;
        return mContext.getString(resId);
    }

    @Override
    public void updateState(Preference preference) {
        super.updateState(preference);
        if (!Flags.hideMagnificationAlwaysOnToggleWhenWindowModeOnly()) {
            return;
        }

        if (preference == null) {
            return;
        }
        @MagnificationMode int mode =
                MagnificationCapabilities.getCapabilities(mContext);
        preference.setEnabled(
                mode == MagnificationMode.FULLSCREEN || mode == MagnificationMode.ALL);
        refreshSummary(preference);
    }
}
+24 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settings.accessibility;

import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.provider.Settings;

import androidx.annotation.IntDef;
@@ -101,5 +102,28 @@ public final class MagnificationCapabilities {
                MagnificationMode.FULLSCREEN, contentResolver.getUserId());
    }

    /**
     * Register an observer class that gets callbacks when magnification capabilities changes.
     *
     * @param context A {@link Context}.
     * @param contentObserver The object that receives callbacks when changes occur.
     */
    public static void registerObserver(Context context, ContentObserver contentObserver) {
        context.getContentResolver().registerContentObserver(
                Settings.Secure.getUriFor(KEY_CAPABILITY),
                /* notifyForDescendants= */ false,
                contentObserver);
    }

    /**
     * Unregisters a magnification capabilities change observer.
     *
     * @param context A {@link Context}.
     * @param contentObserver The previously registered observer that is no longer needed.
     */
    public static void unregisterObserver(Context context, ContentObserver contentObserver) {
        context.getContentResolver().unregisterContentObserver(contentObserver);
    }

    private MagnificationCapabilities() {}
}
+2 −0
Original line number Diff line number Diff line
@@ -266,6 +266,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends
                defaultValue
        );
    }

    private void addAlwaysOnSetting(PreferenceCategory generalCategory) {
        if (!isAlwaysOnSettingEnabled()) {
            return;
@@ -282,6 +283,7 @@ public class ToggleScreenMagnificationPreferenceFragment extends

        var alwaysOnPreferenceController = new MagnificationAlwaysOnPreferenceController(
                getContext(), MagnificationAlwaysOnPreferenceController.PREF_KEY);
        getSettingsLifecycle().addObserver(alwaysOnPreferenceController);
        alwaysOnPreferenceController.displayPreference(getPreferenceScreen());
        addPreferenceController(alwaysOnPreferenceController);
    }
Loading