From c1b7aa881f5559ebfe1c7a5de71930008701a093 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 4 Oct 2019 13:44:07 -0700 Subject: [PATCH 01/22] git st --- .../plugins/share/MethodChannelHandler.java | 72 +++++++++++++++++++ .../io/flutter/plugins/share/SharePlugin.java | 47 +----------- 2 files changed, 75 insertions(+), 44 deletions(-) create mode 100644 packages/share/android/src/main/java/io/flutter/plugins/share/MethodChannelHandler.java diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodChannelHandler.java b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodChannelHandler.java new file mode 100644 index 000000000000..4686a45afb53 --- /dev/null +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodChannelHandler.java @@ -0,0 +1,72 @@ +// 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.share; + +import android.app.Activity; +import android.content.Intent; + +import androidx.annotation.Nullable; + +import java.util.Map; + +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; + +/** + * Handles the method channel for the plugin. + */ +public class MethodChannelHandler implements MethodChannel.MethodCallHandler { + + private Activity activity; + + /** + * Constructs the MethodChannelHandler + * @param activity can be null. Use {@link #setActivity(Activity)} to set it later if it is not available when constructing. + */ + MethodChannelHandler(@Nullable Activity activity) { + this.activity = activity; + } + + /** + * Sets the activity. + * @param activity When the activity is available, use this method to set it. If activity becomes unavailable, use this method to set it to null. + */ + public void setActivity(@Nullable Activity activity) { + this.activity = activity; + } + + @Override + public void onMethodCall(MethodCall call, MethodChannel.Result result) { + if (call.method.equals("share")) { + if (!(call.arguments instanceof Map)) { + throw new IllegalArgumentException("Map argument expected"); + } + // Android does not support showing the share sheet at a particular point on screen. + share((String) call.argument("text"), (String) call.argument("subject")); + result.success(null); + } else { + result.notImplemented(); + } + } + + private void share(String text, String subject) { + if (text == null || text.isEmpty()) { + throw new IllegalArgumentException("Non-empty text expected"); + } + + Intent shareIntent = new Intent(); + shareIntent.setAction(Intent.ACTION_SEND); + shareIntent.putExtra(Intent.EXTRA_TEXT, text); + shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject); + shareIntent.setType("text/plain"); + Intent chooserIntent = Intent.createChooser(shareIntent, null /* dialog title optional */); + if (activity != null) { + activity.startActivity(chooserIntent); + } else { + chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + activity.startActivity(chooserIntent); + } + } +} diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java index 60b83e415b70..2294fb1a7da0 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java @@ -4,59 +4,18 @@ package io.flutter.plugins.share; -import android.content.Intent; -import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.PluginRegistry.Registrar; -import java.util.Map; /** Plugin method host for presenting a share sheet via Intent */ -public class SharePlugin implements MethodChannel.MethodCallHandler { +public class SharePlugin { private static final String CHANNEL = "plugins.flutter.io/share"; public static void registerWith(Registrar registrar) { MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); - SharePlugin instance = new SharePlugin(registrar); - channel.setMethodCallHandler(instance); - } - - private final Registrar mRegistrar; - - private SharePlugin(Registrar registrar) { - this.mRegistrar = registrar; - } - - @Override - public void onMethodCall(MethodCall call, MethodChannel.Result result) { - if (call.method.equals("share")) { - if (!(call.arguments instanceof Map)) { - throw new IllegalArgumentException("Map argument expected"); - } - // Android does not support showing the share sheet at a particular point on screen. - share((String) call.argument("text"), (String) call.argument("subject")); - result.success(null); - } else { - result.notImplemented(); - } - } - - private void share(String text, String subject) { - if (text == null || text.isEmpty()) { - throw new IllegalArgumentException("Non-empty text expected"); - } - Intent shareIntent = new Intent(); - shareIntent.setAction(Intent.ACTION_SEND); - shareIntent.putExtra(Intent.EXTRA_TEXT, text); - shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject); - shareIntent.setType("text/plain"); - Intent chooserIntent = Intent.createChooser(shareIntent, null /* dialog title optional */); - if (mRegistrar.activity() != null) { - mRegistrar.activity().startActivity(chooserIntent); - } else { - chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mRegistrar.context().startActivity(chooserIntent); - } + MethodChannelHandler handler = new MethodChannelHandler(registrar.activity()); + channel.setMethodCallHandler(handler); } } From 0395b36acb0120a3e311ac4ccf9e95b5b244eb06 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 4 Oct 2019 13:44:33 -0700 Subject: [PATCH 02/22] gradle properties update --- packages/share/example/android/gradle.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/share/example/android/gradle.properties b/packages/share/example/android/gradle.properties index 8bd86f680510..a5965ab8dced 100644 --- a/packages/share/example/android/gradle.properties +++ b/packages/share/example/android/gradle.properties @@ -1 +1,4 @@ org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true \ No newline at end of file From 3b396f3099728a88e047879a92d3f9f1ffb2c661 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 4 Oct 2019 14:03:41 -0700 Subject: [PATCH 03/22] new embedding --- .../flutter/plugins/share/SharePlugin.java | 53 ++++++++++ .../plugins/share/MethodChannelHandler.java | 99 +++++++++---------- .../android/app/src/main/AndroidManifest.xml | 7 ++ .../plugins/shareexample/MainActivity.java | 14 +++ 4 files changed, 123 insertions(+), 50 deletions(-) create mode 100644 packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java create mode 100644 packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java diff --git a/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java new file mode 100644 index 000000000000..e6cfbfe510a5 --- /dev/null +++ b/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java @@ -0,0 +1,53 @@ +package dev.flutter.plugins.share; + +import android.app.Activity; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugins.share.MethodChannelHandler; + +/** + * Plugin implementation that uses the new {@code io.flutter.embedding} package. + * + *

