From b1c0e173bb21240e915449a26303699841c9098d Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Fri, 17 Apr 2020 08:01:56 +0100 Subject: [PATCH 1/3] Reland: [e2e] Replaces the check for ActivityTestRule (#2633) This reverts commit 608774119dd5c9d68f5237347c12669fa9110c2b. --- packages/e2e/CHANGELOG.md | 4 +++ .../plugins/e2e/FlutterTestRunner.java | 14 ++++++++--- .../MainActivityWithPermissionTest.java | 25 +++++++++++++++++++ packages/e2e/pubspec.yaml | 2 +- 4 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 packages/e2e/example/android/app/src/androidTest/java/com/example/e2e_example/MainActivityWithPermissionTest.java diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md index 52fcc9284fde..24dc7a846ff2 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 f214cd7ce3fe..78f0c3c5bac2 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 rule = null; + TestRule rule = null; public FlutterTestRunner(Class testClass) { super(); @@ -32,7 +33,10 @@ public FlutterTestRunner(Class testClass) { if (field.isAnnotationPresent(Rule.class)) { try { Object instance = testClass.newInstance(); - rule = (ActivityTestRule) 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 @@ public void run(RunNotifier notifier) { 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 000000000000..90218e8724a9 --- /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 rule = + new ActivityTestRule<>(MainActivity.class, true, false); +} diff --git a/packages/e2e/pubspec.yaml b/packages/e2e/pubspec.yaml index 72a782e25649..1857e2ddfb91 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: From f0ff81bbe59f5b6b30d255a4da28decb3af820fe Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Fri, 28 Aug 2020 12:27:56 +0100 Subject: [PATCH 2/3] Implement FlutterPlugin interface on the no-op plugin --- .../FlutterAndroidLifecyclePlugin.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/flutter_plugin_android_lifecycle/android/src/main/java/io/flutter/plugins/flutter_plugin_android_lifecycle/FlutterAndroidLifecyclePlugin.java b/packages/flutter_plugin_android_lifecycle/android/src/main/java/io/flutter/plugins/flutter_plugin_android_lifecycle/FlutterAndroidLifecyclePlugin.java index 7abf1d67667c..cb346f7c20fe 100644 --- a/packages/flutter_plugin_android_lifecycle/android/src/main/java/io/flutter/plugins/flutter_plugin_android_lifecycle/FlutterAndroidLifecyclePlugin.java +++ b/packages/flutter_plugin_android_lifecycle/android/src/main/java/io/flutter/plugins/flutter_plugin_android_lifecycle/FlutterAndroidLifecyclePlugin.java @@ -4,6 +4,8 @@ // package io.flutter.plugins.flutter_plugin_android_lifecycle; +import androidx.annotation.NonNull; +import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.PluginRegistry.Registrar; /** @@ -12,8 +14,18 @@ * *

DO NOT USE THIS CLASS. */ -public class FlutterAndroidLifecyclePlugin { +public class FlutterAndroidLifecyclePlugin implements FlutterPlugin { public static void registerWith(Registrar registrar) { // no-op } + + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + // no-op + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + // no-op + } } From 442d9e6ac781a365467d77f61e8b4a25424b575d Mon Sep 17 00:00:00 2001 From: Sebastian Roth Date: Fri, 28 Aug 2020 12:28:14 +0100 Subject: [PATCH 3/3] Changelog/pubspec --- packages/flutter_plugin_android_lifecycle/CHANGELOG.md | 4 ++++ packages/flutter_plugin_android_lifecycle/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/flutter_plugin_android_lifecycle/CHANGELOG.md b/packages/flutter_plugin_android_lifecycle/CHANGELOG.md index 60ac1c7de347..cf37870e2a14 100644 --- a/packages/flutter_plugin_android_lifecycle/CHANGELOG.md +++ b/packages/flutter_plugin_android_lifecycle/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.9 + +* Let the no-op plugin implement the `FlutterPlugin` interface. + ## 1.0.8 * Post-v2 Android embedding cleanup. diff --git a/packages/flutter_plugin_android_lifecycle/pubspec.yaml b/packages/flutter_plugin_android_lifecycle/pubspec.yaml index eced211c889d..ec3aa9812ebf 100644 --- a/packages/flutter_plugin_android_lifecycle/pubspec.yaml +++ b/packages/flutter_plugin_android_lifecycle/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_plugin_android_lifecycle description: Flutter plugin for accessing an Android Lifecycle within other plugins. -version: 1.0.8 +version: 1.0.9 homepage: https://github.com/flutter/plugins/tree/master/packages/flutter_plugin_android_lifecycle environment: