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