ShadowMotionEvent.java revision ca99781d0778d4b64a6fa3858924fe31f593ba2c
133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
2315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz
3315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultzimport android.view.MotionEvent;
4a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williamsimport com.xtremelabs.robolectric.Robolectric;
522c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
622c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
7f64d95f87eb9715622e3f77eb0b369d60270054cChristian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.RealObject;
8315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz
9315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultzimport java.lang.reflect.Constructor;
10315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz
1159d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin/**
1259d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * Shadow for {@code MotionEvent} that uses reflection to create {@code MotionEvent} objects, which cannot otherwise
1359d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * be constructed.
1459d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin */
15315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz@SuppressWarnings({"UnusedDeclaration"})
16315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz@Implements(MotionEvent.class)
17afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowMotionEvent {
18d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    @RealObject private MotionEvent realObject;
19d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams
20315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz    private int action;
21d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    private float[] x = new float[2];
22d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    private float[] y = new float[2];
2393d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi    private int pointerCount = 1;
24601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    private long downTime;
25601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    private long eventTime;
26ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    private int[] pointerIds = new int[2];
27ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    private int pointerIndex;
28315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz
29de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
30315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz    public static MotionEvent obtain(long downTime, long eventTime, int action, float x, float y, int metaState) {
31315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz        try {
32315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz            Constructor<MotionEvent> constructor = MotionEvent.class.getDeclaredConstructor();
33315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz            constructor.setAccessible(true);
34315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz            MotionEvent motionEvent = constructor.newInstance();
35a8486da7c7a0b6a10e943c55992f34d9c256456dChristian Williams            ShadowMotionEvent shadowMotionEvent = (ShadowMotionEvent) Robolectric.shadowOf_(motionEvent);
36d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams            shadowMotionEvent.x[0] = x;
37d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams            shadowMotionEvent.y[0] = y;
3803ce698c2bb5b203761ce51694d2fa104be4a40dTyler Schultz            shadowMotionEvent.action = action;
39601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala            shadowMotionEvent.downTime = downTime;
40601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala            shadowMotionEvent.eventTime = eventTime;
41315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz            return motionEvent;
42315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz        } catch (Exception e) {
43315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz            throw new RuntimeException(e);
44315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz        }
45315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz    }
46315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz
47de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
48a0c53bf0d2241a08df8dc302ca275407c806dde8Phil Goodwin & Rick Kawala    public static MotionEvent obtain(MotionEvent motionEvent) {
49a0c53bf0d2241a08df8dc302ca275407c806dde8Phil Goodwin & Rick Kawala        return obtain(motionEvent.getDownTime(), motionEvent.getEventTime(), motionEvent.getAction(), motionEvent.getX(), motionEvent.getY(), motionEvent.getMetaState());
50a0c53bf0d2241a08df8dc302ca275407c806dde8Phil Goodwin & Rick Kawala    }
51a0c53bf0d2241a08df8dc302ca275407c806dde8Phil Goodwin & Rick Kawala
52a0c53bf0d2241a08df8dc302ca275407c806dde8Phil Goodwin & Rick Kawala    @Implementation
53315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz    public int getAction() {
54ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky        return action | (pointerIndex << MotionEvent.ACTION_POINTER_ID_SHIFT);
55315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz    }
56924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
57de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
58924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public final float getX() {
59d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        return getX(0);
60924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
61924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
62de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
63924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public final float getY() {
64d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        return getY(0);
65d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    }
66d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams
67d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    @Implementation
68d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    public final float getX(int pointerIndex) {
69d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        return x[pointerIndex];
70d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    }
71d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams
72d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    @Implementation
73d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    public final float getY(int pointerIndex) {
74d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        return y[pointerIndex];
75d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    }
7693d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi
7793d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi    @Implementation
7893d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi    public final int getPointerCount() {
7993d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi    	return pointerCount;
8093d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi    }
81d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams
82601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    @Implementation
83601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    public final long getEventTime() {
84601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala        return eventTime;
85601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    }
86601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala
87601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    @Implementation
88601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    public final long getDownTime() {
89601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala        return downTime;
90601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    }
91601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala
92ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    @Implementation
93ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    public final int getPointerId(int index) {
94ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky        return pointerIds[index];
95ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    }
96ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky
97ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    @Implementation
98ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    public final int getActionMasked() {
99ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky        return action;
100ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    }
101ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky
102ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    @Implementation
103ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    public final int getActionIndex() {
104ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky        return pointerIndex;
105ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    }
106ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky
107d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    public MotionEvent setPointer2(float x, float y) {
108d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        this.x[1] = x;
109d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        this.y[1] = y;
11093d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi        pointerCount = 2;
111d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        return realObject;
112924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
113ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky
114ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    public void setPointerIdByIndex(int index, int id) {
115ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky        pointerIds[index] = id;
116ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    }
117ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky
118ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    public void setPointerIndex(int pointerIndex) {
119ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky        this.pointerIndex = pointerIndex;
120ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    }
121315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz}
122