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