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