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