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