118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhupackage com.android.uiautomator.core; 218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.accessibilityservice.AccessibilityServiceInfo; 418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.ActivityManager; 518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.ActivityManagerNative; 618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.IActivityController; 718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.IActivityManager; 818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.UiAutomation; 918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.UiAutomationConnection; 1018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.content.Intent; 1118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.HandlerThread; 1218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.RemoteException; 1318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 1418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu/** 1518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @hide 1618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 1718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhupublic class UiAutomationShellWrapper { 1818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 1918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private static final String HANDLER_THREAD_NAME = "UiAutomatorHandlerThread"; 2018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 2118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private final HandlerThread mHandlerThread = new HandlerThread(HANDLER_THREAD_NAME); 2218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 2318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private UiAutomation mUiAutomation; 2418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 2518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public void connect() { 2618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if (mHandlerThread.isAlive()) { 2718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu throw new IllegalStateException("Already connected!"); 2818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 2918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mHandlerThread.start(); 3018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mUiAutomation = new UiAutomation(mHandlerThread.getLooper(), 3118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu new UiAutomationConnection()); 3218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mUiAutomation.connect(); 3318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 3418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 3618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Enable or disable monkey test mode. 3718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 3818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Setting test as "monkey" indicates to some applications that a test framework is 3918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * running as a "monkey" type. Such applications may choose not to perform actions that 4018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * do submits so to avoid allowing monkey tests from doing harm or performing annoying 4118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * actions such as dialing 911 or posting messages to public forums, etc. 4218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 4318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @param isSet True to set as monkey test. False to set as regular functional test (default). 4418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @see {@link ActivityManager#isUserAMonkey()} 4518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 4618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public void setRunAsMonkey(boolean isSet) { 4718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu IActivityManager am = ActivityManagerNative.getDefault(); 4818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if (am == null) { 4918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu throw new RuntimeException("Can't manage monkey status; is the system running?"); 5018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 5118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu try { 5218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if (isSet) { 5318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu am.setActivityController(new DummyActivityController()); 5418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } else { 5518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu am.setActivityController(null); 5618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 5718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } catch (RemoteException e) { 5818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu throw new RuntimeException(e); 5918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 6018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 6118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 6218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public void disconnect() { 6318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if (!mHandlerThread.isAlive()) { 6418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu throw new IllegalStateException("Already disconnected!"); 6518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 6618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mUiAutomation.disconnect(); 6718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mHandlerThread.quit(); 6818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 6918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 7018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public UiAutomation getUiAutomation() { 7118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return mUiAutomation; 7218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 7318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 7418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public void setCompressedLayoutHierarchy(boolean compressed) { 7518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu AccessibilityServiceInfo info = mUiAutomation.getServiceInfo(); 7618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if (compressed) 7718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu info.flags &= ~AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; 7818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu else 7918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; 8018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mUiAutomation.setServiceInfo(info); 8118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 8218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 8318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 8418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Dummy, no interference, activity controller. 8518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 8618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private class DummyActivityController extends IActivityController.Stub { 8718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 8818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public boolean activityStarting(Intent intent, String pkg) throws RemoteException { 8918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /* do nothing and let activity proceed normally */ 9018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return true; 9118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 9218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 9318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 9418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public boolean activityResuming(String pkg) throws RemoteException { 9518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /* do nothing and let activity proceed normally */ 9618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return true; 9718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 9818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 9918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 10018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public boolean appCrashed(String processName, int pid, String shortMsg, String longMsg, 10118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu long timeMillis, String stackTrace) throws RemoteException { 10218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /* do nothing and let activity proceed normally */ 10318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return true; 10418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 10518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 10618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 10718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public int appEarlyNotResponding(String processName, int pid, String annotation) 10818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu throws RemoteException { 10918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /* do nothing and let activity proceed normally */ 11018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return 0; 11118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 11218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 11318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 11418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public int appNotResponding(String processName, int pid, String processStats) 11518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu throws RemoteException { 11618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /* do nothing and let activity proceed normally */ 11718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return 0; 11818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 11918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 12018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 12118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public int systemNotResponding(String message) 12218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu throws RemoteException { 12318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /* do nothing and let system proceed normally */ 12418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return 0; 12518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 12618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 12718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu} 128