Merge "Fix accessibility services tests to work with atest"
diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
index 371f932..cf9f233 100644
--- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
@@ -170,6 +170,20 @@
      *                action.
      */
     public TouchExplorer(Context context, AccessibilityManagerService service) {
+        this(context, service, null);
+    }
+
+    /**
+     * Creates a new instance.
+     *
+     * @param context A context handle for accessing resources.
+     * @param service The service to notify touch interaction and gesture completed and to perform
+     *                action.
+     * @param detector The gesture detector to handle accessibility touch event. If null the default
+     *                one created in place, or for testing purpose.
+     */
+    public TouchExplorer(Context context, AccessibilityManagerService service,
+            AccessibilityGestureDetector detector) {
         mContext = context;
         mAms = service;
         mReceivedPointerTracker = new ReceivedPointerTracker();
@@ -186,7 +200,11 @@
         mSendTouchInteractionEndDelayed = new SendAccessibilityEventDelayed(
                 AccessibilityEvent.TYPE_TOUCH_INTERACTION_END,
                 mDetermineUserIntentTimeout);
-        mGestureDetector = new AccessibilityGestureDetector(context, this);
+        if (detector == null) {
+            mGestureDetector = new AccessibilityGestureDetector(context, this);
+        } else {
+            mGestureDetector = detector;
+        }
         final float density = context.getResources().getDisplayMetrics().density;
         mScaledMinPointerDistanceToUseMiddleLocation =
             (int) (MIN_POINTER_DISTANCE_TO_USE_MIDDLE_LOCATION_DIP * density);
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java
index 1c025cf..aad7230 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java
@@ -18,23 +18,22 @@
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.when;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.accessibilityservice.AccessibilityService;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Point;
 import android.graphics.PointF;
-import android.os.Looper;
 import android.util.DisplayMetrics;
 import android.view.GestureDetector;
 import android.view.MotionEvent;
-import java.util.ArrayList;
+
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 
+import java.util.ArrayList;
 
 /**
  * Tests for AccessibilityGestureDetector
@@ -50,14 +49,6 @@
     private AccessibilityGestureDetector mDetector;
     private AccessibilityGestureDetector.Listener mResultListener;
 
-
-    @BeforeClass
-    public static void oneTimeInitialization() {
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-    }
-
     @Before
     public void setUp() {
         // Construct a mock Context.
@@ -67,7 +58,6 @@
         Resources mockResources = mock(Resources.class);
         when(mockResources.getDisplayMetrics()).thenReturn(displayMetricsMock);
         Context contextMock = mock(Context.class);
-        when(contextMock.getMainLooper()).thenReturn(Looper.myLooper());
         when(contextMock.getResources()).thenReturn(mockResources);
 
         // Construct a testable AccessibilityGestureDetector.
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerTest.java
index 4c0f38a..b9b6d55 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerTest.java
@@ -29,7 +29,6 @@
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.Instrumentation;
-import android.os.Looper;
 import android.os.UserHandle;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
@@ -41,8 +40,8 @@
 
 import com.android.internal.util.IntPair;
 
+import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -63,13 +62,6 @@
     private MessageCapturingHandler mHandler;
     private Instrumentation mInstrumentation;
 
-    @BeforeClass
-    public static void oneTimeInitialization() {
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-    }
-
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
@@ -77,6 +69,12 @@
         mInstrumentation = InstrumentationRegistry.getInstrumentation();
     }
 
+    @After
+    public void tearDown() {
+        mHandler.removeAllMessages();
+    }
+
+
     private AccessibilityManager createManager(boolean enabled) throws Exception {
         long serviceReturnValue = IntPair.of(
                 (enabled) ? AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED : 0,
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java
index 412e844..66d9345 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java
@@ -33,16 +33,14 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
-import android.os.Handler;
 import android.os.IBinder;
-import android.os.Looper;
 import android.os.RemoteException;
 import android.os.UserHandle;
 
 import com.android.server.wm.WindowManagerInternal;
 
+import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -74,13 +72,6 @@
 
     MessageCapturingHandler mHandler = new MessageCapturingHandler(null);
 
-    @BeforeClass
-    public static void oneTimeInitialization() {
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-    }
-
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
@@ -98,6 +89,12 @@
                 mMockGlobalActionPerformer);
     }
 
+    @After
+    public void tearDown() {
+        mHandler.removeAllMessages();
+    }
+
+
     @Test
     public void bind_requestsContextToBindService() {
         mConnection.bindLocked();
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureControllerTest.java
index a3decb9..44a514f 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureControllerTest.java
@@ -16,19 +16,8 @@
 
 package com.android.server.accessibility;
 
-import android.accessibilityservice.FingerprintGestureController;
-import android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback;
-import android.accessibilityservice.IAccessibilityServiceConnection;
-import android.os.Looper;
-import android.support.test.filters.FlakyTest;
-
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import static android.accessibilityservice.FingerprintGestureController.FINGERPRINT_GESTURE_SWIPE_DOWN;
+import static android.accessibilityservice.FingerprintGestureController
+        .FINGERPRINT_GESTURE_SWIPE_DOWN;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -38,6 +27,15 @@
 import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
+import android.accessibilityservice.FingerprintGestureController;
+import android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback;
+import android.accessibilityservice.IAccessibilityServiceConnection;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
 /**
  * Tests for FingerprintGestureController.
  * TODO: These tests aren't really for server code, so this isn't their ideal home.
@@ -47,13 +45,6 @@
     @Mock FingerprintGestureCallback mMockFingerprintGestureCallback;
     FingerprintGestureController mFingerprintGestureController;
 
-    @BeforeClass
-    public static void oneTimeInitialization() {
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-    }
-
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
@@ -97,7 +88,6 @@
     }
 
     @Test
-    @FlakyTest
     public void testDetectionActiveCallback_withHandler_shouldPostRunnableToHandler() {
         MessageCapturingHandler messageCapturingHandler = new MessageCapturingHandler((message) -> {
             message.getCallback().run();
@@ -127,6 +117,8 @@
         mFingerprintGestureController.onGestureDetectionActiveChanged(false);
         assertFalse(messageCapturingHandler.hasMessages());
         verifyZeroInteractions(mMockFingerprintGestureCallback);
+
+        messageCapturingHandler.removeAllMessages();
     }
 
     @Test
@@ -145,7 +137,6 @@
     }
 
     @Test
-    @FlakyTest
     public void testGestureCallback_withHandler_shouldPostRunnableToHandler() {
         MessageCapturingHandler messageCapturingHandler = new MessageCapturingHandler((message) -> {
             message.getCallback().run();
@@ -167,5 +158,7 @@
         mFingerprintGestureController.onGesture(FINGERPRINT_GESTURE_SWIPE_DOWN);
         assertFalse(messageCapturingHandler.hasMessages());
         verifyZeroInteractions(mMockFingerprintGestureCallback);
+
+        messageCapturingHandler.removeAllMessages();
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureDispatcherTest.java b/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureDispatcherTest.java
index 6ce7bbe..de7bc44 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureDispatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/FingerprintGestureDispatcherTest.java
@@ -16,25 +16,6 @@
 
 package com.android.server.accessibility;
 
-import android.accessibilityservice.FingerprintGestureController;
-import android.content.res.Resources;
-import android.hardware.fingerprint.IFingerprintService;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.view.KeyEvent;
-
-import com.android.server.accessibility.FingerprintGestureDispatcher.FingerprintGestureClient;
-
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.Arrays;
-import java.util.Collections;
-
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.anyBoolean;
@@ -44,6 +25,22 @@
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+import android.accessibilityservice.FingerprintGestureController;
+import android.content.res.Resources;
+import android.hardware.fingerprint.IFingerprintService;
+import android.view.KeyEvent;
+
+import com.android.server.accessibility.FingerprintGestureDispatcher.FingerprintGestureClient;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Arrays;
+import java.util.Collections;
+
 /**
  * Tests for FingerprintGestureDispatcher
  */
@@ -57,13 +54,6 @@
     private MessageCapturingHandler mMessageCapturingHandler;
     private FingerprintGestureDispatcher mFingerprintGestureDispatcher;
 
-    @BeforeClass
-    public static void oneTimeInitialization() {
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-    }
-
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
@@ -77,6 +67,12 @@
         when(mGestureCapturingClient.isCapturingFingerprintGestures()).thenReturn(true);
     }
 
