118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu/* 218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Copyright (C) 2013 The Android Open Source Project 318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Licensed under the Apache License, Version 2.0 (the "License"); 518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * you may not use this file except in compliance with the License. 618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * You may obtain a copy of the License at 718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * http://www.apache.org/licenses/LICENSE-2.0 918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 1018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Unless required by applicable law or agreed to in writing, software 1118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * distributed under the License is distributed on an "AS IS" BASIS, 1218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * See the License for the specific language governing permissions and 1418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * limitations under the License. 1518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 1618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhupackage com.android.uiautomator.core; 1718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 1818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu/** 1918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Allows you to set key parameters for running uiautomator tests. The new 2018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * settings take effect immediately and can be changed any time during a test run. 2118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 2218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * To modify parameters using Configurator, first obtain an instance by calling 2318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * {@link #getInstance()}. As a best practice, make sure you always save 2418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * the original value of any parameter that you are modifying. After running your 2518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * tests with the modified parameters, make sure to also restore 2618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * the original parameter values, otherwise this will impact other tests cases. 2718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @since API Level 18 2818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 2918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhupublic final class Configurator { 3018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private long mWaitForIdleTimeout = 10 * 1000; 3118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private long mWaitForSelector = 10 * 1000; 3218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private long mWaitForActionAcknowledgment = 3 * 1000; 3318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // The events for a scroll typically complete even before touchUp occurs. 3518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // This short timeout to make sure we get the very last in cases where the above isn't true. 3618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private long mScrollEventWaitTimeout = 200; // ms 3718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // Default is inject as fast as we can 3918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private long mKeyInjectionDelay = 0; // ms 4018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // reference to self 4218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private static Configurator sConfigurator; 4318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private Configurator() { 4518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /* hide constructor */ 4618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 4718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 4918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Retrieves a singleton instance of Configurator. 5018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 5118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @return Configurator instance 5218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @since API Level 18 5318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 5418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public static Configurator getInstance() { 5518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if (sConfigurator == null) { 5618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu sConfigurator = new Configurator(); 5718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 5818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return sConfigurator; 5918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 6018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 6118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 6218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Sets the timeout for waiting for the user interface to go into an idle 6318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * state before starting a uiautomator action. 6418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 6518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * By default, all core uiautomator objects except {@link UiDevice} will perform 6618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * this wait before starting to search for the widget specified by the 6718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * object's {@link UiSelector}. Once the idle state is detected or the 6818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * timeout elapses (whichever occurs first), the object will start to wait 6918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * for the selector to find a match. 7018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * See {@link #setWaitForSelectorTimeout(long)} 7118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 7218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @param timeout Timeout value in milliseconds 7318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @return self 7418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @since API Level 18 7518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 7618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public Configurator setWaitForIdleTimeout(long timeout) { 7718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mWaitForIdleTimeout = timeout; 7818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return this; 7918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 8018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 8118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 8218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Gets the current timeout used for waiting for the user interface to go 8318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * into an idle state. 8418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 8518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * By default, all core uiautomator objects except {@link UiDevice} will perform 8618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * this wait before starting to search for the widget specified by the 8718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * object's {@link UiSelector}. Once the idle state is detected or the 8818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * timeout elapses (whichever occurs first), the object will start to wait 8918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * for the selector to find a match. 9018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * See {@link #setWaitForSelectorTimeout(long)} 9118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 9218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @return Current timeout value in milliseconds 9318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @since API Level 18 9418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 9518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public long getWaitForIdleTimeout() { 9618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return mWaitForIdleTimeout; 9718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 9818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 9918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 10018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Sets the timeout for waiting for a widget to become visible in the user 10118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * interface so that it can be matched by a selector. 10218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 10318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Because user interface content is dynamic, sometimes a widget may not 10418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * be visible immediately and won't be detected by a selector. This timeout 10518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * allows the uiautomator framework to wait for a match to be found, up until 10618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * the timeout elapses. 10718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 10818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @param timeout Timeout value in milliseconds. 10918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @return self 11018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @since API Level 18 11118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 11218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public Configurator setWaitForSelectorTimeout(long timeout) { 11318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mWaitForSelector = timeout; 11418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return this; 11518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 11618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 11718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 11818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Gets the current timeout for waiting for a widget to become visible in 11918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * the user interface so that it can be matched by a selector. 12018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 12118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Because user interface content is dynamic, sometimes a widget may not 12218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * be visible immediately and won't be detected by a selector. This timeout 12318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * allows the uiautomator framework to wait for a match to be found, up until 12418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * the timeout elapses. 12518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 12618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @return Current timeout value in milliseconds 12718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @since API Level 18 12818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 12918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public long getWaitForSelectorTimeout() { 13018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return mWaitForSelector; 13118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 13218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 13318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 13418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Sets the timeout for waiting for an acknowledgement of an 13518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * uiautomtor scroll swipe action. 13618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 13718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * The acknowledgment is an <a href="http://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html">AccessibilityEvent</a>, 13818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * corresponding to the scroll action, that lets the framework determine if 13918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * the scroll action was successful. Generally, this timeout should not be modified. 14018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * See {@link UiScrollable} 14118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 14218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @param timeout Timeout value in milliseconds 14318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @return self 14418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @since API Level 18 14518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 14618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public Configurator setScrollAcknowledgmentTimeout(long timeout) { 14718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mScrollEventWaitTimeout = timeout; 14818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return this; 14918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 15018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 15118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 15218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Gets the timeout for waiting for an acknowledgement of an 15318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * uiautomtor scroll swipe action. 15418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 15518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * The acknowledgment is an <a href="http://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html">AccessibilityEvent</a>, 15618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * corresponding to the scroll action, that lets the framework determine if 15718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * the scroll action was successful. Generally, this timeout should not be modified. 15818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * See {@link UiScrollable} 15918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 16018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @return current timeout in milliseconds 16118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @since API Level 18 16218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 16318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public long getScrollAcknowledgmentTimeout() { 16418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return mScrollEventWaitTimeout; 16518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 16618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 16718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 16818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Sets the timeout for waiting for an acknowledgment of generic uiautomator 16918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * actions, such as clicks, text setting, and menu presses. 17018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 17118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * The acknowledgment is an <a href="http://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html">AccessibilityEvent</a>, 17218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * corresponding to an action, that lets the framework determine if the 17318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * action was successful. Generally, this timeout should not be modified. 17418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * See {@link UiObject} 17518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 17618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @param timeout Timeout value in milliseconds 17718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @return self 17818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @since API Level 18 17918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 18018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public Configurator setActionAcknowledgmentTimeout(long timeout) { 18118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mWaitForActionAcknowledgment = timeout; 18218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return this; 18318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 18418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 18518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 18618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Gets the current timeout for waiting for an acknowledgment of generic 18718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * uiautomator actions, such as clicks, text setting, and menu presses. 18818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 18918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * The acknowledgment is an <a href="http://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html">AccessibilityEvent</a>, 19018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * corresponding to an action, that lets the framework determine if the 19118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * action was successful. Generally, this timeout should not be modified. 19218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * See {@link UiObject} 19318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 19418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @return current timeout in milliseconds 19518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @since API Level 18 19618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 19718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public long getActionAcknowledgmentTimeout() { 19818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return mWaitForActionAcknowledgment; 19918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 20018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 20118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 20218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Sets a delay between key presses when injecting text input. 20318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * See {@link UiObject#setText(String)} 20418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 20518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @param delay Delay value in milliseconds 20618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @return self 20718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @since API Level 18 20818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 20918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public Configurator setKeyInjectionDelay(long delay) { 21018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mKeyInjectionDelay = delay; 21118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return this; 21218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 21318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 21418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu /** 21518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Gets the current delay between key presses when injecting text input. 21618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * See {@link UiObject#setText(String)} 21718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 21818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @return current delay in milliseconds 21918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @since API Level 18 22018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 22118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public long getKeyInjectionDelay() { 22218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return mKeyInjectionDelay; 22318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 22418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu} 225