189f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganovpackage com.android.uiautomator.core; 289f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov 34a82ca385244ade0d9a5654d7eb3b7797846a6dbAdam Momtazimport android.accessibilityservice.AccessibilityServiceInfo; 448c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtazimport android.app.ActivityManager; 571aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtazimport android.app.ActivityManagerNative; 671aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtazimport android.app.IActivityController; 771aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtazimport android.app.IActivityManager; 889f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganovimport android.app.UiAutomation; 989f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganovimport android.app.UiAutomationConnection; 1071aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtazimport android.content.Intent; 1189f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganovimport android.os.HandlerThread; 1271aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtazimport android.os.RemoteException; 1389f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov 149222850c1f89377be2935e92310067def5bd0eb9Svetoslav/** 159222850c1f89377be2935e92310067def5bd0eb9Svetoslav * @hide 169222850c1f89377be2935e92310067def5bd0eb9Svetoslav */ 1789f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganovpublic class UiAutomationShellWrapper { 1889f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov 1989f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov private static final String HANDLER_THREAD_NAME = "UiAutomatorHandlerThread"; 2089f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov 2189f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov private final HandlerThread mHandlerThread = new HandlerThread(HANDLER_THREAD_NAME); 2289f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov 2389f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov private UiAutomation mUiAutomation; 2489f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov 2589f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov public void connect() { 2689f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov if (mHandlerThread.isAlive()) { 2789f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov throw new IllegalStateException("Already connected!"); 2889f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov } 2989f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov mHandlerThread.start(); 3089f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov mUiAutomation = new UiAutomation(mHandlerThread.getLooper(), 3189f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov new UiAutomationConnection()); 3289f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov mUiAutomation.connect(); 3389f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov } 3489f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov 3548c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz /** 3648c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz * Enable or disable monkey test mode. 3748c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz * 3848c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz * Setting test as "monkey" indicates to some applications that a test framework is 3948c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz * running as a "monkey" type. Such applications may choose not to perform actions that 4048c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz * do submits so to avoid allowing monkey tests from doing harm or performing annoying 4148c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz * actions such as dialing 911 or posting messages to public forums, etc. 4248c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz * 4348c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz * @param isSet True to set as monkey test. False to set as regular functional test (default). 4448c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz * @see {@link ActivityManager#isUserAMonkey()} 4548c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz */ 4648c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz public void setRunAsMonkey(boolean isSet) { 4771aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz IActivityManager am = ActivityManagerNative.getDefault(); 4871aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz if (am == null) { 4971aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz throw new RuntimeException("Can't manage monkey status; is the system running?"); 5071aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz } 5171aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz try { 5271aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz if (isSet) { 5371aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz am.setActivityController(new DummyActivityController()); 5471aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz } else { 5571aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz am.setActivityController(null); 5671aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz } 5771aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz } catch (RemoteException e) { 5871aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz throw new RuntimeException(e); 5971aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz } 6048c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz } 6148c83ae3e5fc36138a412fc5854d543fffe80376Adam Momtaz 6289f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov public void disconnect() { 6389f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov if (!mHandlerThread.isAlive()) { 6489f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov throw new IllegalStateException("Already disconnected!"); 6589f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov } 6689f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov mUiAutomation.disconnect(); 6789f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov mHandlerThread.quit(); 6889f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov } 6989f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov 7089f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov public UiAutomation getUiAutomation() { 7189f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov return mUiAutomation; 7289f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov } 734a82ca385244ade0d9a5654d7eb3b7797846a6dbAdam Momtaz 744a82ca385244ade0d9a5654d7eb3b7797846a6dbAdam Momtaz public void setCompressedLayoutHierarchy(boolean compressed) { 754a82ca385244ade0d9a5654d7eb3b7797846a6dbAdam Momtaz AccessibilityServiceInfo info = mUiAutomation.getServiceInfo(); 764a82ca385244ade0d9a5654d7eb3b7797846a6dbAdam Momtaz if (compressed) 774a82ca385244ade0d9a5654d7eb3b7797846a6dbAdam Momtaz info.flags &= ~AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; 784a82ca385244ade0d9a5654d7eb3b7797846a6dbAdam Momtaz else 794a82ca385244ade0d9a5654d7eb3b7797846a6dbAdam Momtaz info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; 804a82ca385244ade0d9a5654d7eb3b7797846a6dbAdam Momtaz mUiAutomation.setServiceInfo(info); 814a82ca385244ade0d9a5654d7eb3b7797846a6dbAdam Momtaz } 8271aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz 8371aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz /** 8471aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz * Dummy, no interference, activity controller. 8571aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz */ 8671aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz private class DummyActivityController extends IActivityController.Stub { 8771aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz @Override 8871aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz public boolean activityStarting(Intent intent, String pkg) throws RemoteException { 8971aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz /* do nothing and let activity proceed normally */ 9071aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz return true; 9171aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz } 9271aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz 9371aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz @Override 9471aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz public boolean activityResuming(String pkg) throws RemoteException { 9571aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz /* do nothing and let activity proceed normally */ 9671aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz return true; 9771aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz } 9871aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz 9971aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz @Override 10071aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg, 10171aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz long timeMillis, String stackTrace) throws RemoteException { 10271aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz /* do nothing and let activity proceed normally */ 10371aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz return true; 10471aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz } 10571aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz 10671aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz @Override 10771aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz public int appEarlyNotResponding(String processName, int pid, String annotation) 10871aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz throws RemoteException { 10971aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz /* do nothing and let activity proceed normally */ 11071aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz return 0; 11171aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz } 11271aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz 11371aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz @Override 11471aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz public int appNotResponding(String processName, int pid, String processStats) 11571aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz throws RemoteException { 11671aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz /* do nothing and let activity proceed normally */ 11771aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz return 0; 11871aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz } 119d0f4e83d35fd20d1200a0acb0fe51e6da700137eDianne Hackborn 120d0f4e83d35fd20d1200a0acb0fe51e6da700137eDianne Hackborn @Override 121d0f4e83d35fd20d1200a0acb0fe51e6da700137eDianne Hackborn public int systemNotResponding(String message) 122d0f4e83d35fd20d1200a0acb0fe51e6da700137eDianne Hackborn throws RemoteException { 123d0f4e83d35fd20d1200a0acb0fe51e6da700137eDianne Hackborn /* do nothing and let system proceed normally */ 124d0f4e83d35fd20d1200a0acb0fe51e6da700137eDianne Hackborn return 0; 125d0f4e83d35fd20d1200a0acb0fe51e6da700137eDianne Hackborn } 12671aebfa11443a9a04777cde3d9c7e29cdbb5d447Adam Momtaz } 12789f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov} 128