+    @After
+    public void tearDown() {
+        mMessageCapturingHandler.removeAllMessages();
+    }
+
+
     @Test
     public void testNoServices_doesNotCrashOrConsumeGestures() {
         mFingerprintGestureDispatcher.onClientActiveChanged(true);
@@ -171,7 +167,7 @@
     }
 
     @Test
-    public void ifGestureDectionNotSupported_neverSaysAvailable() throws Exception {
+    public void ifGestureDetectionNotSupported_neverSaysAvailable() throws Exception {
         when(mMockResources.getBoolean(anyInt())).thenReturn(false);
         // Need to create a new dispatcher, since it picks up the resource value in its
         // constructor. This is fine since hardware config values don't change dynamically.
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java b/services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java
index 236b458..23ce483 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/KeyEventDispatcherTest.java
@@ -40,6 +40,7 @@
 import android.os.RemoteException;
 import android.view.KeyEvent;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.server.accessibility.KeyEventDispatcher.KeyEventFilter;
@@ -47,16 +48,14 @@
 
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
+import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.List;
 
 /**
  * Tests for KeyEventDispatcher
@@ -68,7 +67,7 @@
     private final KeyEvent mKeyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, 0x40);
     private final KeyEvent mOtherKeyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, 0x50);
     private final Object mLock = new Object();
-    private MessageCapturingHandler mInputEventsHander;
+    private MessageCapturingHandler mInputEventsHandler;
     private KeyEventDispatcher mKeyEventDispatcher;
     private KeyEventFilter mKeyEventFilter1;
     private KeyEventFilter mKeyEventFilter2;
@@ -77,23 +76,17 @@
     private ArgumentCaptor<Integer> mFilter1SequenceCaptor = ArgumentCaptor.forClass(Integer.class);
     private ArgumentCaptor<Integer> mFilter2SequenceCaptor = ArgumentCaptor.forClass(Integer.class);
 
-    @BeforeClass
-    public static void oneTimeInitialization() {
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-    }
-
     @Before
     public void setUp() {
-        mInputEventsHander = new MessageCapturingHandler();
+        Looper looper = InstrumentationRegistry.getContext().getMainLooper();
+        mInputEventsHandler = new MessageCapturingHandler(looper, null);
         mMockPowerManagerService = mock(IPowerManager.class);
         // TODO: It would be better to mock PowerManager rather than its binder, but the class is
         // final.
         PowerManager powerManager =
-                new PowerManager(mock(Context.class), mMockPowerManagerService, new Handler());
-        mMessageCapturingHandler = new MessageCapturingHandler();
-        mKeyEventDispatcher = new KeyEventDispatcher(mInputEventsHander, SEND_FRAMEWORK_KEY_EVENT,
+                new PowerManager(mock(Context.class), mMockPowerManagerService, new Handler(looper));
+        mMessageCapturingHandler = new MessageCapturingHandler(looper, null);
+        mKeyEventDispatcher = new KeyEventDispatcher(mInputEventsHandler, SEND_FRAMEWORK_KEY_EVENT,
                 mLock, powerManager, mMessageCapturingHandler);
 
         mKeyEventFilter1 = mock(KeyEventFilter.class);
@@ -107,10 +100,17 @@
                 .thenReturn(true);
     }
 
+    @After
+    public void tearDown() {
+        mInputEventsHandler.removeAllMessages();
+        mMessageCapturingHandler.removeAllMessages();
+    }
+
+
     @Test
     public void testNotifyKeyEvent_withNoBoundServices_shouldReturnFalse() {
         assertFalse(mKeyEventDispatcher.notifyKeyEventLocked(mKeyEvent, 0, Collections.EMPTY_LIST));
-        assertFalse(mMessageCapturingHandler.isTimeoutPending());
+        assertFalse(isTimeoutPending(mMessageCapturingHandler));
     }
 
     @Test
@@ -119,7 +119,7 @@
         when(keyEventFilter.onKeyEvent((KeyEvent) anyObject(), anyInt())).thenReturn(false);
         assertFalse(mKeyEventDispatcher
                 .notifyKeyEventLocked(mKeyEvent, 0, Arrays.asList(keyEventFilter)));
-        assertFalse(mMessageCapturingHandler.isTimeoutPending());
+        assertFalse(isTimeoutPending(mMessageCapturingHandler));
     }
 
     @Test
@@ -152,9 +152,9 @@
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, false,
                 mFilter1SequenceCaptor.getValue());
 
-        assertTrue(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertTrue(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verifyZeroInteractions(mMockPowerManagerService);
-        assertFalse(mMessageCapturingHandler.isTimeoutPending());
+        assertFalse(isTimeoutPending(mMessageCapturingHandler));
     }
 
     @Test
@@ -166,10 +166,10 @@
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, true,
                 mFilter1SequenceCaptor.getValue());
 
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verify(mMockPowerManagerService, times(1)).userActivity(anyLong(),
                 eq(PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY), eq(0));
-        assertFalse(mMessageCapturingHandler.isTimeoutPending());
+        assertFalse(isTimeoutPending(mMessageCapturingHandler));
     }
 
     @Test
@@ -182,9 +182,9 @@
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter2, false,
                 mFilter2SequenceCaptor.getValue());
 
-        assertTrue(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertTrue(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verifyZeroInteractions(mMockPowerManagerService);
-        assertFalse(mMessageCapturingHandler.isTimeoutPending());
+        assertFalse(isTimeoutPending(mMessageCapturingHandler));
     }
 
     @Test
@@ -198,10 +198,10 @@
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter2, true,
                 mFilter2SequenceCaptor.getValue());
 
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verify(mMockPowerManagerService, times(1)).userActivity(anyLong(),
                 eq(PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY), eq(0));
-        assertFalse(mMessageCapturingHandler.isTimeoutPending());
+        assertFalse(isTimeoutPending(mMessageCapturingHandler));
     }
 
     @Test
@@ -215,10 +215,10 @@
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter2, false,
                 mFilter2SequenceCaptor.getValue());
 
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verify(mMockPowerManagerService, times(1)).userActivity(anyLong(),
                 eq(PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY), eq(0));
-        assertFalse(mMessageCapturingHandler.isTimeoutPending());
+        assertFalse(isTimeoutPending(mMessageCapturingHandler));
     }
 
     @Test
@@ -232,10 +232,10 @@
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter2, true,
                 mFilter2SequenceCaptor.getValue());
 
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verify(mMockPowerManagerService, times(1)).userActivity(anyLong(),
                 eq(PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY), eq(0));
-        assertFalse(mMessageCapturingHandler.isTimeoutPending());
+        assertFalse(isTimeoutPending(mMessageCapturingHandler));
     }
 
     // Each event should have its result set only once, but if it's set twice, we should ignore
@@ -249,14 +249,14 @@
                 mFilter1SequenceCaptor.getValue());
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, false,
                 mFilter1SequenceCaptor.getValue());
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
         // Verify event is sent properly when other service responds
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter2, false,
                 mFilter2SequenceCaptor.getValue());
-        assertTrue(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertTrue(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verifyZeroInteractions(mMockPowerManagerService);
-        assertFalse(mMessageCapturingHandler.isTimeoutPending());
+        assertFalse(isTimeoutPending(mMessageCapturingHandler));
     }
 
 
@@ -269,9 +269,9 @@
                 mKeyEvent, 0, Arrays.asList(mKeyEventFilter1, mKeyEventFilter2));
 
         assertEquals(1, mMessageCapturingHandler.timedMessages.size());
-        mKeyEventDispatcher.handleMessage(mMessageCapturingHandler.timedMessages.get(0));
+        mKeyEventDispatcher.handleMessage(getTimedMessage(mMessageCapturingHandler, 0));
 
-        assertTrue(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertTrue(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verifyZeroInteractions(mMockPowerManagerService);
     }
 
@@ -284,9 +284,9 @@
                 mFilter1SequenceCaptor.getValue());
 
         assertEquals(1, mMessageCapturingHandler.timedMessages.size());
-        mKeyEventDispatcher.handleMessage(mMessageCapturingHandler.timedMessages.get(0));
+        mKeyEventDispatcher.handleMessage(getTimedMessage(mMessageCapturingHandler, 0));
 
-        assertTrue(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertTrue(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verifyZeroInteractions(mMockPowerManagerService);
     }
 
@@ -300,9 +300,9 @@
                 mFilter1SequenceCaptor.getValue());
 
         assertEquals(1, mMessageCapturingHandler.timedMessages.size());
-        mKeyEventDispatcher.handleMessage(mMessageCapturingHandler.timedMessages.get(0));
+        mKeyEventDispatcher.handleMessage(getTimedMessage(mMessageCapturingHandler, 0));
 
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verify(mMockPowerManagerService, times(1)).userActivity(anyLong(),
                 eq(PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY), eq(0));
     }
@@ -310,34 +310,34 @@
     @Test
     public void testEventTimesOut_thenServiceReturnsFalse_shouldPassToFrameworkOnce() {
         mKeyEventDispatcher.notifyKeyEventLocked(mKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
         assertEquals(1, mMessageCapturingHandler.timedMessages.size());
-        mKeyEventDispatcher.handleMessage(mMessageCapturingHandler.timedMessages.get(0));
-        assertTrue(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        mKeyEventDispatcher.handleMessage(getTimedMessage(mMessageCapturingHandler, 0));
+        assertTrue(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
-        mInputEventsHander.removeMessages(SEND_FRAMEWORK_KEY_EVENT);
+        mInputEventsHandler.removeMessages(SEND_FRAMEWORK_KEY_EVENT);
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, false,
                 mFilter1SequenceCaptor.getValue());
 
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verifyZeroInteractions(mMockPowerManagerService);
     }
 
     @Test
     public void testEventTimesOut_afterServiceReturnsFalse_shouldPassToFrameworkOnce() {
         mKeyEventDispatcher.notifyKeyEventLocked(mKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, false,
                 mFilter1SequenceCaptor.getValue());
-        assertTrue(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertTrue(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
-        mInputEventsHander.removeMessages(SEND_FRAMEWORK_KEY_EVENT);
+        mInputEventsHandler.removeMessages(SEND_FRAMEWORK_KEY_EVENT);
         assertEquals(1, mMessageCapturingHandler.timedMessages.size());
-        mKeyEventDispatcher.handleMessage(mMessageCapturingHandler.timedMessages.get(0));
+        mKeyEventDispatcher.handleMessage(getTimedMessage(mMessageCapturingHandler, 0));
 
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verifyZeroInteractions(mMockPowerManagerService);
     }
 
@@ -349,9 +349,9 @@
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, true,
                 mFilter1SequenceCaptor.getValue());
         assertEquals(1, mMessageCapturingHandler.timedMessages.size());
-        mKeyEventDispatcher.handleMessage(mMessageCapturingHandler.timedMessages.get(0));
+        mKeyEventDispatcher.handleMessage(getTimedMessage(mMessageCapturingHandler, 0));
 
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
         verify(mMockPowerManagerService, times(1)).userActivity(anyLong(),
                 eq(PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY), eq(0));
     }
@@ -362,11 +362,11 @@
     @Test
     public void testFlushService_withPendingEvent_shouldPassToFramework() {
         mKeyEventDispatcher.notifyKeyEventLocked(mKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
         mKeyEventDispatcher.flush(mKeyEventFilter1);
 
-        assertTrue(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertTrue(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
     }
 
     @Test
@@ -377,7 +377,7 @@
         mKeyEventDispatcher.flush(mKeyEventFilter1);
         mKeyEventDispatcher.flush(mKeyEventFilter2);
 
-        assertTrue(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertTrue(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
     }
 
     @Test
@@ -389,7 +389,7 @@
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter2, true,
                 mFilter2SequenceCaptor.getValue());
 
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
     }
 
     @Test
@@ -401,7 +401,7 @@
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter2, false,
                 mFilter2SequenceCaptor.getValue());
 
-        assertTrue(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertTrue(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
     }
 
     @Test
@@ -417,11 +417,11 @@
         mKeyEventDispatcher.notifyKeyEventLocked(mKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
         mKeyEventDispatcher
                 .notifyKeyEventLocked(mOtherKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, false,
                 mFilter1SequenceCaptor.getAllValues().get(0));
-        mInputEventsHander.removeMessages(SEND_FRAMEWORK_KEY_EVENT);
+        mInputEventsHandler.removeMessages(SEND_FRAMEWORK_KEY_EVENT);
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, false,
                 mFilter1SequenceCaptor.getAllValues().get(1));
 
@@ -433,14 +433,14 @@
         mKeyEventDispatcher.notifyKeyEventLocked(mKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
         mKeyEventDispatcher
                 .notifyKeyEventLocked(mOtherKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, true,
                 mFilter1SequenceCaptor.getAllValues().get(0));
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, true,
                 mFilter1SequenceCaptor.getAllValues().get(1));
 
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
     }
 
     @Test
@@ -448,7 +448,7 @@
         mKeyEventDispatcher.notifyKeyEventLocked(mKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
         mKeyEventDispatcher
                 .notifyKeyEventLocked(mOtherKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, true,
                 mFilter1SequenceCaptor.getAllValues().get(0));
@@ -463,7 +463,7 @@
         mKeyEventDispatcher.notifyKeyEventLocked(mKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
         mKeyEventDispatcher
                 .notifyKeyEventLocked(mOtherKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, false,
                 mFilter1SequenceCaptor.getAllValues().get(0));
@@ -478,9 +478,9 @@
         mKeyEventDispatcher.notifyKeyEventLocked(mKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
         mKeyEventDispatcher
                 .notifyKeyEventLocked(mOtherKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
-        mKeyEventDispatcher.handleMessage(mMessageCapturingHandler.timedMessages.get(0));
+        mKeyEventDispatcher.handleMessage(getTimedMessage(mMessageCapturingHandler, 0));
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, true,
                 mFilter1SequenceCaptor.getAllValues().get(0));
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter1, true,
@@ -494,7 +494,7 @@
         mKeyEventDispatcher.notifyKeyEventLocked(mKeyEvent, 0, Arrays.asList(mKeyEventFilter1));
         mKeyEventDispatcher.notifyKeyEventLocked(
                 mOtherKeyEvent, 0, Arrays.asList(mKeyEventFilter1, mKeyEventFilter2));
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter2, false,
                 mFilter2SequenceCaptor.getValue());
@@ -513,7 +513,7 @@
         mKeyEventDispatcher.flush(mKeyEventFilter1);
         mKeyEventDispatcher.notifyKeyEventLocked(
                 mOtherKeyEvent, 0, Arrays.asList(mKeyEventFilter2));
-        assertFalse(mInputEventsHander.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
+        assertFalse(mInputEventsHandler.hasMessages(SEND_FRAMEWORK_KEY_EVENT));
 
         mKeyEventDispatcher.setOnKeyEventResult(mKeyEventFilter2, false,
                 mFilter2SequenceCaptor.getAllValues().get(0));
@@ -543,24 +543,34 @@
     }
 
     private void assertOneKeyEventSentToFramework(KeyEvent event) {
-        assertEquals(1, mInputEventsHander.timedMessages.size());
-        assertEquals(SEND_FRAMEWORK_KEY_EVENT, mInputEventsHander.timedMessages.get(0).what);
-        assertEquals(WindowManagerPolicy.FLAG_PASS_TO_USER,
-                mInputEventsHander.timedMessages.get(0).arg1);
-        assertTrue(new KeyEventMatcher(event).matches(mInputEventsHander.timedMessages.get(0).obj));
+        assertEquals(1, mInputEventsHandler.timedMessages.size());
+
+        Message m = getTimedMessage(mInputEventsHandler, 0);
+        assertEquals(SEND_FRAMEWORK_KEY_EVENT, m.what);
+        assertEquals(WindowManagerPolicy.FLAG_PASS_TO_USER, m.arg1);
+        assertTrue(new KeyEventMatcher(event).matches(m.obj));
     }
 
     private void assertTwoKeyEventsSentToFrameworkInOrder(KeyEvent first, KeyEvent second) {
-        assertEquals(2, mInputEventsHander.timedMessages.size());
-        assertEquals(SEND_FRAMEWORK_KEY_EVENT, mInputEventsHander.timedMessages.get(0).what);
-        assertEquals(WindowManagerPolicy.FLAG_PASS_TO_USER,
-                mInputEventsHander.timedMessages.get(0).arg1);
-        assertTrue(new KeyEventMatcher(first).matches(mInputEventsHander.timedMessages.get(0).obj));
-        assertEquals(SEND_FRAMEWORK_KEY_EVENT, mInputEventsHander.timedMessages.get(1).what);
-        assertEquals(WindowManagerPolicy.FLAG_PASS_TO_USER,
-                mInputEventsHander.timedMessages.get(1).arg1);
-        assertTrue(new KeyEventMatcher(second)
-                .matches(mInputEventsHander.timedMessages.get(1).obj));
+        assertEquals(2, mInputEventsHandler.timedMessages.size());
+
+        Message m0 = getTimedMessage(mInputEventsHandler, 0);
+        assertEquals(SEND_FRAMEWORK_KEY_EVENT, m0.what);
+        assertEquals(WindowManagerPolicy.FLAG_PASS_TO_USER, m0.arg1);
+        assertTrue(new KeyEventMatcher(first).matches(m0.obj));
+
+        Message m1 = getTimedMessage(mInputEventsHandler, 1);
+        assertEquals(SEND_FRAMEWORK_KEY_EVENT, m1.what);
+        assertEquals(WindowManagerPolicy.FLAG_PASS_TO_USER, m1.arg1);
+        assertTrue(new KeyEventMatcher(second).matches(m1.obj));
+    }
+
+    private static Message getTimedMessage(MessageCapturingHandler handler, int i) {
+        return handler.timedMessages.get(i).first;
+    }
+
+    private static boolean isTimeoutPending(MessageCapturingHandler handler) {
+        return handler.hasMessages(KeyEventDispatcher.MSG_ON_KEY_EVENT_TIMEOUT);
     }
 
     private class KeyEventMatcher extends TypeSafeMatcher<KeyEvent> {
@@ -581,18 +591,4 @@
             description.appendText("Key event matcher");
         }
     }
-
-    private class MessageCapturingHandler extends Handler {
-        List<Message> timedMessages = new ArrayList<>();
-
-        @Override
-        public boolean sendMessageAtTime(Message message, long uptimeMillis) {
-            timedMessages.add(Message.obtain(message));
-            return super.sendMessageAtTime(message, uptimeMillis);
-        }
-
-        public boolean isTimeoutPending() {
-            return hasMessages(KeyEventDispatcher.MSG_ON_KEY_EVENT_TIMEOUT);
-        }
-    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/KeyboardInterceptorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/KeyboardInterceptorTest.java
index 851e221..9926a09 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/KeyboardInterceptorTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/KeyboardInterceptorTest.java
@@ -28,7 +28,6 @@
 import static org.mockito.Mockito.when;
 import static org.mockito.hamcrest.MockitoHamcrest.argThat;
 
-import android.os.Looper;
 import android.view.KeyEvent;
 
 import androidx.test.runner.AndroidJUnit4;
@@ -38,8 +37,8 @@
 
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
+import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.InOrder;
@@ -58,19 +57,18 @@
     @Mock AccessibilityManagerService mMockAms;
     @Mock WindowManagerPolicy mMockPolicy;
 
-    @BeforeClass
-    public static void oneTimeInitialization() {
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-    }
-
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mInterceptor = new KeyboardInterceptor(mMockAms, mMockPolicy, mHandler);
     }
 
+    @After
+    public void tearDown() {
+        mHandler.removeAllMessages();
+    }
+
+
     @Test
     public void whenNonspecialKeyArrives_withNothingInQueue_eventGoesToAms() {
         KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0);
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java
index d6d21c6..c88b873 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationControllerTest.java
@@ -43,9 +43,9 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.support.test.filters.FlakyTest;
 import android.view.MagnificationSpec;
 
+import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.internal.R;
@@ -55,8 +55,8 @@
 import org.hamcrest.CoreMatchers;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
+import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -67,7 +67,6 @@
 import java.util.Locale;
 
 @RunWith(AndroidJUnit4.class)
-@FlakyTest
 public class MagnificationControllerTest {
     static final Rect INITIAL_MAGNIFICATION_BOUNDS = new Rect(0, 0, 100, 200);
     static final PointF INITIAL_MAGNIFICATION_BOUNDS_CENTER = new PointF(
@@ -75,8 +74,10 @@
     static final PointF INITIAL_BOUNDS_UPPER_LEFT_2X_CENTER = new PointF(25, 50);
     static final PointF INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER = new PointF(75, 150);
     static final Rect OTHER_MAGNIFICATION_BOUNDS = new Rect(100, 200, 500, 600);
+    static final Rect OTHER_MAGNIFICATION_BOUNDS_COMPAT = new Rect(50, 100, 450, 500);
     static final PointF OTHER_BOUNDS_LOWER_RIGHT_2X_CENTER = new PointF(400, 500);
     static final Region INITIAL_MAGNIFICATION_REGION = new Region(INITIAL_MAGNIFICATION_BOUNDS);
+    static final Region OTHER_REGION_COMPAT = new Region(OTHER_MAGNIFICATION_BOUNDS_COMPAT);
     static final Region OTHER_REGION = new Region(OTHER_MAGNIFICATION_BOUNDS);
     static final int SERVICE_ID_1 = 1;
     static final int SERVICE_ID_2 = 2;
@@ -91,25 +92,17 @@
             return mMagnificationController.handleMessage(msg);
         }
     });
-    final ArgumentCaptor<MagnificationSpec> mMagnificationSpecCaptor =
-            ArgumentCaptor.forClass(MagnificationSpec.class);
     final ValueAnimator mMockValueAnimator = mock(ValueAnimator.class);
     MagnificationController.SettingsBridge mMockSettingsBridge;
 
-
     MagnificationController mMagnificationController;
     ValueAnimator.AnimatorUpdateListener mTargetAnimationListener;
 
-    @BeforeClass
-    public static void oneTimeInitialization() {
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-    }
-
     @Before
     public void setUp() {
-        when(mMockContext.getMainLooper()).thenReturn(Looper.myLooper());
+        Looper looper = InstrumentationRegistry.getContext().getMainLooper();
+        // Pretending ID of the Thread associated with looper as main thread ID in controller
+        when(mMockContext.getMainLooper()).thenReturn(looper);
         Resources mockResources = mock(Resources.class);
         when(mMockContext.getResources()).thenReturn(mockResources);
         when(mockResources.getInteger(R.integer.config_longAnimTime))
@@ -136,6 +129,12 @@
         Mockito.reset(mMockValueAnimator); // Ignore other initialization
     }
 
+    @After
+    public void tearDown() {
+        mMessageCapturingHandler.removeAllMessages();
+    }
+
+
     @Test
     public void testRegister_WindowManagerAndContextRegisterListeners() {
         mMagnificationController.register();
@@ -202,6 +201,7 @@
         final PointF offsets = computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, center, scale);
         assertTrue(mMagnificationController
                 .setScale(scale, center.x, center.y, false, SERVICE_ID_1));
+        mMessageCapturingHandler.sendAllMessages();
 
         final MagnificationSpec expectedSpec = getMagnificationSpec(scale, offsets);
         verify(mMockWindowManager).setMagnificationSpec(argThat(closeTo(expectedSpec)));
@@ -219,6 +219,7 @@
         PointF pivotPoint = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER;
         assertTrue(mMagnificationController
                 .setScale(scale, pivotPoint.x, pivotPoint.y, true, SERVICE_ID_1));
+        mMessageCapturingHandler.sendAllMessages();
 
         // New center should be halfway between original center and pivot
         PointF newCenter = new PointF((pivotPoint.x + INITIAL_MAGNIFICATION_BOUNDS.centerX()) / 2,
@@ -264,6 +265,7 @@
         PointF newCenter = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER;
         assertTrue(mMagnificationController
                 .setCenter(newCenter.x, newCenter.y, false, SERVICE_ID_1));
+        mMessageCapturingHandler.sendAllMessages();
         PointF expectedOffsets = computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, newCenter, scale);
         MagnificationSpec expectedSpec = getMagnificationSpec(scale, expectedOffsets);
 
@@ -284,6 +286,7 @@
 
         assertTrue(mMagnificationController.setScaleAndCenter(scale, newCenter.x, newCenter.y,
                 true, SERVICE_ID_1));
+        mMessageCapturingHandler.sendAllMessages();
 
         assertEquals(newCenter.x, mMagnificationController.getCenterX(), 0.5);
         assertEquals(newCenter.y, mMagnificationController.getCenterY(), 0.5);
@@ -325,6 +328,7 @@
         assertTrue(mMagnificationController.setScaleAndCenter(
                 MagnificationController.MAX_SCALE + 1.0f,
                 newCenter.x, newCenter.y, false, SERVICE_ID_1));
+        mMessageCapturingHandler.sendAllMessages();
 
         assertEquals(newCenter.x, mMagnificationController.getCenterX(), 0.5);
         assertEquals(newCenter.y, mMagnificationController.getCenterY(), 0.5);
@@ -335,6 +339,7 @@
         assertTrue(mMagnificationController.setScaleAndCenter(0.5f,
                 INITIAL_MAGNIFICATION_BOUNDS_CENTER.x, INITIAL_MAGNIFICATION_BOUNDS_CENTER.y,
                 false, SERVICE_ID_1));
+        mMessageCapturingHandler.sendAllMessages();
 
         assertEquals(INITIAL_MAGNIFICATION_BOUNDS_CENTER.x,
                 mMagnificationController.getCenterX(), 0.5);
@@ -351,6 +356,7 @@
         // Off the edge to the top and left
         assertTrue(mMagnificationController.setScaleAndCenter(
                 scale, -100f, -200f, false, SERVICE_ID_1));
+        mMessageCapturingHandler.sendAllMessages();
 
         PointF newCenter = INITIAL_BOUNDS_UPPER_LEFT_2X_CENTER;
         PointF newOffsets = computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, newCenter, scale);
@@ -364,6 +370,7 @@
         assertTrue(mMagnificationController.setScaleAndCenter(scale,
                 INITIAL_MAGNIFICATION_BOUNDS.right + 1, INITIAL_MAGNIFICATION_BOUNDS.bottom + 1,
                 false, SERVICE_ID_1));
+        mMessageCapturingHandler.sendAllMessages();
         newCenter = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER;
         newOffsets = computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, newCenter, scale);
         assertEquals(newCenter.x, mMagnificationController.getCenterX(), 0.5);
@@ -391,12 +398,14 @@
         // First zoom in
         assertTrue(mMagnificationController
                 .setScaleAndCenter(scale, startCenter.x, startCenter.y, false, SERVICE_ID_1));
+        mMessageCapturingHandler.sendAllMessages();
         Mockito.reset(mMockWindowManager);
 
         PointF newCenter = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER;
         PointF newOffsets = computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, newCenter, scale);
         mMagnificationController.offsetMagnifiedRegion(
                 startOffsets.x - newOffsets.x, startOffsets.y - newOffsets.y, SERVICE_ID_1);
+        mMessageCapturingHandler.sendAllMessages();
 
         MagnificationSpec expectedSpec = getMagnificationSpec(scale, newOffsets);
         verify(mMockWindowManager).setMagnificationSpec(argThat(closeTo(expectedSpec)));
@@ -490,6 +499,7 @@
     public void testResetIfNeeded_doesWhatItSays() {
         mMagnificationController.register();
         zoomIn2xToMiddle();
+        mMessageCapturingHandler.sendAllMessages();
         reset(mMockAms);
         assertTrue(mMagnificationController.resetIfNeeded(false));
         verify(mMockAms).notifyMagnificationChanged(
@@ -507,6 +517,7 @@
                 broadcastReceiverCaptor.capture(), (IntentFilter) anyObject());
         BroadcastReceiver br = broadcastReceiverCaptor.getValue();
         zoomIn2xToMiddle();
+        mMessageCapturingHandler.sendAllMessages();
         br.onReceive(mMockContext, null);
         mMessageCapturingHandler.sendAllMessages();
         assertFalse(mMagnificationController.isMagnifying());
@@ -517,6 +528,7 @@
         mMagnificationController.register();
         MagnificationCallbacks callbacks = getMagnificationCallbacks();
         zoomIn2xToMiddle();
+        mMessageCapturingHandler.sendAllMessages();
         callbacks.onUserContextChanged();
         mMessageCapturingHandler.sendAllMessages();
         assertFalse(mMagnificationController.isMagnifying());
@@ -539,10 +551,11 @@
         // Going from a small region to a large one leads to no issues
         mMagnificationController.register();
         zoomIn2xToMiddle();
+        mMessageCapturingHandler.sendAllMessages();
         MagnificationSpec startSpec = getCurrentMagnificationSpec();
         MagnificationCallbacks callbacks = getMagnificationCallbacks();
         Mockito.reset(mMockWindowManager);
-        callbacks.onMagnificationRegionChanged(OTHER_REGION);
+        callbacks.onMagnificationRegionChanged(OTHER_REGION_COMPAT);
         mMessageCapturingHandler.sendAllMessages();
         assertThat(getCurrentMagnificationSpec(), closeTo(startSpec));
         verifyNoMoreInteractions(mMockWindowManager);
@@ -553,11 +566,12 @@
         mMagnificationController.register();
         PointF startCenter = INITIAL_MAGNIFICATION_BOUNDS_CENTER;
         float scale = 2.0f;
+        // setting animate parameter to true is differ from zoomIn2xToMiddle()
         mMagnificationController.setScale(scale, startCenter.x, startCenter.y, true, SERVICE_ID_1);
         MagnificationSpec startSpec = getCurrentMagnificationSpec();
         MagnificationCallbacks callbacks = getMagnificationCallbacks();
         Mockito.reset(mMockWindowManager);
-        callbacks.onMagnificationRegionChanged(OTHER_REGION);
+        callbacks.onMagnificationRegionChanged(OTHER_REGION_COMPAT);
         mMessageCapturingHandler.sendAllMessages();
         assertThat(getCurrentMagnificationSpec(), closeTo(startSpec));
         verifyNoMoreInteractions(mMockWindowManager);
@@ -573,6 +587,7 @@
         PointF startCenter = OTHER_BOUNDS_LOWER_RIGHT_2X_CENTER;
         float scale = 2.0f;
         mMagnificationController.setScale(scale, startCenter.x, startCenter.y, false, SERVICE_ID_1);
+        mMessageCapturingHandler.sendAllMessages();
         MagnificationSpec startSpec = getCurrentMagnificationSpec();
         verify(mMockWindowManager).setMagnificationSpec(argThat(closeTo(startSpec)));
         Mockito.reset(mMockWindowManager);
@@ -597,8 +612,9 @@
         PointF startCenter = OTHER_BOUNDS_LOWER_RIGHT_2X_CENTER;
         float scale = 2.0f;
         mMagnificationController.setScale(scale, startCenter.x, startCenter.y, true, SERVICE_ID_1);
+        mMessageCapturingHandler.sendAllMessages();
         MagnificationSpec startSpec = getCurrentMagnificationSpec();
-        when (mMockValueAnimator.isRunning()).thenReturn(true);
+        when(mMockValueAnimator.isRunning()).thenReturn(true);
 
         callbacks.onMagnificationRegionChanged(INITIAL_MAGNIFICATION_REGION);
         mMessageCapturingHandler.sendAllMessages();
@@ -616,6 +632,7 @@
     public void testRequestRectOnScreen_rectAlreadyOnScreen_doesNothing() {
         mMagnificationController.register();
         zoomIn2xToMiddle();
+        mMessageCapturingHandler.sendAllMessages();
         MagnificationSpec startSpec = getCurrentMagnificationSpec();
         MagnificationCallbacks callbacks = getMagnificationCallbacks();
         Mockito.reset(mMockWindowManager);
@@ -631,6 +648,7 @@
     public void testRequestRectOnScreen_rectCanFitOnScreen_pansToGetRectOnScreen() {
         mMagnificationController.register();
         zoomIn2xToMiddle();
+        mMessageCapturingHandler.sendAllMessages();
         MagnificationCallbacks callbacks = getMagnificationCallbacks();
         Mockito.reset(mMockWindowManager);
         callbacks.onRectangleOnScreenRequested(0, 0, 1, 1);
@@ -644,6 +662,7 @@
     public void testRequestRectOnScreen_garbageInput_doesNothing() {
         mMagnificationController.register();
         zoomIn2xToMiddle();
+        mMessageCapturingHandler.sendAllMessages();
         MagnificationSpec startSpec = getCurrentMagnificationSpec();
         MagnificationCallbacks callbacks = getMagnificationCallbacks();
         Mockito.reset(mMockWindowManager);
@@ -653,12 +672,12 @@
         verifyNoMoreInteractions(mMockWindowManager);
     }
 
-
     @Test
     public void testRequestRectOnScreen_rectTooWide_pansToGetStartOnScreenBasedOnLocale() {
         Locale.setDefault(new Locale("en", "us"));
         mMagnificationController.register();
         zoomIn2xToMiddle();
+        mMessageCapturingHandler.sendAllMessages();
         MagnificationCallbacks callbacks = getMagnificationCallbacks();
         MagnificationSpec startSpec = getCurrentMagnificationSpec();
         Mockito.reset(mMockWindowManager);
@@ -685,6 +704,7 @@
     public void testRequestRectOnScreen_rectTooTall_pansMinimumToGetTopOnScreen() {
         mMagnificationController.register();
         zoomIn2xToMiddle();
+        mMessageCapturingHandler.sendAllMessages();
         MagnificationCallbacks callbacks = getMagnificationCallbacks();
         MagnificationSpec startSpec = getCurrentMagnificationSpec();
         Mockito.reset(mMockWindowManager);
@@ -708,6 +728,7 @@
 
         assertTrue(mMagnificationController.setScaleAndCenter(scale, firstCenter.x, firstCenter.y,
                 true, SERVICE_ID_1));
+        mMessageCapturingHandler.sendAllMessages();
 
         assertEquals(firstCenter.x, mMagnificationController.getCenterX(), 0.5);
         assertEquals(firstCenter.y, mMagnificationController.getCenterY(), 0.5);
@@ -736,6 +757,7 @@
                 scale, computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, newCenter, scale));
         assertTrue(mMagnificationController.setCenter(
                 newCenter.x, newCenter.y, true, SERVICE_ID_1));
+        mMessageCapturingHandler.sendAllMessages();
 
         // Animation should have been restarted
         verify(mMockValueAnimator, times(2)).start();
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MessageCapturingHandler.java b/services/tests/servicestests/src/com/android/server/accessibility/MessageCapturingHandler.java
index e3ee47f..e2b517f 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MessageCapturingHandler.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MessageCapturingHandler.java
@@ -16,11 +16,13 @@
 
 package com.android.server.accessibility;
 
-import android.app.Notification;
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import android.util.Pair;
 
+import androidx.test.InstrumentationRegistry;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -34,13 +36,22 @@
     Handler.Callback mCallback;
 
     public MessageCapturingHandler(Handler.Callback callback) {
+        this(InstrumentationRegistry.getContext().getMainLooper(), callback);
+    }
+
+    public MessageCapturingHandler(Looper looper, Callback callback) {
+        super(looper);
         mCallback = callback;
     }
 
+    /**
+     * Holding messages in queue, but never dispatching.
+     * @see #removeAllMessages()
+     */
     @Override
     public boolean sendMessageAtTime(Message message, long uptimeMillis) {
         timedMessages.add(new Pair<>(Message.obtain(message), uptimeMillis));
-        return super.sendMessageAtTime(message, uptimeMillis);
+        return super.sendMessageAtTime(message, Long.MAX_VALUE);
     }
 
     public void setCallback(Handler.Callback callback) {
@@ -67,6 +78,22 @@
         removeStaleMessages();
     }
 
+    /**
+     * Clear messages sent from this handler in queue.
+     * <p>
+     * If main looper is used, this method should be called in tear down function
+     * to ensure messages isolation between test cases.
+     * </p>
+     */
+    public void removeAllMessages() {
+        if (hasMessages()) {
+            for (int i = 0; i < timedMessages.size(); i++) {
+                Message message = timedMessages.get(i).first;
+                removeMessages(message.what, message.obj);
+            }
+        }
+    }
+
     public boolean hasMessages() {
         removeStaleMessages();
         return !timedMessages.isEmpty();
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
index 5f0fa87..2cba9d0 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
@@ -43,7 +43,6 @@
 import android.accessibilityservice.IAccessibilityServiceClient;
 import android.graphics.Point;
 import android.os.Handler;
-import android.os.Looper;
 import android.os.Message;
 import android.os.RemoteException;
 import android.util.Log;
@@ -57,8 +56,8 @@
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
 import org.hamcrest.TypeSafeMatcher;
+import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -127,13 +126,6 @@
     Matcher<MotionEvent> mIsClickDown;
     Matcher<MotionEvent> mIsClickUp;
 
-    @BeforeClass
-    public static void oneTimeInitialization() {
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-    }
-
     @Before
     public void setUp() {
         mMessageCapturingHandler = new MessageCapturingHandler(new Handler.Callback() {
@@ -172,6 +164,12 @@
                 hasTimeFromDown(CLICK_DURATION));
     }
 
+    @After
+    public void tearDown() {
+        mMessageCapturingHandler.removeAllMessages();
+    }
+
+
     @Test
     public void testInjectEvents_shouldEmergeInOrderWithCorrectTiming() throws RemoteException {
         EventStreamTransformation next = attachMockNext(mMotionEventInjector);
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/TouchExplorerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/TouchExplorerTest.java
index c47885f..2645461 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/TouchExplorerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/TouchExplorerTest.java
@@ -16,12 +16,14 @@
 
 package com.android.server.accessibility;
 
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
 
 import android.content.Context;
 import android.graphics.PointF;
 import android.os.SystemClock;
+import android.testing.DexmakerShareClassLoaderRule;
 import android.util.DebugUtils;
 import android.view.InputDevice;
 import android.view.MotionEvent;
@@ -30,6 +32,7 @@
 import androidx.test.runner.AndroidJUnit4;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -66,6 +69,11 @@
     private TouchExplorer mTouchExplorer;
     private long mLastDownTime = Integer.MIN_VALUE;
 
+    // mock package-private AccessibilityGestureDetector class
+    @Rule
+    public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
+            new DexmakerShareClassLoaderRule();
+
     /**
      * {@link TouchExplorer#sendDownForAllNotInjectedPointers} injecting events with the same object
      * is resulting {@link ArgumentCaptor} to capture events with last state. Before implementation
@@ -93,8 +101,9 @@
     public void setUp() {
         Context context = InstrumentationRegistry.getContext();
         AccessibilityManagerService ams = new AccessibilityManagerService(context);
+        AccessibilityGestureDetector detector = mock(AccessibilityGestureDetector.class);
         mCaptor = new EventCaptor();
-        mTouchExplorer = new TouchExplorer(context, ams);
+        mTouchExplorer = new TouchExplorer(context, ams, detector);
         mTouchExplorer.setNext(mCaptor);
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java
index 8853db2..8e09d60 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/UiAutomationManagerTest.java
@@ -32,13 +32,12 @@
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 import android.os.IBinder;
-import android.os.Looper;
 import android.view.accessibility.AccessibilityEvent;
 
 import com.android.server.wm.WindowManagerInternal;
 
+import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
@@ -66,13 +65,6 @@
     @Mock IAccessibilityServiceClient mMockAccessibilityServiceClient;
     @Mock IBinder mMockServiceAsBinder;
 
-    @BeforeClass
-    public static void oneTimeInitialization() {
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-    }
-
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
@@ -88,6 +80,12 @@
         mMessageCapturingHandler = new MessageCapturingHandler(null);
     }
 
+    @After
+    public void tearDown() {
+        mMessageCapturingHandler.removeAllMessages();
+    }
+
+
     @Test
     public void isRunning_returnsTrueOnlyWhenRunning() {
         assertFalse(mUiAutomationManager.isUiAutomationRunningLocked());