summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author ryanlwlin <ryanlwlin@google.com> 2022-01-04 21:21:50 +0800
committer ryanlwlin <ryanlwlin@google.com> 2022-01-04 21:21:50 +0800
commit58e65f3058ca40da293d737e86db8eff36c9adf6 (patch)
tree7e240c4274926252f8269889d3c955355a8f63e1
parent9278335f3cd7ee9897ad548b16a4a503a7cde1ce (diff)
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
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java2
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java5
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java2
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 a63dd005f988..037dc1f6795c 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 336f0bbbe518..c4a577d6e461 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 c9ae11a14ed3..0054fc328932 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 b807c11d5a5c..e9f0bd9db9fe 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 8b7a19136f50..a62c0d5e1eaf 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);