diff --git a/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl b/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl index 722546eb06e46..adfeb6d110083 100644 --- a/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl +++ b/core/java/android/view/accessibility/IWindowMagnificationConnectionCallback.aidl @@ -68,12 +68,10 @@ import android.graphics.Rect; void onAccessibilityActionPerformed(int displayId); /** - * Called when the user is performing dragging gesture. It is started after the offset - * between the down location and the move event location exceed - * {@link ViewConfiguration#getScaledTouchSlop()}. + * Called when the user is performing move action. * * @param displayId The logical display id. */ - void onDrag(int displayId); + void onMove(int displayId); } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java index 9b7a8f8d915ca..aafbf7e4d4396 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java @@ -221,9 +221,9 @@ public class WindowMagnification extends CoreStartable implements WindowMagnifie } @Override - public void onDrag(int displayId) { + public void onMove(int displayId) { if (mWindowMagnificationConnectionImpl != null) { - mWindowMagnificationConnectionImpl.onDrag(displayId); + mWindowMagnificationConnectionImpl.onMove(displayId); } } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java index 0522d43e99fb9..aa684faee5abb 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationConnectionImpl.java @@ -150,10 +150,10 @@ class WindowMagnificationConnectionImpl extends IWindowMagnificationConnection.S } } - void onDrag(int displayId) { + void onMove(int displayId) { if (mConnectionCallback != null) { try { - mConnectionCallback.onDrag(displayId); + mConnectionCallback.onMove(displayId); } catch (RemoteException e) { Log.e(TAG, "Failed to inform taking control by a user", e); } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java index e109b5c9e519b..50ca447090b50 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationController.java @@ -852,6 +852,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold @Override public void move(int xOffset, int yOffset) { moveWindowMagnifier(xOffset, yOffset); + mWindowMagnifierCallback.onMove(mDisplayId); } /** @@ -1045,8 +1046,7 @@ class WindowMagnificationController implements View.OnTouchListener, SurfaceHold @Override public boolean onDrag(float offsetX, float offsetY) { - moveWindowMagnifier(offsetX, offsetY); - mWindowMagnifierCallback.onDrag(mDisplayId); + move((int) offsetX, (int) offsetY); return true; } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java index bdded10dfa1d4..c334ca664c466 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnifierCallback.java @@ -17,7 +17,6 @@ package com.android.systemui.accessibility; import android.graphics.Rect; -import android.view.ViewConfiguration; /** * A callback to inform {@link com.android.server.accessibility.AccessibilityManagerService} about @@ -56,11 +55,9 @@ interface WindowMagnifierCallback { void onAccessibilityActionPerformed(int displayId); /** - * Called when the user is performing dragging gesture. It is started after the offset - * between the down location and the move event location exceed - * {@link ViewConfiguration#getScaledTouchSlop()}. + * Called when the user is performing a move action. * * @param displayId The logical display id. */ - void onDrag(int displayId); + void onMove(int displayId); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java index 19efd11d3a008..a49c4d76445b9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerTest.java @@ -40,6 +40,7 @@ import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -566,6 +567,7 @@ public class WindowMagnificationControllerTest extends SysuiTestCase { mirrorView.performAccessibilityAction(R.id.accessibility_action_move_right, null)); assertTrue( mirrorView.performAccessibilityAction(R.id.accessibility_action_move_left, null)); + verify(mWindowMagnifierCallback, times(4)).onMove(eq(displayId)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java index d3f30c508b8ba..ccf2f8b16f8a8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationTest.java @@ -148,13 +148,13 @@ public class WindowMagnificationTest extends SysuiTestCase { } @Test - public void onDrag_enabled_notifyCallback() throws RemoteException { + public void onMove_enabled_notifyCallback() throws RemoteException { mCommandQueue.requestWindowMagnificationConnection(true); waitForIdleSync(); - mWindowMagnification.onDrag(TEST_DISPLAY); + mWindowMagnification.onMove(TEST_DISPLAY); - verify(mConnectionCallback).onDrag(TEST_DISPLAY); + verify(mConnectionCallback).onMove(TEST_DISPLAY); } @Test diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java index a958209669264..fa32452f389ec 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java @@ -303,7 +303,7 @@ public class FullScreenMagnificationController implements public void onImeWindowVisibilityChanged(boolean shown) { final Message m = PooledLambda.obtainMessage( FullScreenMagnificationController::notifyImeWindowVisibilityChanged, - FullScreenMagnificationController.this, shown); + FullScreenMagnificationController.this, mDisplayId, shown); mControllerCtx.getHandler().sendMessage(m); } @@ -1215,11 +1215,12 @@ public class FullScreenMagnificationController implements /** * Notifies that the IME window visibility changed. * + * @param displayId the logical display id * @param shown {@code true} means the IME window shows on the screen. Otherwise it's * hidden. */ - void notifyImeWindowVisibilityChanged(boolean shown) { - mMagnificationInfoChangedCallback.onImeWindowVisibilityChanged(shown); + void notifyImeWindowVisibilityChanged(int displayId, boolean shown) { + mMagnificationInfoChangedCallback.onImeWindowVisibilityChanged(displayId, shown); } /** @@ -1609,17 +1610,19 @@ public class FullScreenMagnificationController implements * Called when the state of the magnification activation is changed. * It is for the logging data of the magnification activation state. * - * @param displayId The logical display id. + * @param displayId the logical display id * @param activated {@code true} if the magnification is activated, otherwise {@code false}. */ void onFullScreenMagnificationActivationState(int displayId, boolean activated); /** * Called when the IME window visibility changed. + * + * @param displayId the logical display id * @param shown {@code true} means the IME window shows on the screen. Otherwise it's * hidden. */ - void onImeWindowVisibilityChanged(boolean shown); + void onImeWindowVisibilityChanged(int displayId, boolean shown); /** * Called when the magnification spec changed. diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java index d57cc6b6ef850..62ba0c821f4e9 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java @@ -39,6 +39,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.util.Slog; import android.util.SparseArray; +import android.util.SparseBooleanArray; import android.view.accessibility.MagnificationAnimationCallback; import com.android.internal.accessibility.util.AccessibilityStatsLogUtils; @@ -102,7 +103,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb // Track the active user to reset the magnification and get the associated user settings. private @UserIdInt int mUserId = UserHandle.USER_SYSTEM; @GuardedBy("mLock") - private boolean mImeWindowVisible = false; + private final SparseBooleanArray mIsImeVisibleArray = new SparseBooleanArray(); private long mWindowModeEnabledTime = 0; private long mFullScreenModeEnabledTime = 0; @@ -387,7 +388,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb setActivatedModeAndSwitchDelegate(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); mLastActivatedMode = mActivatedMode; } - logMagnificationModeWithImeOnIfNeeded(); + logMagnificationModeWithImeOnIfNeeded(displayId); disableFullScreenMagnificationIfNeeded(displayId); } else { logMagnificationUsageState(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW, @@ -442,7 +443,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb setActivatedModeAndSwitchDelegate(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); mLastActivatedMode = mActivatedMode; } - logMagnificationModeWithImeOnIfNeeded(); + logMagnificationModeWithImeOnIfNeeded(displayId); disableWindowMagnificationIfNeeded(displayId); } else { logMagnificationUsageState(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN, @@ -464,12 +465,12 @@ public class MagnificationController implements WindowMagnificationManager.Callb } @Override - public void onImeWindowVisibilityChanged(boolean shown) { + public void onImeWindowVisibilityChanged(int displayId, boolean shown) { synchronized (mLock) { - mImeWindowVisible = shown; + mIsImeVisibleArray.put(displayId, shown); } - getWindowMagnificationMgr().onImeWindowVisibilityChanged(shown); - logMagnificationModeWithImeOnIfNeeded(); + getWindowMagnificationMgr().onImeWindowVisibilityChanged(displayId, shown); + logMagnificationModeWithImeOnIfNeeded(displayId); } /** @@ -585,11 +586,12 @@ public class MagnificationController implements WindowMagnificationManager.Callb } } - private void logMagnificationModeWithImeOnIfNeeded() { + private void logMagnificationModeWithImeOnIfNeeded(int displayId) { final int mode; synchronized (mLock) { - if (!mImeWindowVisible || mActivatedMode == ACCESSIBILITY_MAGNIFICATION_MODE_NONE) { + if (!mIsImeVisibleArray.get(displayId, false) + || mActivatedMode == ACCESSIBILITY_MAGNIFICATION_MODE_NONE) { return; } mode = mActivatedMode; diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java index fadb07ef4e11b..aeb1112ede5f7 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java @@ -39,6 +39,7 @@ import android.os.RemoteException; import android.os.SystemClock; import android.util.Slog; import android.util.SparseArray; +import android.util.SparseBooleanArray; import android.view.MotionEvent; import android.view.accessibility.IWindowMagnificationConnection; import android.view.accessibility.IWindowMagnificationConnectionCallback; @@ -124,6 +125,7 @@ public class WindowMagnificationManager implements private SparseArray mWindowMagnifiers = new SparseArray<>(); // Whether the following typing focus feature for magnification is enabled. private boolean mMagnificationFollowTypingEnabled = true; + private final SparseBooleanArray mIsImeVisibleArray = new SparseBooleanArray(); private boolean mReceiverRegistered = false; @VisibleForTesting @@ -384,7 +386,8 @@ public class WindowMagnificationManager implements float toCenterY = (float) (top + bottom) / 2; synchronized (mLock) { - if (!isPositionInSourceBounds(displayId, toCenterX, toCenterY) + if (mIsImeVisibleArray.get(displayId, false) + && !isPositionInSourceBounds(displayId, toCenterX, toCenterY) && isTrackingTypingFocusEnabled(displayId)) { moveWindowMagnifierToPositionInternal(displayId, toCenterX, toCenterY, STUB_ANIMATION_CALLBACK); @@ -456,7 +459,8 @@ public class WindowMagnificationManager implements * * @param shown {@code true} means the IME window shows on the screen. Otherwise, it's hidden. */ - void onImeWindowVisibilityChanged(boolean shown) { + void onImeWindowVisibilityChanged(int displayId, boolean shown) { + mIsImeVisibleArray.put(displayId, shown); if (shown) { enableAllTrackingTypingFocus(); } @@ -903,10 +907,10 @@ public class WindowMagnificationManager implements } @Override - public void onDrag(int displayId) { + public void onMove(int displayId) { if (mTrace.isA11yTracingEnabledForTypes( FLAGS_WINDOW_MAGNIFICATION_CONNECTION_CALLBACK)) { - mTrace.logTrace(TAG + "ConnectionCallback.onDrag", + mTrace.logTrace(TAG + "ConnectionCallback.onMove", FLAGS_WINDOW_MAGNIFICATION_CONNECTION_CALLBACK, "displayId=" + displayId); } diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index 8f703c5c77612..d3f3abe1085d4 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -79,6 +79,7 @@ import android.util.ArraySet; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; +import android.util.SparseBooleanArray; import android.util.TypedValue; import android.util.proto.ProtoOutputStream; import android.view.Display; @@ -138,7 +139,7 @@ final class AccessibilityController { new SparseArray<>(); private SparseArray mFocusedWindow = new SparseArray<>(); private int mFocusedDisplay = -1; - private boolean mIsImeVisible = false; + private final SparseBooleanArray mIsImeVisibleArray = new SparseBooleanArray(); // Set to true if initializing window population complete. private boolean mAllObserversInitialized = true; private final AccessibilityWindowsPopulator mAccessibilityWindowsPopulator; @@ -167,8 +168,11 @@ final class AccessibilityController { if (dc != null) { final Display display = dc.getDisplay(); if (display != null && display.getType() != Display.TYPE_OVERLAY) { - mDisplayMagnifiers.put(displayId, new DisplayMagnifier( - mService, dc, display, callbacks)); + final DisplayMagnifier magnifier = new DisplayMagnifier( + mService, dc, display, callbacks); + magnifier.notifyImeWindowVisibilityChanged( + mIsImeVisibleArray.get(displayId, false)); + mDisplayMagnifiers.put(displayId, magnifier); result = true; } } @@ -494,11 +498,13 @@ final class AccessibilityController { mAccessibilityTracing.logTrace(TAG + ".updateImeVisibilityIfNeeded", FLAGS_MAGNIFICATION_CALLBACK, "displayId=" + displayId + ";shown=" + shown); } - if (mIsImeVisible == shown) { + + final boolean isDisplayImeVisible = mIsImeVisibleArray.get(displayId, false); + if (isDisplayImeVisible == shown) { return; } - mIsImeVisible = shown; + mIsImeVisibleArray.put(displayId, shown); final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.get(displayId); if (displayMagnifier != null) { displayMagnifier.notifyImeWindowVisibilityChanged(shown); @@ -534,6 +540,7 @@ final class AccessibilityController { } public void onDisplayRemoved(int displayId) { + mIsImeVisibleArray.delete(displayId); mFocusedWindow.remove(displayId); } diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java index 3ce2ed84d3e8f..f3a0b7fa1ea73 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java @@ -1158,7 +1158,7 @@ public class FullScreenMagnificationControllerTest { MagnificationCallbacks callbacks = getMagnificationCallbacks(DISPLAY_0); callbacks.onImeWindowVisibilityChanged(true); mMessageCapturingHandler.sendAllMessages(); - verify(mRequestObserver).onImeWindowVisibilityChanged(eq(true)); + verify(mRequestObserver).onImeWindowVisibilityChanged(eq(DISPLAY_0), eq(true)); } private void setScaleToMagnifying() { diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java index 4824f046ebf4f..cc6d7611b4a13 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java @@ -752,7 +752,7 @@ public class MagnificationControllerTest { MagnificationController spyController = spy(mMagnificationController); spyController.onWindowMagnificationActivationState(TEST_DISPLAY, true); - spyController.onImeWindowVisibilityChanged(true); + spyController.onImeWindowVisibilityChanged(TEST_DISPLAY, true); verify(spyController).logMagnificationModeWithIme( eq(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW)); @@ -763,7 +763,7 @@ public class MagnificationControllerTest { MagnificationController spyController = spy(mMagnificationController); spyController.onFullScreenMagnificationActivationState(TEST_DISPLAY, true); - spyController.onImeWindowVisibilityChanged(true); + spyController.onImeWindowVisibilityChanged(TEST_DISPLAY, true); verify(spyController).logMagnificationModeWithIme( eq(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN)); @@ -772,7 +772,7 @@ public class MagnificationControllerTest { @Test public void imeWindowStateShown_noMagnifying_noLogAnyMode() { MagnificationController spyController = spy(mMagnificationController); - spyController.onImeWindowVisibilityChanged(true); + spyController.onImeWindowVisibilityChanged(TEST_DISPLAY, true); verify(spyController, never()).logMagnificationModeWithIme(anyInt()); } diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java index c05d8c602839e..978000aa89d36 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java @@ -297,11 +297,12 @@ public class WindowMagnificationManagerTest { throws RemoteException { mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f); + mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true); final Region outRegion = new Region(); mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion); final Rect requestedRect = outRegion.getBounds(); requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10); - mMockConnection.getConnectionCallback().onDrag(TEST_DISPLAY); + mMockConnection.getConnectionCallback().onMove(TEST_DISPLAY); mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY, requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom); @@ -318,6 +319,7 @@ public class WindowMagnificationManagerTest { final float distanceY = 10f; mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f); + mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true); final Region outRegion = new Region(); mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion); final Rect requestedRect = outRegion.getBounds(); @@ -336,6 +338,7 @@ public class WindowMagnificationManagerTest { throws RemoteException { mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f); + mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true); final Region outRegion = new Region(); mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion); final Rect requestedRect = outRegion.getBounds(); @@ -347,12 +350,29 @@ public class WindowMagnificationManagerTest { verify(mMockConnection.getConnection(), never()) .moveWindowMagnifierToPosition(anyInt(), anyFloat(), anyFloat(), any()); } + @Test + public void onRectangleOnScreenRequested_imeVisibilityDefaultInvisible_withoutMovingMagnifier() + throws RemoteException { + mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); + mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f); + final Region outRegion = new Region(); + mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion); + final Rect requestedRect = outRegion.getBounds(); + requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10); + + mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY, + requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom); + + verify(mMockConnection.getConnection(), never()) + .moveWindowMagnifierToPosition(anyInt(), anyFloat(), anyFloat(), any()); + } @Test public void onRectangleOnScreenRequested_trackingEnabledByDefault_movingMagnifier() throws RemoteException { mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f); + mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true); final Region outRegion = new Region(); mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion); final Rect requestedRect = outRegion.getBounds(); @@ -366,13 +386,33 @@ public class WindowMagnificationManagerTest { any(IRemoteMagnificationAnimationCallback.class)); } + @Test + public void onRectangleOnScreenRequested_imeInvisible_withoutMovingMagnifier() + throws RemoteException { + mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); + mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f); + mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true); + final Region outRegion = new Region(); + mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion); + final Rect requestedRect = outRegion.getBounds(); + requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10); + mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, false); + + mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY, + requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom); + + verify(mMockConnection.getConnection(), never()) + .moveWindowMagnifierToPosition(anyInt(), anyFloat(), anyFloat(), any()); + } + @Test public void onRectangleOnScreenRequested_trackingEnabledByDragAndReset_movingMagnifier() throws RemoteException { mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f); - mMockConnection.getConnectionCallback().onDrag(TEST_DISPLAY); - mWindowMagnificationManager.onImeWindowVisibilityChanged(true); + mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true); + mMockConnection.getConnectionCallback().onMove(TEST_DISPLAY); + mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true); final Region outRegion = new Region(); mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, outRegion); final Rect requestedRect = outRegion.getBounds(); @@ -390,6 +430,7 @@ public class WindowMagnificationManagerTest { public void onRectangleOnScreenRequested_followTypingIsDisabled_withoutMovingMagnifier() { mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f); + mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true); final Region beforeRegion = new Region(); mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion); final Rect requestedRect = beforeRegion.getBounds(); @@ -408,6 +449,7 @@ public class WindowMagnificationManagerTest { public void onRectangleOnScreenRequested_trackingDisabled_withoutMovingMagnifier() { mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f); + mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true); mWindowMagnificationManager.setTrackingTypingFocusEnabled(TEST_DISPLAY, false); final Region beforeRegion = new Region(); mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion); @@ -427,6 +469,7 @@ public class WindowMagnificationManagerTest { throws RemoteException { mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f); + mWindowMagnificationManager.onImeWindowVisibilityChanged(TEST_DISPLAY, true); mWindowMagnificationManager.setTrackingTypingFocusEnabled(TEST_DISPLAY, false); final Region beforeRegion = new Region(); mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion);