• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 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 android.server.wm.ActivityManagerTestBase.isTablet;
20 
21 import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
22 
23 import static org.junit.Assume.assumeFalse;
24 import static org.junit.Assume.assumeTrue;
25 
26 import android.app.Activity;
27 import android.app.ActivityManager;
28 import android.content.Context;
29 import android.content.pm.PackageManager;
30 import android.content.res.Configuration;
31 import android.graphics.Insets;
32 import android.util.Log;
33 import android.view.WindowInsets;
34 import android.view.WindowMetrics;
35 
36 import androidx.test.InstrumentationRegistry;
37 import androidx.test.rule.ActivityTestRule;
38 
39 import org.junit.AssumptionViolatedException;
40 
41 /**
42  * Common assumptions for system bar tests.
43  *
44  * TODO: Unify with copy in systemui tests.
45  */
46 public final class BarTestUtils {
47 
BarTestUtils()48     private BarTestUtils() {
49     }
50 
assumeStatusBarContainsCutout(ActivityTestRule<?> rule)51     public static void assumeStatusBarContainsCutout(ActivityTestRule<?> rule) {
52         final boolean[] statusBarContainsCutout = {false};
53         getInstrumentation().runOnMainSync(() -> {
54             final WindowMetrics metrics =
55                     rule.getActivity().getWindowManager().getCurrentWindowMetrics();
56             final WindowInsets windowInsets = metrics.getWindowInsets();
57             final Insets insetsCutout = windowInsets.getInsets(WindowInsets.Type.displayCutout());
58             final Insets insetsStatusBar = windowInsets.getInsets(WindowInsets.Type.statusBars());
59             final Insets min = Insets.min(insetsCutout, insetsStatusBar);
60             statusBarContainsCutout[0] = !Insets.NONE.equals(min);
61         });
62         assumeTrue(statusBarContainsCutout[0]);
63     }
64 
assumeHasColoredStatusBar(ActivityTestRule<?> rule)65     public static void assumeHasColoredStatusBar(ActivityTestRule<?> rule) {
66         assumeHasColoredBars();
67         assumeHasStatusBar(rule);
68     }
69 
assumeHasStatusBar(ActivityTestRule<?> rule)70     public static void assumeHasStatusBar(ActivityTestRule<?> rule) {
71         assumeFalse("No status bar when running in VR", isRunningInVr());
72 
73         Insets statusBar = getInsets(rule).getInsetsIgnoringVisibility(
74                 WindowInsets.Type.statusBars());
75         assumeFalse("There must be status bar insets.", statusBar.equals(Insets.NONE));
76     }
77 
assumeHasColoredNavigationBar(ActivityTestRule<?> rule)78     public static void assumeHasColoredNavigationBar(ActivityTestRule<?> rule) {
79         assumeFalse("No colored navigation bar on Tablet", isTablet());
80         assumeHasColoredBars();
81 
82         assumeTrue("Bottom stable inset is non-positive, no navigation bar",
83                 getInsets(rule).getStableInsetBottom() > 0);
84     }
85 
assumeHasColoredBars()86     public static void assumeHasColoredBars() {
87         final PackageManager pm = getInstrumentation().getContext().getPackageManager();
88 
89         assumeHasBars();
90 
91         assumeFalse("Automotive navigation bar is opaque",
92                 pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE));
93 
94         assumeTrue("Only highEndGfx devices have colored system bars",
95                 ActivityManager.isHighEndGfx());
96     }
97 
assumeHasBars()98     public static void assumeHasBars() {
99         final PackageManager pm = getInstrumentation().getContext().getPackageManager();
100 
101         assumeFalse("Embedded devices don't have system bars",
102                 getInstrumentation().getContext().getPackageManager().hasSystemFeature(
103                         PackageManager.FEATURE_EMBEDDED));
104 
105         assumeFalse("No bars on watches and TVs", pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
106                 || pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION)
107                 || pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK));
108 
109         assumeFalse("No bars on PCs", pm.hasSystemFeature(PackageManager.FEATURE_PC));
110     }
111 
isRunningInVr()112     private static boolean isRunningInVr() {
113         final Context context = InstrumentationRegistry.getContext();
114         final Configuration config = context.getResources().getConfiguration();
115         return (config.uiMode & Configuration.UI_MODE_TYPE_MASK)
116                 == Configuration.UI_MODE_TYPE_VR_HEADSET;
117     }
118 
getInsets(ActivityTestRule<?> rule)119     private static WindowInsets getInsets(ActivityTestRule<?> rule) {
120         final WindowInsets[] insets = new WindowInsets[1];
121         try {
122             rule.runOnUiThread(() -> {
123                 insets[0] = rule.getActivity().getWindow().getDecorView().getRootWindowInsets();
124             });
125         } catch (Throwable t) {
126             throw new RuntimeException(t);
127         }
128         return insets[0];
129     }
130 
isAssumptionViolated(Runnable assumption)131     public static boolean isAssumptionViolated(Runnable assumption) {
132         try {
133             assumption.run();
134             return false;
135         } catch (AssumptionViolatedException e) {
136             Log.i("BarTestUtils", "Assumption violated", e);
137             return true;
138         }
139     }
140 }
141