From 4fc91304e8e0a7721fdb4cc22c00689b560efcdb Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Wed, 9 Aug 2023 14:58:43 -0500 Subject: [PATCH] Pair progress --- .../android/AndroidTouchProcessor.java | 38 ++++++++++---- .../embedding/android/FlutterView.java | 3 +- .../android/io/flutter/view/FlutterView.java | 3 +- sky/packages/sky_engine/lib/_embedder.yaml | 50 +++++++++---------- 4 files changed, 57 insertions(+), 37 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/android/AndroidTouchProcessor.java b/shell/platform/android/io/flutter/embedding/android/AndroidTouchProcessor.java index b3db5df1eb99b..7b05107aab6de 100644 --- a/shell/platform/android/io/flutter/embedding/android/AndroidTouchProcessor.java +++ b/shell/platform/android/io/flutter/embedding/android/AndroidTouchProcessor.java @@ -1,9 +1,11 @@ package io.flutter.embedding.android; +import android.content.Context; import android.graphics.Matrix; import android.os.Build; import android.view.InputDevice; import android.view.MotionEvent; +import android.view.ViewConfiguration; import androidx.annotation.IntDef; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; @@ -138,7 +140,8 @@ public boolean onTouchEvent(@NonNull MotionEvent event, @NonNull Matrix transfor || maskedAction == MotionEvent.ACTION_POINTER_UP); if (updateForSinglePointer) { // ACTION_DOWN and ACTION_POINTER_DOWN always apply to a single pointer only. - addPointerForIndex(event, event.getActionIndex(), pointerChange, 0, transformMatrix, packet); + addPointerForIndex( + event, event.getActionIndex(), pointerChange, 0, transformMatrix, packet, null); } else if (updateForMultiplePointers) { // ACTION_UP and ACTION_POINTER_UP may contain position updates for other pointers. // We are converting these updates to move events here in order to preserve this data. @@ -147,18 +150,25 @@ public boolean onTouchEvent(@NonNull MotionEvent event, @NonNull Matrix transfor for (int p = 0; p < pointerCount; p++) { if (p != event.getActionIndex() && event.getToolType(p) == MotionEvent.TOOL_TYPE_FINGER) { addPointerForIndex( - event, p, PointerChange.MOVE, POINTER_DATA_FLAG_BATCHED, transformMatrix, packet); + event, + p, + PointerChange.MOVE, + POINTER_DATA_FLAG_BATCHED, + transformMatrix, + packet, + null); } } // It's important that we're sending the UP event last. This allows PlatformView // to correctly batch everything back into the original Android event if needed. - addPointerForIndex(event, event.getActionIndex(), pointerChange, 0, transformMatrix, packet); + addPointerForIndex( + event, event.getActionIndex(), pointerChange, 0, transformMatrix, packet, null); } else { // ACTION_MOVE may not actually mean all pointers have moved // but it's the responsibility of a later part of the system to // ignore 0-deltas if desired. for (int p = 0; p < pointerCount; p++) { - addPointerForIndex(event, p, pointerChange, 0, transformMatrix, packet); + addPointerForIndex(event, p, pointerChange, 0, transformMatrix, packet, null); } } @@ -183,7 +193,7 @@ public boolean onTouchEvent(@NonNull MotionEvent event, @NonNull Matrix transfor * @param event The generic motion event being processed. * @return True if the event was handled. */ - public boolean onGenericMotionEvent(@NonNull MotionEvent event) { + public boolean onGenericMotionEvent(@NonNull MotionEvent event, Context context) { // Method isFromSource is only available in API 18+ (Jelly Bean MR2) // Mouse hover support is not implemented for API < 18. boolean isPointerEvent = @@ -203,7 +213,8 @@ public boolean onGenericMotionEvent(@NonNull MotionEvent event) { packet.order(ByteOrder.LITTLE_ENDIAN); // ACTION_HOVER_MOVE always applies to a single pointer only. - addPointerForIndex(event, event.getActionIndex(), pointerChange, 0, IDENTITY_TRANSFORM, packet); + addPointerForIndex( + event, event.getActionIndex(), pointerChange, 0, IDENTITY_TRANSFORM, packet, context); if (packet.position() % (POINTER_DATA_FIELD_COUNT * BYTES_PER_FIELD) != 0) { throw new AssertionError("Packet position is not on field boundary."); } @@ -219,7 +230,8 @@ private void addPointerForIndex( int pointerChange, int pointerData, Matrix transformMatrix, - ByteBuffer packet) { + ByteBuffer packet, + Context context) { if (pointerChange == -1) { return; } @@ -335,11 +347,17 @@ private void addPointerForIndex( packet.putLong(pointerData); // platformData if (signalKind == PointerSignalKind.SCROLL) { - packet.putDouble(-event.getAxisValue(MotionEvent.AXIS_HSCROLL)); // scroll_delta_x - packet.putDouble(-event.getAxisValue(MotionEvent.AXIS_VSCROLL)); // scroll_delta_y + double verticalScaleFactor = 1.0; + if (context != null) { + verticalScaleFactor = ViewConfiguration.get(context).getScaledVerticalScrollFactor(); + } + packet.putDouble(-event.getAxisValue(MotionEvent.AXIS_X, pointerIndex)); // scroll_delta_x + packet.putDouble( + verticalScaleFactor + * -event.getAxisValue(MotionEvent.AXIS_Y, pointerIndex)); // scroll_delta_y } else { packet.putDouble(0.0); // scroll_delta_x - packet.putDouble(0.0); // scroll_delta_x + packet.putDouble(0.0); // scroll_delta_y } if (isTrackpadPan) { diff --git a/shell/platform/android/io/flutter/embedding/android/FlutterView.java b/shell/platform/android/io/flutter/embedding/android/FlutterView.java index 45fae9f96456c..a0f902ff9b527 100644 --- a/shell/platform/android/io/flutter/embedding/android/FlutterView.java +++ b/shell/platform/android/io/flutter/embedding/android/FlutterView.java @@ -952,7 +952,8 @@ public boolean onTouchEvent(@NonNull MotionEvent event) { @Override public boolean onGenericMotionEvent(@NonNull MotionEvent event) { boolean handled = - isAttachedToFlutterEngine() && androidTouchProcessor.onGenericMotionEvent(event); + isAttachedToFlutterEngine() + && androidTouchProcessor.onGenericMotionEvent(event, getContext()); return handled ? true : super.onGenericMotionEvent(event); } diff --git a/shell/platform/android/io/flutter/view/FlutterView.java b/shell/platform/android/io/flutter/view/FlutterView.java index 7d15aab7ad89d..46d91eefe6420 100644 --- a/shell/platform/android/io/flutter/view/FlutterView.java +++ b/shell/platform/android/io/flutter/view/FlutterView.java @@ -482,7 +482,8 @@ public boolean onHoverEvent(MotionEvent event) { */ @Override public boolean onGenericMotionEvent(MotionEvent event) { - boolean handled = isAttached() && androidTouchProcessor.onGenericMotionEvent(event); + boolean handled = + isAttached() && androidTouchProcessor.onGenericMotionEvent(event, getContext()); return handled ? true : super.onGenericMotionEvent(event); } diff --git a/sky/packages/sky_engine/lib/_embedder.yaml b/sky/packages/sky_engine/lib/_embedder.yaml index ab4dd851b6b6b..1abb5224edfbe 100644 --- a/sky/packages/sky_engine/lib/_embedder.yaml +++ b/sky/packages/sky_engine/lib/_embedder.yaml @@ -1,33 +1,33 @@ -# This file is suitable for use within the tree. A different _embedder.yaml -# is generated by the BUILD.gn in this directory. Changes here must be -# mirrored there. +# This file is generated by //flutter/sky/packages/sky_engine:_embedder_yaml +# Do not modify this file directly. Instead, update the build file. + embedded_libs: - "dart:async": "../../../../../third_party/dart/sdk/lib/async/async.dart" - "dart:collection": "../../../../../third_party/dart/sdk/lib/collection/collection.dart" - "dart:convert": "../../../../../third_party/dart/sdk/lib/convert/convert.dart" - "dart:core": "../../../../../third_party/dart/sdk/lib/core/core.dart" - "dart:developer": "../../../../../third_party/dart/sdk/lib/developer/developer.dart" - "dart:ffi": "../../../../../third_party/dart/sdk/lib/ffi/ffi.dart" - "dart:html": "../../../../../third_party/dart/sdk/lib/html/html_dart2js.dart" - "dart:io": "../../../../../third_party/dart/sdk/lib/io/io.dart" - "dart:isolate": "../../../../../third_party/dart/sdk/lib/isolate/isolate.dart" - "dart:js": "../../../../../third_party/dart/sdk/lib/js/js.dart" - "dart:js_interop": "../../../../../third_party/dart/sdk/lib/js_interop/js_interop.dart" - "dart:js_interop_unsafe": "../../../../../third_party/dart/sdk/lib/js_interop_unsafe/js_interop_unsafe.dart" - "dart:js_util": "../../../../../third_party/dart/sdk/lib/js_util/js_util.dart" - "dart:math": "../../../../../third_party/dart/sdk/lib/math/math.dart" - "dart:typed_data": "../../../../../third_party/dart/sdk/lib/typed_data/typed_data.dart" - "dart:ui": "../../../../lib/ui/ui.dart" - "dart:ui_web": "../../../../lib/web_ui/lib/ui_web/src/ui_web.dart" + "dart:async": "async/async.dart" + "dart:collection": "collection/collection.dart" + "dart:convert": "convert/convert.dart" + "dart:core": "core/core.dart" + "dart:developer": "developer/developer.dart" + "dart:ffi": "ffi/ffi.dart" + "dart:html": "html/html_dart2js.dart" + "dart:io": "io/io.dart" + "dart:isolate": "isolate/isolate.dart" + "dart:js": "js/js.dart" + "dart:js_interop": "js_interop/js_interop.dart" + "dart:js_interop_unsafe": "js_interop_unsafe/js_interop_unsafe.dart" + "dart:js_util": "js_util/js_util.dart" + "dart:math": "math/math.dart" + "dart:typed_data": "typed_data/typed_data.dart" + "dart:ui": "ui/ui.dart" + "dart:ui_web": "ui_web/ui_web.dart" - "dart:_http": "../../../../../third_party/dart/sdk/lib/_http/http.dart" - "dart:_interceptors": "../../../../../third_party/dart/sdk/lib/_interceptors/interceptors.dart" + "dart:_http": "_http/http.dart" + "dart:_interceptors": "_interceptors/interceptors.dart" # The _internal library is needed as some implementations bleed into the # public API, e.g. List being Iterable by virtue of implementing # EfficientLengthIterable. Not including this library yields analysis errors. - "dart:_internal": "../../../../../third_party/dart/sdk/lib/internal/internal.dart" + "dart:_internal": "internal/internal.dart" # The _js_annotations library is also needed for the same reasons as _internal. - "dart:_js_annotations": "../../../../../third_party/dart/sdk/lib/js/_js_annotations.dart" + "dart:_js_annotations": "_js_annotations/_js_annotations.dart" # The _js_types library is also needed for the same reasons as _internal. - "dart:_js_types": "../../../../../third_party/dart/sdk/lib/_internal/js_shared/lib/js_types.dart" + "dart:_js_types": "_js_types/js_types.dart" "dart:nativewrappers": "_empty.dart"