| /* | |
| * Copyright (C) 2015 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except | |
| * in compliance with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software distributed under the License | |
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express | |
| * or implied. See the License for the specific language governing permissions and limitations under | |
| * the License. | |
| */ | |
| package android.windowanimationjank; | |
| import android.app.Instrumentation; | |
| import android.app.UiAutomation; | |
| import android.content.ComponentName; | |
| import android.content.Intent; | |
| import android.os.SystemClock; | |
| import android.support.test.uiautomator.By; | |
| import android.support.test.uiautomator.BySelector; | |
| import android.support.test.uiautomator.UiDevice; | |
| import android.support.test.uiautomator.UiObject2; | |
| import android.support.test.uiautomator.Until; | |
| /** | |
| * Set of helpers to manipulate test activities. | |
| */ | |
| public class Utils { | |
| protected final static String PACKAGE = "android.windowanimationjank"; | |
| protected final static String ELEMENT_LAYOUT_ACTIVITY = "ElementLayoutActivity"; | |
| protected final static String ELEMENT_LAYOUT_CLASS = PACKAGE + "." + ELEMENT_LAYOUT_ACTIVITY; | |
| protected final static long WAIT_FOR_ACTIVITY_TIMEOUT = 10000; | |
| private static final BySelector ROOT_ELEMENT_LAYOUT = By.res(PACKAGE, "root_flow_layout"); | |
| private final static long ROTATION_ANIMATION_TIME_FULL_SCREEN_MS = 1000; | |
| protected final static int ROTATION_MODE_NATURAL = 0; | |
| protected final static int ROTATION_MODE_LEFT = 1; | |
| protected final static int ROTATION_MODE_RIGHT = 2; | |
| private static UiObject2 waitForActivity(Instrumentation instrumentation, BySelector selector) { | |
| UiDevice device = UiDevice.getInstance(instrumentation); | |
| UiObject2 window = device.wait(Until.findObject(selector), WAIT_FOR_ACTIVITY_TIMEOUT); | |
| if (window == null) { | |
| throw new RuntimeException(selector.toString() + " has not been started."); | |
| } | |
| // Get root object. | |
| while (window.getParent() != null) { | |
| window = window.getParent(); | |
| } | |
| return window; | |
| } | |
| public static UiObject2 waitForElementLayout(Instrumentation instrumentation) { | |
| return waitForActivity(instrumentation, ROOT_ELEMENT_LAYOUT); | |
| } | |
| /** | |
| * Start and return activity with requested number of random elements. | |
| */ | |
| public static UiObject2 startElementLayout(Instrumentation instrumentation, int numElements) { | |
| Intent intent = new Intent(Intent.ACTION_MAIN); | |
| intent.setComponent(new ComponentName(PACKAGE, ELEMENT_LAYOUT_CLASS)); | |
| intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |
| intent.putExtra(ElementLayoutActivity.NUM_ELEMENTS_KEY, numElements); | |
| instrumentation.getTargetContext().startActivity(intent); | |
| return waitForElementLayout(instrumentation); | |
| } | |
| public static int getDeviceRotation(Instrumentation instrumentation) { | |
| try { | |
| UiDevice device = UiDevice.getInstance(instrumentation); | |
| switch (device.getDisplayRotation()) { | |
| case UiAutomation.ROTATION_FREEZE_90: | |
| return ROTATION_MODE_LEFT; | |
| case UiAutomation.ROTATION_FREEZE_270: | |
| return ROTATION_MODE_RIGHT; | |
| case UiAutomation.ROTATION_FREEZE_0: | |
| case UiAutomation.ROTATION_FREEZE_180: | |
| return ROTATION_MODE_NATURAL; | |
| } | |
| } catch(Exception e) { | |
| throw new RuntimeException(); | |
| } | |
| throw new RuntimeException("Unsupported device rotation."); | |
| } | |
| public static void rotateDevice(Instrumentation instrumentation, int rotationMode) { | |
| try { | |
| UiDevice device = UiDevice.getInstance(instrumentation); | |
| long startTime = System.currentTimeMillis(); | |
| switch (rotationMode) { | |
| case ROTATION_MODE_NATURAL: | |
| device.setOrientationNatural(); | |
| break; | |
| case ROTATION_MODE_LEFT: | |
| device.setOrientationLeft(); | |
| break; | |
| case ROTATION_MODE_RIGHT: | |
| device.setOrientationRight(); | |
| break; | |
| default: | |
| throw new RuntimeException("Unsupported rotation mode: " + rotationMode); | |
| } | |
| long toSleep = ROTATION_ANIMATION_TIME_FULL_SCREEN_MS - | |
| (System.currentTimeMillis() - startTime); | |
| if (toSleep > 0) { | |
| SystemClock.sleep(toSleep); | |
| } | |
| } catch(Exception e) { | |
| throw new RuntimeException(e); | |
| } | |
| } | |
| } |