CTS: Fix EnsureBarContrastTest for products without system bars

Fixes: 136784434
Test: atest EnsureBarContrastTest LightBarTests LightBarThemeTest
Change-Id: If5abc5e09c8a3f0b5d393648dadcfec5c6ce9daf
Merged-In: If5abc5e09c8a3f0b5d393648dadcfec5c6ce9daf
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/EnsureBarContrastTest.java b/tests/framework/base/windowmanager/src/android/server/wm/EnsureBarContrastTest.java
index 331716a..4830da0 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/EnsureBarContrastTest.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/EnsureBarContrastTest.java
@@ -19,6 +19,10 @@
 import static android.server.wm.EnsureBarContrastTest.TestActivity.EXTRA_ENSURE_CONTRAST;
 import static android.server.wm.EnsureBarContrastTest.TestActivity.EXTRA_LIGHT_BARS;
 import static android.server.wm.EnsureBarContrastTest.TestActivity.backgroundForBar;
+import static android.server.wm.BarTestUtils.assumeHasColoredBars;
+import static android.server.wm.BarTestUtils.assumeHasColoredNavigationBar;
+import static android.server.wm.BarTestUtils.assumeHasColoredStatusBar;
+import static android.server.wm.BarTestUtils.isAssumptionViolated;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 
 import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
@@ -37,7 +41,6 @@
 import android.view.ViewGroup;
 import android.view.WindowInsets;
 
-import androidx.test.filters.FlakyTest;
 import androidx.test.rule.ActivityTestRule;
 
 import com.android.compatibility.common.util.PollingCheck;
@@ -45,6 +48,7 @@
 import org.hamcrest.CustomTypeSafeMatcher;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
+import org.junit.AssumptionViolatedException;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ErrorCollector;
@@ -84,8 +88,13 @@
     }
 
     public void runTestEnsureContrast(boolean lightBars) {
+        assumeHasColoredBars();
         TestActivity activity = launchAndWait(mTestActivity, lightBars, true /* ensureContrast */);
         for (Bar bar : Bar.BARS) {
+            if (isAssumptionViolated(() -> bar.checkAssumptions(mTestActivity))) {
+                continue;
+            }
+
             Bitmap bitmap = getOnMainSync(() -> activity.screenshotBar(bar, mDumper));
 
             if (getOnMainSync(() -> activity.barIsTapThrough(bar))) {
@@ -307,6 +316,11 @@
                 r.bottom = r.top + getInset(insets);
                 return r;
             }
+
+            @Override
+            void checkAssumptions(ActivityTestRule<?> rule) throws AssumptionViolatedException {
+                assumeHasColoredStatusBar(rule);
+            }
         };
 
         static final Bar NAVIGATION = new Bar("Navigation") {
@@ -321,6 +335,11 @@
                 r.top = r.bottom - getInset(insets);
                 return r;
             }
+
+            @Override
+            void checkAssumptions(ActivityTestRule<?> rule) throws AssumptionViolatedException {
+                assumeHasColoredNavigationBar(rule);
+            }
         };
 
         static final Bar[] BARS = {STATUS, NAVIGATION};
@@ -334,5 +353,7 @@
         abstract int getInset(Insets insets);
 
         abstract Rect getLocation(Insets insets, Rect screen);
+
+        abstract void checkAssumptions(ActivityTestRule<?> rule) throws AssumptionViolatedException;
     }
 }
diff --git a/tests/framework/base/windowmanager/util/src/android/server/wm/BarTestUtils.java b/tests/framework/base/windowmanager/util/src/android/server/wm/BarTestUtils.java
new file mode 100644
index 0000000..2d524df
--- /dev/null
+++ b/tests/framework/base/windowmanager/util/src/android/server/wm/BarTestUtils.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.server.wm;
+
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeTrue;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.util.Log;
+import android.view.WindowInsets;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.rule.ActivityTestRule;
+
+import org.junit.AssumptionViolatedException;
+
+/**
+ * Common assumptions for system bar tests.
+ *
+ * TODO: Unify with copy in systemui tests.
+ */
+public final class BarTestUtils {
+
+    private BarTestUtils() {
+    }
+
+    public static void assumeHasColoredStatusBar(ActivityTestRule<?> rule) {
+        assumeHasColoredBars();
+
+        assumeFalse("No status bar when running in VR", isRunningInVr());
+
+        assumeTrue("Top stable inset is non-positive, no status bar.",
+                getInsets(rule).getStableInsetTop() > 0);
+    }
+
+    public static void assumeHasColoredNavigationBar(ActivityTestRule<?> rule) {
+        assumeHasColoredBars();
+
+        assumeTrue("Bottom stable inset is non-positive, no navigation bar",
+                getInsets(rule).getStableInsetBottom() > 0);
+    }
+
+    public static void assumeHasColoredBars() {
+        final PackageManager pm = getInstrumentation().getContext().getPackageManager();
+
+        assumeFalse("Embedded devices don't have system bars",
+                getInstrumentation().getContext().getPackageManager().hasSystemFeature(
+                        PackageManager.FEATURE_EMBEDDED));
+
+        assumeFalse("No bars on watches and TVs", pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
+                || pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION)
+                || pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK));
+
+        assumeFalse("Automotive navigation bar is opaque",
+                pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE));
+
+        assumeTrue("Only highEndGfx devices have colored system bars",
+                ActivityManager.isHighEndGfx());
+    }
+
+    private static boolean isRunningInVr() {
+        final Context context = InstrumentationRegistry.getContext();
+        final Configuration config = context.getResources().getConfiguration();
+        return (config.uiMode & Configuration.UI_MODE_TYPE_MASK)
+                == Configuration.UI_MODE_TYPE_VR_HEADSET;
+    }
+
+    private static WindowInsets getInsets(ActivityTestRule<?> rule) {
+        final WindowInsets[] insets = new WindowInsets[1];
+        try {
+            rule.runOnUiThread(() -> {
+                insets[0] = rule.getActivity().getWindow().getDecorView().getRootWindowInsets();
+            });
+        } catch (Throwable t) {
+            throw new RuntimeException(t);
+        }
+        return insets[0];
+    }
+
+    public static boolean isAssumptionViolated(Runnable assumption) {
+        try {
+            assumption.run();
+            return true;
+        } catch (AssumptionViolatedException e) {
+            Log.i("BarTestUtils", "Assumption violated", e);
+            return false;
+        }
+    }
+}
diff --git a/tests/tests/systemui/Android.mk b/tests/tests/systemui/Android.mk
index facdb87..6bb72ec 100644
--- a/tests/tests/systemui/Android.mk
+++ b/tests/tests/systemui/Android.mk
@@ -29,6 +29,7 @@
 LOCAL_STATIC_JAVA_LIBRARIES := \
     compatibility-device-util-axt \
     ctstestrunner-axt \
