1e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu/*
2e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Copyright (C) 2012 The Android Open Source Project
3e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu *
4e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Licensed under the Apache License, Version 2.0 (the "License");
5e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * you may not use this file except in compliance with the License.
6e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * You may obtain a copy of the License at
7e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu *
8e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu *      http://www.apache.org/licenses/LICENSE-2.0
9e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu *
10e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * Unless required by applicable law or agreed to in writing, software
11e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * distributed under the License is distributed on an "AS IS" BASIS,
12e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * See the License for the specific language governing permissions and
14e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * limitations under the License.
15e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */
16e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
17e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhupackage com.android.uiautomator.testrunner;
18e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
19e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport android.content.Context;
20e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport android.os.Bundle;
21e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport android.os.RemoteException;
22e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport android.os.ServiceManager;
23e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport android.os.SystemClock;
24e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport android.view.inputmethod.InputMethodInfo;
25e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
26e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport com.android.internal.view.IInputMethodManager;
27e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport com.android.uiautomator.core.UiDevice;
28e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
29e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport junit.framework.TestCase;
30e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
31e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhuimport java.util.List;
32e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
33e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu/**
34e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * UI automation test should extend this class. This class provides access
35e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * to the following:
36e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * {@link UiDevice} instance
37e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu * {@link Bundle} for command line parameters.
38e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */
39e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhupublic class UiAutomatorTestCase extends TestCase {
40e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
41e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    private static final String DISABLE_IME = "disable_ime";
42e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    private static final String DUMMY_IME_PACKAGE = "com.android.testing.dummyime";
43e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    private UiDevice mUiDevice;
44e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    private Bundle mParams;
45e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    private IAutomationSupport mAutomationSupport;
46e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    private boolean mShouldDisableIme = false;
47e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
48e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    @Override
49e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    protected void setUp() throws Exception {
50e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        super.setUp();
51e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        mShouldDisableIme = "true".equals(mParams.getString(DISABLE_IME));
52e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        if (mShouldDisableIme) {
53e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu            setDummyIme();
54e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        }
55e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
56e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
57e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    @Override
58e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    protected void tearDown() throws Exception {
59e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        if (mShouldDisableIme) {
60e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu            restoreActiveIme();
61e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        }
62e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        super.tearDown();
63e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
64e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
65e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    /**
66e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * Get current instance of {@link UiDevice}. Works similar to calling the static
67e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * {@link UiDevice#getInstance()} from anywhere in the test classes.
68e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     */
69e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    public UiDevice getUiDevice() {
70e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        return mUiDevice;
71e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
72e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
73e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    /**
74e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * Get command line parameters. On the command line when passing <code>-e key value</code>
75e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * pairs, the {@link Bundle} will have the key value pairs conveniently available to the
76e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * tests.
77e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     */
78e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    public Bundle getParams() {
79e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        return mParams;
80e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
81e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
82e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    /**
83e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * Provides support for running tests to report interim status
84e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     *
85e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * @return
86e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     */
87e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    public IAutomationSupport getAutomationSupport() {
88e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        return mAutomationSupport;
89e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
90e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
91e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    /**
92e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * package private
93e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * @param uiDevice
94e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     */
95e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    void setUiDevice(UiDevice uiDevice) {
96e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        mUiDevice = uiDevice;
97e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
98e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
99e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    /**
100e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * package private
101e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * @param params
102e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     */
103e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    void setParams(Bundle params) {
104e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        mParams = params;
105e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
106e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
107e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    void setAutomationSupport(IAutomationSupport automationSupport) {
108e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        mAutomationSupport = automationSupport;
109e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
110e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
111e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    /**
112e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * Calls {@link SystemClock#sleep(long)} to sleep
113e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * @param ms is in milliseconds.
114e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     */
115e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    public void sleep(long ms) {
116e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        SystemClock.sleep(ms);
117e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
118e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
119f612e6a05f47b28ae0f5715545658c08dd759dd7Guang Zhu    private void setDummyIme() throws RemoteException {
120e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        IInputMethodManager im = IInputMethodManager.Stub.asInterface(ServiceManager
121e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu                .getService(Context.INPUT_METHOD_SERVICE));
122e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        List<InputMethodInfo> infos = im.getInputMethodList();
123e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        String id = null;
124e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        for (InputMethodInfo info : infos) {
125e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu            if (DUMMY_IME_PACKAGE.equals(info.getComponent().getPackageName())) {
126e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu                id = info.getId();
127e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu            }
128e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        }
129e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        if (id == null) {
130e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu            throw new RuntimeException(String.format(
131e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu                    "Required testing fixture missing: IME package (%s)", DUMMY_IME_PACKAGE));
132e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        }
133e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        im.setInputMethod(null, id);
134e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
135e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
136f612e6a05f47b28ae0f5715545658c08dd759dd7Guang Zhu    private void restoreActiveIme() throws RemoteException {
137e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        // TODO: figure out a way to restore active IME
138e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        // Currently retrieving active IME requires querying secure settings provider, which is hard
139e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        // to do without a Context; so the caveat here is that to make the post test device usable,
140e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        // the active IME needs to be manually switched.
141e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
142e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu}
143