Merge "Resolve race condition in TaskStackChangedListenerTest"
diff --git a/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java b/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java
index b431af1..3f7c714 100644
--- a/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/TaskStackChangedListenerTest.java
@@ -143,10 +143,10 @@
         assertEquals(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, params[1]);
     }
 
-    @Test
     /**
      * Tests for onTaskCreated, onTaskMovedToFront, onTaskRemoved and onTaskRemovalStarted.
      */
+    @Test
     public void testTaskChangeCallBacks() throws Exception {
         final Object[] params = new Object[2];
         final CountDownLatch taskCreatedLaunchLatch = new CountDownLatch(1);
@@ -218,16 +218,17 @@
     /**
      * Starts the provided activity and returns the started instance.
      */
-    private Activity startTestActivity(Class<?> activityClass) {
+    private TestActivity startTestActivity(Class<?> activityClass) throws InterruptedException {
         final Context context = InstrumentationRegistry.getContext();
         final ActivityMonitor monitor =
                 new ActivityMonitor(activityClass.getName(), null, false);
         InstrumentationRegistry.getInstrumentation().addMonitor(monitor);
         context.startActivity(new Intent(context, activityClass));
-        final Activity activity = monitor.waitForActivityWithTimeout(1000);
+        final TestActivity activity = (TestActivity)monitor.waitForActivityWithTimeout(1000);
         if (activity == null) {
             throw new RuntimeException("Timed out waiting for Activity");
         }
+        activity.waitForResumeStateChange(true);
         return activity;
     }
 
@@ -245,7 +246,43 @@
         }catch (InterruptedException e) {}
     }
 
-    public static class ActivityA extends Activity {
+    public static class TestActivity extends Activity {
+        boolean mIsResumed = false;
+
+        @Override
+        protected void onPostResume() {
+            super.onPostResume();
+            synchronized (this) {
+                mIsResumed = true;
+                notifyAll();
+            }
+        }
+
+        @Override
+        protected void onPause() {
+            super.onPause();
+            synchronized (this) {
+                mIsResumed = false;
+                notifyAll();
+            }
+        }
+
+        /**
+         * If isResumed is {@code true}, sleep the thread until the activity is resumed.
+         * if {@code false}, sleep the thread until the activity is paused.
+         */
+        public void waitForResumeStateChange(boolean isResumed) throws InterruptedException {
+            synchronized (this) {
+                if (mIsResumed == isResumed) {
+                    return;
+                }
+                wait(5000);
+            }
+            assertTrue("The activity resume state change timed out", mIsResumed == isResumed);
+        }
+    }
+
+    public static class ActivityA extends TestActivity {
 
         private boolean mActivityBLaunched = false;
 
@@ -261,7 +298,7 @@
         }
     }
 
-    public static class ActivityB extends Activity {
+    public static class ActivityB extends TestActivity {
 
         @Override
         protected void onPostResume() {
@@ -274,7 +311,7 @@
         }
     }
 
-    public static class ActivityRequestedOrientationChange extends Activity {
+    public static class ActivityRequestedOrientationChange extends TestActivity {
         @Override
         protected void onPostResume() {
             super.onPostResume();
@@ -283,7 +320,7 @@
         }
     }
 
-    public static class ActivityTaskDescriptionChange extends Activity {
+    public static class ActivityTaskDescriptionChange extends TestActivity {
         @Override
         protected void onPostResume() {
             super.onPostResume();
@@ -292,7 +329,7 @@
         }
     }
 
-    public static class ActivityTaskChangeCallbacks extends Activity {
+    public static class ActivityTaskChangeCallbacks extends TestActivity {
         boolean onDetachedFromWindowCalled = false;
         CountDownLatch onDetachedFromWindowCountDownLatch;