diff options
author | 2025-01-02 19:05:33 -0800 | |
---|---|---|
committer | 2025-01-02 19:05:33 -0800 | |
commit | 29fa2d4e480fd1e716f27f4b22ba95dfc89c84cd (patch) | |
tree | cdfa52f172cc01e790ee4f6dac4bfcefc56c4962 | |
parent | 33a6bf252bd0d28a1fd72e6c763f03f28183d2ea (diff) | |
parent | ef3abf29323b1370052bcf94c36bdaaa8c5c88e7 (diff) |
Merge "MotionEvent: Don't update private flags when setting flags from Java" into main am: ef3abf2932
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/3431486
Change-Id: I9ff24c50e9a87809e5ed2bc59bdc64bf925813a5
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | core/jni/android_view_MotionEvent.cpp | 3 | ||||
-rw-r--r-- | core/tests/coretests/src/android/view/MotionEventTest.java | 25 |
2 files changed, 27 insertions, 1 deletions
diff --git a/core/jni/android_view_MotionEvent.cpp b/core/jni/android_view_MotionEvent.cpp index 240be3fe5534..c105a6098870 100644 --- a/core/jni/android_view_MotionEvent.cpp +++ b/core/jni/android_view_MotionEvent.cpp @@ -704,7 +704,8 @@ static void android_view_MotionEvent_nativeSetFlags(CRITICAL_JNI_PARAMS_COMMA jl jint flags) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); // Prevent private flags from being used from Java. - event->setFlags(flags & ~AMOTION_EVENT_PRIVATE_FLAG_MASK); + const int32_t privateFlags = event->getFlags() & AMOTION_EVENT_PRIVATE_FLAG_MASK; + event->setFlags((flags & ~AMOTION_EVENT_PRIVATE_FLAG_MASK) | privateFlags); } static jint android_view_MotionEvent_nativeGetEdgeFlags(CRITICAL_JNI_PARAMS_COMMA jlong nativePtr) { diff --git a/core/tests/coretests/src/android/view/MotionEventTest.java b/core/tests/coretests/src/android/view/MotionEventTest.java index d0f9a38720bf..419c05f5b8c1 100644 --- a/core/tests/coretests/src/android/view/MotionEventTest.java +++ b/core/tests/coretests/src/android/view/MotionEventTest.java @@ -49,9 +49,14 @@ public class MotionEventTest { private static final int ID_SOURCE_MASK = 0x3 << 30; private PointerCoords pointerCoords(float x, float y) { + return pointerCoords(x, y, 0f /*orientation*/); + } + + private PointerCoords pointerCoords(float x, float y, float orientation) { final var coords = new PointerCoords(); coords.x = x; coords.y = y; + coords.orientation = orientation; return coords; } @@ -295,4 +300,24 @@ public class MotionEventTest { // Expected } } + + @Test + public void testAxesAreNotAffectedByFlagChanges() { + final int pointerCount = 1; + final var properties = new PointerProperties[]{fingerProperties(0)}; + final var coords = new PointerCoords[]{pointerCoords(20, 60, 0.1234f)}; + + final MotionEvent event = MotionEvent.obtain(0 /* downTime */, + 0 /* eventTime */, MotionEvent.ACTION_MOVE, pointerCount, properties, coords, + 0 /* metaState */, 0 /* buttonState */, 1 /* xPrecision */, 1 /* yPrecision */, + 0 /* deviceId */, 0 /* edgeFlags */, InputDevice.SOURCE_TOUCHSCREEN, + 0 /* flags */); + + // Mark the event as tainted to update the MotionEvent flags. + event.setTainted(true); + + assertEquals(20f, event.getX(), 0.0001); + assertEquals(60f, event.getY(), 0.0001); + assertEquals(0.1234f, event.getOrientation(), 0.0001); + } } |