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

Commit 9fa39209 authored by Hiroki Sato's avatar Hiroki Sato
Browse files

window magnification overlap with bottom bar when mouse or keyborad connected

With this change, window magnification bounds overlaps with the bottom
system gesture insets when a mouse or a keyboard is connected to the
device.

This essentially reverts the behavior introduced with a flag
update_window_magnifier_bottom_boundary but only enabled when desktop
like experience is provided.

Bug: 419389153
Test: WindowMagnificationControllerTest
Test: WindowMagnificationAnimationControllerTest
Flag: com.android.systemui.update_window_magnifier_bottom_boundary_with_mouse
Change-Id: I6e168b3dbe1dbb52b1ac831c5634709898c59382
parent d0dba9b0
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -85,6 +85,16 @@ flag {
    }
}

flag {
    name: "update_window_magnifier_bottom_boundary_with_mouse"
    namespace: "accessibility"
    description:  "Update the window magnification behavior with bottom gesture insets with mouse."
    bug: "419389153"
    metadata {
      purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "hearing_devices_dialog_related_tools"
    namespace: "accessibility"
+12 −6
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.annotation.Nullable;
import android.content.Context;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.hardware.input.InputManager;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -98,11 +99,13 @@ public class MagnificationImpl implements Magnification, CommandQueue.Callbacks
        private final SysUiState mSysUiState;
        private final SecureSettings mSecureSettings;
        private final WindowManagerProvider mWindowManagerProvider;
        private final InputManager mInputManager;

        WindowMagnificationControllerSupplier(Context context, Handler handler,
                WindowMagnifierCallback windowMagnifierCallback,
                DisplayManager displayManager, SysUiState sysUiState,
                SecureSettings secureSettings, WindowManagerProvider windowManagerProvider) {
                SecureSettings secureSettings, WindowManagerProvider windowManagerProvider,
                InputManager inputManager) {
            super(displayManager);
            mContext = context;
            mHandler = handler;
@@ -110,6 +113,7 @@ public class MagnificationImpl implements Magnification, CommandQueue.Callbacks
            mSysUiState = sysUiState;
            mSecureSettings = secureSettings;
            mWindowManagerProvider = windowManagerProvider;
            mInputManager = inputManager;
        }

        @Override
@@ -135,7 +139,8 @@ public class MagnificationImpl implements Magnification, CommandQueue.Callbacks
                    mSysUiState,
                    mSecureSettings,
                    scvhSupplier,
                    windowManager);
                    windowManager,
                    mInputManager);
        }
    }

@@ -233,11 +238,11 @@ public class MagnificationImpl implements Magnification, CommandQueue.Callbacks
            SecureSettings secureSettings, DisplayTracker displayTracker,
            DisplayManager displayManager, AccessibilityLogger a11yLogger,
            IWindowManager iWindowManager, AccessibilityManager accessibilityManager,
            WindowManagerProvider windowManagerProvider) {
            WindowManagerProvider windowManagerProvider, InputManager inputManager) {
        this(context, mainHandler.getLooper(), executor, commandQueue,
                modeSwitchesController, sysUiState, launcherProxyService, secureSettings,
                displayTracker, displayManager, a11yLogger, iWindowManager, accessibilityManager,
                windowManagerProvider);
                windowManagerProvider, inputManager);
    }

    @VisibleForTesting
