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