| Index: content/public/android/javatests/src/org/chromium/content/browser/ScreenOrientationListenerTest.java
|
| diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ScreenOrientationListenerTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ScreenOrientationListenerTest.java
|
| index 5afd8cab27931cebb3f333eee7d22e223e746ec2..d82b6b8f5c43544882934c9fd7f29ee1b2aa4bae 100644
|
| --- a/content/public/android/javatests/src/org/chromium/content/browser/ScreenOrientationListenerTest.java
|
| +++ b/content/public/android/javatests/src/org/chromium/content/browser/ScreenOrientationListenerTest.java
|
| @@ -4,217 +4,247 @@
|
|
|
| package org.chromium.content.browser;
|
|
|
| -import android.app.Activity;
|
| import android.content.pm.ActivityInfo;
|
| import android.test.suitebuilder.annotation.MediumTest;
|
| +import android.view.Surface;
|
|
|
| import org.chromium.base.ThreadUtils;
|
| -import org.chromium.base.test.util.DisabledTest;
|
| -import org.chromium.base.test.util.Feature;
|
| -import org.chromium.base.test.util.RetryOnFailure;
|
| -import org.chromium.base.test.util.UrlUtils;
|
| -import org.chromium.content.browser.test.util.CriteriaHelper;
|
| -import org.chromium.content.browser.test.util.MockOrientationObserver;
|
| -import org.chromium.content.browser.test.util.OrientationChangeObserverCriteria;
|
| -import org.chromium.content_shell_apk.ContentShellActivity;
|
| +import org.chromium.content.browser.test.util.CallbackHelper;
|
| +import org.chromium.content_public.common.ScreenOrientationValues;
|
| import org.chromium.content_shell_apk.ContentShellTestBase;
|
| -import org.chromium.ui.gfx.DeviceDisplayInfo;
|
| +import org.chromium.ui.display.DisplayAndroid;
|
| +import org.chromium.ui.display.DisplayAndroid.DisplayAndroidObserver;
|
| +
|
| +import java.util.concurrent.Callable;
|
| +
|
|
|
| /**
|
| * Tests for ScreenOrientationListener and its implementations.
|
| + *
|
| + * rotation: Surface.ROTATION_*
|
| + * orientation: ActivityInfo.SCREEN_ORIENTATION_*
|
| + * orientation value: ScreenOrientationValues.*
|
| */
|
| public class ScreenOrientationListenerTest extends ContentShellTestBase {
|
| + private static class OrientationChangeCallbackHelper
|
| + extends CallbackHelper implements DisplayAndroidObserver {
|
| + private int mLastOrientation;
|
| +
|
| + @Override
|
| + public void onRotationChanged(int rotation) {
|
| + mLastOrientation = rotation;
|
| + notifyCalled();
|
| + }
|
|
|
| - // For some reasons build bots are not able to lock to 180 degrees. This
|
| - // boolean is here to make the false negative go away in that situation.
|
| - private static final boolean ALLOW_0_FOR_180 = true;
|
| + public int getLastRotation() {
|
| + return mLastOrientation;
|
| + }
|
| + }
|
|
|
| - private static final String DEFAULT_URL =
|
| - UrlUtils.encodeHtmlDataUri("<html><body>foo</body></html>");
|
| + private OrientationChangeCallbackHelper mCallbackHelper;
|
| + private DisplayAndroid mDisplayAndroid;
|
| + private int mNaturalOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
|
|
|
| - private MockOrientationObserver mObserver;
|
| + @Override
|
| + public void setUp() throws Exception {
|
| + super.setUp();
|
|
|
| - private int mNaturalOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
|
| + launchContentShellWithUrl("about:blank");
|
| + mCallbackHelper = new OrientationChangeCallbackHelper();
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + mDisplayAndroid = getContentViewCore().getWindowAndroid().getDisplay();
|
| + mDisplayAndroid.addObserver(mCallbackHelper);
|
| + DisplayAndroid.startAccurateListening();
|
| + }
|
| + });
|
| +
|
| + // Calculate device natural orientation, as mObserver.mOrientation
|
| + // is difference between current and natural orientation in degrees.
|
| + mNaturalOrientation = getNaturalOrientation(mDisplayAndroid);
|
| +
|
| + // Make sure we start all the tests with the same orientation.
|
| + lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
| + }
|
| +
|
| + @Override
|
| + public void tearDown() throws Exception {
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + mDisplayAndroid.removeObserver(mCallbackHelper);
|
| + mDisplayAndroid = null;
|
| + getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
|
| + DisplayAndroid.stopAccurateListening();
|
| + }
|
| + });
|
| +
|
| + mCallbackHelper = null;
|
| + super.tearDown();
|
| + }
|
|
|
| - /**
|
| - * Checks does the device orientation match the requested one.
|
| - */
|
| - private boolean checkOrientationForLock(int orientation) {
|
| - int expectedOrientation = orientationTypeToAngle(orientation);
|
| - int currentOrientation = mObserver.mOrientation;
|
| - switch (orientation) {
|
| - case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
|
| - case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
|
| - case ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT:
|
| - case ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE:
|
| - if (expectedOrientation == currentOrientation) {
|
| - return true;
|
| - } else if (ALLOW_0_FOR_180 && expectedOrientation == 180
|
| - && currentOrientation == 0) {
|
| - return true;
|
| - }
|
| - return false;
|
| - default:
|
| - return false;
|
| + private static int getNaturalOrientation(DisplayAndroid display) {
|
| + int rotation = display.getRotation();
|
| + if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) {
|
| + if (display.getDisplayHeight() >= display.getDisplayWidth()) {
|
| + return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
|
| + }
|
| + return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
|
| + } else {
|
| + if (display.getDisplayHeight() < display.getDisplayWidth()) {
|
| + return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
|
| + }
|
| + return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
|
| }
|
| }
|
|
|
| - /**
|
| - * Returns the expected orientation angle based on the orientation type.
|
| - */
|
| - private int orientationTypeToAngle(int orientation) {
|
| + private int orientationToRotation(int orientation) {
|
| if (mNaturalOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
|
| switch (orientation) {
|
| case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
|
| - return 0;
|
| + return Surface.ROTATION_0;
|
| case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
|
| - return 90;
|
| + return Surface.ROTATION_90;
|
| case ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT:
|
| - return 180;
|
| + return Surface.ROTATION_180;
|
| case ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE:
|
| - return -90;
|
| + return Surface.ROTATION_270;
|
| default:
|
| fail("Should not be there!");
|
| - return 0;
|
| + return Surface.ROTATION_0;
|
| }
|
| } else { // mNaturalOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
|
| switch (orientation) {
|
| case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
|
| - return -90;
|
| + return Surface.ROTATION_270;
|
| case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
|
| - return 0;
|
| + return Surface.ROTATION_0;
|
| case ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT:
|
| - return 90;
|
| + return Surface.ROTATION_90;
|
| case ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE:
|
| - return 180;
|
| + return Surface.ROTATION_180;
|
| default:
|
| fail("Should not be there!");
|
| - return 0;
|
| + return Surface.ROTATION_0;
|
| }
|
| }
|
| }
|
|
|
| - /**
|
| - * Retrieves device natural orientation.
|
| - */
|
| - private int getNaturalOrientation(Activity activity) {
|
| - DeviceDisplayInfo displayInfo = DeviceDisplayInfo.create(activity);
|
| - int rotation = displayInfo.getRotationDegrees();
|
| - if (rotation == 0 || rotation == 180) {
|
| - if (displayInfo.getDisplayHeight() >= displayInfo.getDisplayWidth()) {
|
| - return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
|
| - }
|
| - return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
|
| - } else {
|
| - if (displayInfo.getDisplayHeight() < displayInfo.getDisplayWidth()) {
|
| - return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
|
| + private int getCurrentRotation() {
|
| + return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Integer>() {
|
| + @Override
|
| + public Integer call() {
|
| + return mDisplayAndroid.getRotation();
|
| }
|
| - return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
|
| - }
|
| + });
|
| }
|
|
|
| - /**
|
| - * Locks the screen orientation to the predefined orientation type then wait
|
| - * for the orientation change to happen.
|
| - */
|
| - private void lockOrientationAndWait(final int orientation) throws InterruptedException {
|
| - OrientationChangeObserverCriteria criteria =
|
| - new OrientationChangeObserverCriteria(mObserver,
|
| - orientationTypeToAngle(orientation));
|
| + // Returns the rotation observed.
|
| + private int lockOrientationAndWait(final int orientation) throws Exception {
|
| + int expectedRotation = orientationToRotation(orientation);
|
| + int currentRotation = getCurrentRotation();
|
| + if (expectedRotation == currentRotation) return expectedRotation;
|
| +
|
| + int callCount = mCallbackHelper.getCallCount();
|
| ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| @Override
|
| public void run() {
|
| getActivity().setRequestedOrientation(orientation);
|
| }
|
| });
|
| - getInstrumentation().waitForIdleSync();
|
| -
|
| - try {
|
| - CriteriaHelper.pollInstrumentationThread(criteria);
|
| - } catch (AssertionError e) {
|
| - // This should not be here but the Criteria does not support cases where the orientation
|
| - // is not being changed (i.e. where the Natural orientation matches the one you are
|
| - // locking to). crbug.com/565587
|
| - }
|
| + mCallbackHelper.waitForCallback(callCount);
|
| + return mCallbackHelper.getLastRotation();
|
| }
|
|
|
| - @Override
|
| - public void setUp() throws Exception {
|
| - super.setUp();
|
| -
|
| - mObserver = new MockOrientationObserver();
|
| + @MediumTest
|
| + public void testOrientationChanges() throws Exception {
|
| + int rotation = lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
| + assertEquals(orientationToRotation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE), rotation);
|
|
|
| - final ContentShellActivity activity = launchContentShellWithUrl(DEFAULT_URL);
|
| - waitForActiveShellToBeDoneLoading();
|
| + rotation = lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
| + assertEquals(orientationToRotation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT), rotation);
|
|
|
| - ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - ScreenOrientationListener.getInstance().addObserver(mObserver, activity);
|
| - ScreenOrientationListener.getInstance().startAccurateListening();
|
| - }
|
| - });
|
| + rotation = lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
|
| + assertEquals(
|
| + orientationToRotation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE), rotation);
|
|
|
| - // Calculate device natural orientation, as mObserver.mOrientation
|
| - // is difference between current and natural orientation in degrees.
|
| - mNaturalOrientation = getNaturalOrientation(activity);
|
| + // Note: REVERSE_PORTRAIT does not work when device orientation is locked by user (eg from
|
| + // the notification shade). Bots on the commit queue are all locked, so don't bother testing
|
| + // REVERSE_PORTRAIT.
|
| + }
|
|
|
| - // Make sure we start all the tests with the same orientation.
|
| - lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
| + private int orientationValueToRotation(int orientationValue) {
|
| + if (mNaturalOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
|
| + switch (orientationValue) {
|
| + case ScreenOrientationValues.PORTRAIT_PRIMARY:
|
| + return Surface.ROTATION_0;
|
| + case ScreenOrientationValues.LANDSCAPE_PRIMARY:
|
| + return Surface.ROTATION_90;
|
| + case ScreenOrientationValues.PORTRAIT:
|
| + return Surface.ROTATION_0;
|
| + case ScreenOrientationValues.LANDSCAPE:
|
| + return Surface.ROTATION_90;
|
| + case ScreenOrientationValues.LANDSCAPE_SECONDARY:
|
| + return Surface.ROTATION_270;
|
| + case ScreenOrientationValues.PORTRAIT_SECONDARY:
|
| + return Surface.ROTATION_180;
|
| + default:
|
| + fail("Can't requiest this orientation value " + orientationValue);
|
| + return 0;
|
| + }
|
| + } else { // mNaturalOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
|
| + switch (orientationValue) {
|
| + case ScreenOrientationValues.PORTRAIT_PRIMARY:
|
| + return Surface.ROTATION_270;
|
| + case ScreenOrientationValues.LANDSCAPE_PRIMARY:
|
| + return Surface.ROTATION_0;
|
| + case ScreenOrientationValues.PORTRAIT:
|
| + return Surface.ROTATION_90;
|
| + case ScreenOrientationValues.LANDSCAPE:
|
| + return Surface.ROTATION_0;
|
| + case ScreenOrientationValues.LANDSCAPE_SECONDARY:
|
| + return Surface.ROTATION_180;
|
| + case ScreenOrientationValues.PORTRAIT_SECONDARY:
|
| + return Surface.ROTATION_90;
|
| + default:
|
| + fail("Can't requiest this orientation value " + orientationValue);
|
| + return 0;
|
| + }
|
| + }
|
| }
|
|
|
| - @Override
|
| - public void tearDown() throws Exception {
|
| + // Returns the rotation observed.
|
| + private int lockOrientationValueAndWait(final int orientationValue) throws Exception {
|
| + int expectedRotation = orientationValueToRotation(orientationValue);
|
| + int currentRotation = getCurrentRotation();
|
| + if (expectedRotation == currentRotation) return expectedRotation;
|
| +
|
| + int callCount = mCallbackHelper.getCallCount();
|
| ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| @Override
|
| public void run() {
|
| - getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
|
| - ScreenOrientationListener.getInstance().startAccurateListening();
|
| + ScreenOrientationProvider.lockOrientation((byte) orientationValue);
|
| }
|
| });
|
| -
|
| - mObserver = null;
|
| - super.tearDown();
|
| - }
|
| -
|
| - //@MediumTest
|
| - //@Feature({"ScreenOrientation"})
|
| - //@RetryOnFailure
|
| - // Disabled due to flakiness. See crbug.com/645609.
|
| - @DisabledTest
|
| - public void testVariousOrientationChanges() throws Exception {
|
| - lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
| - assertTrue(checkOrientationForLock(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE));
|
| -
|
| - lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
|
| - assertTrue(checkOrientationForLock(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT));
|
| -
|
| - lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
|
| - assertTrue(checkOrientationForLock(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE));
|
| -
|
| - lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
| - assertTrue(checkOrientationForLock(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT));
|
| + mCallbackHelper.waitForCallback(callCount);
|
| + return mCallbackHelper.getLastRotation();
|
| }
|
|
|
| @MediumTest
|
| - @Feature({"ScreenOrientation"})
|
| - public void testFlipPortrait() throws Exception {
|
| - lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
| - assertTrue(checkOrientationForLock(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT));
|
| + public void testBasicValues() throws Exception {
|
| + int rotation = lockOrientationValueAndWait(ScreenOrientationValues.LANDSCAPE_PRIMARY);
|
| + assertEquals(
|
| + orientationValueToRotation(ScreenOrientationValues.LANDSCAPE_PRIMARY), rotation);
|
|
|
| - lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
|
| - assertTrue(checkOrientationForLock(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT));
|
| - }
|
| + rotation = lockOrientationValueAndWait(ScreenOrientationValues.PORTRAIT_PRIMARY);
|
| + assertEquals(
|
| + orientationValueToRotation(ScreenOrientationValues.PORTRAIT_PRIMARY), rotation);
|
|
|
| - @DisabledTest(message = "crbug.com/645609")
|
| - @MediumTest
|
| - @Feature({"ScreenOrientation"})
|
| - @RetryOnFailure
|
| - public void testFlipLandscape() throws Exception {
|
| - lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
| - assertTrue(checkOrientationForLock(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE));
|
| -
|
| - lockOrientationAndWait(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
|
| - assertTrue(checkOrientationForLock(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE));
|
| + rotation = lockOrientationValueAndWait(ScreenOrientationValues.LANDSCAPE_SECONDARY);
|
| + assertEquals(
|
| + orientationValueToRotation(ScreenOrientationValues.LANDSCAPE_SECONDARY), rotation);
|
| +
|
| + // The note in testOrientationChanges about REVERSE_PORTRAIT applies to PORTRAIT_SECONDARY.
|
| }
|
| }
|
|
|