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
58d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky    public float getRawX() {
59d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky        return getX();
60d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky    }
61d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky
62d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky    @Implementation
63d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky    public float getRawY() {
64d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky        return getY();
65d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky    }
66d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky
67d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky    @Implementation
68924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public final float getX() {
69d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        return getX(0);
70924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
71924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard
72de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams    @Implementation
73924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    public final float getY() {
74d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        return getY(0);
75d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    }
76d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams
77d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    @Implementation
78d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    public final float getX(int pointerIndex) {
79d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        return x[pointerIndex];
80d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    }
81d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams
82d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    @Implementation
83d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    public final float getY(int pointerIndex) {
84d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        return y[pointerIndex];
85d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    }
8693d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi
8793d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi    @Implementation
8893d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi    public final int getPointerCount() {
8993d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi    	return pointerCount;
9093d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi    }
91d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams
92601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    @Implementation
93601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    public final long getEventTime() {
94601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala        return eventTime;
95601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    }
96601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala
97601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    @Implementation
98601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    public final long getDownTime() {
99601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala        return downTime;
100601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala    }
101601eab036c49264be1000e08f6001e0654542415Phil Goodwin & Rick Kawala
102ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    @Implementation
103ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    public final int getPointerId(int index) {
104ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky        return pointerIds[index];
105ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    }
106ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky
107ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    @Implementation
1081dc18ea3dc469aa6ed0d51b7f98f78880fd5725aGlenn Jahnke & Lenny Turetsky    public final int findPointerIndex(int id) {
1091dc18ea3dc469aa6ed0d51b7f98f78880fd5725aGlenn Jahnke & Lenny Turetsky        for (int i = 0; i < pointerIds.length; i++) {
1101dc18ea3dc469aa6ed0d51b7f98f78880fd5725aGlenn Jahnke & Lenny Turetsky            int pointerId = pointerIds[i];
1111dc18ea3dc469aa6ed0d51b7f98f78880fd5725aGlenn Jahnke & Lenny Turetsky
1121dc18ea3dc469aa6ed0d51b7f98f78880fd5725aGlenn Jahnke & Lenny Turetsky            if (pointerId == id) {
1131dc18ea3dc469aa6ed0d51b7f98f78880fd5725aGlenn Jahnke & Lenny Turetsky                return i;
1141dc18ea3dc469aa6ed0d51b7f98f78880fd5725aGlenn Jahnke & Lenny Turetsky            }
1151dc18ea3dc469aa6ed0d51b7f98f78880fd5725aGlenn Jahnke & Lenny Turetsky        }
1161dc18ea3dc469aa6ed0d51b7f98f78880fd5725aGlenn Jahnke & Lenny Turetsky        return -1;
1171dc18ea3dc469aa6ed0d51b7f98f78880fd5725aGlenn Jahnke & Lenny Turetsky    }
1181dc18ea3dc469aa6ed0d51b7f98f78880fd5725aGlenn Jahnke & Lenny Turetsky
1191dc18ea3dc469aa6ed0d51b7f98f78880fd5725aGlenn Jahnke & Lenny Turetsky    @Implementation
120ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    public final int getActionMasked() {
121ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky        return action;
122ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    }
123ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky
124ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    @Implementation
125ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    public final int getActionIndex() {
126ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky        return pointerIndex;
127ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    }
128ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky
129d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky    @Implementation
130d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky    public final float getPressure(int pointerIndex) {
131d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky        return 1.0f;
132d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky    }
133d6a53292956b595958a0b59786d0ea9eed5b079dGlenn Jahnke & Lenny Turetsky
1340a5ae0648d1be345e04bc429e732170b1942c134Andrew Dai & Wei Wu    @Implementation
1350a5ae0648d1be345e04bc429e732170b1942c134Andrew Dai & Wei Wu    public final void setLocation(float x, float y) {
1360a5ae0648d1be345e04bc429e732170b1942c134Andrew Dai & Wei Wu        this.x[0] = x;
1370a5ae0648d1be345e04bc429e732170b1942c134Andrew Dai & Wei Wu        this.y[0] = y;
1380a5ae0648d1be345e04bc429e732170b1942c134Andrew Dai & Wei Wu    }
1390a5ae0648d1be345e04bc429e732170b1942c134Andrew Dai & Wei Wu
140d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams    public MotionEvent setPointer2(float x, float y) {
141d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        this.x[1] = x;
142d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        this.y[1] = y;
14393d2e533a569470d2901b9d20d9113e3f9761563Michael Portuesi        pointerCount = 2;
144d4e5d32b81cae2114f66739beaac6fe1ceeead0dJosh Lauer & Christian Williams        return realObject;
145924f851cb0ec279b6974744ce623f25bdc657551Ryan Richard    }
146ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky
147ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    public void setPointerIndex(int pointerIndex) {
148ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky        this.pointerIndex = pointerIndex;
149ca99781d0778d4b64a6fa3858924fe31f593ba2cGlenn Jahnke & Lenny Turetsky    }
1507a6a972d9edb203a44ff878da8207889d73e5d3cGlenn Jahnke & Lenny Turetsky
1517a6a972d9edb203a44ff878da8207889d73e5d3cGlenn Jahnke & Lenny Turetsky    public void setPointerIds(int index0PointerId, int index1PointerId) {
1527a6a972d9edb203a44ff878da8207889d73e5d3cGlenn Jahnke & Lenny Turetsky        pointerIds[0] = index0PointerId;
1537a6a972d9edb203a44ff878da8207889d73e5d3cGlenn Jahnke & Lenny Turetsky        pointerIds[1] = index1PointerId;
1547a6a972d9edb203a44ff878da8207889d73e5d3cGlenn Jahnke & Lenny Turetsky    }
155315e61dd716c47d1f4daef379c559d362ae22deeTyler Schultz}
156