summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Roy Chou <juchengchou@google.com> 2023-03-07 06:42:11 +0000
committer Roy Chou <juchengchou@google.com> 2023-03-10 03:27:17 +0000
commitd9f6d456e3efa073d60af272af092471f16e7ab0 (patch)
treeab92c02c9db8d8223b11cd732b44febb6a2e8801
parentabc36a70d7acbfdfda5d2dbe24034559f24a7c29 (diff)
fix(#Magnification): reset gesture handler state when magnifier deactivates
Add FullScreenMagnificationGestureHandler as MagnificationInfoChange callbacks for FullScreenMagnificationController, so that when fullscreen magnifier resets the gesture handler would be notified and reset the state. Bug: b/271520937 Test: manually atest FullScreenMagnificationControllerTest atest FullScreenMagnificationGestureHandlerTest atest MagnificationControllerTest Change-Id: I605dbd7b0c29fb056dca6afd89d4316db7e71a08
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java46
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java40
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java9
3 files changed, 84 insertions, 11 deletions
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 f8ab0d51808c..9c1169414b07 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java
@@ -63,6 +63,7 @@ import com.android.server.accessibility.AccessibilityManagerService;
import com.android.server.accessibility.AccessibilityTraceManager;
import com.android.server.wm.WindowManagerInternal;
+import java.util.ArrayList;
import java.util.Locale;
import java.util.function.Supplier;
@@ -90,7 +91,9 @@ public class FullScreenMagnificationController implements
private final ScreenStateObserver mScreenStateObserver;
- private final MagnificationInfoChangedCallback mMagnificationInfoChangedCallback;
+ @GuardedBy("mLock")
+ private final ArrayList<MagnificationInfoChangedCallback>
+ mMagnificationInfoChangedCallbacks = new ArrayList<>();
private final MagnificationScaleProvider mScaleProvider;
@@ -393,8 +396,10 @@ public class FullScreenMagnificationController implements
.setScale(scale)
.setCenterX(centerX)
.setCenterY(centerY).build();
- mMagnificationInfoChangedCallback.onFullScreenMagnificationChanged(mDisplayId,
- mMagnificationRegion, config);
+ mMagnificationInfoChangedCallbacks.forEach(callback -> {
+ callback.onFullScreenMagnificationChanged(mDisplayId,
+ mMagnificationRegion, config);
+ });
if (mUnregisterPending && !isActivated()) {
unregister(mDeleteAfterUnregister);
}
@@ -502,8 +507,10 @@ public class FullScreenMagnificationController implements
if (changed) {
mMagnificationActivated = activated;
- mMagnificationInfoChangedCallback.onFullScreenMagnificationActivationState(
- mDisplayId, mMagnificationActivated);
+ mMagnificationInfoChangedCallbacks.forEach(callback -> {
+ callback.onFullScreenMagnificationActivationState(
+ mDisplayId, mMagnificationActivated);
+ });
mControllerCtx.getWindowManager().setForceShowMagnifiableBounds(
mDisplayId, activated);
}
@@ -580,8 +587,10 @@ public class FullScreenMagnificationController implements
sendSpecToAnimation(mCurrentMagnificationSpec, animationCallback);
if (isActivated() && (id != INVALID_SERVICE_ID)) {
mIdOfLastServiceToMagnify = id;
- mMagnificationInfoChangedCallback.onRequestMagnificationSpec(mDisplayId,
- mIdOfLastServiceToMagnify);
+ mMagnificationInfoChangedCallbacks.forEach(callback -> {
+ callback.onRequestMagnificationSpec(mDisplayId,
+ mIdOfLastServiceToMagnify);
+ });
}
return changed;
}
@@ -787,7 +796,7 @@ public class FullScreenMagnificationController implements
mLock = lock;
mMainThreadId = mControllerCtx.getContext().getMainLooper().getThread().getId();
mScreenStateObserver = new ScreenStateObserver(mControllerCtx.getContext(), this);
- mMagnificationInfoChangedCallback = magnificationInfoChangedCallback;
+ addInfoChangedCallback(magnificationInfoChangedCallback);
mScaleProvider = scaleProvider;
mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
mThumbnailSupplier = thumbnailSupplier;
@@ -1349,7 +1358,11 @@ public class FullScreenMagnificationController implements
* hidden.
*/
void notifyImeWindowVisibilityChanged(int displayId, boolean shown) {
- mMagnificationInfoChangedCallback.onImeWindowVisibilityChanged(displayId, shown);
+ synchronized (mLock) {
+ mMagnificationInfoChangedCallbacks.forEach(callback -> {
+ callback.onImeWindowVisibilityChanged(displayId, shown);
+ });
+ }
}
private void onScreenTurnedOff() {
@@ -1411,6 +1424,18 @@ public class FullScreenMagnificationController implements
}
}
+ void addInfoChangedCallback(@NonNull MagnificationInfoChangedCallback callback) {
+ synchronized (mLock) {
+ mMagnificationInfoChangedCallbacks.add(callback);
+ }
+ }
+
+ void removeInfoChangedCallback(@NonNull MagnificationInfoChangedCallback callback) {
+ synchronized (mLock) {
+ mMagnificationInfoChangedCallbacks.remove(callback);
+ }
+ }
+
private boolean traceEnabled() {
return mControllerCtx.getTraceManager().isA11yTracingEnabledForTypes(
FLAGS_WINDOW_MANAGER_INTERNAL);
@@ -1709,7 +1734,7 @@ public class FullScreenMagnificationController implements
return animate ? STUB_ANIMATION_CALLBACK : null;
}
- interface MagnificationInfoChangedCallback {
+ interface MagnificationInfoChangedCallback {
/**
* Called when the {@link MagnificationSpec} is changed with non-default
@@ -1722,7 +1747,6 @@ 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 activated {@code true} if the magnification is activated, otherwise {@code false}.
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
index f85ef43f99fe..038847e2a759 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
@@ -32,6 +32,7 @@ import static java.lang.Math.abs;
import static java.util.Arrays.asList;
import static java.util.Arrays.copyOfRange;
+import android.accessibilityservice.MagnificationConfig;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UiContext;
@@ -40,6 +41,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.PointF;
+import android.graphics.Region;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -129,6 +131,8 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
@VisibleForTesting final FullScreenMagnificationController mFullScreenMagnificationController;
+ private final FullScreenMagnificationController.MagnificationInfoChangedCallback
+ mMagnificationInfoChangedCallback;
@VisibleForTesting final DelegatingState mDelegatingState;
@VisibleForTesting final DetectingState mDetectingState;
@VisibleForTesting final PanningScalingState mPanningScalingState;
@@ -158,6 +162,40 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
+ ", detectShortcutTrigger = " + detectShortcutTrigger + ")");
}
mFullScreenMagnificationController = fullScreenMagnificationController;
+ mMagnificationInfoChangedCallback =
+ new FullScreenMagnificationController.MagnificationInfoChangedCallback() {
+ @Override
+ public void onRequestMagnificationSpec(int displayId, int serviceId) {
+ return;
+ }
+
+ @Override
+ public void onFullScreenMagnificationActivationState(int displayId,
+ boolean activated) {
+ if (displayId != mDisplayId) {
+ return;
+ }
+
+ if (!activated) {
+ clearAndTransitionToStateDetecting();
+ }
+ }
+
+ @Override
+ public void onImeWindowVisibilityChanged(int displayId, boolean shown) {
+ return;
+ }
+
+ @Override
+ public void onFullScreenMagnificationChanged(int displayId,
+ @NonNull Region region,
+ @NonNull MagnificationConfig config) {
+ return;
+ }
+ };
+ mFullScreenMagnificationController.addInfoChangedCallback(
+ mMagnificationInfoChangedCallback);
+
mPromptController = promptController;
mDelegatingState = new DelegatingState();
@@ -217,6 +255,8 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
// Check if need to reset when MagnificationGestureHandler is the last magnifying service.
mFullScreenMagnificationController.resetIfNeeded(
mDisplayId, AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID);
+ mFullScreenMagnificationController.removeInfoChangedCallback(
+ mMagnificationInfoChangedCallback);
clearAndTransitionToStateDetecting();
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java
index 306ce4dbf707..cf5ba270999e 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java
@@ -416,6 +416,15 @@ public class FullScreenMagnificationGestureHandlerTest {
}
@Test
+ public void testMagnifierDeactivates_shortcutTriggeredState_returnToIdleState() {
+ goFromStateIdleTo(STATE_SHORTCUT_TRIGGERED);
+
+ mFullScreenMagnificationController.reset(DISPLAY_0, /* animate= */ false);
+
+ assertIn(STATE_IDLE);
+ }
+
+ @Test
public void testThreeFingersOneTap_activatedState_dispatchMotionEvents() {
goFromStateIdleTo(STATE_ACTIVATED);
final EventCaptor eventCaptor = new EventCaptor();