| 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(); |
| } |