Update multi-launch tests to support watch.

On watch, startActivities() is slow and sometimes the activities are
created/resumed in an unintended order, so we can't just keep track of
the order of onResume() calls.

Now we tell the activity the expected order, so it can skip
unexpected resumes.

Bug 33358948

Change-Id: Idd0a06a9747b4ac18164cf1a1e5c750e48450acf
diff --git a/tests/tests/shortcutmanager/src/android/content/pm/cts/shortcutmanager/ShortcutLaunchedActivity.java b/tests/tests/shortcutmanager/src/android/content/pm/cts/shortcutmanager/ShortcutLaunchedActivity.java
index 61f94d4..fdedc45 100644
--- a/tests/tests/shortcutmanager/src/android/content/pm/cts/shortcutmanager/ShortcutLaunchedActivity.java
+++ b/tests/tests/shortcutmanager/src/android/content/pm/cts/shortcutmanager/ShortcutLaunchedActivity.java
@@ -22,7 +22,9 @@
 import android.util.Log;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -36,9 +38,14 @@
 
     private final int mInstanceId = sNextInstanceId.getAndIncrement();
 
-    // @GuardedBy("sReceivedIntents")
+    private static final Object sLock = new Object();
+
+    // @GuardedBy("sLock")
     private static final ArrayList<Intent> sReceivedIntents = new ArrayList<>();
 
+    // @GuardedBy("sLock")
+    private static final ArrayList<String> sExpectedVisibleOrder = new ArrayList<>();
+
     private Handler mHandler = new Handler();
 
     private Intent mIntentToAdd;
@@ -48,6 +55,10 @@
                 mInstanceId, action, getIntent()));
     }
 
+    public ShortcutLaunchedActivity() {
+        log("ctor");
+    }
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -63,22 +74,27 @@
 
         log("onResume");
 
-        synchronized (sReceivedIntents) {
+        synchronized (sLock) {
+            if (!Objects.equals(getIntent().getAction(), sExpectedVisibleOrder.get(0))) {
+                log("Not my turn yet.");
+                return;
+            }
+            sExpectedVisibleOrder.remove(0);
+
             // Make sure we only add it once, ever.
             if (mIntentToAdd != null) {
                 sReceivedIntents.add(new Intent(getIntent()));
                 mIntentToAdd = null;
             }
         }
-        mHandler.post(() -> {
-            onBackPressed();
-        });
+        finish();
     }
 
     @Override
-    public void onBackPressed() {
-        log("onBackPressed");
-        super.onBackPressed();
+    protected void onPause() {
+        log("onPause");
+
+        super.onPause();
     }
 
     @Override
@@ -88,14 +104,17 @@
         super.onDestroy();
     }
 
-    public static void clearIntents() {
-        synchronized (sReceivedIntents) {
+    public static void setExpectedOrder(String[] actions) {
+        synchronized (sLock) {
             sReceivedIntents.clear();
+
+            sExpectedVisibleOrder.clear();
+            sExpectedVisibleOrder.addAll(Arrays.asList(actions));
         }
     }
 
     public static List<Intent> getIntents() {
-        synchronized (sReceivedIntents) {
+        synchronized (sLock) {
             return new ArrayList(sReceivedIntents);
         }
     }
diff --git a/tests/tests/shortcutmanager/src/android/content/pm/cts/shortcutmanager/ShortcutManagerStartShortcutTest.java b/tests/tests/shortcutmanager/src/android/content/pm/cts/shortcutmanager/ShortcutManagerStartShortcutTest.java
index e80b66e..9cf1f89 100644
--- a/tests/tests/shortcutmanager/src/android/content/pm/cts/shortcutmanager/ShortcutManagerStartShortcutTest.java
+++ b/tests/tests/shortcutmanager/src/android/content/pm/cts/shortcutmanager/ShortcutManagerStartShortcutTest.java
@@ -20,7 +20,6 @@
 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.retryUntil;
 import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.setDefaultLauncher;
 
-import android.app.ActivityOptions;
 import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
 import android.content.Context;
@@ -29,8 +28,6 @@
 import android.os.Bundle;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import org.junit.internal.runners.statements.ExpectException;
-
 import java.util.List;
 
 @SmallTest
@@ -45,14 +42,16 @@
     }
 
     private List<Intent> launchShortcutAndGetIntents(Context launcher, Context client,
-            String id, int expectedNumIntents) {
-        return launchShortcutAndGetIntents(launcher, client, id, expectedNumIntents, null, null);
+            String id, int expectedNumIntents, String[] expectedActions) {
+        return launchShortcutAndGetIntents(launcher, client, id, expectedNumIntents, null, null,
+                expectedActions);
     }
 
     private List<Intent> launchShortcutAndGetIntents(Context launcher, Context client,
-            String id, int expectedNumIntents, Rect rect, Bundle options) {
+            String id, int expectedNumIntents, Rect rect, Bundle options,
+            String[] expectedActions) {
 
-        ShortcutLaunchedActivity.clearIntents();
+        ShortcutLaunchedActivity.setExpectedOrder(expectedActions);
 
         runWithCaller(launcher, () -> {
             getLauncherApps().startShortcut(client.getPackageName(), id, rect, options,
@@ -65,8 +64,10 @@
         return ShortcutLaunchedActivity.getIntents();
     }
 
-    private void assertShortcutStarts(Context launcher, Context client, String id) {
-        final List<Intent> launched = launchShortcutAndGetIntents(launcher, client, id, 1);
+    private void assertShortcutStarts(Context launcher, Context client, String id,
+            String[] expectedActions) {
+        final List<Intent> launched = launchShortcutAndGetIntents(launcher, client, id, 1,
+                expectedActions);
         assertTrue(launched.size() > 0);
     }
 
@@ -81,6 +82,9 @@
         });
     }
 
+    private static final String[] EXPECTED_ACTIONS_SINGLE = new String[]{Intent.ACTION_MAIN};
+    private static final String[] EXPECTED_ACTIONS_MULTI = new String[]{"a3", "a2", "a1"};
+
     /**
      * Start a single activity.
      */
@@ -100,7 +104,7 @@
         });
 
         List<Intent> launched = launchShortcutAndGetIntents(mLauncherContext1, mPackageContext1,
-                "s1", 1);
+                "s1", 1, EXPECTED_ACTIONS_SINGLE);
         assertEquals(1, launched.size());
         assertEquals(Intent.ACTION_MAIN, launched.get(0).getAction());
         assertTrue((launched.get(0).getFlags() & Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0);
@@ -132,7 +136,7 @@
         });
 
         List<Intent> launched = launchShortcutAndGetIntents(mLauncherContext1, mPackageContext1,
-                "s1", 3);
+                "s1", 3, EXPECTED_ACTIONS_MULTI);
         assertEquals(3, launched.size());
 
         Intent i = launched.get(2);
