ScreenOrientationProviderTest.java revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochpackage org.chromium.content.browser; 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.os.Build; 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.test.suitebuilder.annotation.MediumTest; 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport org.chromium.base.ThreadUtils; 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport org.chromium.base.test.util.Feature; 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport org.chromium.base.test.util.UrlUtils; 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)import org.chromium.content.browser.test.util.CriteriaHelper; 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)import org.chromium.content.browser.test.util.MockOrientationObserver; 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport org.chromium.content.browser.test.util.OrientationChangeObserverCriteria; 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport org.chromium.content.common.ScreenOrientationValues; 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport org.chromium.content_shell_apk.ContentShellActivity; 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport org.chromium.content_shell_apk.ContentShellTestBase; 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)/** 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Tests for ScreenOrientationListener and its implementations. 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */ 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochpublic class ScreenOrientationProviderTest extends ContentShellTestBase { 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // For some reasons build bots are not able to lock to 180 degrees. This 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // boolean is here to make the false negative go away in that situation. 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private static final boolean ALLOW_0_FOR_180 = true; 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private static final String DEFAULT_URL = 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UrlUtils.encodeHtmlDataUri("<html><body>foo</body></html>"); 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private MockOrientationObserver mObserver; 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private boolean checkOrientationForLock(int orientations) { 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (orientations) { 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case ScreenOrientationValues.PORTRAIT_PRIMARY: 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return mObserver.mOrientation == 0; 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case ScreenOrientationValues.PORTRAIT_SECONDARY: 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return mObserver.mOrientation == 180 || 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (ALLOW_0_FOR_180 && mObserver.mOrientation == 0); 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case ScreenOrientationValues.LANDSCAPE_PRIMARY: 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return mObserver.mOrientation == 90; 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case ScreenOrientationValues.LANDSCAPE_SECONDARY: 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return mObserver.mOrientation == -90; 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case ScreenOrientationValues.PORTRAIT: 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return mObserver.mOrientation == 0 || mObserver.mOrientation == 180; 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case ScreenOrientationValues.LANDSCAPE: 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return mObserver.mOrientation == 90 || mObserver.mOrientation == -90; 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case ScreenOrientationValues.ANY: 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The orientation should not change but might and the value could be anything. 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) default: 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return mObserver.mHasChanged == false; 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /** 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Call |lockOrientation| and wait for an orientation change. 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private boolean lockOrientationAndWait(final int orientations) throws InterruptedException { 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OrientationChangeObserverCriteria criteria = 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new OrientationChangeObserverCriteria(mObserver); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ThreadUtils.runOnUiThreadBlocking(new Runnable() { 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch @Override 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public void run() { 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ScreenOrientationProvider.lockOrientation((byte)orientations); 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }); 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch getInstrumentation().waitForIdleSync(); 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return CriteriaHelper.pollForCriteria(criteria); 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) @Override 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public void setUp() throws Exception { 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) super.setUp(); 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) mObserver = new MockOrientationObserver(); 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OrientationChangeObserverCriteria criteria = 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new OrientationChangeObserverCriteria(mObserver); 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch final ContentShellActivity activity = launchContentShellWithUrl(DEFAULT_URL); 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch waitForActiveShellToBeDoneLoading(); 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ThreadUtils.runOnUiThreadBlocking(new Runnable() { 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch @Override 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public void run() { 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ScreenOrientationListener.getInstance().addObserver(mObserver, activity); 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }); 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Make sure we start all the tests with the same orientation. 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) lockOrientationAndWait(ScreenOrientationValues.PORTRAIT_PRIMARY); 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Make sure mObserver is updated before we start the tests. 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CriteriaHelper.pollForCriteria(criteria); 9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch @Override 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public void tearDown() throws Exception { 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ThreadUtils.runOnUiThreadBlocking(new Runnable() { 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch @Override 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public void run() { 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ScreenOrientationProvider.unlockOrientation(); 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }); 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch mObserver = null; 11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) super.tearDown(); 11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) @MediumTest 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) @Feature({"ScreenOrientation"}) 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public void testBasicValues() throws Exception { 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) lockOrientationAndWait(ScreenOrientationValues.PORTRAIT_PRIMARY); 11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertTrue(checkOrientationForLock(ScreenOrientationValues.PORTRAIT_PRIMARY)); 11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) lockOrientationAndWait(ScreenOrientationValues.LANDSCAPE_PRIMARY); 12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertTrue(checkOrientationForLock(ScreenOrientationValues.LANDSCAPE_PRIMARY)); 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) lockOrientationAndWait(ScreenOrientationValues.PORTRAIT_SECONDARY); 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertTrue(checkOrientationForLock(ScreenOrientationValues.PORTRAIT_SECONDARY)); 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) lockOrientationAndWait(ScreenOrientationValues.LANDSCAPE_SECONDARY); 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertTrue(checkOrientationForLock(ScreenOrientationValues.LANDSCAPE_SECONDARY)); 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @MediumTest 13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) @Feature({"ScreenOrientation"}) 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public void testPortrait() throws Exception { 13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Do not run that test for versions of Android before JB-MR1 because 13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // the ScreenOrientationListener for those versions isn't accurate 13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // enough. We will later simply not run that code in that version or add 13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // an "accurate mode" that will fix this by polling. 13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // See http://crbug.com/400158 13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) 13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) lockOrientationAndWait(ScreenOrientationValues.PORTRAIT_PRIMARY); 14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) assertTrue(checkOrientationForLock(ScreenOrientationValues.PORTRAIT_PRIMARY)); 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch lockOrientationAndWait(ScreenOrientationValues.PORTRAIT_PRIMARY | 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ScreenOrientationValues.PORTRAIT_SECONDARY); 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(checkOrientationForLock(ScreenOrientationValues.PORTRAIT_PRIMARY | 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ScreenOrientationValues.PORTRAIT_SECONDARY)); 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) lockOrientationAndWait(ScreenOrientationValues.PORTRAIT_SECONDARY); 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(checkOrientationForLock(ScreenOrientationValues.PORTRAIT_SECONDARY)); 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) lockOrientationAndWait(ScreenOrientationValues.PORTRAIT_PRIMARY | 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ScreenOrientationValues.PORTRAIT_SECONDARY); 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assertTrue(checkOrientationForLock(ScreenOrientationValues.PORTRAIT_PRIMARY | 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ScreenOrientationValues.PORTRAIT_SECONDARY)); 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @MediumTest 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Feature({"ScreenOrientation"}) 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void testLandscape() throws Exception { 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Do not run that test for versions of Android before JB-MR1 because 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // the ScreenOrientationListener for those versions isn't accurate 16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // enough. We will later simply not run that code in that version or add 16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // an "accurate mode" that will fix this by polling. 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // See http://crbug.com/400158 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 168 lockOrientationAndWait(ScreenOrientationValues.LANDSCAPE_PRIMARY); 169 assertTrue(checkOrientationForLock(ScreenOrientationValues.LANDSCAPE_PRIMARY)); 170 171 lockOrientationAndWait(ScreenOrientationValues.LANDSCAPE_PRIMARY | 172 ScreenOrientationValues.LANDSCAPE_SECONDARY); 173 assertTrue(checkOrientationForLock(ScreenOrientationValues.LANDSCAPE_PRIMARY | 174 ScreenOrientationValues.LANDSCAPE_SECONDARY)); 175 176 lockOrientationAndWait(ScreenOrientationValues.LANDSCAPE_SECONDARY); 177 assertTrue(checkOrientationForLock(ScreenOrientationValues.LANDSCAPE_SECONDARY)); 178 179 lockOrientationAndWait(ScreenOrientationValues.LANDSCAPE_PRIMARY | 180 ScreenOrientationValues.LANDSCAPE_SECONDARY); 181 assertTrue(checkOrientationForLock(ScreenOrientationValues.LANDSCAPE_PRIMARY | 182 ScreenOrientationValues.LANDSCAPE_SECONDARY)); 183 } 184 185 // There is no point in testing the case where we try to lock to 186 // PORTRAIT_PRIMARY | PORTRAIT_SECONDARY | LANDSCAPE_PRIMARY | LANDSCAPE_SECONDARY 187 // because with the device being likely flat during the test, locking to that 188 // will be a no-op. 189 190 // We can't test unlock because the device is likely flat during the test 191 // and in that situation unlocking is a no-op. 192} 193