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.
38dbba713661688a285e701a006ce2d199296ac328Guang Zhu * @since API Level 16
39e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu */
40e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhupublic class UiAutomatorTestCase extends TestCase {
41e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
42e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    private static final String DISABLE_IME = "disable_ime";
43e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    private static final String DUMMY_IME_PACKAGE = "com.android.testing.dummyime";
44e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    private UiDevice mUiDevice;
45e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    private Bundle mParams;
46e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    private IAutomationSupport mAutomationSupport;
47e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    private boolean mShouldDisableIme = false;
48e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
49e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    @Override
50e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    protected void setUp() throws Exception {
51e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        super.setUp();
52e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        mShouldDisableIme = "true".equals(mParams.getString(DISABLE_IME));
53e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        if (mShouldDisableIme) {
54e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu            setDummyIme();
55e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        }
56e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
57e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
58e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    @Override
59e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    protected void tearDown() throws Exception {
60e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        if (mShouldDisableIme) {
61e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu            restoreActiveIme();
62e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        }
63e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        super.tearDown();
64e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
65e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
66e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    /**
67e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * Get current instance of {@link UiDevice}. Works similar to calling the static
68e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * {@link UiDevice#getInstance()} from anywhere in the test classes.
69dbba713661688a285e701a006ce2d199296ac328Guang Zhu     * @since API Level 16
70e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     */
71e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    public UiDevice getUiDevice() {
72e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        return mUiDevice;
73e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
74e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
75e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    /**
76e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * Get command line parameters. On the command line when passing <code>-e key value</code>
77e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * pairs, the {@link Bundle} will have the key value pairs conveniently available to the
78e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * tests.
79dbba713661688a285e701a006ce2d199296ac328Guang Zhu     * @since API Level 16
80e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     */
81e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    public Bundle getParams() {
82e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        return mParams;
83e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
84e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
85e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    /**
86e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * Provides support for running tests to report interim status
87e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     *
881893caed0ad4e73b0676f206282d490c2d345316Thanh Le     * @return IAutomationSupport
89dbba713661688a285e701a006ce2d199296ac328Guang Zhu     * @since API Level 16
90e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     */
91e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    public IAutomationSupport getAutomationSupport() {
92e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        return mAutomationSupport;
93e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
94e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
95e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    /**
96e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * package private
97e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * @param uiDevice
98e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     */
99e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    void setUiDevice(UiDevice uiDevice) {
100e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        mUiDevice = uiDevice;
101e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
102e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
103e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    /**
104e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * package private
105e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * @param params
106e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     */
107e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    void setParams(Bundle params) {
108e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        mParams = params;
109e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
110e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
111e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    void setAutomationSupport(IAutomationSupport automationSupport) {
112e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        mAutomationSupport = automationSupport;
113e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
114e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
115e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    /**
116e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * Calls {@link SystemClock#sleep(long)} to sleep
117e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     * @param ms is in milliseconds.
118dbba713661688a285e701a006ce2d199296ac328Guang Zhu     * @since API Level 16
119e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu     */
120e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    public void sleep(long ms) {
121e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        SystemClock.sleep(ms);
122e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
123e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
124f612e6a05f47b28ae0f5715545658c08dd759dd7Guang Zhu    private void setDummyIme() throws RemoteException {
125e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        IInputMethodManager im = IInputMethodManager.Stub.asInterface(ServiceManager
126e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu                .getService(Context.INPUT_METHOD_SERVICE));
127e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        List<InputMethodInfo> infos = im.getInputMethodList();
128e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        String id = null;
129e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        for (InputMethodInfo info : infos) {
130e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu            if (DUMMY_IME_PACKAGE.equals(info.getComponent().getPackageName())) {
131e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu                id = info.getId();
132e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu            }
133e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        }
134e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        if (id == null) {
135e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu            throw new RuntimeException(String.format(
136e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu                    "Required testing fixture missing: IME package (%s)", DUMMY_IME_PACKAGE));
137e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        }
138e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        im.setInputMethod(null, id);
139e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
140e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu
141f612e6a05f47b28ae0f5715545658c08dd759dd7Guang Zhu    private void restoreActiveIme() throws RemoteException {
142e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        // TODO: figure out a way to restore active IME
143e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        // Currently retrieving active IME requires querying secure settings provider, which is hard
144e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        // to do without a Context; so the caveat here is that to make the post test device usable,
145e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu        // the active IME needs to be manually switched.
146e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu    }
147e54d649fb83a0a44516e5c25a9ac1992c8950e59Guang Zhu}
148