Home | History | Annotate | Download | only in wm
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package android.server.wm;
     18 
     19 import static androidx.test.InstrumentationRegistry.getInstrumentation;
     20 
     21 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
     22 import static org.hamcrest.Matchers.lessThanOrEqualTo;
     23 
     24 import android.app.Activity;
     25 import android.graphics.Point;
     26 import android.view.Display;
     27 import android.view.WindowManager;
     28 
     29 import androidx.test.rule.ActivityTestRule;
     30 
     31 import com.android.compatibility.common.util.PollingCheck;
     32 
     33 import org.hamcrest.Matcher;
     34 import org.junit.Before;
     35 
     36 class AspectRatioTestsBase {
     37     // The delta allowed when comparing two floats for equality. We consider them equal if they are
     38     // within two significant digits of each other.
     39     private static final float FLOAT_EQUALITY_DELTA = .01f;
     40 
     41     interface AssertAspectRatioCallback {
     42         void assertAspectRatio(float actual, int displayId, Point size);
     43     }
     44 
     45     void runAspectRatioTest(final ActivityTestRule activityRule,
     46             final AssertAspectRatioCallback callback) {
     47         final Activity activity = launchActivity(activityRule);
     48         PollingCheck.waitFor(activity::hasWindowFocus);
     49         try {
     50             callback.assertAspectRatio(getActivityAspectRatio(activity),
     51                     getDisplay(activity).getDisplayId(),
     52                     getActivitySize(activity));
     53         } finally {
     54             finishActivity(activityRule);
     55         }
     56 
     57         // TODO(b/35810513): All this rotation stuff doesn't really work yet. Need to make sure
     58         // context is updated correctly here. Also, what does it mean to be holding a reference to
     59         // this activity if changing the orientation will cause a relaunch?
     60 //        activity.setRequestedOrientation(SCREEN_ORIENTATION_LANDSCAPE);
     61 //        waitForIdle();
     62 //        callback.assertAspectRatio(getAspectRatio(activity));
     63 //
     64 //        activity.setRequestedOrientation(SCREEN_ORIENTATION_PORTRAIT);
     65 //        waitForIdle();
     66 //        callback.assertAspectRatio(getAspectRatio(activity));
     67     }
     68 
     69     @Before
     70     public void wakeUpAndUnlock() {
     71         UiDeviceUtils.pressWakeupButton();
     72         UiDeviceUtils.pressUnlockButton();
     73     }
     74 
     75     static float getDefaultDisplayAspectRatio() {
     76         return getAspectRatio(getInstrumentation().getContext().getSystemService(
     77                 WindowManager.class).getDefaultDisplay());
     78     }
     79 
     80     private static float getActivityAspectRatio(Activity activity) {
     81         return getAspectRatio(getDisplay(activity));
     82     }
     83 
     84     private static Point getActivitySize(Activity activity) {
     85         final Point size = new Point();
     86         getDisplay(activity).getSize(size);
     87         return size;
     88     }
     89 
     90     private static Display getDisplay(Activity activity) {
     91         return activity.getWindow().peekDecorView().getDisplay();
     92     }
     93 
     94     private static float getAspectRatio(Display display) {
     95         final Point size = new Point();
     96         display.getSize(size);
     97         final float longSide = Math.max(size.x, size.y);
     98         final float shortSide = Math.min(size.x, size.y);
     99         return longSide / shortSide;
    100     }
    101 
    102     protected Activity launchActivity(final ActivityTestRule activityRule) {
    103         final Activity activity = activityRule.launchActivity(null);
    104         waitForIdle();
    105         return activity;
    106     }
    107 
    108     private void finishActivity(ActivityTestRule activityRule) {
    109         final Activity activity = activityRule.getActivity();
    110         if (activity != null) {
    111             activity.finish();
    112         }
    113     }
    114 
    115     private static void waitForIdle() {
    116         getInstrumentation().waitForIdleSync();
    117     }
    118 
    119     static Matcher<Float> greaterThanOrEqualToInexact(float expected) {
    120         return greaterThanOrEqualTo(expected - FLOAT_EQUALITY_DELTA);
    121     }
    122 
    123     static Matcher<Float> lessThanOrEqualToInexact(float expected) {
    124         return lessThanOrEqualTo(expected + FLOAT_EQUALITY_DELTA);
    125     }
    126 }
    127