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

Commit d2da52c3 authored by Hiroki Sato's avatar Hiroki Sato
Browse files

Allow devices override default behavior of magnify NavBar and IME

This change allows device configuration to change the default behavior
of fullscreen magnification magnifying navigation bar and IME windows.

Bug: 357764515
Test: adb shell settings delete secure accessibility_magnification_magnify_nav_and_ime \
      and see behavior with and without overrides.
Test: WindowStateTests
Flag: com.android.server.accessibility.enable_magnification_magnify_nav_bar_and_ime
Change-Id: I70b74542ff32da283db5d77477793e35b873dbeb
parent e539f591
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.text.TextUtils;
import android.util.ArraySet;
import android.view.accessibility.AccessibilityManager;

import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;

import libcore.util.EmptyArray;
@@ -372,4 +373,15 @@ public final class AccessibilityUtils {
        }
        return null;
    }

    /**
     * Returns the default value for
     * {@link android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MAGNIFY_NAV_AND_IME}.
     *
     * @return The {@link State} whether the default value is on or off.
     */
    public static int getMagnificationMagnifyKeyboardDefaultValue(Context context) {
        return context.getResources().getBoolean(
                R.bool.config_magnification_magnify_keyboard_default) ? State.ON : State.OFF;
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -4163,6 +4163,9 @@
    <!-- Whether to keep fullscreen magnification zoom level when context changes. -->
    <bool name="config_magnification_keep_zoom_level_when_context_changed">false</bool>

    <!-- The default value whether to magnify IME and keyboard with fullscreen magnification . -->
    <bool name="config_magnification_magnify_keyboard_default">false</bool>

    <!-- If true, the display will be shifted around in ambient mode. -->
    <bool name="config_enableBurnInProtection">false</bool>

+1 −0
Original line number Diff line number Diff line
@@ -4959,6 +4959,7 @@
  <java-symbol type="bool" name="config_magnification_area" />
  <java-symbol type="bool" name="config_magnification_always_on_enabled" />
  <java-symbol type="bool" name="config_magnification_keep_zoom_level_when_context_changed" />
  <java-symbol type="bool" name="config_magnification_magnify_keyboard_default" />

  <java-symbol type="bool" name="config_trackerAppNeedsPermissions"/>
  <!-- FullScreenMagnification thumbnail -->
+5 −3
Original line number Diff line number Diff line
@@ -326,6 +326,7 @@ import android.window.WindowContainerToken;
import android.window.WindowContextInfo;

import com.android.internal.R;
import com.android.internal.accessibility.util.AccessibilityUtils;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting.Visibility;
@@ -1051,7 +1052,8 @@ public class WindowManagerService extends IWindowManager.Stub
            boolean enabledMagnifyNavAndIme = Settings.Secure.getIntForUser(
                    mContext.getContentResolver(),
                    Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MAGNIFY_NAV_AND_IME,
                    0, mCurrentUserId) == 1;
                    AccessibilityUtils.getMagnificationMagnifyKeyboardDefaultValue(mContext),
                    mCurrentUserId) == 1;
            if (mMagnifyNavAndIme == enabledMagnifyNavAndIme) {
                return;
            }
+55 −2
Original line number Diff line number Diff line
@@ -42,10 +42,10 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
import static android.view.WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY;
@@ -120,6 +120,7 @@ import android.window.TaskFragmentOrganizer;

import androidx.test.filters.SmallTest;

import com.android.internal.R;
import com.android.server.inputmethod.InputMethodManagerInternal;
import com.android.server.testutils.StubTransaction;
import com.android.server.wm.SensitiveContentPackages.PackageInfo;
@@ -374,6 +375,58 @@ public class WindowStateTests extends WindowTestsBase {
        assertTrue(navWindow.shouldMagnify());
    }

    @Test
    @EnableFlags(com.android.server.accessibility
            .Flags.FLAG_ENABLE_MAGNIFICATION_MAGNIFY_NAV_BAR_AND_IME)
    public void testMagnifyNavAndIme_flagOnAndDefaultEnable_typeIsIme_shouldMagnify() {
        useFakeSettingsProvider();  // This resets the Settings.Secure value.
        spyOn(mContext.getResources());
        when(mContext.getResources().getBoolean(
                R.bool.config_magnification_magnify_keyboard_default)).thenReturn(true);

        final WindowState imeWindow = newWindowBuilder("imeWindow", TYPE_INPUT_METHOD).build();
        final WindowState imeDialogWindow =
                newWindowBuilder("imeDialogWindow", TYPE_INPUT_METHOD_DIALOG).build();
        final WindowState navWindow = newWindowBuilder("navWindow", TYPE_NAVIGATION_BAR).build();

        imeWindow.setHasSurface(true);
        imeDialogWindow.setHasSurface(true);
        navWindow.setHasSurface(true);

        mWm.mSettingsObserver.loadSettings();

        assertTrue(mWm.isMagnifyNavAndImeEnabled());
        assertTrue(imeWindow.shouldMagnify());
        assertTrue(imeDialogWindow.shouldMagnify());
        assertTrue(navWindow.shouldMagnify());
    }

    @Test
    @EnableFlags(com.android.server.accessibility
            .Flags.FLAG_ENABLE_MAGNIFICATION_MAGNIFY_NAV_BAR_AND_IME)
    public void testMagnifyNavAndIme_flagOnAndDefaultDisable_typeIsIme_shouldNotMagnify() {
        useFakeSettingsProvider();  // This resets the Settings.Secure value.
        spyOn(mContext.getResources());
        when(mContext.getResources().getBoolean(
                R.bool.config_magnification_magnify_keyboard_default)).thenReturn(false);

        final WindowState imeWindow = newWindowBuilder("imeWindow", TYPE_INPUT_METHOD).build();
        final WindowState imeDialogWindow =
                newWindowBuilder("imeDialogWindow", TYPE_INPUT_METHOD_DIALOG).build();
        final WindowState navWindow = newWindowBuilder("navWindow", TYPE_NAVIGATION_BAR).build();

        imeWindow.setHasSurface(true);
        imeDialogWindow.setHasSurface(true);
        navWindow.setHasSurface(true);

        mWm.mSettingsObserver.loadSettings();

        assertFalse(mWm.isMagnifyNavAndImeEnabled());
        assertFalse(imeWindow.shouldMagnify());
        assertFalse(imeDialogWindow.shouldMagnify());
        assertFalse(navWindow.shouldMagnify());
    }

    @Test
    public void testCanBeImeLayeringTarget() {
        final WindowState appWindow = newWindowBuilder("appWindow", TYPE_APPLICATION).build();