Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 1c412b5

Browse files
author
Kaushik Iska
committed
replace getRawX and getRawY with shims
1 parent ed939eb commit 1c412b5

File tree

2 files changed

+49
-15
lines changed

2 files changed

+49
-15
lines changed

shell/platform/android/io/flutter/embedding/android/AndroidTouchProcessor.java

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.flutter.embedding.android;
22

3+
import android.graphics.Matrix;
34
import android.os.Build;
45
import android.view.InputDevice;
56
import android.view.MotionEvent;
@@ -69,6 +70,8 @@ public class AndroidTouchProcessor {
6970

7071
private static final int _POINTER_BUTTON_PRIMARY = 1;
7172

73+
private static final Matrix IDENTITY_TRANSFORM = new Matrix();
74+
7275
private final boolean trackMotionEvents;
7376

7477
/**
@@ -83,8 +86,12 @@ public AndroidTouchProcessor(@NonNull FlutterRenderer renderer, boolean trackMot
8386
this.trackMotionEvents = trackMotionEvents;
8487
}
8588

86-
/** Sends the given {@link MotionEvent} data to Flutter in a format that Flutter understands. */
8789
public boolean onTouchEvent(@NonNull MotionEvent event) {
90+
return onTouchEvent(event, IDENTITY_TRANSFORM);
91+
}
92+
93+
/** Sends the given {@link MotionEvent} data to Flutter in a format that Flutter understands. */
94+
public boolean onTouchEvent(@NonNull MotionEvent event, Matrix transformMatrix) {
8895
int pointerCount = event.getPointerCount();
8996

9097
// Prepare a data packet of the appropriate size and order.
@@ -102,26 +109,27 @@ public boolean onTouchEvent(@NonNull MotionEvent event) {
102109
|| maskedAction == MotionEvent.ACTION_POINTER_UP);
103110
if (updateForSinglePointer) {
104111
// ACTION_DOWN and ACTION_POINTER_DOWN always apply to a single pointer only.
105-
addPointerForIndex(event, event.getActionIndex(), pointerChange, 0, packet);
112+
addPointerForIndex(event, event.getActionIndex(), pointerChange, 0, transformMatrix, packet);
106113
} else if (updateForMultiplePointers) {
107114
// ACTION_UP and ACTION_POINTER_UP may contain position updates for other pointers.
108115
// We are converting these updates to move events here in order to preserve this data.
109116
// We also mark these events with a flag in order to help the framework reassemble
110117
// the original Android event later, should it need to forward it to a PlatformView.
111118
for (int p = 0; p < pointerCount; p++) {
112119
if (p != event.getActionIndex() && event.getToolType(p) == MotionEvent.TOOL_TYPE_FINGER) {
113-
addPointerForIndex(event, p, PointerChange.MOVE, POINTER_DATA_FLAG_BATCHED, packet);
120+
addPointerForIndex(
121+
event, p, PointerChange.MOVE, POINTER_DATA_FLAG_BATCHED, transformMatrix, packet);
114122
}
115123
}
116124
// It's important that we're sending the UP event last. This allows PlatformView
117125
// to correctly batch everything back into the original Android event if needed.
118-
addPointerForIndex(event, event.getActionIndex(), pointerChange, 0, packet);
126+
addPointerForIndex(event, event.getActionIndex(), pointerChange, 0, transformMatrix, packet);
119127
} else {
120128
// ACTION_MOVE may not actually mean all pointers have moved
121129
// but it's the responsibility of a later part of the system to
122130
// ignore 0-deltas if desired.
123131
for (int p = 0; p < pointerCount; p++) {
124-
addPointerForIndex(event, p, pointerChange, 0, packet);
132+
addPointerForIndex(event, p, pointerChange, 0, transformMatrix, packet);
125133
}
126134
}
127135

@@ -163,7 +171,7 @@ public boolean onGenericMotionEvent(@NonNull MotionEvent event) {
163171
packet.order(ByteOrder.LITTLE_ENDIAN);
164172

165173
// ACTION_HOVER_MOVE always applies to a single pointer only.
166-
addPointerForIndex(event, event.getActionIndex(), pointerChange, 0, packet);
174+
addPointerForIndex(event, event.getActionIndex(), pointerChange, 0, IDENTITY_TRANSFORM, packet);
167175
if (packet.position() % (POINTER_DATA_FIELD_COUNT * BYTES_PER_FIELD) != 0) {
168176
throw new AssertionError("Packet position is not on field boundary.");
169177
}
@@ -174,7 +182,12 @@ public boolean onGenericMotionEvent(@NonNull MotionEvent event) {
174182
// TODO(mattcarroll): consider creating a PointerPacket class instead of using a procedure that
175183
// mutates inputs.
176184
private void addPointerForIndex(
177-
MotionEvent event, int pointerIndex, int pointerChange, int pointerData, ByteBuffer packet) {
185+
MotionEvent event,
186+
int pointerIndex,
187+
int pointerChange,
188+
int pointerData,
189+
Matrix transformMatrix,
190+
ByteBuffer packet) {
178191
if (pointerChange == -1) {
179192
return;
180193
}
@@ -201,8 +214,14 @@ private void addPointerForIndex(
201214
packet.putLong(signalKind); // signal_kind
202215
packet.putLong(event.getPointerId(pointerIndex)); // device
203216
packet.putLong(0); // pointer_identifier, will be generated in pointer_data_packet_converter.cc.
204-
packet.putDouble(event.getRawX(pointerIndex)); // physical_x
205-
packet.putDouble(event.getRawY(pointerIndex)); // physical_y
217+
218+
// We use this in lieu of using event.getRawX and event.getRawY as we wish to support
219+
// earlier versions than API level 29.
220+
float viewToScreenCoords[] = {event.getX(pointerIndex), event.getY(pointerIndex)};
221+
transformMatrix.mapPoints(viewToScreenCoords);
222+
packet.putDouble(viewToScreenCoords[0]); // physical_x
223+
packet.putDouble(viewToScreenCoords[1]); // physical_y
224+
206225
packet.putDouble(
207226
0.0); // physical_delta_x, will be generated in pointer_data_packet_converter.cc.
208227
packet.putDouble(

shell/platform/android/io/flutter/embedding/engine/mutatorsstack/FlutterMutatorView.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ public FlutterMutatorView(
3333
}
3434

3535
/** Initialize the FlutterMutatorView. */
36-
public FlutterMutatorView(@NonNull Context context, AndroidTouchProcessor androidTouchProcessor) {
36+
public FlutterMutatorView(@NonNull Context context) {
3737
super(context, null);
3838
this.screenDensity = 1;
39-
this.androidTouchProcessor = androidTouchProcessor;
39+
this.androidTouchProcessor = null;
4040
}
4141

4242
/**
@@ -78,7 +78,14 @@ public void dispatchDraw(Canvas canvas) {
7878
// Apply all the transforms on the child canvas.
7979
canvas.save();
8080

81+
canvas.concat(getPlatformViewMatrix());
82+
super.dispatchDraw(canvas);
83+
canvas.restore();
84+
}
85+
86+
private Matrix getPlatformViewMatrix() {
8187
Matrix finalMatrix = new Matrix(mutatorsStack.getFinalMatrix());
88+
8289
// Reverse scale based on screen scale.
8390
//
8491
// The Android frame is set based on the logical resolution instead of physical.
@@ -87,6 +94,7 @@ public void dispatchDraw(Canvas canvas) {
8794
// 500 points in Android. And until this point, we did all the calculation based on the flow
8895
// resolution. So we need to scale down to match Android's logical resolution.
8996
finalMatrix.preScale(1 / screenDensity, 1 / screenDensity);
97+
9098
// Reverse the current offset.
9199
//
92100
// The frame of this view includes the final offset of the bounding rect.
@@ -95,9 +103,7 @@ public void dispatchDraw(Canvas canvas) {
95103
// all the clipping paths
96104
finalMatrix.postTranslate(-left, -top);
97105

98-
canvas.concat(finalMatrix);
99-
super.dispatchDraw(canvas);
100-
canvas.restore();
106+
return finalMatrix;
101107
}
102108

103109
@Override
@@ -108,6 +114,15 @@ public boolean onInterceptTouchEvent(MotionEvent event) {
108114

109115
@Override
110116
public boolean onTouchEvent(MotionEvent event) {
111-
return androidTouchProcessor.onTouchEvent(event);
117+
if (androidTouchProcessor == null) {
118+
return super.onTouchEvent(event);
119+
}
120+
121+
// Mutator view itself doesn't rotate, scale, skew, etc.
122+
// we only need to account for translation.
123+
Matrix screenMatrix = new Matrix();
124+
screenMatrix.postTranslate(getLeft(), getTop());
125+
126+
return androidTouchProcessor.onTouchEvent(event, screenMatrix);
112127
}
113128
}

0 commit comments

Comments
 (0)