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