From 58e65f3058ca40da293d737e86db8eff36c9adf6 Mon Sep 17 00:00:00 2001 From: ryanlwlin Date: Tue, 4 Jan 2022 21:21:50 +0800 Subject: [PATCH] Fix flaky AccessibilityMagnificationTest The flaky is caused by the deadlock. WindowMagnificationManager has its own lock and the WindowMagnificationConnectionWrapper which uses AccessibilityTraceManager. When the public method of WindowMagnificationManager is invoked, it hold the lock of WindowMagnificationManager and the lock of AccessibilityManagerService. However, when the service connection is unbound, it will hold the lock of AccessibilityManagerService first then the lock of WindowMagnificationManager. To simplify the archiecuture, we inject the lock of AccessibilityManagerService to WindowMagnificationManager. Bug: 213120663 Test: atest com.android.server.accessibility atest CtsAccessibilityServiceTestCases Change-Id: I818c57a5140269a5800eb1a52e25aa2ce0919245 --- .../accessibility/magnification/MagnificationController.java | 2 +- .../magnification/WindowMagnificationManager.java | 5 +++-- .../magnification/MagnificationControllerTest.java | 5 +++-- .../magnification/WindowMagnificationGestureHandlerTest.java | 2 +- .../magnification/WindowMagnificationManagerTest.java | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) 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 a63dd005f988e..037dc1f6795ca 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java @@ -578,7 +578,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb synchronized (mLock) { if (mWindowMagnificationMgr == null) { mWindowMagnificationMgr = new WindowMagnificationManager(mContext, - mUserId, this, mAms.getTraceManager(), + mLock, this, mAms.getTraceManager(), mScaleProvider); } return mWindowMagnificationMgr; 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 336f0bbbe5185..c4a577d6e4611 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java @@ -87,7 +87,7 @@ public class WindowMagnificationManager implements }) public @interface WindowPosition {} - private final Object mLock = new Object(); + private final Object mLock; private final Context mContext; @VisibleForTesting @GuardedBy("mLock") @@ -152,9 +152,10 @@ public class WindowMagnificationManager implements private final AccessibilityTraceManager mTrace; private final MagnificationScaleProvider mScaleProvider; - public WindowMagnificationManager(Context context, int userId, @NonNull Callback callback, + public WindowMagnificationManager(Context context, Object lock, @NonNull Callback callback, AccessibilityTraceManager trace, MagnificationScaleProvider scaleProvider) { mContext = context; + mLock = lock; mCallback = callback; mTrace = trace; mScaleProvider = scaleProvider; 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 c9ae11a14ed30..0054fc3289320 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 @@ -125,6 +125,7 @@ public class MagnificationControllerTest { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); FakeSettingsProvider.clearSettingsProvider(); + final Object globalLock = new Object(); LocalServices.removeServiceForTest(WindowManagerInternal.class); LocalServices.addService(WindowManagerInternal.class, mMockWindowManagerInternal); @@ -139,14 +140,14 @@ public class MagnificationControllerTest { CURRENT_USER_ID); mScaleProvider = spy(new MagnificationScaleProvider(mContext)); mWindowMagnificationManager = Mockito.spy( - new WindowMagnificationManager(mContext, CURRENT_USER_ID, + new WindowMagnificationManager(mContext, globalLock, mock(WindowMagnificationManager.Callback.class), mTraceManager, mScaleProvider)); mMockConnection = new MockWindowMagnificationConnection(true); mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mScreenMagnificationControllerStubber = new FullScreenMagnificationControllerStubber( mScreenMagnificationController); - mMagnificationController = new MagnificationController(mService, new Object(), mContext, + mMagnificationController = new MagnificationController(mService, globalLock, mContext, mScreenMagnificationController, mWindowMagnificationManager, mScaleProvider); mMagnificationController.setMagnificationCapabilities( diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java index b807c11d5a5c4..e9f0bd9db9fe7 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java @@ -85,7 +85,7 @@ public class WindowMagnificationGestureHandlerTest { @Before public void setUp() throws RemoteException { MockitoAnnotations.initMocks(this); - mWindowMagnificationManager = new WindowMagnificationManager(mContext, 0, + mWindowMagnificationManager = new WindowMagnificationManager(mContext, new Object(), mock(WindowMagnificationManager.Callback.class), mMockTrace, new MagnificationScaleProvider(mContext)); mMockConnection = new MockWindowMagnificationConnection(); 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 8b7a19136f50f..a62c0d5e1eaf1 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 @@ -94,7 +94,7 @@ public class WindowMagnificationManagerTest { LocalServices.addService(StatusBarManagerInternal.class, mMockStatusBarManagerInternal); mResolver = new MockContentResolver(); mMockConnection = new MockWindowMagnificationConnection(); - mWindowMagnificationManager = new WindowMagnificationManager(mContext, CURRENT_USER_ID, + mWindowMagnificationManager = new WindowMagnificationManager(mContext, new Object(), mMockCallback, mMockTrace, new MagnificationScaleProvider(mContext)); when(mContext.getContentResolver()).thenReturn(mResolver);