aboutsummaryrefslogtreecommitdiff
path: root/v1/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMotionEvent.java
diff options
context:
space:
mode:
Diffstat (limited to 'v1/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMotionEvent.java')
-rw-r--r--v1/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMotionEvent.java155
1 files changed, 155 insertions, 0 deletions
diff --git a/v1/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMotionEvent.java b/v1/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMotionEvent.java
new file mode 100644
index 000000000..c9a71875a
--- /dev/null
+++ b/v1/src/main/java/com/xtremelabs/robolectric/shadows/ShadowMotionEvent.java
@@ -0,0 +1,155 @@
+package com.xtremelabs.robolectric.shadows;
+
+import android.view.MotionEvent;
+import com.xtremelabs.robolectric.Robolectric;
+import com.xtremelabs.robolectric.internal.Implementation;
+import com.xtremelabs.robolectric.internal.Implements;
+import com.xtremelabs.robolectric.internal.RealObject;
+
+import java.lang.reflect.Constructor;
+
+/**
+ * Shadow for {@code MotionEvent} that uses reflection to create {@code MotionEvent} objects, which cannot otherwise
+ * be constructed.
+ */
+@SuppressWarnings({"UnusedDeclaration"})
+@Implements(MotionEvent.class)
+public class ShadowMotionEvent {
+ @RealObject private MotionEvent realObject;
+
+ private int action;
+ private float[] x = new float[2];
+ private float[] y = new float[2];
+ private int pointerCount = 1;
+ private long downTime;
+ private long eventTime;
+ private int[] pointerIds = new int[2];
+ private int pointerIndex;
+
+ @Implementation
+ public static MotionEvent obtain(long downTime, long eventTime, int action, float x, float y, int metaState) {
+ try {
+ Constructor<MotionEvent> constructor = MotionEvent.class.getDeclaredConstructor();
+ constructor.setAccessible(true);
+ MotionEvent motionEvent = constructor.newInstance();
+ ShadowMotionEvent shadowMotionEvent = (ShadowMotionEvent) Robolectric.shadowOf_(motionEvent);
+ shadowMotionEvent.x[0] = x;
+ shadowMotionEvent.y[0] = y;
+ shadowMotionEvent.action = action;
+ shadowMotionEvent.downTime = downTime;
+ shadowMotionEvent.eventTime = eventTime;
+ return motionEvent;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Implementation
+ public static MotionEvent obtain(MotionEvent motionEvent) {
+ return obtain(motionEvent.getDownTime(), motionEvent.getEventTime(), motionEvent.getAction(), motionEvent.getX(), motionEvent.getY(), motionEvent.getMetaState());
+ }
+
+ @Implementation
+ public int getAction() {
+ return action | (pointerIndex << MotionEvent.ACTION_POINTER_ID_SHIFT);
+ }
+
+ @Implementation
+ public float getRawX() {
+ return getX();
+ }
+
+ @Implementation
+ public float getRawY() {
+ return getY();
+ }
+
+ @Implementation
+ public final float getX() {
+ return getX(0);
+ }
+
+ @Implementation
+ public final float getY() {
+ return getY(0);
+ }
+
+ @Implementation
+ public final float getX(int pointerIndex) {
+ return x[pointerIndex];
+ }
+
+ @Implementation
+ public final float getY(int pointerIndex) {
+ return y[pointerIndex];
+ }
+
+ @Implementation
+ public final int getPointerCount() {
+ return pointerCount;
+ }
+
+ @Implementation
+ public final long getEventTime() {
+ return eventTime;
+ }
+
+ @Implementation
+ public final long getDownTime() {
+ return downTime;
+ }
+
+ @Implementation
+ public final int getPointerId(int index) {
+ return pointerIds[index];
+ }
+
+ @Implementation
+ public final int findPointerIndex(int id) {
+ for (int i = 0; i < pointerIds.length; i++) {
+ int pointerId = pointerIds[i];
+
+ if (pointerId == id) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ @Implementation
+ public final int getActionMasked() {
+ return action;
+ }
+
+ @Implementation
+ public final int getActionIndex() {
+ return pointerIndex;
+ }
+
+ @Implementation
+ public final float getPressure(int pointerIndex) {
+ return 1.0f;
+ }
+
+ @Implementation
+ public final void setLocation(float x, float y) {
+ this.x[0] = x;
+ this.y[0] = y;
+ }
+
+ public MotionEvent setPointer2(float x, float y) {
+ this.x[1] = x;
+ this.y[1] = y;
+ pointerCount = 2;
+ return realObject;
+ }
+
+ public void setPointerIndex(int pointerIndex) {
+ this.pointerIndex = pointerIndex;
+ }
+
+ public void setPointerIds(int index0PointerId, int index1PointerId) {
+ pointerIds[0] = index0PointerId;
+ pointerIds[1] = index1PointerId;
+ }
+}