Instantiate this in an add to app scenario to gracefully handle activity and context changes. + */ +public class SharePlugin implements FlutterPlugin, ActivityAware { + + private static final String CHANNEL = "plugins.flutter.io/share"; + MethodChannelHandler handler; + Activity activity; + + @Override + public void onAttachedToEngine(FlutterPluginBinding binding) { + final MethodChannel methodChannel = + new MethodChannel(binding.getFlutterEngine().getDartExecutor(), CHANNEL); + handler = new MethodChannelHandler(activity); + methodChannel.setMethodCallHandler(handler); + } + + @Override + public void onDetachedFromEngine(FlutterPluginBinding binding) {} + + @Override + public void onAttachedToActivity(ActivityPluginBinding binding) { + activity = binding.getActivity(); + handler.setActivity(activity); + } + + @Override + public void onDetachedFromActivity() { + activity = null; + handler.setActivity(null); + } + + @Override + public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) { + onAttachedToActivity(binding); + } + + @Override + public void onDetachedFromActivityForConfigChanges() { + onDetachedFromActivity(); + } +} diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodChannelHandler.java b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodChannelHandler.java index 4686a45afb53..93695170da12 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodChannelHandler.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodChannelHandler.java @@ -6,67 +6,66 @@ import android.app.Activity; import android.content.Intent; - import androidx.annotation.Nullable; - -import java.util.Map; - import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; +import java.util.Map; -/** - * Handles the method channel for the plugin. - */ +/** Handles the method channel for the plugin. */ public class MethodChannelHandler implements MethodChannel.MethodCallHandler { - private Activity activity; + private Activity activity; - /** - * Constructs the MethodChannelHandler - * @param activity can be null. Use {@link #setActivity(Activity)} to set it later if it is not available when constructing. - */ - MethodChannelHandler(@Nullable Activity activity) { - this.activity = activity; - } + /** + * Constructs the MethodChannelHandler + * + * @param activity can be null. Use {@link #setActivity(Activity)} to set it later if it is not + * available when constructing. + */ + public MethodChannelHandler(@Nullable Activity activity) { + this.activity = activity; + } - /** - * Sets the activity. - * @param activity When the activity is available, use this method to set it. If activity becomes unavailable, use this method to set it to null. - */ - public void setActivity(@Nullable Activity activity) { - this.activity = activity; - } + /** + * Sets the activity. + * + * @param activity When the activity is available, use this method to set it. If activity becomes + * unavailable, use this method to set it to null. + */ + public void setActivity(@Nullable Activity activity) { + this.activity = activity; + } - @Override - public void onMethodCall(MethodCall call, MethodChannel.Result result) { - if (call.method.equals("share")) { - if (!(call.arguments instanceof Map)) { - throw new IllegalArgumentException("Map argument expected"); - } - // Android does not support showing the share sheet at a particular point on screen. - share((String) call.argument("text"), (String) call.argument("subject")); - result.success(null); - } else { - result.notImplemented(); - } + @Override + public void onMethodCall(MethodCall call, MethodChannel.Result result) { + if (call.method.equals("share")) { + if (!(call.arguments instanceof Map)) { + throw new IllegalArgumentException("Map argument expected"); + } + // Android does not support showing the share sheet at a particular point on screen. + share((String) call.argument("text"), (String) call.argument("subject")); + result.success(null); + } else { + result.notImplemented(); } + } - private void share(String text, String subject) { - if (text == null || text.isEmpty()) { - throw new IllegalArgumentException("Non-empty text expected"); - } + private void share(String text, String subject) { + if (text == null || text.isEmpty()) { + throw new IllegalArgumentException("Non-empty text expected"); + } - Intent shareIntent = new Intent(); - shareIntent.setAction(Intent.ACTION_SEND); - shareIntent.putExtra(Intent.EXTRA_TEXT, text); - shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject); - shareIntent.setType("text/plain"); - Intent chooserIntent = Intent.createChooser(shareIntent, null /* dialog title optional */); - if (activity != null) { - activity.startActivity(chooserIntent); - } else { - chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - activity.startActivity(chooserIntent); - } + Intent shareIntent = new Intent(); + shareIntent.setAction(Intent.ACTION_SEND); + shareIntent.putExtra(Intent.EXTRA_TEXT, text); + shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject); + shareIntent.setType("text/plain"); + Intent chooserIntent = Intent.createChooser(shareIntent, null /* dialog title optional */); + if (activity != null) { + activity.startActivity(chooserIntent); + } else { + chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + activity.startActivity(chooserIntent); } + } } diff --git a/packages/share/example/android/app/src/main/AndroidManifest.xml b/packages/share/example/android/app/src/main/AndroidManifest.xml index a86d072a6b33..72c0f2e84abd 100644 --- a/packages/share/example/android/app/src/main/AndroidManifest.xml +++ b/packages/share/example/android/app/src/main/AndroidManifest.xml @@ -10,6 +10,13 @@ android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> + + diff --git a/packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java b/packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java new file mode 100644 index 000000000000..c4f3b36c8f9d --- /dev/null +++ b/packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java @@ -0,0 +1,14 @@ +package dev.flutter.plugins.shareexample; + +import dev.flutter.plugins.share.SharePlugin; +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; + +public class MainActivity extends FlutterActivity { + + @Override + public void configureFlutterEngine(FlutterEngine flutterEngine) { + super.configureFlutterEngine(flutterEngine); + flutterEngine.getPlugins().add(new SharePlugin()); + } +} From 3f57f80f3ba835144b787ac4bb07df691454c1b0 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 4 Oct 2019 14:30:06 -0700 Subject: [PATCH 04/22] Update gradle.properties --- packages/share/example/android/gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/share/example/android/gradle.properties b/packages/share/example/android/gradle.properties index a5965ab8dced..38c8d4544ff1 100644 --- a/packages/share/example/android/gradle.properties +++ b/packages/share/example/android/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx1536M android.enableR8=true android.useAndroidX=true -android.enableJetifier=true \ No newline at end of file +android.enableJetifier=true From d372d3d8744311d1bf214cff13884f3d6ac02876 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 4 Oct 2019 15:56:23 -0700 Subject: [PATCH 05/22] refactor --- .../flutter/plugins/share/SharePlugin.java | 15 ++-- .../plugins/share/MethodCallHandler.java | 36 ++++++++++ .../plugins/share/MethodChannelHandler.java | 71 ------------------- .../java/io/flutter/plugins/share/Share.java | 49 +++++++++++++ .../io/flutter/plugins/share/SharePlugin.java | 4 +- 5 files changed, 96 insertions(+), 79 deletions(-) create mode 100644 packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java delete mode 100644 packages/share/android/src/main/java/io/flutter/plugins/share/MethodChannelHandler.java create mode 100644 packages/share/android/src/main/java/io/flutter/plugins/share/Share.java diff --git a/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java index e6cfbfe510a5..ce8eb1883f28 100644 --- a/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java +++ b/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java @@ -5,7 +5,8 @@ import io.flutter.embedding.engine.plugins.activity.ActivityAware; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugins.share.MethodChannelHandler; +import io.flutter.plugins.share.MethodCallHandler; +import io.flutter.plugins.share.Share; /** * Plugin implementation that uses the new {@code io.flutter.embedding} package. @@ -15,14 +16,16 @@ public class SharePlugin implements FlutterPlugin, ActivityAware { private static final String CHANNEL = "plugins.flutter.io/share"; - MethodChannelHandler handler; - Activity activity; + private MethodCallHandler handler; + private Activity activity; + private Share share; @Override public void onAttachedToEngine(FlutterPluginBinding binding) { final MethodChannel methodChannel = new MethodChannel(binding.getFlutterEngine().getDartExecutor(), CHANNEL); - handler = new MethodChannelHandler(activity); + share = new Share(activity); + handler = new MethodCallHandler(share); methodChannel.setMethodCallHandler(handler); } @@ -32,13 +35,13 @@ public void onDetachedFromEngine(FlutterPluginBinding binding) {} @Override public void onAttachedToActivity(ActivityPluginBinding binding) { activity = binding.getActivity(); - handler.setActivity(activity); + share.setActivity(activity); } @Override public void onDetachedFromActivity() { activity = null; - handler.setActivity(null); + share.setActivity(null); } @Override diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java new file mode 100644 index 000000000000..406150bf3452 --- /dev/null +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java @@ -0,0 +1,36 @@ +// 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.share; + + +import androidx.annotation.NonNull; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import java.util.Map; + +/** Handles the method channel for the plugin. */ +public class MethodCallHandler implements MethodChannel.MethodCallHandler { + + private Share share; + + /** Constructs the MethodChannelHandler */ + public MethodCallHandler(@NonNull Share share) { + this.share = share; + } + + @Override + public void onMethodCall(MethodCall call, MethodChannel.Result result) { + if (call.method.equals("share")) { + if (!(call.arguments instanceof Map)) { + throw new IllegalArgumentException("Map argument expected"); + } + // Android does not support showing the share sheet at a particular point on screen. + share.share((String) call.argument("text"), (String) call.argument("subject")); + result.success(null); + } else { + result.notImplemented(); + } + } +} diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodChannelHandler.java b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodChannelHandler.java deleted file mode 100644 index 93695170da12..000000000000 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodChannelHandler.java +++ /dev/null @@ -1,71 +0,0 @@ -// 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.share; - -import android.app.Activity; -import android.content.Intent; -import androidx.annotation.Nullable; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; -import java.util.Map; - -/** Handles the method channel for the plugin. */ -public class MethodChannelHandler implements MethodChannel.MethodCallHandler { - - private Activity activity; - - /** - * Constructs the MethodChannelHandler - * - * @param activity can be null. Use {@link #setActivity(Activity)} to set it later if it is not - * available when constructing. - */ - public MethodChannelHandler(@Nullable Activity activity) { - this.activity = activity; - } - - /** - * Sets the activity. - * - * @param activity When the activity is available, use this method to set it. If activity becomes - * unavailable, use this method to set it to null. - */ - public void setActivity(@Nullable Activity activity) { - this.activity = activity; - } - - @Override - public void onMethodCall(MethodCall call, MethodChannel.Result result) { - if (call.method.equals("share")) { - if (!(call.arguments instanceof Map)) { - throw new IllegalArgumentException("Map argument expected"); - } - // Android does not support showing the share sheet at a particular point on screen. - share((String) call.argument("text"), (String) call.argument("subject")); - result.success(null); - } else { - result.notImplemented(); - } - } - - private void share(String text, String subject) { - if (text == null || text.isEmpty()) { - throw new IllegalArgumentException("Non-empty text expected"); - } - - Intent shareIntent = new Intent(); - shareIntent.setAction(Intent.ACTION_SEND); - shareIntent.putExtra(Intent.EXTRA_TEXT, text); - shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject); - shareIntent.setType("text/plain"); - Intent chooserIntent = Intent.createChooser(shareIntent, null /* dialog title optional */); - if (activity != null) { - activity.startActivity(chooserIntent); - } else { - chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - activity.startActivity(chooserIntent); - } - } -} diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java new file mode 100644 index 000000000000..979e24bfeec2 --- /dev/null +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java @@ -0,0 +1,49 @@ +package io.flutter.plugins.share; + +import android.app.Activity; +import android.content.Intent; +import androidx.annotation.Nullable; + +/** Handles share intent. */ +public class Share { + + private Activity activity; + + /** + * Constructs a Share object. + * + * @param activity the activity used to fire share intent. + */ + public Share(@Nullable Activity activity) { + this.activity = activity; + } + + /** + * Sets the activity. + * + * @param activity if the activity becomes unavailable, call this with a null parameter to set it + * to null. + */ + public void setActivity(@Nullable Activity activity) { + this.activity = activity; + } + + void share(String text, String subject) { + if (text == null || text.isEmpty()) { + throw new IllegalArgumentException("Non-empty text expected"); + } + + Intent shareIntent = new Intent(); + shareIntent.setAction(Intent.ACTION_SEND); + shareIntent.putExtra(Intent.EXTRA_TEXT, text); + shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject); + shareIntent.setType("text/plain"); + Intent chooserIntent = Intent.createChooser(shareIntent, null /* dialog title optional */); + if (activity != null) { + activity.startActivity(chooserIntent); + } else { + chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + activity.startActivity(chooserIntent); + } + } +} diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java index 2294fb1a7da0..bede1795c170 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java @@ -14,8 +14,8 @@ public class SharePlugin { public static void registerWith(Registrar registrar) { MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); - - MethodChannelHandler handler = new MethodChannelHandler(registrar.activity()); + Share share = new Share(registrar.activity()); + MethodCallHandler handler = new MethodCallHandler(share); channel.setMethodCallHandler(handler); } } From f8066d251a575d9f63be769f3dff70232a48d692 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 7 Oct 2019 09:50:20 -0700 Subject: [PATCH 06/22] update javadocs --- .../java/dev/flutter/plugins/share/SharePlugin.java | 6 ++++-- .../io/flutter/plugins/share/MethodCallHandler.java | 3 +-- .../main/java/io/flutter/plugins/share/Share.java | 12 +++++------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java index ce8eb1883f28..76c8576d8192 100644 --- a/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java +++ b/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java @@ -9,9 +9,11 @@ import io.flutter.plugins.share.Share; /** - * Plugin implementation that uses the new {@code io.flutter.embedding} package. + * Entry point of the plugin. * - *

Instantiate this in an add to app scenario to gracefully handle activity and context changes. + *

set up the {@link io.flutter.plugin.common.MethodChannel.MethodCallHandler} during {@link + * #onAttachedToEngine(FlutterPluginBinding)}. It also implements {@link ActivityAware}, provides + * the activity instance to {@link Share} when it's available. */ public class SharePlugin implements FlutterPlugin, ActivityAware { diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java index 406150bf3452..6036db2e047a 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java @@ -4,13 +4,12 @@ package io.flutter.plugins.share; - import androidx.annotation.NonNull; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import java.util.Map; -/** Handles the method channel for the plugin. */ +/** Handles the method calls for the plugin. */ public class MethodCallHandler implements MethodChannel.MethodCallHandler { private Share share; diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java index 979e24bfeec2..c5146598175b 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java @@ -10,19 +10,17 @@ public class Share { private Activity activity; /** - * Constructs a Share object. - * - * @param activity the activity used to fire share intent. + * Constructs a Share object. The {@code activity} is used to start the share intent. It might be + * null when constructing the {@link Share} object and set to non-null when an activity is + * available using {@link #setActivity(Activity)}. */ public Share(@Nullable Activity activity) { this.activity = activity; } /** - * Sets the activity. - * - * @param activity if the activity becomes unavailable, call this with a null parameter to set it - * to null. + * Sets the activity when an activity is available. When the activity becomes unavailable, use + * this method to set it to null. */ public void setActivity(@Nullable Activity activity) { this.activity = activity; From 02963906606fb02c82dbbb5776e5fd1b0ae92d89 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 7 Oct 2019 11:51:36 -0700 Subject: [PATCH 07/22] add license header --- .../android/src/main/java/io/flutter/plugins/share/Share.java | 4 ++++ .../java/dev/flutter/plugins/shareexample/MainActivity.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java index c5146598175b..9b61dd9b676d 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java @@ -1,3 +1,7 @@ +// 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.share; import android.app.Activity; diff --git a/packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java b/packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java index c4f3b36c8f9d..1a709a52450c 100644 --- a/packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java +++ b/packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java @@ -1,3 +1,7 @@ +// 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.shareexample; import dev.flutter.plugins.share.SharePlugin; From f268c3289e9dd3b98458dc0acca45f569dbff3f2 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 7 Oct 2019 13:38:21 -0700 Subject: [PATCH 08/22] merge 2 packages --- .../flutter/plugins/share/SharePlugin.java | 58 ------------------- .../io/flutter/plugins/share/SharePlugin.java | 43 +++++++++++++- .../plugins/shareexample/MainActivity.java | 2 +- 3 files changed, 43 insertions(+), 60 deletions(-) delete mode 100644 packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java diff --git a/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java deleted file mode 100644 index 76c8576d8192..000000000000 --- a/packages/share/android/src/main/java/dev/flutter/plugins/share/SharePlugin.java +++ /dev/null @@ -1,58 +0,0 @@ -package dev.flutter.plugins.share; - -import android.app.Activity; -import io.flutter.embedding.engine.plugins.FlutterPlugin; -import io.flutter.embedding.engine.plugins.activity.ActivityAware; -import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; -import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugins.share.MethodCallHandler; -import io.flutter.plugins.share.Share; - -/** - * Entry point of the plugin. - * - *

set up the {@link io.flutter.plugin.common.MethodChannel.MethodCallHandler} during {@link - * #onAttachedToEngine(FlutterPluginBinding)}. It also implements {@link ActivityAware}, provides - * the activity instance to {@link Share} when it's available. - */ -public class SharePlugin implements FlutterPlugin, ActivityAware { - - private static final String CHANNEL = "plugins.flutter.io/share"; - private MethodCallHandler handler; - private Activity activity; - private Share share; - - @Override - public void onAttachedToEngine(FlutterPluginBinding binding) { - final MethodChannel methodChannel = - new MethodChannel(binding.getFlutterEngine().getDartExecutor(), CHANNEL); - share = new Share(activity); - handler = new MethodCallHandler(share); - methodChannel.setMethodCallHandler(handler); - } - - @Override - public void onDetachedFromEngine(FlutterPluginBinding binding) {} - - @Override - public void onAttachedToActivity(ActivityPluginBinding binding) { - activity = binding.getActivity(); - share.setActivity(activity); - } - - @Override - public void onDetachedFromActivity() { - activity = null; - share.setActivity(null); - } - - @Override - public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) { - onAttachedToActivity(binding); - } - - @Override - public void onDetachedFromActivityForConfigChanges() { - onDetachedFromActivity(); - } -} diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java index bede1795c170..a6bae9ceaacb 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java @@ -4,13 +4,20 @@ package io.flutter.plugins.share; +import android.app.Activity; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.PluginRegistry.Registrar; /** Plugin method host for presenting a share sheet via Intent */ -public class SharePlugin { +public class SharePlugin implements FlutterPlugin, ActivityAware { private static final String CHANNEL = "plugins.flutter.io/share"; + private MethodCallHandler handler; + private Activity activity; + private Share share; public static void registerWith(Registrar registrar) { MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); @@ -18,4 +25,38 @@ public static void registerWith(Registrar registrar) { MethodCallHandler handler = new MethodCallHandler(share); channel.setMethodCallHandler(handler); } + + @Override + public void onAttachedToEngine(FlutterPluginBinding binding) { + final MethodChannel methodChannel = + new MethodChannel(binding.getFlutterEngine().getDartExecutor(), CHANNEL); + share = new Share(activity); + handler = new MethodCallHandler(share); + methodChannel.setMethodCallHandler(handler); + } + + @Override + public void onDetachedFromEngine(FlutterPluginBinding binding) {} + + @Override + public void onAttachedToActivity(ActivityPluginBinding binding) { + activity = binding.getActivity(); + share.setActivity(activity); + } + + @Override + public void onDetachedFromActivity() { + activity = null; + share.setActivity(null); + } + + @Override + public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) { + onAttachedToActivity(binding); + } + + @Override + public void onDetachedFromActivityForConfigChanges() { + onDetachedFromActivity(); + } } diff --git a/packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java b/packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java index 1a709a52450c..d81c6cb0056b 100644 --- a/packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java +++ b/packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java @@ -4,9 +4,9 @@ package dev.flutter.plugins.shareexample; -import dev.flutter.plugins.share.SharePlugin; import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.plugins.share.SharePlugin; public class MainActivity extends FlutterActivity { From 6488ff60c810a0a8f41a4835bd48cf83216bf3e3 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 7 Oct 2019 16:54:16 -0700 Subject: [PATCH 09/22] refactor --- .../io/flutter/plugins/share/SharePlugin.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java index a6bae9ceaacb..ca70e15d52c9 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java @@ -8,6 +8,7 @@ import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.embedding.engine.plugins.activity.ActivityAware; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.PluginRegistry.Registrar; @@ -18,21 +19,16 @@ public class SharePlugin implements FlutterPlugin, ActivityAware { private MethodCallHandler handler; private Activity activity; private Share share; + private MethodChannel methodChannel; public static void registerWith(Registrar registrar) { - MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); - Share share = new Share(registrar.activity()); - MethodCallHandler handler = new MethodCallHandler(share); - channel.setMethodCallHandler(handler); + SharePlugin plugin = new SharePlugin(); + plugin.setUpChannel(registrar.messenger()); } @Override public void onAttachedToEngine(FlutterPluginBinding binding) { - final MethodChannel methodChannel = - new MethodChannel(binding.getFlutterEngine().getDartExecutor(), CHANNEL); - share = new Share(activity); - handler = new MethodCallHandler(share); - methodChannel.setMethodCallHandler(handler); + setUpChannel(binding.getFlutterEngine().getDartExecutor()); } @Override @@ -59,4 +55,11 @@ public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding public void onDetachedFromActivityForConfigChanges() { onDetachedFromActivity(); } + + private void setUpChannel(BinaryMessenger messenger) { + methodChannel = new MethodChannel(messenger, CHANNEL); + share = new Share(activity); + handler = new MethodCallHandler(share); + methodChannel.setMethodCallHandler(handler); + } } From 4530b8d480c9c585859478591fc5b0eec948132e Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 7 Oct 2019 16:54:39 -0700 Subject: [PATCH 10/22] refactor --- .../src/main/java/io/flutter/plugins/share/SharePlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java index ca70e15d52c9..fecc7ff4ebc3 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java @@ -44,6 +44,7 @@ public void onAttachedToActivity(ActivityPluginBinding binding) { public void onDetachedFromActivity() { activity = null; share.setActivity(null); + methodChannel.setMethodCallHandler(null); } @Override From ae774b639722edccb1a1af2a241cfc987f6ec372 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 8 Oct 2019 12:59:52 -0700 Subject: [PATCH 11/22] rename activities --- .../android/app/src/main/AndroidManifest.xml | 4 ++-- .../plugins/shareexample/MainActivity.java | 18 ------------------ .../shareexample/EmbeddingV1Activity.java | 18 ++++++++++++++++++ .../plugins/shareexample/MainActivity.java | 14 +++++++------- 4 files changed, 27 insertions(+), 27 deletions(-) delete mode 100644 packages/share/example/android/app/src/main/java/dev/flutter/plugins/shareexample/MainActivity.java create mode 100644 packages/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/EmbeddingV1Activity.java diff --git a/packages/share/example/android/app/src/main/AndroidManifest.xml b/packages/share/example/android/app/src/main/AndroidManifest.xml index 72c0f2e84abd..bb37f879848f 100644 --- a/packages/share/example/android/app/src/main/AndroidManifest.xml +++ b/packages/share/example/android/app/src/main/AndroidManifest.xml @@ -4,14 +4,14 @@ - - Date: Tue, 8 Oct 2019 15:33:13 -0700 Subject: [PATCH 12/22] non public --- .../java/io/flutter/plugins/share/MethodCallHandler.java | 4 ++-- .../src/main/java/io/flutter/plugins/share/Share.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java index 6036db2e047a..ee2f5c43fbcd 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java @@ -10,12 +10,12 @@ import java.util.Map; /** Handles the method calls for the plugin. */ -public class MethodCallHandler implements MethodChannel.MethodCallHandler { +class MethodCallHandler implements MethodChannel.MethodCallHandler { private Share share; /** Constructs the MethodChannelHandler */ - public MethodCallHandler(@NonNull Share share) { + MethodCallHandler(@NonNull Share share) { this.share = share; } diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java index 9b61dd9b676d..2e007e166369 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java @@ -9,7 +9,7 @@ import androidx.annotation.Nullable; /** Handles share intent. */ -public class Share { +class Share { private Activity activity; @@ -18,7 +18,7 @@ public class Share { * null when constructing the {@link Share} object and set to non-null when an activity is * available using {@link #setActivity(Activity)}. */ - public Share(@Nullable Activity activity) { + Share(@Nullable Activity activity) { this.activity = activity; } @@ -26,7 +26,7 @@ public Share(@Nullable Activity activity) { * Sets the activity when an activity is available. When the activity becomes unavailable, use * this method to set it to null. */ - public void setActivity(@Nullable Activity activity) { + void setActivity(@Nullable Activity activity) { this.activity = activity; } From 7e0d74fccdb0891bfe93b92ee4616d8e7232ed41 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 11 Oct 2019 13:53:41 -0700 Subject: [PATCH 13/22] fix gradle --- packages/share/android/build.gradle | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/share/android/build.gradle b/packages/share/android/build.gradle index 3b265e6c5ca7..17e314970f9d 100644 --- a/packages/share/android/build.gradle +++ b/packages/share/android/build.gradle @@ -45,3 +45,27 @@ android { disable 'InvalidPackage' } } + +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" + } + } + } +} From 3033ef619634b86ba7d8729b82a9a73740fda978 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 14 Oct 2019 09:06:57 -0700 Subject: [PATCH 14/22] review fixes --- .../main/java/io/flutter/plugins/share/Share.java | 9 --------- .../java/io/flutter/plugins/share/SharePlugin.java | 14 +++++++------- .../android/app/src/main/AndroidManifest.xml | 1 - 3 files changed, 7 insertions(+), 17 deletions(-) diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java index 2e007e166369..e6338c51192b 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java @@ -13,15 +13,6 @@ class Share { private Activity activity; - /** - * Constructs a Share object. The {@code activity} is used to start the share intent. It might be - * null when constructing the {@link Share} object and set to non-null when an activity is - * available using {@link #setActivity(Activity)}. - */ - Share(@Nullable Activity activity) { - this.activity = activity; - } - /** * Sets the activity when an activity is available. When the activity becomes unavailable, use * this method to set it to null. diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java index fecc7ff4ebc3..bdd01806f42d 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java @@ -4,7 +4,6 @@ package io.flutter.plugins.share; -import android.app.Activity; import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.embedding.engine.plugins.activity.ActivityAware; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; @@ -17,7 +16,6 @@ public class SharePlugin implements FlutterPlugin, ActivityAware { private static final String CHANNEL = "plugins.flutter.io/share"; private MethodCallHandler handler; - private Activity activity; private Share share; private MethodChannel methodChannel; @@ -32,17 +30,19 @@ public void onAttachedToEngine(FlutterPluginBinding binding) { } @Override - public void onDetachedFromEngine(FlutterPluginBinding binding) {} + public void onDetachedFromEngine(FlutterPluginBinding binding) { + methodChannel.setMethodCallHandler(null); + methodChannel = null; + share = null; + } @Override public void onAttachedToActivity(ActivityPluginBinding binding) { - activity = binding.getActivity(); - share.setActivity(activity); + share.setActivity(binding.getActivity()); } @Override public void onDetachedFromActivity() { - activity = null; share.setActivity(null); methodChannel.setMethodCallHandler(null); } @@ -59,7 +59,7 @@ public void onDetachedFromActivityForConfigChanges() { private void setUpChannel(BinaryMessenger messenger) { methodChannel = new MethodChannel(messenger, CHANNEL); - share = new Share(activity); + share = new Share(); handler = new MethodCallHandler(share); methodChannel.setMethodCallHandler(handler); } diff --git a/packages/share/example/android/app/src/main/AndroidManifest.xml b/packages/share/example/android/app/src/main/AndroidManifest.xml index bb37f879848f..d5e5ec8bf39d 100644 --- a/packages/share/example/android/app/src/main/AndroidManifest.xml +++ b/packages/share/example/android/app/src/main/AndroidManifest.xml @@ -12,7 +12,6 @@ android:windowSoftInputMode="adjustResize"> Date: Mon, 14 Oct 2019 09:14:28 -0700 Subject: [PATCH 15/22] review fixes --- .../main/java/io/flutter/plugins/share/SharePlugin.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java index bdd01806f42d..a866a56c9177 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java @@ -43,8 +43,7 @@ public void onAttachedToActivity(ActivityPluginBinding binding) { @Override public void onDetachedFromActivity() { - share.setActivity(null); - methodChannel.setMethodCallHandler(null); + tearDownChannel(); } @Override @@ -63,4 +62,9 @@ private void setUpChannel(BinaryMessenger messenger) { handler = new MethodCallHandler(share); methodChannel.setMethodCallHandler(handler); } + + private void tearDownChannel() { + share.setActivity(null); + methodChannel.setMethodCallHandler(null); + } } From 83dfcb58ef0a696048a1382c4cc0ee11a353e30e Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 14 Oct 2019 11:25:04 -0700 Subject: [PATCH 16/22] revert the change that moved the activity out of the constructor --- .../src/main/java/io/flutter/plugins/share/Share.java | 9 +++++++++ .../main/java/io/flutter/plugins/share/SharePlugin.java | 9 +++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java index e6338c51192b..2e007e166369 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java @@ -13,6 +13,15 @@ class Share { private Activity activity; + /** + * Constructs a Share object. The {@code activity} is used to start the share intent. It might be + * null when constructing the {@link Share} object and set to non-null when an activity is + * available using {@link #setActivity(Activity)}. + */ + Share(@Nullable Activity activity) { + this.activity = activity; + } + /** * Sets the activity when an activity is available. When the activity becomes unavailable, use * this method to set it to null. diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java index a866a56c9177..443f28ede38e 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/SharePlugin.java @@ -4,6 +4,7 @@ package io.flutter.plugins.share; +import android.app.Activity; import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.embedding.engine.plugins.activity.ActivityAware; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; @@ -21,12 +22,12 @@ public class SharePlugin implements FlutterPlugin, ActivityAware { public static void registerWith(Registrar registrar) { SharePlugin plugin = new SharePlugin(); - plugin.setUpChannel(registrar.messenger()); + plugin.setUpChannel(registrar.activity(), registrar.messenger()); } @Override public void onAttachedToEngine(FlutterPluginBinding binding) { - setUpChannel(binding.getFlutterEngine().getDartExecutor()); + setUpChannel(null, binding.getFlutterEngine().getDartExecutor()); } @Override @@ -56,9 +57,9 @@ public void onDetachedFromActivityForConfigChanges() { onDetachedFromActivity(); } - private void setUpChannel(BinaryMessenger messenger) { + private void setUpChannel(Activity activity, BinaryMessenger messenger) { methodChannel = new MethodChannel(messenger, CHANNEL); - share = new Share(); + share = new Share(activity); handler = new MethodCallHandler(share); methodChannel.setMethodCallHandler(handler); } From 9ae8145bf05d40eccf6d01afc240ce948202cd23 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 15 Oct 2019 13:40:25 -0700 Subject: [PATCH 17/22] add driver tests --- packages/share/CHANGELOG.md | 7 +++++++ packages/share/example/pubspec.yaml | 9 +++++++++ .../example/test_driver/test/share_e2e_test.dart | 15 +++++++++++++++ packages/share/pubspec.yaml | 5 +++-- packages/share/test/share_e2e.dart | 16 ++++++++++++++++ 5 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 packages/share/example/test_driver/test/share_e2e_test.dart create mode 100644 packages/share/test/share_e2e.dart diff --git a/packages/share/CHANGELOG.md b/packages/share/CHANGELOG.md index f3159bbfbdc1..4c5dd6cb05fa 100644 --- a/packages/share/CHANGELOG.md +++ b/packages/share/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.6.3 + +* Support the v2 Android embedder. +* Update to AndroidX. +* Migrate to using the new e2e test binding. +* Add a e2e test. + ## 0.6.2+3 * Fix iOS crash when setting subject to null. diff --git a/packages/share/example/pubspec.yaml b/packages/share/example/pubspec.yaml index f28c6dc95d62..a9c3c88d0612 100644 --- a/packages/share/example/pubspec.yaml +++ b/packages/share/example/pubspec.yaml @@ -7,5 +7,14 @@ dependencies: share: path: ../ +dev_dependencies: + flutter_driver: + sdk: flutter + e2e: ^0.2.0 + flutter: uses-material-design: true + +environment: + sdk: ">=2.0.0-dev.28.0 <3.0.0" + flutter: ">=1.9.1+hotfix.2 <2.0.0" \ No newline at end of file diff --git a/packages/share/example/test_driver/test/share_e2e_test.dart b/packages/share/example/test_driver/test/share_e2e_test.dart new file mode 100644 index 000000000000..642dc8bd6ab2 --- /dev/null +++ b/packages/share/example/test_driver/test/share_e2e_test.dart @@ -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. + +import 'dart:async'; +import 'dart:io'; +import 'package:flutter_driver/flutter_driver.dart'; + +Future main() async { + final FlutterDriver driver = await FlutterDriver.connect(); + final String result = + await driver.requestData(null, timeout: const Duration(minutes: 1)); + driver.close(); + exit(result == 'pass' ? 0 : 1); +} \ No newline at end of file diff --git a/packages/share/pubspec.yaml b/packages/share/pubspec.yaml index 78d094ee487b..d569cbff70be 100644 --- a/packages/share/pubspec.yaml +++ b/packages/share/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for sharing content via the platform share UI, using the ACTION_SEND intent on Android and UIActivityViewController on iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/share -version: 0.6.2+3 +version: 0.6.3 flutter: plugin: @@ -21,7 +21,8 @@ dev_dependencies: mockito: ^3.0.0 flutter_test: sdk: flutter + e2e: ^0.2.0 environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.6.0 <2.0.0" + flutter: ">=1.6.7 <2.0.0" diff --git a/packages/share/test/share_e2e.dart b/packages/share/test/share_e2e.dart new file mode 100644 index 000000000000..717855d16e92 --- /dev/null +++ b/packages/share/test/share_e2e.dart @@ -0,0 +1,16 @@ +// 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. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:share/share.dart'; +import 'package:e2e/e2e.dart'; + +void main() { + E2EWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('Can launch share', + (WidgetTester tester) async { + expect(Share.share('message', subject: 'title'), completes); + }); +} \ No newline at end of file From 3ba4341556ca46edb9312b94d55aafa534770ba4 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 15 Oct 2019 13:47:32 -0700 Subject: [PATCH 18/22] e2e tests --- packages/share/android/build.gradle | 1 + .../flutter/plugins/share/MethodCallHandler.java | 1 - .../shareexample/EmbeddingV1ActivityTest.java | 13 +++++++++++++ .../plugins/shareexample/MainActivityTest.java | 15 +++++++++++++++ .../example/test_driver/test/share_e2e_test.dart | 2 +- packages/share/test/share_e2e.dart | 5 ++--- 6 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 packages/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/EmbeddingV1ActivityTest.java create mode 100644 packages/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/MainActivityTest.java diff --git a/packages/share/android/build.gradle b/packages/share/android/build.gradle index 17e314970f9d..7e8f49008201 100644 --- a/packages/share/android/build.gradle +++ b/packages/share/android/build.gradle @@ -46,6 +46,7 @@ android { } } +// TODO(cyanglaz): 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) { diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java index ee2f5c43fbcd..09b5fec8f6aa 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java @@ -14,7 +14,6 @@ class MethodCallHandler implements MethodChannel.MethodCallHandler { private Share share; - /** Constructs the MethodChannelHandler */ MethodCallHandler(@NonNull Share share) { this.share = share; } diff --git a/packages/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/EmbeddingV1ActivityTest.java b/packages/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/EmbeddingV1ActivityTest.java new file mode 100644 index 000000000000..958541165806 --- /dev/null +++ b/packages/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/EmbeddingV1ActivityTest.java @@ -0,0 +1,13 @@ +package io.flutter.plugins.shareexample; + +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/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/MainActivityTest.java b/packages/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/MainActivityTest.java new file mode 100644 index 000000000000..fcd936a7dd0f --- /dev/null +++ b/packages/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/MainActivityTest.java @@ -0,0 +1,15 @@ +// Copyright 2019 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.shareexample; + +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/share/example/test_driver/test/share_e2e_test.dart b/packages/share/example/test_driver/test/share_e2e_test.dart index 642dc8bd6ab2..ff6e9ce74ad9 100644 --- a/packages/share/example/test_driver/test/share_e2e_test.dart +++ b/packages/share/example/test_driver/test/share_e2e_test.dart @@ -12,4 +12,4 @@ Future main() async { await driver.requestData(null, timeout: const Duration(minutes: 1)); driver.close(); exit(result == 'pass' ? 0 : 1); -} \ No newline at end of file +} diff --git a/packages/share/test/share_e2e.dart b/packages/share/test/share_e2e.dart index 717855d16e92..eb990222b009 100644 --- a/packages/share/test/share_e2e.dart +++ b/packages/share/test/share_e2e.dart @@ -9,8 +9,7 @@ import 'package:e2e/e2e.dart'; void main() { E2EWidgetsFlutterBinding.ensureInitialized(); - testWidgets('Can launch share', - (WidgetTester tester) async { + testWidgets('Can launch share', (WidgetTester tester) async { expect(Share.share('message', subject: 'title'), completes); }); -} \ No newline at end of file +} From 7acd1d91596ad5d0a609f3a578d31e0c7ca5f5ac Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 15 Oct 2019 14:25:36 -0700 Subject: [PATCH 19/22] Update pubspec.yaml --- packages/share/example/pubspec.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/share/example/pubspec.yaml b/packages/share/example/pubspec.yaml index a9c3c88d0612..4e4fc49dca7a 100644 --- a/packages/share/example/pubspec.yaml +++ b/packages/share/example/pubspec.yaml @@ -17,4 +17,5 @@ flutter: environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.9.1+hotfix.2 <2.0.0" \ No newline at end of file + flutter: ">=1.9.1+hotfix.2 <2.0.0" + From 172280328c6b7c5914788f41aadf631d9ba7e2b5 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 15 Oct 2019 16:09:44 -0700 Subject: [PATCH 20/22] Update MainActivity.java --- .../java/io/flutter/plugins/shareexample/MainActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/MainActivity.java b/packages/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/MainActivity.java index 6e49600da5e4..3717feb8ca7e 100644 --- a/packages/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/MainActivity.java +++ b/packages/share/example/android/app/src/main/java/io/flutter/plugins/shareexample/MainActivity.java @@ -9,7 +9,8 @@ import io.flutter.plugins.share.SharePlugin; public class MainActivity extends FlutterActivity { - + // TODO(cyanglaz): Remove this once v2 of GeneratedPluginRegistrant rolls to stable. + // https://github.com/flutter/flutter/issues/42694 @Override public void configureFlutterEngine(FlutterEngine flutterEngine) { super.configureFlutterEngine(flutterEngine); From 2ffc18092fd8178b08ceab4f5a591a85cff042ce Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 21 Oct 2019 12:52:05 -0700 Subject: [PATCH 21/22] remove androidx constraint --- packages/share/android/build.gradle | 7 ++++--- .../java/io/flutter/plugins/share/MethodCallHandler.java | 3 +-- .../src/main/java/io/flutter/plugins/share/Share.java | 5 ++--- packages/share/pubspec.yaml | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/share/android/build.gradle b/packages/share/android/build.gradle index 7e8f49008201..1461873885ef 100644 --- a/packages/share/android/build.gradle +++ b/packages/share/android/build.gradle @@ -63,9 +63,10 @@ afterEvaluate { 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" + def lifecycle_version = "1.1.1" + api "android.arch.lifecycle:runtime:$lifecycle_version" + api "android.arch.lifecycle:common:$lifecycle_version" + api "android.arch.lifecycle:common-java8:$lifecycle_version" } } } diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java index 09b5fec8f6aa..f7e4d579e7a2 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java @@ -4,7 +4,6 @@ package io.flutter.plugins.share; -import androidx.annotation.NonNull; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import java.util.Map; @@ -14,7 +13,7 @@ class MethodCallHandler implements MethodChannel.MethodCallHandler { private Share share; - MethodCallHandler(@NonNull Share share) { + MethodCallHandler(Share share) { this.share = share; } diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java index 2e007e166369..8c9e833ee9d3 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/Share.java @@ -6,7 +6,6 @@ import android.app.Activity; import android.content.Intent; -import androidx.annotation.Nullable; /** Handles share intent. */ class Share { @@ -18,7 +17,7 @@ class Share { * null when constructing the {@link Share} object and set to non-null when an activity is * available using {@link #setActivity(Activity)}. */ - Share(@Nullable Activity activity) { + Share(Activity activity) { this.activity = activity; } @@ -26,7 +25,7 @@ class Share { * Sets the activity when an activity is available. When the activity becomes unavailable, use * this method to set it to null. */ - void setActivity(@Nullable Activity activity) { + void setActivity(Activity activity) { this.activity = activity; } diff --git a/packages/share/pubspec.yaml b/packages/share/pubspec.yaml index d569cbff70be..549a4e5402c8 100644 --- a/packages/share/pubspec.yaml +++ b/packages/share/pubspec.yaml @@ -25,4 +25,4 @@ dev_dependencies: environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.6.7 <2.0.0" + flutter: ">=1.9.1+hotfix.2 <2.0.0" From ba7e66b97fdc4dc58d19cf685bb7304c315e41d4 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 21 Oct 2019 13:21:36 -0700 Subject: [PATCH 22/22] Update pubspec.yaml --- packages/share/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/share/pubspec.yaml b/packages/share/pubspec.yaml index 549a4e5402c8..d569cbff70be 100644 --- a/packages/share/pubspec.yaml +++ b/packages/share/pubspec.yaml @@ -25,4 +25,4 @@ dev_dependencies: environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.9.1+hotfix.2 <2.0.0" + flutter: ">=1.6.7 <2.0.0"