119 lines
4.7 KiB
Java
119 lines
4.7 KiB
Java
/*
|
|
* 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);
|
|
}
|
|
}
|
|
}
|