@@ -164,7 +168,8 @@
         setDefaultLauncher(getInstrumentation(), mLauncherContext2);
 
         // L2 can start it.
-        assertShortcutStarts(mLauncherContext2, mPackageContext1, "s1");
+        assertShortcutStarts(mLauncherContext2, mPackageContext1, "s1",
+                EXPECTED_ACTIONS_SINGLE);
 
         // L1 no longer can start it.
         assertShortcutCantStart(mLauncherContext1, mPackageContext1, "s1",
@@ -225,7 +230,7 @@
         });
 
         // Should still be launchable.
-        assertShortcutStarts(mLauncherContext1, mPackageContext1, "s1");
+        assertShortcutStarts(mLauncherContext1, mPackageContext1, "s1", EXPECTED_ACTIONS_SINGLE);
     }
 
     public void testPinnedShortcut_differentLauncher() {
@@ -249,7 +254,7 @@
         setDefaultLauncher(getInstrumentation(), mLauncherContext2);
 
         // L2 can now launch it.
-        assertShortcutStarts(mLauncherContext2, mPackageContext1, "s1");
+        assertShortcutStarts(mLauncherContext2, mPackageContext1, "s1", EXPECTED_ACTIONS_SINGLE);
 
         // Then remove it.
         runWithCaller(mPackageContext1, () -> {
@@ -261,14 +266,14 @@
                 ActivityNotFoundException.class);
 
         // But launcher 1 can still launch it too, because it's pinned by this launcher.
-        assertShortcutStarts(mLauncherContext1, mPackageContext1, "s1");
+        assertShortcutStarts(mLauncherContext1, mPackageContext1, "s1", EXPECTED_ACTIONS_SINGLE);
     }
 
     public void testStartSingleWithOptions() {
         testStartSingle();
 
         List<Intent> launched = launchShortcutAndGetIntents(mLauncherContext1, mPackageContext1,
-                "s1", 1, new Rect(1, 1, 2, 2), new Bundle());
+                "s1", 1, new Rect(1, 1, 2, 2), new Bundle(), EXPECTED_ACTIONS_SINGLE);
 
         Intent i = launched.get(0);
         assertEquals(1, i.getSourceBounds().left);
@@ -280,7 +285,7 @@
         testStartMultiple();
 
         List<Intent> launched = launchShortcutAndGetIntents(mLauncherContext1, mPackageContext1,
-                "s1", 3, new Rect(1, 1, 2, 2), new Bundle());
+                "s1", 3, new Rect(1, 1, 2, 2), new Bundle(), EXPECTED_ACTIONS_MULTI);
 
         Intent i = launched.get(2);
         assertEquals(1, i.getSourceBounds().left);
@@ -309,7 +314,7 @@
         assertExpectException(
                 ActivityNotFoundException.class, "Shortcut could not be started", () -> {
             launchShortcutAndGetIntents(mLauncherContext1, mPackageContext1,
-                    "s1", 1);
+                    "s1", 1, new String[0]);
         });
     }
 
@@ -334,7 +339,7 @@
         assertExpectException(
                 ActivityNotFoundException.class, "Shortcut could not be started", () -> {
                     launchShortcutAndGetIntents(mLauncherContext1, mPackageContext1,
-                            "s1", 1);
+                            "s1", 1, new String[0]);
                 });
     }
 }