Make FlutterRunner launch deterministic when running other tests. (#2584)

* Make FlutterRunner launch deterministic when running other tests.
* Switch to using FlutterTestRunner
diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md
index 86f37b2..ab17150 100644
--- a/packages/e2e/CHANGELOG.md
+++ b/packages/e2e/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.3.0
+
+* Updates documentation to instruct developers not to launch the activity since
+  we are doing it for them.
+* Renames `FlutterRunner` to `FlutterTestRunner` to avoid conflict with Fuchsia.
+
 ## 0.2.4+4
 
 * Fixed a hang that occurred on platforms that don't have a `MethodChannel` listener registered..
diff --git a/packages/e2e/README.md b/packages/e2e/README.md
index 3e27ff3..7d571a5 100644
--- a/packages/e2e/README.md
+++ b/packages/e2e/README.md
@@ -93,10 +93,10 @@
 import org.junit.Rule;
 import org.junit.runner.RunWith;
 
-@RunWith(FlutterRunner.class)
+@RunWith(FlutterTestRunner.class)
 public class MainActivityTest {
   @Rule
-  public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class);
+  public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class, true, false);
 }
 ```
 
diff --git a/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterRunner.java b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java
similarity index 74%
rename from packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterRunner.java
rename to packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java
index 31f3e84..f214cd7 100644
--- a/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterRunner.java
+++ b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java
@@ -5,6 +5,7 @@
 package dev.flutter.plugins.e2e;
 
 import android.app.Activity;
+import android.util.Log;
 import androidx.test.rule.ActivityTestRule;
 import java.lang.reflect.Field;
 import java.util.Map;
@@ -15,11 +16,13 @@
 import org.junit.runner.notification.Failure;
 import org.junit.runner.notification.RunNotifier;
 
-public class FlutterRunner extends Runner {
+public class FlutterTestRunner extends Runner {
+  private static final String TAG = "FlutterTestRunner";
 
   final Class testClass;
+  ActivityTestRule<Activity> rule = null;
 
-  public FlutterRunner(Class<?> testClass) {
+  public FlutterTestRunner(Class<?> testClass) {
     super();
     this.testClass = testClass;
 
@@ -29,8 +32,7 @@
       if (field.isAnnotationPresent(Rule.class)) {
         try {
           Object instance = testClass.newInstance();
-          ActivityTestRule<Activity> rule = (ActivityTestRule<Activity>) field.get(instance);
-          rule.launchActivity(null);
+          rule = (ActivityTestRule<Activity>) field.get(instance);
         } catch (InstantiationException | IllegalAccessException e) {
           // This might occur if the developer did not make the rule public.
           // We could call field.setAccessible(true) but it seems better to throw.
@@ -47,6 +49,17 @@
 
   @Override
   public void run(RunNotifier notifier) {
+    if (rule == null) {
+      throw new RuntimeException("Unable to run tests due to missing activity rule");
+    }
+    try {
+      rule.launchActivity(null);
+    } catch (RuntimeException e) {
+      Log.v(TAG, "launchActivity failed, possibly because the activity was already running. " + e);
+      Log.v(
+          TAG,
+          "Try disabling auto-launch of the activity, e.g. ActivityTestRule<>(MainActivity.class, true, false);");
+    }
     Map<String, String> results = null;
     try {
       results = E2EPlugin.testResults.get();
diff --git a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/EmbedderV1ActivityTest.java b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/EmbedderV1ActivityTest.java
index a526c1c..eedde29 100644
--- a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/EmbedderV1ActivityTest.java
+++ b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/EmbedderV1ActivityTest.java
@@ -1,13 +1,13 @@
 package com.example.e2e_example;
 
 import androidx.test.rule.ActivityTestRule;
-import dev.flutter.plugins.e2e.FlutterRunner;
+import dev.flutter.plugins.e2e.FlutterTestRunner;
 import org.junit.Rule;
 import org.junit.runner.RunWith;
 
-@RunWith(FlutterRunner.class)
+@RunWith(FlutterTestRunner.class)
 public class EmbedderV1ActivityTest {
   @Rule
   public ActivityTestRule<EmbedderV1Activity> rule =
-      new ActivityTestRule<>(EmbedderV1Activity.class);
+      new ActivityTestRule<>(EmbedderV1Activity.class, true, false);
 }
diff --git a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java
index b61c056..93b1f92 100644
--- a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java
+++ b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityTest.java
@@ -1,11 +1,13 @@
 package com.example.e2e_example;
 
 import androidx.test.rule.ActivityTestRule;
-import dev.flutter.plugins.e2e.FlutterRunner;
+import dev.flutter.plugins.e2e.FlutterTestRunner;
 import org.junit.Rule;
 import org.junit.runner.RunWith;
 
-@RunWith(FlutterRunner.class)
+@RunWith(FlutterTestRunner.class)
 public class MainActivityTest {
-  @Rule public ActivityTestRule<MainActivity> rule = new ActivityTestRule<>(MainActivity.class);
+  @Rule
+  public ActivityTestRule<MainActivity> rule =
+      new ActivityTestRule<>(MainActivity.class, true, false);
 }
diff --git a/packages/e2e/pubspec.yaml b/packages/e2e/pubspec.yaml
index 21e1210..e05bc1b 100644
--- a/packages/e2e/pubspec.yaml
+++ b/packages/e2e/pubspec.yaml
@@ -1,6 +1,6 @@
 name: e2e
 description: Runs tests that use the flutter_test API as integration tests.
-version: 0.2.4+4
+version: 0.3.0
 homepage: https://github.com/flutter/plugins/tree/master/packages/e2e
 
 environment: