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

Commit 8e88b15b authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "window magnification overlap with bottom bar when mouse or keyborad connected" into main

parents c719e8e5 9fa39209
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