[e2e] Reland: Replaces the check for ActivityTestRule (#2633) (#2661)

This reverts commit 608774119dd5c9d68f5237347c12669fa9110c2b.
diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md
index 52fcc92..24dc7a8 100644
--- a/packages/e2e/CHANGELOG.md
+++ b/packages/e2e/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.4.2
+
+* Adds support for Android E2E tests that utilize other @Rule's, like GrantPermissionRule.
+
 ## 0.4.1
 
 * Remove Android dependencies fallback.
diff --git a/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java
index f214cd7..78f0c3c 100644
--- a/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java
+++ b/packages/e2e/android/src/main/java/dev/flutter/plugins/e2e/FlutterTestRunner.java
@@ -4,23 +4,24 @@
 
 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;
 import java.util.concurrent.ExecutionException;
 import org.junit.Rule;
+import org.junit.rules.TestRule;
 import org.junit.runner.Description;
 import org.junit.runner.Runner;
 import org.junit.runner.notification.Failure;
 import org.junit.runner.notification.RunNotifier;
 
 public class FlutterTestRunner extends Runner {
+
   private static final String TAG = "FlutterTestRunner";
 
   final Class testClass;
-  ActivityTestRule<Activity> rule = null;
+  TestRule rule = null;
 
   public FlutterTestRunner(Class<?> testClass) {
     super();
@@ -32,7 +33,10 @@
       if (field.isAnnotationPresent(Rule.class)) {
         try {
           Object instance = testClass.newInstance();
-          rule = (ActivityTestRule<Activity>) field.get(instance);
+          if (field.get(instance) instanceof ActivityTestRule) {
+            rule = (TestRule) field.get(instance);
+            break;
+          }
         } 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.
@@ -53,7 +57,9 @@
       throw new RuntimeException("Unable to run tests due to missing activity rule");
     }
     try {
-      rule.launchActivity(null);
+      if (rule instanceof ActivityTestRule) {
+        ((ActivityTestRule) rule).launchActivity(null);
+      }
     } catch (RuntimeException e) {
       Log.v(TAG, "launchActivity failed, possibly because the activity was already running. " + e);
       Log.v(
diff --git a/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityWithPermissionTest.java b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityWithPermissionTest.java
new file mode 100644
index 0000000..90218e8
--- /dev/null
+++ b/packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityWithPermissionTest.java
@@ -0,0 +1,25 @@
+package com.example.e2e_example;
+
+import android.Manifest.permission;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.rule.GrantPermissionRule;
+import dev.flutter.plugins.e2e.FlutterTestRunner;
+import org.junit.Rule;
+import org.junit.runner.RunWith;
+
+/**
+ * Demonstrates how a E2E test on Android can be run with permissions already granted. This is
+ * helpful if developers want to test native App behavior that depends on certain system service
+ * results which are guarded with permissions.
+ */
+@RunWith(FlutterTestRunner.class)
+public class MainActivityWithPermissionTest {
+
+  @Rule
+  public GrantPermissionRule permissionRule =
+      GrantPermissionRule.grant(permission.ACCESS_COARSE_LOCATION);
+
+  @Rule
+  public ActivityTestRule<MainActivity> rule =
+      new ActivityTestRule<>(MainActivity.class, true, false);
+}
diff --git a/packages/e2e/pubspec.yaml b/packages/e2e/pubspec.yaml
index 72a782e..1857e2d 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.4.1
+version: 0.4.2
 homepage: https://github.com/flutter/plugins/tree/master/packages/e2e
 
 environment: