From e4ddb31794e1be653ad0d949b0a20c0305819edc Mon Sep 17 00:00:00 2001 From: Justin McCandless Date: Mon, 10 Aug 2020 14:14:08 -0700 Subject: [PATCH 1/8] Implement hasStrings in terms of getClipboardData on Android --- .../engine/systemchannels/PlatformChannel.java | 13 +++++++++++++ .../io/flutter/plugin/platform/PlatformPlugin.java | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java b/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java index ddb39fd0e5093..97f98d0b1b528 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java @@ -155,6 +155,14 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result.success(null); break; } + case "Clipboard.hasStrings": + { + boolean hasStrings = platformMessageHandler.clipboardHasStrings(); + JSONObject response = new JSONObject(); + response.put("value", hasStrings); + result.success(response); + break; + } default: result.notImplemented(); break; @@ -426,6 +434,11 @@ public interface PlatformMessageHandler { * {@code text}. */ void setClipboardData(@NonNull String text); + + /** The Flutter application would like to know if the clipboard currently contains a string + * that can be pasted. + */ + boolean clipboardHasStrings(); } /** Types of sounds the Android OS can play on behalf of an application. */ diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java index 38f2b275fd275..90d84ab5afb59 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java @@ -85,6 +85,12 @@ public CharSequence getClipboardData( public void setClipboardData(@NonNull String text) { PlatformPlugin.this.setClipboardData(text); } + + @Override + public boolean clipboardHasStrings() { + CharSequence data = PlatformPlugin.this.getClipboardData(PlatformChannel.ClipboardContentFormat.PLAIN_TEXT); + return data != null && data.length() > 0; + } }; public PlatformPlugin(Activity activity, PlatformChannel platformChannel) { From f723cfcd28fea5f09911ae03cb72249b979891e5 Mon Sep 17 00:00:00 2001 From: Justin McCandless Date: Mon, 10 Aug 2020 16:20:27 -0700 Subject: [PATCH 2/8] WIP trying and failing to test this --- .../plugin/platform/PlatformPluginTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index 848b19161a3f9..cdddd84e9a274 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -1,15 +1,18 @@ package io.flutter.plugin.platform; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.app.Activity; +import android.content.ClipboardManager; import android.view.View; import android.view.Window; import io.flutter.embedding.engine.systemchannels.PlatformChannel; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @Config(manifest = Config.NONE) @@ -32,4 +35,24 @@ public void itIgnoresNewHapticEventsOnOldAndroidPlatforms() { // SELECTION_CLICK haptic response is only available on "LOLLIPOP" (21) and later. platformPlugin.vibrateHapticFeedback(PlatformChannel.HapticFeedbackType.SELECTION_CLICK); } + + @Test + public void platformPlugin_hasStrings() { + View fakeDecorView = mock(View.class); + Window fakeWindow = mock(Window.class); + when(fakeWindow.getDecorView()).thenReturn(fakeDecorView); + Activity fakeActivity = mock(Activity.class); + when(fakeActivity.getWindow()).thenReturn(fakeWindow); + PlatformChannel fakePlatformChannel = mock(PlatformChannel.class); + PlatformPlugin platformPlugin = new PlatformPlugin(fakeActivity, fakePlatformChannel); + + ClipboardManager clipboardManager = + RuntimeEnvironment.application.getSystemService(ClipboardManager.class); + clipboardManager.setText("iamastring"); + + // TODO(justinmc): Can't do this because mPlatformMessageHandler is private. + // How can I send a message to the platform plugin? + //boolean hasStrings = platformPlugin.mPlatformMessageHandler.clipboardHasStrings(); + //assertTrue(hasStrings); + } } From 5d5c9b2eb32aef954ce1d10f373c45f171e6ea8d Mon Sep 17 00:00:00 2001 From: Justin McCandless Date: Wed, 12 Aug 2020 14:18:02 -0700 Subject: [PATCH 3/8] Test hasStrings message --- .../systemchannels/PlatformChannel.java | 2 +- .../plugin/platform/PlatformPluginTest.java | 48 ++++++++++++------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java b/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java index 97f98d0b1b528..4100e362cb7a9 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java @@ -30,7 +30,7 @@ public class PlatformChannel { @Nullable private PlatformMessageHandler platformMessageHandler; @NonNull @VisibleForTesting - protected final MethodChannel.MethodCallHandler parsingMethodCallHandler = + public final MethodChannel.MethodCallHandler parsingMethodCallHandler = new MethodChannel.MethodCallHandler() { @Override public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index cdddd84e9a274..bc2b79fc14ad1 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -2,15 +2,29 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Activity; +import android.content.res.AssetManager; import android.content.ClipboardManager; import android.view.View; import android.view.Window; +import io.flutter.embedding.engine.FlutterJNI; +import io.flutter.embedding.engine.dart.DartExecutor; import io.flutter.embedding.engine.systemchannels.PlatformChannel; +import io.flutter.embedding.engine.systemchannels.TextInputChannel; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import java.util.HashMap; +import java.util.Map; +import org.json.JSONException; +import org.json.JSONObject; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Matchers; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -37,22 +51,24 @@ public void itIgnoresNewHapticEventsOnOldAndroidPlatforms() { } @Test - public void platformPlugin_hasStrings() { - View fakeDecorView = mock(View.class); - Window fakeWindow = mock(Window.class); - when(fakeWindow.getDecorView()).thenReturn(fakeDecorView); - Activity fakeActivity = mock(Activity.class); - when(fakeActivity.getWindow()).thenReturn(fakeWindow); - PlatformChannel fakePlatformChannel = mock(PlatformChannel.class); - PlatformPlugin platformPlugin = new PlatformPlugin(fakeActivity, fakePlatformChannel); - - ClipboardManager clipboardManager = - RuntimeEnvironment.application.getSystemService(ClipboardManager.class); - clipboardManager.setText("iamastring"); + public void platformPlugin_hasStringsMessage() { + MethodChannel rawChannel = mock(MethodChannel.class); + FlutterJNI mockFlutterJNI = mock(FlutterJNI.class); + DartExecutor dartExecutor = new DartExecutor(mockFlutterJNI, mock(AssetManager.class)); + PlatformChannel fakePlatformChannel = new PlatformChannel(dartExecutor); + PlatformChannel.PlatformMessageHandler mockMessageHandler = mock(PlatformChannel.PlatformMessageHandler.class); + fakePlatformChannel.setPlatformMessageHandler(mockMessageHandler); + Boolean returnValue = true; + when(mockMessageHandler.clipboardHasStrings()).thenReturn(returnValue); + MethodCall methodCall = new MethodCall("Clipboard.hasStrings", null); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + fakePlatformChannel.parsingMethodCallHandler.onMethodCall(methodCall, mockResult); - // TODO(justinmc): Can't do this because mPlatformMessageHandler is private. - // How can I send a message to the platform plugin? - //boolean hasStrings = platformPlugin.mPlatformMessageHandler.clipboardHasStrings(); - //assertTrue(hasStrings); + JSONObject expected = new JSONObject(); + try { + expected.put("value", returnValue); + } catch (JSONException e) { + } + verify(mockResult).success(Matchers.refEq(expected)); } } From fdf79d6f51eedfd5411881b04b8400ce56077b65 Mon Sep 17 00:00:00 2001 From: Justin McCandless Date: Thu, 13 Aug 2020 09:51:37 -0700 Subject: [PATCH 4/8] Test real hasStrings call but not working due to inability to mock ClipboardManager --- .../plugin/platform/PlatformPlugin.java | 3 +- .../plugin/platform/PlatformPluginTest.java | 28 +++++++++++++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java index 90d84ab5afb59..4e63a467939eb 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java @@ -30,7 +30,8 @@ public class PlatformPlugin { private PlatformChannel.SystemChromeStyle currentTheme; private int mEnabledOverlays; - private final PlatformChannel.PlatformMessageHandler mPlatformMessageHandler = + @VisibleForTesting + final PlatformChannel.PlatformMessageHandler mPlatformMessageHandler = new PlatformChannel.PlatformMessageHandler() { @Override public void playSystemSound(@NonNull PlatformChannel.SoundType soundType) { diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index bc2b79fc14ad1..f1d663621a4e4 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -1,8 +1,8 @@ package io.flutter.plugin.platform; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -14,22 +14,19 @@ import io.flutter.embedding.engine.FlutterJNI; import io.flutter.embedding.engine.dart.DartExecutor; import io.flutter.embedding.engine.systemchannels.PlatformChannel; -import io.flutter.embedding.engine.systemchannels.TextInputChannel; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; -import java.util.HashMap; -import java.util.Map; import org.json.JSONException; import org.json.JSONObject; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; import org.mockito.Matchers; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowClipboardManager; -@Config(manifest = Config.NONE) +@Config(manifest = Config.NONE, shadows = ShadowClipboardManager.class) @RunWith(RobolectricTestRunner.class) public class PlatformPluginTest { @Config(sdk = 16) @@ -71,4 +68,23 @@ public void platformPlugin_hasStringsMessage() { } verify(mockResult).success(Matchers.refEq(expected)); } + + @Test + public void platformPlugin_hasStrings() { + View fakeDecorView = mock(View.class); + Window fakeWindow = mock(Window.class); + when(fakeWindow.getDecorView()).thenReturn(fakeDecorView); + Activity fakeActivity = mock(Activity.class); + when(fakeActivity.getWindow()).thenReturn(fakeWindow); + PlatformChannel fakePlatformChannel = mock(PlatformChannel.class); + PlatformPlugin platformPlugin = new PlatformPlugin(fakeActivity, fakePlatformChannel); + + ClipboardManager clipboardManager = + RuntimeEnvironment.application.getSystemService(ClipboardManager.class); + clipboardManager.setText("iamastring"); + assertTrue(platformPlugin.mPlatformMessageHandler.clipboardHasStrings()); + + clipboardManager.setText(""); + assertFalse(platformPlugin.mPlatformMessageHandler.clipboardHasStrings()); + } } From d2f40f4e6015c43bfa701c29ac7369295a70a053 Mon Sep 17 00:00:00 2001 From: Justin McCandless Date: Thu, 13 Aug 2020 10:56:41 -0700 Subject: [PATCH 5/8] Fix hasStrings test and ClipboardManager mocking --- .../io/flutter/plugin/platform/PlatformPluginTest.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index f1d663621a4e4..7ca9e8c83b1bd 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -9,6 +9,7 @@ import android.app.Activity; import android.content.res.AssetManager; import android.content.ClipboardManager; +import android.content.Context; import android.view.View; import android.view.Window; import io.flutter.embedding.engine.FlutterJNI; @@ -71,16 +72,18 @@ public void platformPlugin_hasStringsMessage() { @Test public void platformPlugin_hasStrings() { + ClipboardManager clipboardManager = + RuntimeEnvironment.application.getSystemService(ClipboardManager.class); + View fakeDecorView = mock(View.class); Window fakeWindow = mock(Window.class); when(fakeWindow.getDecorView()).thenReturn(fakeDecorView); Activity fakeActivity = mock(Activity.class); when(fakeActivity.getWindow()).thenReturn(fakeWindow); + when(fakeActivity.getSystemService(Context.CLIPBOARD_SERVICE)).thenReturn(clipboardManager); PlatformChannel fakePlatformChannel = mock(PlatformChannel.class); PlatformPlugin platformPlugin = new PlatformPlugin(fakeActivity, fakePlatformChannel); - ClipboardManager clipboardManager = - RuntimeEnvironment.application.getSystemService(ClipboardManager.class); clipboardManager.setText("iamastring"); assertTrue(platformPlugin.mPlatformMessageHandler.clipboardHasStrings()); From 585c7e2766889fe577acd89be7138e2ac55445a4 Mon Sep 17 00:00:00 2001 From: Justin McCandless Date: Thu, 13 Aug 2020 11:02:22 -0700 Subject: [PATCH 6/8] Formatting --- .../embedding/engine/systemchannels/PlatformChannel.java | 5 +++-- .../android/io/flutter/plugin/platform/PlatformPlugin.java | 4 +++- .../io/flutter/plugin/platform/PlatformPluginTest.java | 7 ++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java b/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java index 4100e362cb7a9..577fd19b4c752 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java @@ -435,8 +435,9 @@ public interface PlatformMessageHandler { */ void setClipboardData(@NonNull String text); - /** The Flutter application would like to know if the clipboard currently contains a string - * that can be pasted. + /** + * The Flutter application would like to know if the clipboard currently contains a string that + * can be pasted. */ boolean clipboardHasStrings(); } diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java index 4e63a467939eb..cc87aa2eaf254 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformPlugin.java @@ -89,7 +89,9 @@ public void setClipboardData(@NonNull String text) { @Override public boolean clipboardHasStrings() { - CharSequence data = PlatformPlugin.this.getClipboardData(PlatformChannel.ClipboardContentFormat.PLAIN_TEXT); + CharSequence data = + PlatformPlugin.this.getClipboardData( + PlatformChannel.ClipboardContentFormat.PLAIN_TEXT); return data != null && data.length() > 0; } }; diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index 7ca9e8c83b1bd..0a879c1ee94ef 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -1,15 +1,15 @@ package io.flutter.plugin.platform; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Activity; -import android.content.res.AssetManager; import android.content.ClipboardManager; import android.content.Context; +import android.content.res.AssetManager; import android.view.View; import android.view.Window; import io.flutter.embedding.engine.FlutterJNI; @@ -54,7 +54,8 @@ public void platformPlugin_hasStringsMessage() { FlutterJNI mockFlutterJNI = mock(FlutterJNI.class); DartExecutor dartExecutor = new DartExecutor(mockFlutterJNI, mock(AssetManager.class)); PlatformChannel fakePlatformChannel = new PlatformChannel(dartExecutor); - PlatformChannel.PlatformMessageHandler mockMessageHandler = mock(PlatformChannel.PlatformMessageHandler.class); + PlatformChannel.PlatformMessageHandler mockMessageHandler = + mock(PlatformChannel.PlatformMessageHandler.class); fakePlatformChannel.setPlatformMessageHandler(mockMessageHandler); Boolean returnValue = true; when(mockMessageHandler.clipboardHasStrings()).thenReturn(returnValue); From 3e1eb3d5decafaf396942317d6a3ebbf87987337 Mon Sep 17 00:00:00 2001 From: Justin McCandless Date: Thu, 13 Aug 2020 14:05:50 -0700 Subject: [PATCH 7/8] Omit 'public' and split tests so they're in the correct packages --- shell/platform/android/BUILD.gn | 1 + .../systemchannels/PlatformChannel.java | 2 +- .../test/io/flutter/FlutterTestSuite.java | 2 + .../systemchannels/PlatformChannelTest.java | 46 +++++++++++++++++++ .../plugin/platform/PlatformPluginTest.java | 35 +------------- 5 files changed, 51 insertions(+), 35 deletions(-) create mode 100644 shell/platform/android/test/io/flutter/embedding/engine/systemchannels/PlatformChannelTest.java diff --git a/shell/platform/android/BUILD.gn b/shell/platform/android/BUILD.gn index 308c70af691e4..3f0abeca7f4c8 100644 --- a/shell/platform/android/BUILD.gn +++ b/shell/platform/android/BUILD.gn @@ -432,6 +432,7 @@ action("robolectric_tests") { "test/io/flutter/embedding/engine/dart/DartExecutorTest.java", "test/io/flutter/embedding/engine/plugins/shim/ShimPluginRegistryTest.java", "test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java", + "test/io/flutter/embedding/engine/systemchannels/PlatformChannelTest.java", "test/io/flutter/embedding/engine/systemchannels/RestorationChannelTest.java", "test/io/flutter/external/FlutterLaunchTests.java", "test/io/flutter/plugin/common/StandardMessageCodecTest.java", diff --git a/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java b/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java index 577fd19b4c752..06833cbe2c225 100644 --- a/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java +++ b/shell/platform/android/io/flutter/embedding/engine/systemchannels/PlatformChannel.java @@ -30,7 +30,7 @@ public class PlatformChannel { @Nullable private PlatformMessageHandler platformMessageHandler; @NonNull @VisibleForTesting - public final MethodChannel.MethodCallHandler parsingMethodCallHandler = + final MethodChannel.MethodCallHandler parsingMethodCallHandler = new MethodChannel.MethodCallHandler() { @Override public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { diff --git a/shell/platform/android/test/io/flutter/FlutterTestSuite.java b/shell/platform/android/test/io/flutter/FlutterTestSuite.java index 075e33c24b53e..3436a14eb601e 100644 --- a/shell/platform/android/test/io/flutter/FlutterTestSuite.java +++ b/shell/platform/android/test/io/flutter/FlutterTestSuite.java @@ -17,6 +17,7 @@ import io.flutter.embedding.engine.RenderingComponentTest; import io.flutter.embedding.engine.plugins.shim.ShimPluginRegistryTest; import io.flutter.embedding.engine.renderer.FlutterRendererTest; +import io.flutter.embedding.engine.systemchannels.PlatformChannelTest; import io.flutter.embedding.engine.systemchannels.RestorationChannelTest; import io.flutter.external.FlutterLaunchTests; import io.flutter.plugin.common.StandardMessageCodecTest; @@ -68,6 +69,7 @@ TextInputPluginTest.class, MouseCursorPluginTest.class, AccessibilityBridgeTest.class, + PlatformChannelTest.class, RestorationChannelTest.class, }) /** Runs all of the unit tests listed in the {@code @SuiteClasses} annotation. */ diff --git a/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/PlatformChannelTest.java b/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/PlatformChannelTest.java new file mode 100644 index 0000000000000..5f16a3570da61 --- /dev/null +++ b/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/PlatformChannelTest.java @@ -0,0 +1,46 @@ +package io.flutter.embedding.engine.systemchannels; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.res.AssetManager; +import io.flutter.embedding.engine.FlutterJNI; +import io.flutter.embedding.engine.dart.DartExecutor; +import io.flutter.embedding.engine.systemchannels.PlatformChannel; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Matchers; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +@Config(manifest = Config.NONE) +@RunWith(RobolectricTestRunner.class) +public class PlatformChannelTest { + @Test + public void platformChannel_hasStringsMessage() { + MethodChannel rawChannel = mock(MethodChannel.class); + FlutterJNI mockFlutterJNI = mock(FlutterJNI.class); + DartExecutor dartExecutor = new DartExecutor(mockFlutterJNI, mock(AssetManager.class)); + PlatformChannel fakePlatformChannel = new PlatformChannel(dartExecutor); + PlatformChannel.PlatformMessageHandler mockMessageHandler = + mock(PlatformChannel.PlatformMessageHandler.class); + fakePlatformChannel.setPlatformMessageHandler(mockMessageHandler); + Boolean returnValue = true; + when(mockMessageHandler.clipboardHasStrings()).thenReturn(returnValue); + MethodCall methodCall = new MethodCall("Clipboard.hasStrings", null); + MethodChannel.Result mockResult = mock(MethodChannel.Result.class); + fakePlatformChannel.parsingMethodCallHandler.onMethodCall(methodCall, mockResult); + + JSONObject expected = new JSONObject(); + try { + expected.put("value", returnValue); + } catch (JSONException e) { + } + verify(mockResult).success(Matchers.refEq(expected)); + } +} diff --git a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java index 0a879c1ee94ef..355ec4e9ea5ee 100644 --- a/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java +++ b/shell/platform/android/test/io/flutter/plugin/platform/PlatformPluginTest.java @@ -3,31 +3,21 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Activity; import android.content.ClipboardManager; import android.content.Context; -import android.content.res.AssetManager; import android.view.View; import android.view.Window; -import io.flutter.embedding.engine.FlutterJNI; -import io.flutter.embedding.engine.dart.DartExecutor; import io.flutter.embedding.engine.systemchannels.PlatformChannel; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; -import org.json.JSONException; -import org.json.JSONObject; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Matchers; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowClipboardManager; -@Config(manifest = Config.NONE, shadows = ShadowClipboardManager.class) +@Config(manifest = Config.NONE) @RunWith(RobolectricTestRunner.class) public class PlatformPluginTest { @Config(sdk = 16) @@ -48,29 +38,6 @@ public void itIgnoresNewHapticEventsOnOldAndroidPlatforms() { platformPlugin.vibrateHapticFeedback(PlatformChannel.HapticFeedbackType.SELECTION_CLICK); } - @Test - public void platformPlugin_hasStringsMessage() { - MethodChannel rawChannel = mock(MethodChannel.class); - FlutterJNI mockFlutterJNI = mock(FlutterJNI.class); - DartExecutor dartExecutor = new DartExecutor(mockFlutterJNI, mock(AssetManager.class)); - PlatformChannel fakePlatformChannel = new PlatformChannel(dartExecutor); - PlatformChannel.PlatformMessageHandler mockMessageHandler = - mock(PlatformChannel.PlatformMessageHandler.class); - fakePlatformChannel.setPlatformMessageHandler(mockMessageHandler); - Boolean returnValue = true; - when(mockMessageHandler.clipboardHasStrings()).thenReturn(returnValue); - MethodCall methodCall = new MethodCall("Clipboard.hasStrings", null); - MethodChannel.Result mockResult = mock(MethodChannel.Result.class); - fakePlatformChannel.parsingMethodCallHandler.onMethodCall(methodCall, mockResult); - - JSONObject expected = new JSONObject(); - try { - expected.put("value", returnValue); - } catch (JSONException e) { - } - verify(mockResult).success(Matchers.refEq(expected)); - } - @Test public void platformPlugin_hasStrings() { ClipboardManager clipboardManager = From f606805e8b0739f7310c779166ad664d228d17d1 Mon Sep 17 00:00:00 2001 From: Justin McCandless Date: Thu, 13 Aug 2020 15:25:37 -0700 Subject: [PATCH 8/8] Formatting --- .../embedding/engine/systemchannels/PlatformChannelTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/PlatformChannelTest.java b/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/PlatformChannelTest.java index 5f16a3570da61..3a215e3e5507d 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/PlatformChannelTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/systemchannels/PlatformChannelTest.java @@ -7,7 +7,6 @@ import android.content.res.AssetManager; import io.flutter.embedding.engine.FlutterJNI; import io.flutter.embedding.engine.dart.DartExecutor; -import io.flutter.embedding.engine.systemchannels.PlatformChannel; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import org.json.JSONException;