mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-01 06:35:42 +00:00
4a207df851
--HG-- rename : build/mobile/robocop/Actions.java.in => build/mobile/robocop/Actions.java rename : build/mobile/robocop/Assert.java.in => build/mobile/robocop/Assert.java rename : build/mobile/robocop/Driver.java.in => build/mobile/robocop/Driver.java rename : build/mobile/robocop/Element.java.in => build/mobile/robocop/Element.java rename : build/mobile/robocop/FennecInstrumentationTestRunner.java.in => build/mobile/robocop/FennecInstrumentationTestRunner.java rename : build/mobile/robocop/FennecMochitestAssert.java.in => build/mobile/robocop/FennecMochitestAssert.java rename : build/mobile/robocop/FennecNativeActions.java.in => build/mobile/robocop/FennecNativeActions.java rename : build/mobile/robocop/FennecNativeDriver.java.in => build/mobile/robocop/FennecNativeDriver.java rename : build/mobile/robocop/FennecNativeElement.java.in => build/mobile/robocop/FennecNativeElement.java rename : build/mobile/robocop/FennecTalosAssert.java.in => build/mobile/robocop/FennecTalosAssert.java rename : build/mobile/robocop/PaintedSurface.java.in => build/mobile/robocop/PaintedSurface.java rename : build/mobile/robocop/RoboCopException.java.in => build/mobile/robocop/RoboCopException.java rename : build/mobile/robocop/RobocopUtils.java.in => build/mobile/robocop/RobocopUtils.java rename : mobile/android/base/tests/AboutHomeTest.java.in => mobile/android/base/tests/AboutHomeTest.java rename : mobile/android/base/tests/BaseTest.java.in => mobile/android/base/tests/BaseTest.java rename : mobile/android/base/tests/ContentContextMenuTest.java.in => mobile/android/base/tests/ContentContextMenuTest.java rename : mobile/android/base/tests/ContentProviderTest.java.in => mobile/android/base/tests/ContentProviderTest.java rename : mobile/android/base/tests/DatabaseHelper.java.in => mobile/android/base/tests/DatabaseHelper.java rename : mobile/android/base/tests/JavascriptTest.java.in => mobile/android/base/tests/JavascriptTest.java rename : mobile/android/base/tests/MotionEventHelper.java.in => mobile/android/base/tests/MotionEventHelper.java rename : mobile/android/base/tests/MotionEventReplayer.java.in => mobile/android/base/tests/MotionEventReplayer.java rename : mobile/android/base/tests/PixelTest.java.in => mobile/android/base/tests/PixelTest.java rename : mobile/android/base/tests/StringHelper.java.in => mobile/android/base/tests/StringHelper.java rename : mobile/android/base/tests/testAboutPage.java.in => mobile/android/base/tests/testAboutPage.java rename : mobile/android/base/tests/testAddSearchEngine.java.in => mobile/android/base/tests/testAddSearchEngine.java rename : mobile/android/base/tests/testAddonManager.java.in => mobile/android/base/tests/testAddonManager.java rename : mobile/android/base/tests/testAwesomebar.java.in => mobile/android/base/tests/testAwesomebar.java rename : mobile/android/base/tests/testAwesomebarSwipes.java.in => mobile/android/base/tests/testAwesomebarSwipes.java rename : mobile/android/base/tests/testAxisLocking.java.in => mobile/android/base/tests/testAxisLocking.java rename : mobile/android/base/tests/testBookmark.java.in => mobile/android/base/tests/testBookmark.java rename : mobile/android/base/tests/testBookmarkFolders.java.in => mobile/android/base/tests/testBookmarkFolders.java rename : mobile/android/base/tests/testBookmarkKeyword.java.in => mobile/android/base/tests/testBookmarkKeyword.java rename : mobile/android/base/tests/testBookmarklets.java.in => mobile/android/base/tests/testBookmarklets.java rename : mobile/android/base/tests/testBookmarksPage.java.in => mobile/android/base/tests/testBookmarksPage.java rename : mobile/android/base/tests/testBrowserProvider.java.in => mobile/android/base/tests/testBrowserProvider.java rename : mobile/android/base/tests/testBrowserProviderPerf.java.in => mobile/android/base/tests/testBrowserProviderPerf.java rename : mobile/android/base/tests/testBrowserSearchVisibility.java.in => mobile/android/base/tests/testBrowserSearchVisibility.java rename : mobile/android/base/tests/testCheck.java.in => mobile/android/base/tests/testCheck.java rename : mobile/android/base/tests/testCheck2.java.in => mobile/android/base/tests/testCheck2.java rename : mobile/android/base/tests/testClearPrivateData.java.in => mobile/android/base/tests/testClearPrivateData.java rename : mobile/android/base/tests/testDeviceSearchEngine.java.in => mobile/android/base/tests/testDeviceSearchEngine.java rename : mobile/android/base/tests/testDistribution.java.in => mobile/android/base/tests/testDistribution.java rename : mobile/android/base/tests/testDoorHanger.java.in => mobile/android/base/tests/testDoorHanger.java rename : mobile/android/base/tests/testFindInPage.java.in => mobile/android/base/tests/testFindInPage.java rename : mobile/android/base/tests/testFlingCorrectness.java.in => mobile/android/base/tests/testFlingCorrectness.java rename : mobile/android/base/tests/testFormHistory.java.in => mobile/android/base/tests/testFormHistory.java rename : mobile/android/base/tests/testGetUserMedia.java.in => mobile/android/base/tests/testGetUserMedia.java rename : mobile/android/base/tests/testHistory.java.in => mobile/android/base/tests/testHistory.java rename : mobile/android/base/tests/testHomeBanner.java.in => mobile/android/base/tests/testHomeBanner.java rename : mobile/android/base/tests/testImportFromAndroid.java.in => mobile/android/base/tests/testImportFromAndroid.java rename : mobile/android/base/tests/testInputUrlBar.java.in => mobile/android/base/tests/testInputUrlBar.java rename : mobile/android/base/tests/testJNI.java.in => mobile/android/base/tests/testJNI.java rename : mobile/android/base/tests/testJarReader.java.in => mobile/android/base/tests/testJarReader.java rename : mobile/android/base/tests/testLinkContextMenu.java.in => mobile/android/base/tests/testLinkContextMenu.java rename : mobile/android/base/tests/testLoad.java.in => mobile/android/base/tests/testLoad.java rename : mobile/android/base/tests/testMailToContextMenu.java.in => mobile/android/base/tests/testMailToContextMenu.java rename : mobile/android/base/tests/testMasterPassword.java.in => mobile/android/base/tests/testMasterPassword.java rename : mobile/android/base/tests/testNewTab.java.in => mobile/android/base/tests/testNewTab.java rename : mobile/android/base/tests/testOrderedBroadcast.java.in => mobile/android/base/tests/testOrderedBroadcast.java rename : mobile/android/base/tests/testOverscroll.java.in => mobile/android/base/tests/testOverscroll.java rename : mobile/android/base/tests/testPan.java.in => mobile/android/base/tests/testPan.java rename : mobile/android/base/tests/testPanCorrectness.java.in => mobile/android/base/tests/testPanCorrectness.java rename : mobile/android/base/tests/testPasswordEncrypt.java.in => mobile/android/base/tests/testPasswordEncrypt.java rename : mobile/android/base/tests/testPasswordProvider.java.in => mobile/android/base/tests/testPasswordProvider.java rename : mobile/android/base/tests/testPermissions.java.in => mobile/android/base/tests/testPermissions.java rename : mobile/android/base/tests/testPictureLinkContextMenu.java.in => mobile/android/base/tests/testPictureLinkContextMenu.java rename : mobile/android/base/tests/testPrefsObserver.java.in => mobile/android/base/tests/testPrefsObserver.java rename : mobile/android/base/tests/testPrivateBrowsing.java.in => mobile/android/base/tests/testPrivateBrowsing.java rename : mobile/android/base/tests/testPromptGridInput.java.in => mobile/android/base/tests/testPromptGridInput.java rename : mobile/android/base/tests/testReaderMode.java.in => mobile/android/base/tests/testReaderMode.java rename : mobile/android/base/tests/testSearchSuggestions.java.in => mobile/android/base/tests/testSearchSuggestions.java rename : mobile/android/base/tests/testSettingsMenuItems.java.in => mobile/android/base/tests/testSettingsMenuItems.java rename : mobile/android/base/tests/testShareLink.java.in => mobile/android/base/tests/testShareLink.java rename : mobile/android/base/tests/testSharedPreferences.java.in => mobile/android/base/tests/testSharedPreferences.java rename : mobile/android/base/tests/testSystemPages.java.in => mobile/android/base/tests/testSystemPages.java rename : mobile/android/base/tests/testTabHistory.java.in => mobile/android/base/tests/testTabHistory.java rename : mobile/android/base/tests/testThumbnails.java.in => mobile/android/base/tests/testThumbnails.java rename : mobile/android/base/tests/testVkbOverlap.java.in => mobile/android/base/tests/testVkbOverlap.java rename : mobile/android/base/tests/test_bug720538.java.in => mobile/android/base/tests/test_bug720538.java extra : rebase_source : c8d715aa110b07c6010054a674879e143a5f04e7 extra : amend_source : fb5714b78e055e336b5e0c6a0da8eb8c931ff09e extra : histedit_source : ec57d8ba94000092438a2ba0bf4fb66091e98513%2C114ade72bb9b72b96557da74f1179734fa347e5c
145 lines
5.9 KiB
Java
145 lines
5.9 KiB
Java
package org.mozilla.gecko.tests;
|
|
|
|
import android.app.Instrumentation;
|
|
import android.os.SystemClock;
|
|
import android.util.FloatMath;
|
|
import android.util.Log;
|
|
import android.view.MotionEvent;
|
|
|
|
class MotionEventHelper {
|
|
private static final String LOGTAG = "RobocopMotionEventHelper";
|
|
|
|
private static final long DRAG_EVENTS_PER_SECOND = 20; // 20 move events per second when doing a drag
|
|
|
|
private final Instrumentation mInstrumentation;
|
|
private final int mSurfaceOffsetX;
|
|
private final int mSurfaceOffsetY;
|
|
|
|
public MotionEventHelper(Instrumentation inst, int surfaceOffsetX, int surfaceOffsetY) {
|
|
mInstrumentation = inst;
|
|
mSurfaceOffsetX = surfaceOffsetX;
|
|
mSurfaceOffsetY = surfaceOffsetY;
|
|
Log.i(LOGTAG, "Initialized using offset (" + mSurfaceOffsetX + "," + mSurfaceOffsetY + ")");
|
|
}
|
|
|
|
public long down(float x, float y) {
|
|
Log.d(LOGTAG, "Triggering down at (" + x + "," + y + ")");
|
|
long downTime = SystemClock.uptimeMillis();
|
|
MotionEvent event = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, mSurfaceOffsetX + x, mSurfaceOffsetY + y, 0);
|
|
mInstrumentation.sendPointerSync(event);
|
|
return downTime;
|
|
}
|
|
|
|
public long move(long downTime, float x, float y) {
|
|
return move(downTime, SystemClock.uptimeMillis(), x, y);
|
|
}
|
|
|
|
public long move(long downTime, long moveTime, float x, float y) {
|
|
Log.d(LOGTAG, "Triggering move to (" + x + "," + y + ")");
|
|
MotionEvent event = MotionEvent.obtain(downTime, moveTime, MotionEvent.ACTION_MOVE, mSurfaceOffsetX + x, mSurfaceOffsetY + y, 0);
|
|
mInstrumentation.sendPointerSync(event);
|
|
return downTime;
|
|
}
|
|
|
|
public long up(long downTime, float x, float y) {
|
|
return up(downTime, SystemClock.uptimeMillis(), x, y);
|
|
}
|
|
|
|
public long up(long downTime, long upTime, float x, float y) {
|
|
Log.d(LOGTAG, "Triggering up at (" + x + "," + y + ")");
|
|
MotionEvent event = MotionEvent.obtain(downTime, upTime, MotionEvent.ACTION_UP, mSurfaceOffsetX + x, mSurfaceOffsetY + y, 0);
|
|
mInstrumentation.sendPointerSync(event);
|
|
return -1L;
|
|
}
|
|
|
|
public Thread dragAsync(final float startX, final float startY, final float endX, final float endY, final long durationMillis) {
|
|
Thread t = new Thread() {
|
|
@Override
|
|
public void run() {
|
|
int numEvents = (int)(durationMillis * DRAG_EVENTS_PER_SECOND / 1000);
|
|
float eventDx = (endX - startX) / numEvents;
|
|
float eventDy = (endY - startY) / numEvents;
|
|
long downTime = down(startX, startY);
|
|
for (int i = 0; i < numEvents - 1; i++) {
|
|
downTime = move(downTime, startX + (eventDx * i), startY + (eventDy * i));
|
|
try {
|
|
Thread.sleep(1000L / DRAG_EVENTS_PER_SECOND);
|
|
} catch (InterruptedException ie) {
|
|
ie.printStackTrace();
|
|
}
|
|
}
|
|
// sleep a bit before sending the last move so that the calculated
|
|
// fling velocity is low and we don't end up doing a fling afterwards.
|
|
try {
|
|
Thread.sleep(1000L);
|
|
} catch (InterruptedException ie) {
|
|
ie.printStackTrace();
|
|
}
|
|
// do the last one using endX/endY directly to avoid rounding errors
|
|
downTime = move(downTime, endX, endY);
|
|
downTime = up(downTime, endX, endY);
|
|
}
|
|
};
|
|
t.start();
|
|
return t;
|
|
}
|
|
|
|
public void dragSync(float startX, float startY, float endX, float endY, long durationMillis) {
|
|
try {
|
|
dragAsync(startX, startY, endX, endY, durationMillis).join();
|
|
mInstrumentation.waitForIdleSync();
|
|
} catch (InterruptedException ie) {
|
|
ie.printStackTrace();
|
|
}
|
|
}
|
|
|
|
public void dragSync(float startX, float startY, float endX, float endY) {
|
|
dragSync(startX, startY, endX, endY, 1000);
|
|
}
|
|
|
|
public Thread flingAsync(final float startX, final float startY, final float endX, final float endY, final float velocity) {
|
|
// note that the first move after the touch-down is used to get over the panning threshold, and
|
|
// is basically cancelled out. this means we need to generate (at least) two move events, with
|
|
// the last move event hitting the target velocity. to do this we just slice the total distance
|
|
// in half, assuming the first half will get us over the panning threshold and the second half
|
|
// will trigger the fling.
|
|
final float dx = (endX - startX) / 2;
|
|
final float dy = (endY - startY) / 2;
|
|
float distance = FloatMath.sqrt((dx * dx) + (dy * dy));
|
|
final long time = (long)(distance / velocity);
|
|
if (time <= 0) {
|
|
throw new IllegalArgumentException( "Fling parameters require too small a time period" );
|
|
}
|
|
Thread t = new Thread() {
|
|
@Override
|
|
public void run() {
|
|
long downTime = down(startX, startY);
|
|
downTime = move(downTime, downTime + time, startX + dx, startY + dy);
|
|
downTime = move(downTime, downTime + time + time, endX, endY);
|
|
downTime = up(downTime, downTime + time, endX, endY);
|
|
}
|
|
};
|
|
t.start();
|
|
return t;
|
|
}
|
|
|
|
public void flingSync(float startX, float startY, float endX, float endY, float velocity) {
|
|
try {
|
|
flingAsync(startX, startY, endX, endY, velocity).join();
|
|
mInstrumentation.waitForIdleSync();
|
|
} catch (InterruptedException ie) {
|
|
ie.printStackTrace();
|
|
}
|
|
}
|
|
|
|
public void tap(float x, float y) {
|
|
long downTime = down(x, y);
|
|
downTime = up(downTime, x, y);
|
|
}
|
|
|
|
public void doubleTap(float x, float y) {
|
|
tap(x, y);
|
|
tap(x, y);
|
|
}
|
|
}
|