From 87ae6662b1888defcea95d696909923ae10ab45d Mon Sep 17 00:00:00 2001 From: Christopher Fujino Date: Mon, 28 Sep 2020 12:18:35 -0700 Subject: [PATCH 1/2] Update dart to 2.10.0 --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index 3d56e8fd1dbc6..93267b6ec53f3 100644 --- a/DEPS +++ b/DEPS @@ -34,7 +34,7 @@ vars = { # Dart is: https://github.com/dart-lang/sdk/blob/master/DEPS. # You can use //tools/dart/create_updated_flutter_deps.py to produce # updated revision list of existing dependencies. - 'dart_revision': '4215dca724fb80de592f51a6cdba51e7638d1723', + 'dart_revision': '41eab9b49ccce8960f71c657861dc629f96295af', # WARNING: DO NOT EDIT MANUALLY # The lines between blank lines above and below are generated by a script. See create_updated_flutter_deps.py From 69a2bf5d62d12c56d2854cbbeb4e2e88f7061a37 Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Fri, 25 Sep 2020 17:46:34 -0700 Subject: [PATCH 2/2] Support dragging native platform views (#21396) --- shell/platform/android/BUILD.gn | 1 + .../mutatorsstack/FlutterMutatorView.java | 27 +++++-- .../test/io/flutter/FlutterTestSuite.java | 2 + .../mutatorsstack/FlutterMutatorViewTest.java | 79 +++++++++++++++++++ 4 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 shell/platform/android/test/io/flutter/embedding/engine/mutatorsstack/FlutterMutatorViewTest.java diff --git a/shell/platform/android/BUILD.gn b/shell/platform/android/BUILD.gn index 3443dba51d3ae..f372d8ef840de 100644 --- a/shell/platform/android/BUILD.gn +++ b/shell/platform/android/BUILD.gn @@ -438,6 +438,7 @@ action("robolectric_tests") { "test/io/flutter/embedding/engine/dart/DartExecutorTest.java", "test/io/flutter/embedding/engine/loader/ApplicationInfoLoaderTest.java", "test/io/flutter/embedding/engine/loader/FlutterLoaderTest.java", + "test/io/flutter/embedding/engine/mutatorsstack/FlutterMutatorViewTest.java", "test/io/flutter/embedding/engine/plugins/shim/ShimPluginRegistryTest.java", "test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java", "test/io/flutter/embedding/engine/systemchannels/KeyEventChannelTest.java", diff --git a/shell/platform/android/io/flutter/embedding/engine/mutatorsstack/FlutterMutatorView.java b/shell/platform/android/io/flutter/embedding/engine/mutatorsstack/FlutterMutatorView.java index d910ab82f2eb0..25089bbc4d781 100644 --- a/shell/platform/android/io/flutter/embedding/engine/mutatorsstack/FlutterMutatorView.java +++ b/shell/platform/android/io/flutter/embedding/engine/mutatorsstack/FlutterMutatorView.java @@ -19,6 +19,8 @@ public class FlutterMutatorView extends FrameLayout { private float screenDensity; private int left; private int top; + private int prevLeft; + private int prevTop; private final AndroidTouchProcessor androidTouchProcessor; @@ -122,11 +124,26 @@ public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } - // Mutator view itself doesn't rotate, scale, skew, etc. - // we only need to account for translation. - Matrix screenMatrix = new Matrix(); - screenMatrix.postTranslate(left, top); - + final Matrix screenMatrix = new Matrix(); + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + prevLeft = left; + prevTop = top; + screenMatrix.postTranslate(left, top); + break; + case MotionEvent.ACTION_MOVE: + // While the view is dragged, use the left and top positions as + // they were at the moment the touch event fired. + screenMatrix.postTranslate(prevLeft, prevTop); + prevLeft = left; + prevTop = top; + break; + case MotionEvent.ACTION_UP: + default: + screenMatrix.postTranslate(left, top); + break; + } return androidTouchProcessor.onTouchEvent(event, screenMatrix); } } diff --git a/shell/platform/android/test/io/flutter/FlutterTestSuite.java b/shell/platform/android/test/io/flutter/FlutterTestSuite.java index bb5c44c6568df..525db5cabe90b 100644 --- a/shell/platform/android/test/io/flutter/FlutterTestSuite.java +++ b/shell/platform/android/test/io/flutter/FlutterTestSuite.java @@ -18,6 +18,7 @@ import io.flutter.embedding.engine.RenderingComponentTest; import io.flutter.embedding.engine.loader.ApplicationInfoLoaderTest; import io.flutter.embedding.engine.loader.FlutterLoaderTest; +import io.flutter.embedding.engine.mutatorsstack.FlutterMutatorViewTest; import io.flutter.embedding.engine.plugins.shim.ShimPluginRegistryTest; import io.flutter.embedding.engine.renderer.FlutterRendererTest; import io.flutter.embedding.engine.systemchannels.KeyEventChannelTest; @@ -60,6 +61,7 @@ FlutterJNITest.class, FlutterLaunchTests.class, FlutterLoaderTest.class, + FlutterMutatorViewTest.class, FlutterShellArgsTest.class, FlutterRendererTest.class, FlutterShellArgsTest.class, diff --git a/shell/platform/android/test/io/flutter/embedding/engine/mutatorsstack/FlutterMutatorViewTest.java b/shell/platform/android/test/io/flutter/embedding/engine/mutatorsstack/FlutterMutatorViewTest.java new file mode 100644 index 0000000000000..35f412058be61 --- /dev/null +++ b/shell/platform/android/test/io/flutter/embedding/engine/mutatorsstack/FlutterMutatorViewTest.java @@ -0,0 +1,79 @@ +package io.flutter.embedding.engine.mutatorsstack; + +import static junit.framework.TestCase.*; +import static org.mockito.Mockito.*; + +import android.graphics.Matrix; +import android.view.MotionEvent; +import io.flutter.embedding.android.AndroidTouchProcessor; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@Config(manifest = Config.NONE) +@RunWith(RobolectricTestRunner.class) +public class FlutterMutatorViewTest { + + @Test + public void canDragViews() { + final AndroidTouchProcessor touchProcessor = mock(AndroidTouchProcessor.class); + final FlutterMutatorView view = + new FlutterMutatorView(RuntimeEnvironment.systemContext, 1.0f, touchProcessor); + final FlutterMutatorsStack mutatorStack = mock(FlutterMutatorsStack.class); + + assertTrue(view.onInterceptTouchEvent(mock(MotionEvent.class))); + + { + view.readyToDisplay(mutatorStack, /*left=*/ 1, /*top=*/ 2, /*width=*/ 0, /*height=*/ 0); + view.onTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0.0f, 0.0f, 0)); + final ArgumentCaptor matrixCaptor = ArgumentCaptor.forClass(Matrix.class); + verify(touchProcessor).onTouchEvent(any(), matrixCaptor.capture()); + + final Matrix screenMatrix = new Matrix(); + screenMatrix.postTranslate(1, 2); + assertTrue(matrixCaptor.getValue().equals(screenMatrix)); + } + + reset(touchProcessor); + + { + view.readyToDisplay(mutatorStack, /*left=*/ 3, /*top=*/ 4, /*width=*/ 0, /*height=*/ 0); + view.onTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, 0.0f, 0.0f, 0)); + final ArgumentCaptor matrixCaptor = ArgumentCaptor.forClass(Matrix.class); + verify(touchProcessor).onTouchEvent(any(), matrixCaptor.capture()); + + final Matrix screenMatrix = new Matrix(); + screenMatrix.postTranslate(1, 2); + assertTrue(matrixCaptor.getValue().equals(screenMatrix)); + } + + reset(touchProcessor); + + { + view.readyToDisplay(mutatorStack, /*left=*/ 5, /*top=*/ 6, /*width=*/ 0, /*height=*/ 0); + view.onTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, 0.0f, 0.0f, 0)); + final ArgumentCaptor matrixCaptor = ArgumentCaptor.forClass(Matrix.class); + verify(touchProcessor).onTouchEvent(any(), matrixCaptor.capture()); + + final Matrix screenMatrix = new Matrix(); + screenMatrix.postTranslate(3, 4); + assertTrue(matrixCaptor.getValue().equals(screenMatrix)); + } + + reset(touchProcessor); + + { + view.readyToDisplay(mutatorStack, /*left=*/ 7, /*top=*/ 8, /*width=*/ 0, /*height=*/ 0); + view.onTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0.0f, 0.0f, 0)); + final ArgumentCaptor matrixCaptor = ArgumentCaptor.forClass(Matrix.class); + verify(touchProcessor).onTouchEvent(any(), matrixCaptor.capture()); + + final Matrix screenMatrix = new Matrix(); + screenMatrix.postTranslate(7, 8); + assertTrue(matrixCaptor.getValue().equals(screenMatrix)); + } + } +}