+    cts-wm-util \
     androidx.test.rules \
     ub-uiautomator
 
diff --git a/tests/tests/systemui/src/android/systemui/cts/LightBarTestBase.java b/tests/tests/systemui/src/android/systemui/cts/LightBarTestBase.java
index dbf3e76..9da89be 100644
--- a/tests/tests/systemui/src/android/systemui/cts/LightBarTestBase.java
+++ b/tests/tests/systemui/src/android/systemui/cts/LightBarTestBase.java
@@ -94,64 +94,6 @@
         }
     }
 
-    private boolean hasVirtualNavigationBar(ActivityTestRule<? extends LightBarBaseActivity> rule)
-            throws Throwable {
-        final WindowInsets[] inset = new WindowInsets[1];
-        rule.runOnUiThread(()-> {
-            inset[0] = rule.getActivity().getRootWindowInsets();
-        });
-        return inset[0].getStableInsetBottom() > 0;
-    }
-
-    private boolean isRunningInVr() {
-        final Context context = InstrumentationRegistry.getContext();
-        final Configuration config = context.getResources().getConfiguration();
-        return (config.uiMode & Configuration.UI_MODE_TYPE_MASK)
-                == Configuration.UI_MODE_TYPE_VR_HEADSET;
-    }
-
-    private void assumeBasics() {
-        final PackageManager pm = getInstrumentation().getContext().getPackageManager();
-
-        // No bars on embedded devices.
-        assumeFalse(getInstrumentation().getContext().getPackageManager().hasSystemFeature(
-                PackageManager.FEATURE_EMBEDDED));
-
-        // No bars on TVs and watches.
-        // Automotive navigation bar is not transparent
-        assumeFalse(pm.hasSystemFeature(PackageManager.FEATURE_WATCH)
-                || pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION)
-                || pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
-                || pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE));
-
-
-        // Non-highEndGfx devices don't do colored system bars.
-        assumeTrue(ActivityManager.isHighEndGfx());
-    }
-
-    protected void assumeHasColoredStatusBar(ActivityTestRule<? extends LightBarBaseActivity> rule)
-            throws Throwable {
-        assumeBasics();
-
-        // No status bar when running in Vr
-        assumeFalse(isRunningInVr());
-
-        // Status bar exists only when top stable inset is positive
-        final WindowInsets[] inset = new WindowInsets[1];
-        rule.runOnUiThread(()-> {
-            inset[0] = rule.getActivity().getRootWindowInsets();
-        });
-        assumeTrue("Top stable inset is non-positive.", inset[0].getStableInsetTop() > 0);
-    }
-
-    protected void assumeHasColoredNavigationBar(
-            ActivityTestRule<? extends LightBarBaseActivity> rule) throws Throwable {
-        assumeBasics();
-
-        // No virtual navigation bar, so no effect.
-        assumeTrue(hasVirtualNavigationBar(rule));
-    }
-
     protected void checkNavigationBarDivider(LightBarBaseActivity activity, int dividerColor,
             int backgroundColor, String methodName) {
         final Bitmap bitmap = takeNavigationBarScreenshot(activity);
diff --git a/tests/tests/systemui/src/android/systemui/cts/LightBarTests.java b/tests/tests/systemui/src/android/systemui/cts/LightBarTests.java
index 95573d1..137c003 100644
--- a/tests/tests/systemui/src/android/systemui/cts/LightBarTests.java
+++ b/tests/tests/systemui/src/android/systemui/cts/LightBarTests.java
@@ -16,6 +16,9 @@
 
 package android.systemui.cts;
 
+import static android.server.wm.BarTestUtils.assumeHasColoredNavigationBar;
+import static android.server.wm.BarTestUtils.assumeHasColoredStatusBar;
+
 import static androidx.test.InstrumentationRegistry.getInstrumentation;
 
 import static org.junit.Assert.assertTrue;
diff --git a/tests/tests/systemui/src/android/systemui/cts/LightBarThemeTest.java b/tests/tests/systemui/src/android/systemui/cts/LightBarThemeTest.java
index f8036f2..7da28d0 100644
--- a/tests/tests/systemui/src/android/systemui/cts/LightBarThemeTest.java
+++ b/tests/tests/systemui/src/android/systemui/cts/LightBarThemeTest.java
@@ -16,6 +16,8 @@
 
 package android.systemui.cts;
 
+import static android.server.wm.BarTestUtils.assumeHasColoredNavigationBar;
+
 import static androidx.test.InstrumentationRegistry.getInstrumentation;
 
 import static org.junit.Assert.assertEquals;