@@ -248,7 +253,8 @@ public class MagnificationImpl implements Magnification, CommandQueue.Callbacks
            DisplayManager displayManager, AccessibilityLogger a11yLogger,
            IWindowManager iWindowManager,
            AccessibilityManager accessibilityManager,
            WindowManagerProvider windowManagerProvider) {
            WindowManagerProvider windowManagerProvider,
            InputManager inputManager) {
        mHandler = new Handler(looper) {
            @Override
            public void handleMessage(@NonNull Message msg) {
@@ -267,7 +273,7 @@ public class MagnificationImpl implements Magnification, CommandQueue.Callbacks
        mA11yLogger = a11yLogger;
        mWindowMagnificationControllerSupplier = new WindowMagnificationControllerSupplier(context,
                mHandler, mWindowMagnifierCallback,
                displayManager, sysUiState, secureSettings, windowManagerProvider);
                displayManager, sysUiState, secureSettings, windowManagerProvider, inputManager);
        mFullscreenMagnificationControllerSupplier = new FullscreenMagnificationControllerSupplier(
                context, displayManager, mHandler, mExecutor, iWindowManager,
                windowManagerProvider);
+69 −21
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
import android.hardware.input.InputManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@@ -56,6 +57,7 @@ import android.util.SparseArray;
import android.util.TypedValue;
import android.view.Display;
import android.view.Gravity;
import android.view.InputDevice;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.Surface;
@@ -248,6 +250,42 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
    @Nullable
    private final MirrorWindowControl mMirrorWindowControl;

    private final InputManager mInputManager;
    private boolean mIsMouseOrKeyboardConnected = false;
    private final InputManager.InputDeviceListener mInputDeviceListener =
            new InputManager.InputDeviceListener() {
                @Override
                public void onInputDeviceAdded(int deviceId) {
                    onInputDeviceChanged(deviceId);
                }

                @Override
                public void onInputDeviceRemoved(int deviceId) {
                    onInputDeviceChanged(deviceId);
                }

                @Override
                public void onInputDeviceChanged(int deviceId) {
                    final boolean wasConnected = mIsMouseOrKeyboardConnected;
                    mIsMouseOrKeyboardConnected = false;
                    for (final int id : mInputManager.getInputDeviceIds()) {
                        final InputDevice device = mInputManager.getInputDevice(id);
                        if (device == null || !device.isEnabled() || device.isVirtual()) {
                            continue;
                        }
                        if (device.supportsSource(InputDevice.SOURCE_MOUSE)
                                || device.isFullKeyboard()) {
                            mIsMouseOrKeyboardConnected = true;
                            break;
                        }
                    }
                    if (wasConnected != mIsMouseOrKeyboardConnected) {
                        // mIsMouseOrKeyboardConnected affects how to handle insets.
                        onWindowInsetChanged();
                    }
                }
            };

    WindowMagnificationController(
            @UiContext Context context,
            @NonNull Handler handler,
@@ -258,7 +296,8 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
            SysUiState sysUiState,
            SecureSettings secureSettings,
            Supplier<SurfaceControlViewHost> scvhSupplier,
            WindowManager windowManager) {
            WindowManager windowManager,
            InputManager inputManager) {
        mContext = context;
        mHandler = handler;
        mAnimationController = animationController;
@@ -269,6 +308,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
        mScvhSupplier = scvhSupplier;
        mConfiguration = new Configuration(context.getResources().getConfiguration());
        mWindowMagnificationFrameSizePrefs = new WindowMagnificationFrameSizePrefs(mContext);
        mInputManager = inputManager;

        final Display display = mContext.getDisplay();
        mDisplayId = mContext.getDisplayId();
@@ -387,10 +427,10 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
        final WindowMetrics windowMetrics = mWm.getCurrentWindowMetrics();
        final Insets insets = windowMetrics.getWindowInsets().getInsets(systemGestures());
        final int gestureTop;
        if (Flags.updateWindowMagnifierBottomBoundary()) {
            gestureTop = windowMetrics.getBounds().bottom - insets.bottom;
        } else {
        if (canOverlapWithBottomGestureInsets()) {
            gestureTop = insets.bottom != 0 ? windowMetrics.getBounds().bottom - insets.bottom : -1;
        } else {
            gestureTop = windowMetrics.getBounds().bottom - insets.bottom;
        }
        if (gestureTop != mSystemGestureTop) {
            mSystemGestureTop = gestureTop;
@@ -470,6 +510,10 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
            return;
        }

        if (Flags.updateWindowMagnifierBottomBoundaryWithMouse()) {
            mInputManager.unregisterInputDeviceListener(mInputDeviceListener);
        }

        if (mMirrorSurface != null) {
            mTransaction.remove(mMirrorSurface).apply();
            mMirrorSurface = null;
@@ -534,9 +578,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
        if (configDiff == 0) {
            return;
        }
        if (Flags.updateWindowMagnifierBottomBoundary()) {
        updateSystemGestureInsetsTop();
        }
        if ((configDiff & ActivityInfo.CONFIG_ORIENTATION) != 0) {
            onRotate();
        }
@@ -714,14 +756,10 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
    }

    private void onWindowInsetChanged() {
        if (Flags.updateWindowMagnifierBottomBoundary()) {
            updateSystemGestureInsetsTop();
        } else {
        if (updateSystemGestureInsetsTop()) {
            updateSystemUIStateIfNeeded();
        }
    }
    }

    private void applyTouchableRegion() {
        // Sometimes this can get posted and run after deleteWindowMagnification() is called.
@@ -985,9 +1023,9 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
        final int x = MathUtils.clamp(mMagnificationFrame.left - mMirrorSurfaceMargin, minX, maxX);

        final int minY = -mOuterBorderSize;
        final int maxY = Flags.updateWindowMagnifierBottomBoundary()
                ? mSystemGestureTop - height + mOuterBorderSize
                : mWindowBounds.bottom - height + mOuterBorderSize;
        final int maxY = canOverlapWithBottomGestureInsets()
                ? mWindowBounds.bottom - height + mOuterBorderSize
                : mSystemGestureTop - height + mOuterBorderSize;
        final int y = MathUtils.clamp(mMagnificationFrame.top - mMirrorSurfaceMargin, minY, maxY);
        if (computeWindowSize) {
            LayoutParams params = (LayoutParams) mMirrorView.getLayoutParams();
@@ -1143,11 +1181,8 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
    }

    private void updateSysUIState(boolean force) {
        if (Flags.updateWindowMagnifierBottomBoundary()) {
            return;
        }

        final boolean overlap = isActivated() && mSystemGestureTop > 0
        final boolean overlap = isActivated() && canOverlapWithBottomGestureInsets()
                && mSystemGestureTop > 0
                && mMirrorViewBounds.bottom > mSystemGestureTop;
        if (force || overlap != mOverlapWithGestureInsets) {
            mOverlapWithGestureInsets = overlap;
@@ -1274,6 +1309,11 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
            createWindowlessMirrorWindow();
            showControls();
            applyResourcesValues();

            if (Flags.updateWindowMagnifierBottomBoundaryWithMouse()) {
                mInputManager.registerInputDeviceListener(mInputDeviceListener, mHandler);
                mInputDeviceListener.onInputDeviceChanged(-1);
            }
        } else {
            modifyWindowMagnification(false);
        }
@@ -1634,9 +1674,17 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold
        scaleAnimator.start();
    }

    private boolean canOverlapWithBottomGestureInsets() {
        return !Flags.updateWindowMagnifierBottomBoundary()
                || (Flags.updateWindowMagnifierBottomBoundaryWithMouse()
                && mIsMouseOrKeyboardConnected);
    }

    public void dump(PrintWriter pw) {
        pw.println("WindowMagnificationController (displayId=" + mDisplayId + "):");
        pw.println("      mOverlapWithGestureInsets:" + mOverlapWithGestureInsets);
        pw.println("      canOverlapWithBottomGestureInsets:"
                + canOverlapWithBottomGestureInsets());
        pw.println("      mScale:" + mScale);
        pw.println("      mWindowBounds:" + mWindowBounds);
        pw.println("      mMirrorViewBounds:" + (isActivated() ? mMirrorViewBounds : "empty"));
+5 −1
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.when;

import android.content.Context;
import android.hardware.display.DisplayManager;
import android.hardware.input.InputManager;
import android.os.RemoteException;
import android.provider.Settings;
import android.testing.TestableLooper;
@@ -95,6 +96,8 @@ public class IMagnificationConnectionTest extends SysuiTestCase {
    private IWindowManager mIWindowManager;
    @Mock
    private WindowManagerProvider mWindowManagerProvider;
    @Mock
    private InputManager mInputManager;

    private IMagnificationConnection mIMagnificationConnection;
    private MagnificationImpl mMagnification;
@@ -116,7 +119,8 @@ public class IMagnificationConnectionTest extends SysuiTestCase {
                mTestableLooper.getLooper(), mContext.getMainExecutor(), mCommandQueue,
                mModeSwitchesController, mSysUiState, mLauncherProxyService, mSecureSettings,
                mDisplayTracker, getContext().getSystemService(DisplayManager.class),
                mA11yLogger, mIWindowManager, mAccessibilityManager, mWindowManagerProvider);
                mA11yLogger, mIWindowManager, mAccessibilityManager, mWindowManagerProvider,
                mInputManager);
        mMagnification.mWindowMagnificationControllerSupplier =
                new FakeWindowMagnificationControllerSupplier(
                        mContext.getSystemService(DisplayManager.class));
+5 −1
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.hardware.input.InputManager;
import android.os.RemoteException;
import android.testing.TestableLooper;
import android.view.Display;
@@ -99,6 +100,8 @@ public class MagnificationTest extends SysuiTestCase {
    private IWindowManager mIWindowManager;
    @Mock
    private WindowManagerProvider mWindowManagerProvider;
    @Mock
    private InputManager mInputManager;

    @Before
    public void setUp() throws Exception {
@@ -132,7 +135,8 @@ public class MagnificationTest extends SysuiTestCase {
                mCommandQueue, mModeSwitchesController,
                mSysUiState, mLauncherProxyService, mSecureSettings, mDisplayTracker,
                getContext().getSystemService(DisplayManager.class), mA11yLogger, mIWindowManager,
                getContext().getSystemService(AccessibilityManager.class), mWindowManagerProvider);
                getContext().getSystemService(AccessibilityManager.class), mWindowManagerProvider,
                mInputManager);
        mMagnification.mWindowMagnificationControllerSupplier = new FakeControllerSupplier(
                mContext.getSystemService(DisplayManager.class), mWindowMagnificationController);
        mMagnification.mMagnificationSettingsSupplier = new FakeSettingsSupplier(
Loading