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