Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 58e65f30 authored by ryanlwlin's avatar ryanlwlin
Browse files

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
parent 9278335f
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -578,7 +578,7 @@ public class MagnificationController implements WindowMagnificationManager.Callb
        synchronized (mLock) {
        synchronized (mLock) {
            if (mWindowMagnificationMgr == null) {
            if (mWindowMagnificationMgr == null) {
                mWindowMagnificationMgr = new WindowMagnificationManager(mContext,
                mWindowMagnificationMgr = new WindowMagnificationManager(mContext,
                        mUserId, this, mAms.getTraceManager(),
                        mLock, this, mAms.getTraceManager(),
                        mScaleProvider);
                        mScaleProvider);
            }
            }
            return mWindowMagnificationMgr;
            return mWindowMagnificationMgr;
+3 −2
Original line number Original line Diff line number Diff line
@@ -87,7 +87,7 @@ public class WindowMagnificationManager implements
    })
    })
    public @interface WindowPosition {}
    public @interface WindowPosition {}


    private final Object mLock = new Object();
    private final Object mLock;
    private final Context mContext;
    private final Context mContext;
    @VisibleForTesting
    @VisibleForTesting
    @GuardedBy("mLock")
    @GuardedBy("mLock")
@@ -152,9 +152,10 @@ public class WindowMagnificationManager implements
    private final AccessibilityTraceManager mTrace;
    private final AccessibilityTraceManager mTrace;
    private final MagnificationScaleProvider mScaleProvider;
    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) {
            AccessibilityTraceManager trace, MagnificationScaleProvider scaleProvider) {
        mContext = context;
        mContext = context;
        mLock = lock;
        mCallback = callback;
        mCallback = callback;
        mTrace = trace;
        mTrace = trace;
        mScaleProvider = scaleProvider;
        mScaleProvider = scaleProvider;
+3 −2
Original line number Original line Diff line number Diff line
@@ -125,6 +125,7 @@ public class MagnificationControllerTest {
    public void setUp() throws Exception {
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        MockitoAnnotations.initMocks(this);
        FakeSettingsProvider.clearSettingsProvider();
        FakeSettingsProvider.clearSettingsProvider();
        final Object globalLock = new Object();


        LocalServices.removeServiceForTest(WindowManagerInternal.class);
        LocalServices.removeServiceForTest(WindowManagerInternal.class);
        LocalServices.addService(WindowManagerInternal.class, mMockWindowManagerInternal);
        LocalServices.addService(WindowManagerInternal.class, mMockWindowManagerInternal);
@@ -139,14 +140,14 @@ public class MagnificationControllerTest {
                CURRENT_USER_ID);
                CURRENT_USER_ID);
        mScaleProvider = spy(new MagnificationScaleProvider(mContext));
        mScaleProvider = spy(new MagnificationScaleProvider(mContext));
        mWindowMagnificationManager = Mockito.spy(
        mWindowMagnificationManager = Mockito.spy(
                new WindowMagnificationManager(mContext, CURRENT_USER_ID,
                new WindowMagnificationManager(mContext, globalLock,
                        mock(WindowMagnificationManager.Callback.class), mTraceManager,
                        mock(WindowMagnificationManager.Callback.class), mTraceManager,
                        mScaleProvider));
                        mScaleProvider));
        mMockConnection = new MockWindowMagnificationConnection(true);
        mMockConnection = new MockWindowMagnificationConnection(true);
        mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
        mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
        mScreenMagnificationControllerStubber = new FullScreenMagnificationControllerStubber(
        mScreenMagnificationControllerStubber = new FullScreenMagnificationControllerStubber(
                mScreenMagnificationController);
                mScreenMagnificationController);
        mMagnificationController = new MagnificationController(mService, new Object(), mContext,
        mMagnificationController = new MagnificationController(mService, globalLock, mContext,
                mScreenMagnificationController, mWindowMagnificationManager, mScaleProvider);
                mScreenMagnificationController, mWindowMagnificationManager, mScaleProvider);


        mMagnificationController.setMagnificationCapabilities(
        mMagnificationController.setMagnificationCapabilities(
+1 −1
Original line number Original line Diff line number Diff line
@@ -85,7 +85,7 @@ public class WindowMagnificationGestureHandlerTest {
    @Before
    @Before
    public void setUp() throws RemoteException {
    public void setUp() throws RemoteException {
        MockitoAnnotations.initMocks(this);
        MockitoAnnotations.initMocks(this);
        mWindowMagnificationManager = new WindowMagnificationManager(mContext, 0,
        mWindowMagnificationManager = new WindowMagnificationManager(mContext, new Object(),
                mock(WindowMagnificationManager.Callback.class), mMockTrace,
                mock(WindowMagnificationManager.Callback.class), mMockTrace,
                new MagnificationScaleProvider(mContext));
                new MagnificationScaleProvider(mContext));
        mMockConnection = new MockWindowMagnificationConnection();
        mMockConnection = new MockWindowMagnificationConnection();
+1 −1
Original line number Original line Diff line number Diff line
@@ -94,7 +94,7 @@ public class WindowMagnificationManagerTest {
        LocalServices.addService(StatusBarManagerInternal.class, mMockStatusBarManagerInternal);
        LocalServices.addService(StatusBarManagerInternal.class, mMockStatusBarManagerInternal);
        mResolver = new MockContentResolver();
        mResolver = new MockContentResolver();
        mMockConnection = new MockWindowMagnificationConnection();
        mMockConnection = new MockWindowMagnificationConnection();
        mWindowMagnificationManager = new WindowMagnificationManager(mContext, CURRENT_USER_ID,
        mWindowMagnificationManager = new WindowMagnificationManager(mContext, new Object(),
                mMockCallback, mMockTrace, new MagnificationScaleProvider(mContext));
                mMockCallback, mMockTrace, new MagnificationScaleProvider(mContext));


        when(mContext.getContentResolver()).thenReturn(mResolver);
        when(mContext.getContentResolver()).thenReturn(mResolver);