summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Roy Chou <juchengchou@google.com> 2023-03-12 06:52:10 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-03-12 06:52:10 +0000
commit3b65691e8b1c57a810facde943a80b808a64577c (patch)
tree80ff6f96ce6458ed2c3549e941e06d09b32149e4
parent3217999c9a5c2b7658cb277b02e15117c4cd8ae2 (diff)
parentd9f6d456e3efa073d60af272af092471f16e7ab0 (diff)
Merge "fix(#Magnification): reset gesture handler state when magnifier deactivates" into udc-dev
-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();