/*
* 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);
}
}
}