diff --git a/packages/path_provider/CHANGELOG.md b/packages/path_provider/CHANGELOG.md index 3bab2b1b53bf..a220d66fb87d 100644 --- a/packages/path_provider/CHANGELOG.md +++ b/packages/path_provider/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.3.2 + +* Support the v2 Android embedder. +* Migrate to using the new e2e test binding. + ## 1.3.1 * Define clang module for iOS. diff --git a/packages/path_provider/android/build.gradle b/packages/path_provider/android/build.gradle index 191930fee299..b5f8221c0543 100644 --- a/packages/path_provider/android/build.gradle +++ b/packages/path_provider/android/build.gradle @@ -45,3 +45,28 @@ android { disable 'InvalidPackage' } } + +// TODO(amirh): Remove this hack once androidx.lifecycle is included on stable. https://github.com/flutter/flutter/issues/42348 +afterEvaluate { + def containsEmbeddingDependencies = false + for (def configuration : configurations.all) { + for (def dependency : configuration.dependencies) { + if (dependency.group == 'io.flutter' && + dependency.name.startsWith('flutter_embedding') && + dependency.isTransitive()) + { + containsEmbeddingDependencies = true + break + } + } + } + if (!containsEmbeddingDependencies) { + android { + dependencies { + def lifecycle_version = "2.1.0" + api "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" + api "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" + } + } + } +} diff --git a/packages/path_provider/android/gradle.properties b/packages/path_provider/android/gradle.properties index 8bd86f680510..08f2b5f91bff 100644 --- a/packages/path_provider/android/gradle.properties +++ b/packages/path_provider/android/gradle.properties @@ -1 +1,3 @@ org.gradle.jvmargs=-Xmx1536M +android.enableJetifier=true +android.useAndroidX=true diff --git a/packages/path_provider/android/src/main/java/dev/flutter/plugins/pathprovider/PathProviderPlugin.java b/packages/path_provider/android/src/main/java/dev/flutter/plugins/pathprovider/PathProviderPlugin.java new file mode 100644 index 000000000000..28ddc85c97d4 --- /dev/null +++ b/packages/path_provider/android/src/main/java/dev/flutter/plugins/pathprovider/PathProviderPlugin.java @@ -0,0 +1,25 @@ +// Copyright 2019 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package dev.flutter.plugins.pathprovider; + +import androidx.annotation.NonNull; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugins.pathprovider.PathProviderMethodCallHandler; + +public class PathProviderPlugin implements FlutterPlugin { + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + MethodChannel channel = + new MethodChannel( + binding.getFlutterEngine().getDartExecutor(), "plugins.flutter.io/path_provider"); + PathProviderMethodCallHandler handler = + new PathProviderMethodCallHandler(binding.getApplicationContext()); + channel.setMethodCallHandler(handler); + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {} +} diff --git a/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderMethodCallHandler.java b/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderMethodCallHandler.java new file mode 100644 index 000000000000..d7897035e4c4 --- /dev/null +++ b/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderMethodCallHandler.java @@ -0,0 +1,62 @@ +// Copyright 2019 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.pathprovider; + +import android.content.Context; +import androidx.annotation.NonNull; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.util.PathUtils; +import java.io.File; + +public class PathProviderMethodCallHandler implements MethodCallHandler { + + private final Context context; + + public PathProviderMethodCallHandler(Context context) { + this.context = context; + } + + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { + switch (call.method) { + case "getTemporaryDirectory": + result.success(getPathProviderTemporaryDirectory()); + break; + case "getApplicationDocumentsDirectory": + result.success(getPathProviderApplicationDocumentsDirectory()); + break; + case "getStorageDirectory": + result.success(getPathProviderStorageDirectory()); + break; + case "getApplicationSupportDirectory": + result.success(getApplicationSupportDirectory()); + break; + default: + result.notImplemented(); + } + } + + private String getPathProviderTemporaryDirectory() { + return context.getCacheDir().getPath(); + } + + private String getApplicationSupportDirectory() { + return PathUtils.getFilesDir(context); + } + + private String getPathProviderApplicationDocumentsDirectory() { + return PathUtils.getDataDirectory(context); + } + + private String getPathProviderStorageDirectory() { + final File dir = context.getExternalFilesDir(null); + if (dir == null) { + return null; + } + return dir.getAbsolutePath(); + } +} diff --git a/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java b/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java index 271236be060a..8f501cdedc2e 100644 --- a/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java +++ b/packages/path_provider/android/src/main/java/io/flutter/plugins/pathprovider/PathProviderPlugin.java @@ -4,65 +4,15 @@ package io.flutter.plugins.pathprovider; -import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.MethodChannel.MethodCallHandler; -import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.common.PluginRegistry.Registrar; -import io.flutter.util.PathUtils; -import java.io.File; -public class PathProviderPlugin implements MethodCallHandler { - private final Registrar mRegistrar; +public class PathProviderPlugin { public static void registerWith(Registrar registrar) { MethodChannel channel = new MethodChannel(registrar.messenger(), "plugins.flutter.io/path_provider"); - PathProviderPlugin instance = new PathProviderPlugin(registrar); + PathProviderMethodCallHandler instance = new PathProviderMethodCallHandler(registrar.context()); channel.setMethodCallHandler(instance); } - - private PathProviderPlugin(Registrar registrar) { - this.mRegistrar = registrar; - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - case "getTemporaryDirectory": - result.success(getPathProviderTemporaryDirectory()); - break; - case "getApplicationDocumentsDirectory": - result.success(getPathProviderApplicationDocumentsDirectory()); - break; - case "getStorageDirectory": - result.success(getPathProviderStorageDirectory()); - break; - case "getApplicationSupportDirectory": - result.success(getApplicationSupportDirectory()); - break; - default: - result.notImplemented(); - } - } - - private String getPathProviderTemporaryDirectory() { - return mRegistrar.context().getCacheDir().getPath(); - } - - private String getApplicationSupportDirectory() { - return PathUtils.getFilesDir(mRegistrar.context()); - } - - private String getPathProviderApplicationDocumentsDirectory() { - return PathUtils.getDataDirectory(mRegistrar.context()); - } - - private String getPathProviderStorageDirectory() { - final File dir = mRegistrar.context().getExternalFilesDir(null); - if (dir == null) { - return null; - } - return dir.getAbsolutePath(); - } } diff --git a/packages/path_provider/example/android/app/build.gradle b/packages/path_provider/example/android/app/build.gradle index 2ca6a7a4add3..c8efe0aeae96 100644 --- a/packages/path_provider/example/android/app/build.gradle +++ b/packages/path_provider/example/android/app/build.gradle @@ -55,6 +55,6 @@ flutter { dependencies { testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } diff --git a/packages/path_provider/example/android/app/src/androidTest/java/io/flutter/plugins/pathproviderexample/EmbeddingV1ActivityTest.java b/packages/path_provider/example/android/app/src/androidTest/java/io/flutter/plugins/pathproviderexample/EmbeddingV1ActivityTest.java new file mode 100644 index 000000000000..1ce0d1050e1a --- /dev/null +++ b/packages/path_provider/example/android/app/src/androidTest/java/io/flutter/plugins/pathproviderexample/EmbeddingV1ActivityTest.java @@ -0,0 +1,19 @@ +// Copyright 2019, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package io.flutter.plugins.pathproviderexample; + +import static org.junit.Assert.*; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.e2e.FlutterRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class EmbeddingV1ActivityTest { + @Rule + public ActivityTestRule rule = + new ActivityTestRule<>(EmbeddingV1Activity.class); +} diff --git a/packages/path_provider/example/android/app/src/androidTest/java/io/flutter/plugins/pathproviderexample/MainActivityTest.java b/packages/path_provider/example/android/app/src/androidTest/java/io/flutter/plugins/pathproviderexample/MainActivityTest.java new file mode 100644 index 000000000000..bb37ccacd29e --- /dev/null +++ b/packages/path_provider/example/android/app/src/androidTest/java/io/flutter/plugins/pathproviderexample/MainActivityTest.java @@ -0,0 +1,15 @@ +// Copyright 2019, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package io.flutter.plugins.pathproviderexample; + +import androidx.test.rule.ActivityTestRule; +import dev.flutter.plugins.e2e.FlutterRunner; +import org.junit.Rule; +import org.junit.runner.RunWith; + +@RunWith(FlutterRunner.class) +public class MainActivityTest { + @Rule public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); +} diff --git a/packages/path_provider/example/android/app/src/main/AndroidManifest.xml b/packages/path_provider/example/android/app/src/main/AndroidManifest.xml index 793c13b6e612..321e0f0c4b76 100644 --- a/packages/path_provider/example/android/app/src/main/AndroidManifest.xml +++ b/packages/path_provider/example/android/app/src/main/AndroidManifest.xml @@ -1,18 +1,33 @@ - + - - + + + - - + + diff --git a/packages/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java b/packages/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java new file mode 100644 index 000000000000..b9eb224d0d03 --- /dev/null +++ b/packages/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java @@ -0,0 +1,18 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.pathproviderexample; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class EmbeddingV1Activity extends FlutterActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} diff --git a/packages/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java b/packages/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java index 9bd248e435b4..0f757eb339f2 100644 --- a/packages/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java +++ b/packages/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java @@ -4,15 +4,16 @@ package io.flutter.plugins.pathproviderexample; -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import dev.flutter.plugins.pathprovider.PathProviderPlugin; +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); + public void configureFlutterEngine(FlutterEngine flutterEngine) { + super.configureFlutterEngine(flutterEngine); + // TODO(jackson): Remove this once v2 of GeneratedPluginRegistrant rolls to stable. + // https://github.com/flutter/flutter/issues/42694 + flutterEngine.getPlugins().add(new PathProviderPlugin()); } } diff --git a/packages/path_provider/example/android/gradle.properties b/packages/path_provider/example/android/gradle.properties index 8bd86f680510..db69c65482ce 100644 --- a/packages/path_provider/example/android/gradle.properties +++ b/packages/path_provider/example/android/gradle.properties @@ -1 +1,4 @@ org.gradle.jvmargs=-Xmx1536M +android.enableJetifier=false +android.useAndroidX=true +android.enableR8=true diff --git a/packages/path_provider/example/pubspec.yaml b/packages/path_provider/example/pubspec.yaml index 9daa92b8c22e..ac976b4f3997 100644 --- a/packages/path_provider/example/pubspec.yaml +++ b/packages/path_provider/example/pubspec.yaml @@ -7,6 +7,7 @@ dependencies: path_provider: path: ../ uuid: "^1.0.0" + e2e: "^0.2.1" dev_dependencies: flutter_driver: diff --git a/packages/path_provider/example/test_driver/path_provider.dart b/packages/path_provider/example/test_driver/path_provider_e2e.dart similarity index 91% rename from packages/path_provider/example/test_driver/path_provider.dart rename to packages/path_provider/example/test_driver/path_provider_e2e.dart index 8438965f9646..2066b8724c3b 100644 --- a/packages/path_provider/example/test_driver/path_provider.dart +++ b/packages/path_provider/example/test_driver/path_provider_e2e.dart @@ -5,15 +5,13 @@ import 'dart:async'; import 'dart:io'; -import 'package:flutter_driver/driver_extension.dart'; +import 'package:e2e/e2e.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:path_provider/path_provider.dart'; import 'package:uuid/uuid.dart'; void main() { - final Completer allTestsCompleter = Completer(); - enableFlutterDriverExtension(handler: (_) => allTestsCompleter.future); - tearDownAll(() => allTestsCompleter.complete(null)); + E2EWidgetsFlutterBinding.ensureInitialized(); test('getTemporaryDirectory', () async { final Directory result = await getTemporaryDirectory(); diff --git a/packages/path_provider/example/test_driver/path_provider_test.dart b/packages/path_provider/example/test_driver/path_provider_e2e_test.dart similarity index 72% rename from packages/path_provider/example/test_driver/path_provider_test.dart rename to packages/path_provider/example/test_driver/path_provider_e2e_test.dart index b0d3305cd652..2e5c27fd402e 100644 --- a/packages/path_provider/example/test_driver/path_provider_test.dart +++ b/packages/path_provider/example/test_driver/path_provider_e2e_test.dart @@ -3,11 +3,14 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:async'; +import 'dart:io'; import 'package:flutter_driver/flutter_driver.dart'; Future main() async { final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); + final String result = + await driver.requestData(null, timeout: const Duration(minutes: 1)); driver.close(); + exit(result == 'pass' ? 0 : 1); }