Fix sysui cts skip the cutout parts
The sysui cts test should skip the parts of cutouts as the
background.
Change-Id: Ib19d6620143711802433b0a7a5df0d9e5a4649a2
Merged-In: Ib19d6620143711802433b0a7a5df0d9e5a4649a2
Fixes: 113564408
Test: atest android.systemui.cts
diff --git a/tests/tests/systemui/src/android/systemui/cts/LightBarTestBase.java b/tests/tests/systemui/src/android/systemui/cts/LightBarTestBase.java
index dde2ce1..a56ab29 100644
--- a/tests/tests/systemui/src/android/systemui/cts/LightBarTestBase.java
+++ b/tests/tests/systemui/src/android/systemui/cts/LightBarTestBase.java
@@ -26,10 +26,11 @@
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
+import android.graphics.Rect;
import android.support.test.InstrumentationRegistry;
import android.support.test.rule.ActivityTestRule;
import android.util.Log;
-import android.view.KeyEvent;
+import android.view.DisplayCutout;
import android.view.WindowInsets;
import java.io.File;
@@ -37,6 +38,8 @@
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Locale;
public class LightBarTestBase {
@@ -45,6 +48,8 @@
public static final Path DUMP_PATH = FileSystems.getDefault()
.getPath("/sdcard/LightBarTestBase/");
+ private ArrayList<Rect> mCutouts;
+
protected Bitmap takeStatusBarScreenshot(LightBarBaseActivity activity) {
Bitmap fullBitmap = getInstrumentation().getUiAutomation().takeScreenshot();
return Bitmap.createBitmap(fullBitmap, 0, 0, activity.getWidth(), activity.getTop());
@@ -144,18 +149,30 @@
int[] pixels = new int[bitmap.getHeight() * bitmap.getWidth()];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
+ loadCutout(activity);
int backgroundColorPixelCount = 0;
+ int shiftY = activity.getBottom();
for (int i = 0; i < pixels.length; i++) {
- if (pixels[i] == backgroundColor) {
+ int x = i % bitmap.getWidth();
+ int y = i / bitmap.getWidth();
+
+ if (pixels[i] == backgroundColor
+ || isInsideCutout(x, shiftY + y)) {
backgroundColorPixelCount++;
}
}
assumeNavigationBarChangesColor(backgroundColorPixelCount, pixels.length);
for (int col = 0; col < bitmap.getWidth(); col++) {
+ if (isInsideCutout(col, shiftY)) {
+ continue;
+ }
+
if (dividerColor != pixels[col]) {
dumpBitmap(bitmap, methodName);
- fail("Invalid color exptected=" + dividerColor + " actual=" + pixels[col]);
+ fail(String.format(Locale.ENGLISH,
+ "Invalid color expected= 0x%08x, actual= 0x%08x",
+ dividerColor, pixels[col]));
}
}
}
@@ -164,4 +181,25 @@
assumeTrue("Not enough background pixels. The navigation bar may not be able to change "
+ "color.", backgroundColorPixelCount > 0.3f * totalPixel);
}
+
+ protected ArrayList loadCutout(LightBarBaseActivity activity) {
+ mCutouts = new ArrayList<>();
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(()-> {
+ WindowInsets windowInsets = activity.getRootWindowInsets();
+ DisplayCutout displayCutout = windowInsets.getDisplayCutout();
+ if (displayCutout != null) {
+ mCutouts.addAll(displayCutout.getBoundingRects());
+ }
+ });
+ return mCutouts;
+ }
+
+ protected boolean isInsideCutout(int x, int y) {
+ for (Rect cutout : mCutouts) {
+ if (cutout.contains(x, y)) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/tests/tests/systemui/src/android/systemui/cts/LightBarTests.java b/tests/tests/systemui/src/android/systemui/cts/LightBarTests.java
index 724bca0..5566a0d 100644
--- a/tests/tests/systemui/src/android/systemui/cts/LightBarTests.java
+++ b/tests/tests/systemui/src/android/systemui/cts/LightBarTests.java
@@ -20,13 +20,11 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import android.app.ActivityManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.UiAutomation;
import android.content.Context;
-import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.SystemClock;
@@ -96,7 +94,7 @@
Thread.sleep(WAIT_TIME);
Bitmap bitmap = takeStatusBarScreenshot(mActivityRule.getActivity());
- Stats s = evaluateLightBarBitmap(bitmap, Color.RED /* background */);
+ Stats s = evaluateLightBarBitmap(bitmap, Color.RED /* background */, 0);
assertLightStats(bitmap, s);
mNm.cancelAll();
@@ -116,8 +114,9 @@
injectCanceledTap(x, y);
Thread.sleep(WAIT_TIME);
- Bitmap bitmap = takeNavigationBarScreenshot(mActivityRule.getActivity());
- Stats s = evaluateLightBarBitmap(bitmap, Color.RED /* background */);
+ LightBarActivity activity = mActivityRule.getActivity();
+ Bitmap bitmap = takeNavigationBarScreenshot(activity);
+ Stats s = evaluateLightBarBitmap(bitmap, Color.RED /* background */, activity.getBottom());
assertLightStats(bitmap, s);
}
@@ -225,7 +224,7 @@
}
}
- private Stats evaluateLightBarBitmap(Bitmap bitmap, int background) {
+ private Stats evaluateLightBarBitmap(Bitmap bitmap, int background, int shiftY) {
int iconColor = 0x99000000;
int iconPartialColor = 0x3d000000;
@@ -247,8 +246,17 @@
Stats s = new Stats();
float eps = 0.005f;
+ loadCutout(mActivityRule.getActivity());
float [] hsvPixel = new float[3];
+ int i = 0;
for (int c : pixels) {
+ int x = i % bitmap.getWidth();
+ int y = i / bitmap.getWidth();
+ i++;
+ if (isInsideCutout(x, shiftY + y)) {
+ continue;
+ }
+
if (isColorSame(c, background)) {
s.backgroundPixels++;
continue;