| package com.android.uiautomator.core; |
| |
| import android.accessibilityservice.AccessibilityServiceInfo; |
| import android.app.ActivityManager; |
| import android.app.ActivityManagerNative; |
| import android.app.IActivityController; |
| import android.app.IActivityManager; |
| import android.app.UiAutomation; |
| import android.app.UiAutomationConnection; |
| import android.content.Intent; |
| import android.os.HandlerThread; |
| import android.os.RemoteException; |
| |
| /** |
| * @hide |
| */ |
| public class UiAutomationShellWrapper { |
| |
| private static final String HANDLER_THREAD_NAME = "UiAutomatorHandlerThread"; |
| |
| private final HandlerThread mHandlerThread = new HandlerThread(HANDLER_THREAD_NAME); |
| |
| private UiAutomation mUiAutomation; |
| |
| public void connect() { |
| if (mHandlerThread.isAlive()) { |
| throw new IllegalStateException("Already connected!"); |
| } |
| mHandlerThread.start(); |
| mUiAutomation = new UiAutomation(mHandlerThread.getLooper(), |
| new UiAutomationConnection()); |
| mUiAutomation.connect(); |
| } |
| |
| /** |
| * Enable or disable monkey test mode. |
| * |
| * Setting test as "monkey" indicates to some applications that a test framework is |
| * running as a "monkey" type. Such applications may choose not to perform actions that |
| * do submits so to avoid allowing monkey tests from doing harm or performing annoying |
| * actions such as dialing 911 or posting messages to public forums, etc. |
| * |
| * @param isSet True to set as monkey test. False to set as regular functional test (default). |
| * @see {@link ActivityManager#isUserAMonkey()} |
| */ |
| public void setRunAsMonkey(boolean isSet) { |
| IActivityManager am = ActivityManagerNative.getDefault(); |
| if (am == null) { |
| throw new RuntimeException("Can't manage monkey status; is the system running?"); |
| } |
| try { |
| if (isSet) { |
| am.setActivityController(new DummyActivityController()); |
| } else { |
| am.setActivityController(null); |
| } |
| } catch (RemoteException e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| public void disconnect() { |
| if (!mHandlerThread.isAlive()) { |
| throw new IllegalStateException("Already disconnected!"); |
| } |
| mUiAutomation.disconnect(); |
| mHandlerThread.quit(); |
| } |
| |
| public UiAutomation getUiAutomation() { |
| return mUiAutomation; |
| } |
| |
| 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); |
| } |
| |
| /** |
| * Dummy, no interference, activity controller. |
| */ |
| private class DummyActivityController extends IActivityController.Stub { |
| @Override |
| public boolean activityStarting(Intent intent, String pkg) throws RemoteException { |
| /* do nothing and let activity proceed normally */ |
| return true; |
| } |
| |
| @Override |
| public boolean activityResuming(String pkg) throws RemoteException { |
| /* do nothing and let activity proceed normally */ |
| return true; |
| } |
| |
| @Override |
| public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg, |
| long timeMillis, String stackTrace) throws RemoteException { |
| /* do nothing and let activity proceed normally */ |
| return true; |
| } |
| |
| @Override |
| public int appEarlyNotResponding(String processName, int pid, String annotation) |
| throws RemoteException { |
| /* do nothing and let activity proceed normally */ |
| return 0; |
| } |
| |
| @Override |
| public int appNotResponding(String processName, int pid, String processStats) |
| throws RemoteException { |
| /* do nothing and let activity proceed normally */ |
| return 0; |
| } |
| |
| @Override |
| public int systemNotResponding(String message) |
| throws RemoteException { |
| /* do nothing and let system proceed normally */ |
| return 0; |
| } |
| } |
| } |