diff options
Diffstat (limited to 'src/com/android/uiautomator/core/UiAutomatorBridge.java')
-rw-r--r-- | src/com/android/uiautomator/core/UiAutomatorBridge.java | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/src/com/android/uiautomator/core/UiAutomatorBridge.java b/src/com/android/uiautomator/core/UiAutomatorBridge.java new file mode 100644 index 0000000..bc5bc8e --- /dev/null +++ b/src/com/android/uiautomator/core/UiAutomatorBridge.java @@ -0,0 +1,143 @@ +package com.android.uiautomator.core; + +import android.accessibilityservice.AccessibilityServiceInfo; +import android.app.UiAutomation; +import android.app.UiAutomation.AccessibilityEventFilter; +import android.app.UiAutomation.OnAccessibilityEventListener; +import android.graphics.Bitmap; +import android.util.Log; +import android.view.Display; +import android.view.InputEvent; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +/** + * @hide + */ +public abstract class UiAutomatorBridge { + + private static final String LOG_TAG = UiAutomatorBridge.class.getSimpleName(); + + /** + * This value has the greatest bearing on the appearance of test execution speeds. + * This value is used as the minimum time to wait before considering the UI idle after + * each action. + */ + private static final long QUIET_TIME_TO_BE_CONSIDERD_IDLE_STATE = 500;//ms + + /** + * This is the maximum time the automation will wait for the UI to go idle. Execution + * will resume normally anyway. This is to prevent waiting forever on display updates + * that may be related to spinning wheels or progress updates of sorts etc... + */ + private static final long TOTAL_TIME_TO_WAIT_FOR_IDLE_STATE = 1000 * 10;//ms + + private final UiAutomation mUiAutomation; + + private final InteractionController mInteractionController; + + private final QueryController mQueryController; + + UiAutomatorBridge(UiAutomation uiAutomation) { + mUiAutomation = uiAutomation; + mInteractionController = new InteractionController(this); + mQueryController = new QueryController(this); + } + + InteractionController getInteractionController() { + return mInteractionController; + } + + QueryController getQueryController() { + return mQueryController; + } + + public void setOnAccessibilityEventListener(OnAccessibilityEventListener listener) { + mUiAutomation.setOnAccessibilityEventListener(listener); + } + + public AccessibilityNodeInfo getRootInActiveWindow() { + return mUiAutomation.getRootInActiveWindow(); + } + + public boolean injectInputEvent(InputEvent event, boolean sync) { + return mUiAutomation.injectInputEvent(event, sync); + } + + public boolean setRotation(int rotation) { + return mUiAutomation.setRotation(rotation); + } + + public void setCompressedLayoutHierarchy(boolean compressed) { + AccessibilityServiceInfo info = mUiAutomation.getServiceInfo(); + if (compressed) + info.flags &= ~AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; + else + info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; + mUiAutomation.setServiceInfo(info); + } + + public abstract int getRotation(); + + public abstract boolean isScreenOn(); + + public void waitForIdle() { + waitForIdle(TOTAL_TIME_TO_WAIT_FOR_IDLE_STATE); + } + + public void waitForIdle(long timeout) { + try { + mUiAutomation.waitForIdle(QUIET_TIME_TO_BE_CONSIDERD_IDLE_STATE, timeout); + } catch (TimeoutException te) { + Log.w(LOG_TAG, "Could not detect idle state.", te); + } + } + + public AccessibilityEvent executeCommandAndWaitForAccessibilityEvent(Runnable command, + AccessibilityEventFilter filter, long timeoutMillis) throws TimeoutException { + return mUiAutomation.executeAndWaitForEvent(command, + filter, timeoutMillis); + } + + public boolean takeScreenshot(File storePath, int quality) { + Bitmap screenshot = mUiAutomation.takeScreenshot(); + if (screenshot == null) { + return false; + } + BufferedOutputStream bos = null; + try { + bos = new BufferedOutputStream(new FileOutputStream(storePath)); + if (bos != null) { + screenshot.compress(Bitmap.CompressFormat.PNG, quality, bos); + bos.flush(); + } + } catch (IOException ioe) { + Log.e(LOG_TAG, "failed to save screen shot to file", ioe); + return false; + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException ioe) { + /* ignore */ + } + } + screenshot.recycle(); + } + return true; + } + + public boolean performGlobalAction(int action) { + return mUiAutomation.performGlobalAction(action); + } + + public abstract Display getDefaultDisplay(); + + public abstract long getSystemLongPressTime(); +} |