diff options
| -rw-r--r-- | core/java/android/view/MotionEvent.java | 7 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/view/MotionEventTest.java | 63 |
2 files changed, 70 insertions, 0 deletions
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java index 0ae3e598f8b9..56a24e4705b7 100644 --- a/core/java/android/view/MotionEvent.java +++ b/core/java/android/view/MotionEvent.java @@ -3783,6 +3783,13 @@ public final class MotionEvent extends InputEvent implements Parcelable { throw new IllegalArgumentException( "idBits must contain at least one pointer from this motion event"); } + final int currentBits = getPointerIdBits(); + if ((currentBits & idBits) != idBits) { + throw new IllegalArgumentException( + "idBits must be a non-empty subset of the pointer IDs from this MotionEvent, " + + "got idBits: " + + String.format("0x%x", idBits) + " for " + this); + } MotionEvent event = obtain(); event.mNativePtr = nativeSplit(event.mNativePtr, this.mNativePtr, idBits); return event; diff --git a/core/tests/coretests/src/android/view/MotionEventTest.java b/core/tests/coretests/src/android/view/MotionEventTest.java index 6a6e65288b7a..bad048523053 100644 --- a/core/tests/coretests/src/android/view/MotionEventTest.java +++ b/core/tests/coretests/src/android/view/MotionEventTest.java @@ -26,6 +26,7 @@ import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; import android.graphics.Matrix; import android.platform.test.annotations.Presubmit; @@ -232,4 +233,66 @@ public class MotionEventTest { assertEquals(10, (int) event.getX()); assertEquals(20, (int) event.getY()); } + + @Test + public void testSplit() { + final int pointerCount = 2; + final var properties = new PointerProperties[]{fingerProperties(0), fingerProperties(1)}; + final var coords = new PointerCoords[]{pointerCoords(20, 60), pointerCoords(40, 40)}; + + 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 */); + + final int idBits = ~0b1 & event.getPointerIdBits(); + final MotionEvent splitEvent = event.split(idBits); + assertEquals(1, splitEvent.getPointerCount()); + assertEquals(1, splitEvent.getPointerId(0)); + assertEquals(40, (int) splitEvent.getX()); + assertEquals(40, (int) splitEvent.getY()); + } + + @Test + public void testSplitFailsWhenNoIdsSpecified() { + final int pointerCount = 2; + final var properties = new PointerProperties[]{fingerProperties(0), fingerProperties(1)}; + final var coords = new PointerCoords[]{pointerCoords(20, 60), pointerCoords(40, 40)}; + + 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 */); + + try { + final MotionEvent splitEvent = event.split(0); + fail("Splitting event with id bits 0 should throw: " + splitEvent); + } catch (IllegalArgumentException e) { + // Expected + } + } + + @Test + public void testSplitFailsWhenIdBitsDoNotMatch() { + final int pointerCount = 2; + final var properties = new PointerProperties[]{fingerProperties(0), fingerProperties(1)}; + final var coords = new PointerCoords[]{pointerCoords(20, 60), pointerCoords(40, 40)}; + + 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 */); + + try { + final int idBits = 0b100; + final MotionEvent splitEvent = event.split(idBits); + fail("Splitting event with id bits that do not match any pointers should throw: " + + splitEvent); + } catch (IllegalArgumentException e) { + // Expected + } + } } |