[path_provider] Add v2 embedding support for (#2284)

diff --git a/packages/path_provider/CHANGELOG.md b/packages/path_provider/CHANGELOG.md
index 27dde42..505977e 100644
--- a/packages/path_provider/CHANGELOG.md
+++ b/packages/path_provider/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.4.5
+
+* Add support for v2 plugins APIs.
+
 ## 1.4.4
 
 * Update driver tests in the example app to e2e tests.
diff --git a/packages/path_provider/android/build.gradle b/packages/path_provider/android/build.gradle
index 71ea49b..3bc008e 100644
--- a/packages/path_provider/android/build.gradle
+++ b/packages/path_provider/android/build.gradle
@@ -62,4 +62,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
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 30b00d0..0bf9ee4 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,9 +4,11 @@
 
 package io.flutter.plugins.pathprovider;
 
+import android.content.Context;
 import android.os.Build.VERSION;
 import android.os.Build.VERSION_CODES;
 import androidx.annotation.NonNull;
+import io.flutter.embedding.engine.plugins.FlutterPlugin;
 import io.flutter.plugin.common.MethodCall;
 import io.flutter.plugin.common.MethodChannel;
 import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
@@ -17,19 +19,33 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class PathProviderPlugin implements MethodCallHandler {
+public class PathProviderPlugin implements FlutterPlugin, MethodCallHandler {
 
-  private final Registrar mRegistrar;
+  private Context context;
+  private MethodChannel channel;
+
+  public PathProviderPlugin() {}
 
   public static void registerWith(Registrar registrar) {
-    MethodChannel channel =
-        new MethodChannel(registrar.messenger(), "plugins.flutter.io/path_provider");
-    PathProviderPlugin instance = new PathProviderPlugin(registrar);
-    channel.setMethodCallHandler(instance);
+    PathProviderPlugin instance = new PathProviderPlugin();
+    instance.channel = new MethodChannel(registrar.messenger(), "plugins.flutter.io/path_provider");
+    instance.context = registrar.context();
+    instance.channel.setMethodCallHandler(instance);
   }
 
-  private PathProviderPlugin(Registrar registrar) {
-    this.mRegistrar = registrar;
+  @Override
+  public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
+    channel =
+        new MethodChannel(
+            binding.getFlutterEngine().getDartExecutor(), "plugins.flutter.io/path_provider");
+    context = binding.getApplicationContext();
+    channel.setMethodCallHandler(this);
+  }
+
+  @Override
+  public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
+    channel.setMethodCallHandler(null);
+    channel = null;
   }
 
   @Override
@@ -61,19 +77,19 @@
   }
 
   private String getPathProviderTemporaryDirectory() {
-    return mRegistrar.context().getCacheDir().getPath();
+    return context.getCacheDir().getPath();
   }
 
   private String getApplicationSupportDirectory() {
-    return PathUtils.getFilesDir(mRegistrar.context());
+    return PathUtils.getFilesDir(context);
   }
 
   private String getPathProviderApplicationDocumentsDirectory() {
-    return PathUtils.getDataDirectory(mRegistrar.context());
+    return PathUtils.getDataDirectory(context);
   }
 
   private String getPathProviderStorageDirectory() {
-    final File dir = mRegistrar.context().getExternalFilesDir(null);
+    final File dir = context.getExternalFilesDir(null);
     if (dir == null) {
       return null;
     }
@@ -84,13 +100,13 @@
     final List<String> paths = new ArrayList<>();
 
     if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
-      for (File dir : mRegistrar.context().getExternalCacheDirs()) {
+      for (File dir : context.getExternalCacheDirs()) {
         if (dir != null) {
           paths.add(dir.getAbsolutePath());
         }
       }
     } else {
-      File dir = mRegistrar.context().getExternalCacheDir();
+      File dir = context.getExternalCacheDir();
       if (dir != null) {
         paths.add(dir.getAbsolutePath());
       }
@@ -103,13 +119,13 @@
     final List<String> paths = new ArrayList<>();
 
     if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
-      for (File dir : mRegistrar.context().getExternalFilesDirs(type)) {
+      for (File dir : context.getExternalFilesDirs(type)) {
         if (dir != null) {
           paths.add(dir.getAbsolutePath());
         }
       }
     } else {
-      File dir = mRegistrar.context().getExternalFilesDir(type);
+      File dir = context.getExternalFilesDir(type);
       if (dir != null) {
         paths.add(dir.getAbsolutePath());
       }
diff --git a/packages/path_provider/example/android/app/build.gradle b/packages/path_provider/example/android/app/build.gradle
index 2ca6a7a..0404c72 100644
--- a/packages/path_provider/example/android/app/build.gradle
+++ b/packages/path_provider/example/android/app/build.gradle
@@ -54,6 +54,10 @@
 }
 
 dependencies {
+    androidTestImplementation 'androidx.test:runner:1.2.0'
+    androidTestImplementation 'androidx.test:rules:1.2.0'
+    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'androidx.test:runner:1.1.1'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
diff --git a/packages/path_provider/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java b/packages/path_provider/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java
new file mode 100644
index 0000000..cce04b7
--- /dev/null
+++ b/packages/path_provider/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java
@@ -0,0 +1,15 @@
+
+package io.flutter.plugins.pathprovider;
+
+import androidx.test.rule.ActivityTestRule;
+import dev.flutter.plugins.e2e.FlutterRunner;
+import io.flutter.plugins.pathproviderexample.EmbeddingV1Activity;
+import org.junit.Rule;
+import org.junit.runner.RunWith;
+
+@RunWith(FlutterRunner.class)
+public class EmbeddingV1ActivityTest {
+  @Rule
+  public ActivityTestRule<EmbeddingV1Activity> rule =
+      new ActivityTestRule<>(EmbeddingV1Activity.class);
+}
diff --git a/packages/path_provider/example/android/app/src/androidTest/java/MainActivityTest.java b/packages/path_provider/example/android/app/src/androidTest/java/MainActivityTest.java
new file mode 100644
index 0000000..7bdd449
--- /dev/null
+++ b/packages/path_provider/example/android/app/src/androidTest/java/MainActivityTest.java
@@ -0,0 +1,13 @@
+
+package io.flutter.plugins.pathprovider;
+
+import androidx.test.rule.ActivityTestRule;
+import dev.flutter.plugins.e2e.FlutterRunner;
+import io.flutter.plugins.pathproviderexample.MainActivity;
+import org.junit.Rule;
+import org.junit.runner.RunWith;
+
+@RunWith(FlutterRunner.class)
+public class MainActivityTest {
+  @Rule public ActivityTestRule<MainActivity> 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 793c13b..9e03a93 100644
--- a/packages/path_provider/example/android/app/src/main/AndroidManifest.xml
+++ b/packages/path_provider/example/android/app/src/main/AndroidManifest.xml
@@ -4,6 +4,12 @@
     <uses-permission android:name="android.permission.INTERNET"/>
 
     <application android:name="io.flutter.app.FlutterApplication" android:label="path_provider_example" android:icon="@mipmap/ic_launcher">
+        <activity
+            android:name=".EmbeddingV1Activity"
+            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale"
+            android:hardwareAccelerated="true"
+            android:windowSoftInputMode="adjustResize">
+        </activity>
         <activity android:name=".MainActivity"
                   android:launchMode="singleTop"
                   android:theme="@android:style/Theme.Black.NoTitleBar"
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 0000000..a826af3
--- /dev/null
+++ b/packages/path_provider/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java
@@ -0,0 +1,14 @@
+
+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 9bd248e..3637296 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.e2e.E2EPlugin;
+import io.flutter.embedding.android.FlutterActivity;
+import io.flutter.embedding.engine.FlutterEngine;
+import io.flutter.plugins.pathprovider.PathProviderPlugin;
 
 public class MainActivity extends FlutterActivity {
-
+  // TODO(xster): Remove this once v2 of GeneratedPluginRegistrant rolls to stable. https://github.com/flutter/flutter/issues/42694
   @Override
-  protected void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    GeneratedPluginRegistrant.registerWith(this);
+  public void configureFlutterEngine(FlutterEngine flutterEngine) {
+    flutterEngine.getPlugins().add(new PathProviderPlugin());
+    flutterEngine.getPlugins().add(new E2EPlugin());
   }
 }
diff --git a/packages/path_provider/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/path_provider/example/android/gradle/wrapper/gradle-wrapper.properties
index 019065d..caf54fa 100644
--- a/packages/path_provider/example/android/gradle/wrapper/gradle-wrapper.properties
+++ b/packages/path_provider/example/android/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
diff --git a/packages/path_provider/example/pubspec.yaml b/packages/path_provider/example/pubspec.yaml
index 279a913..bf034a3 100644
--- a/packages/path_provider/example/pubspec.yaml
+++ b/packages/path_provider/example/pubspec.yaml
@@ -8,10 +8,10 @@
     path: ../
 
 dev_dependencies:
+  e2e: ^0.2.1
   flutter_driver:
     sdk: flutter
   test: any
-  e2e: ^0.2.1
 
 flutter:
   uses-material-design: true
diff --git a/packages/path_provider/pubspec.yaml b/packages/path_provider/pubspec.yaml
index 15aa1a0..4bbd4fc 100644
--- a/packages/path_provider/pubspec.yaml
+++ b/packages/path_provider/pubspec.yaml
@@ -3,7 +3,7 @@
   iOS file systems, such as the temp and app data directories.
 author: Flutter Team <flutter-dev@googlegroups.com>
 homepage: https://github.com/flutter/plugins/tree/master/packages/path_provider
-version: 1.4.4
+version: 1.4.5
 
 flutter:
   plugin:
@@ -18,6 +18,7 @@
   meta: ^1.0.5
 
 dev_dependencies:
+  e2e: ^0.2.1
   flutter_test:
     sdk: flutter
   flutter_driver:
@@ -27,4 +28,4 @@
 
 environment:
   sdk: ">=2.0.0-dev.28.0 <3.0.0"
-  flutter: ">=0.1.4 <2.0.0"
+  flutter: ">=1.9.1+hotfix.5 <2.0.0"
diff --git a/packages/path_provider/test/path_provider_e2e.dart b/packages/path_provider/test/path_provider_e2e.dart
new file mode 100644
index 0000000..545671e
--- /dev/null
+++ b/packages/path_provider/test/path_provider_e2e.dart
@@ -0,0 +1,12 @@
+import 'package:flutter_test/flutter_test.dart';
+import 'package:path_provider/path_provider.dart';
+import 'package:e2e/e2e.dart';
+
+void main() {
+  E2EWidgetsFlutterBinding.ensureInitialized();
+
+  testWidgets('Can get temporary directory', (WidgetTester tester) async {
+    final String tempPath = (await getTemporaryDirectory()).path;
+    expect(tempPath, isNotEmpty);
+  });
+}