diff options
2 files changed, 32 insertions, 5 deletions
diff --git a/packages/SystemUI/screenshot/src/com/android/systemui/testing/screenshot/ScreenshotTestRule.kt b/packages/SystemUI/screenshot/src/com/android/systemui/testing/screenshot/ScreenshotTestRule.kt index 363ce10fa36c..564901c2a773 100644 --- a/packages/SystemUI/screenshot/src/com/android/systemui/testing/screenshot/ScreenshotTestRule.kt +++ b/packages/SystemUI/screenshot/src/com/android/systemui/testing/screenshot/ScreenshotTestRule.kt @@ -20,6 +20,7 @@ import android.app.UiModeManager import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas +import android.os.Build import android.os.UserHandle import android.view.Display import android.view.View @@ -32,6 +33,7 @@ import platform.test.screenshot.GoldenImagePathManager import platform.test.screenshot.PathConfig import platform.test.screenshot.PathElementNoContext import platform.test.screenshot.ScreenshotTestRule +import platform.test.screenshot.matchers.MSSIMMatcher import platform.test.screenshot.matchers.PixelPerfectMatcher /** @@ -55,7 +57,11 @@ class ScreenshotTestRule(private val testSpec: ScreenshotTestSpec) : TestRule { currentDisplay?.name ?: error("currentDisplay is null") }, ) - private val defaultMatcher = PixelPerfectMatcher() + private val matcher = if (shouldUsePerfectMatching()) { + PixelPerfectMatcher() + } else { + MSSIMMatcher() + } private val screenshotRule = ScreenshotTestRule( @@ -67,6 +73,17 @@ class ScreenshotTestRule(private val testSpec: ScreenshotTestSpec) : TestRule { ) ) + private fun shouldUsePerfectMatching(): Boolean { + // Different CPU architectures can sometimes end up rendering differently, so we can't do + // pixel-perfect matching on different architectures using the same golden. Given that our + // presubmits are run on cf_x86_64_phone, our goldens should be perfectly matched on the + // x86_64 architecture and use the Structural Similarity Index on others. + // TODO(b/237511747): Run our screenshot presubmit tests on arm64 instead so that we can + // do pixel perfect matching both at presubmit time and at development time with actual + // devices. + return Build.CPU_ABI == "x86_64" + } + override fun apply(base: Statement, description: Description): Statement { // The statement which call beforeTest() before running the test and afterTest() afterwards. val statement = @@ -147,7 +164,7 @@ class ScreenshotTestRule(private val testSpec: ScreenshotTestSpec) : TestRule { // device to assertBitmapAgainstGolden instead? currentDisplay = testSpec.display currentGoldenIdentifier = goldenIdentifier - screenshotRule.assertBitmapAgainstGolden(bitmap, identifierWithSpec, defaultMatcher) + screenshotRule.assertBitmapAgainstGolden(bitmap, identifierWithSpec, matcher) currentDisplay = null currentGoldenIdentifier = goldenIdentifier } diff --git a/packages/SystemUI/screenshot/src/com/android/systemui/testing/screenshot/ViewScreenshotTestRule.kt b/packages/SystemUI/screenshot/src/com/android/systemui/testing/screenshot/ViewScreenshotTestRule.kt index 35812e39677d..6a80c486d515 100644 --- a/packages/SystemUI/screenshot/src/com/android/systemui/testing/screenshot/ViewScreenshotTestRule.kt +++ b/packages/SystemUI/screenshot/src/com/android/systemui/testing/screenshot/ViewScreenshotTestRule.kt @@ -60,11 +60,17 @@ class ViewScreenshotTestRule(testSpec: ScreenshotTestSpec) : TestRule { ) { var dialog: Dialog? = null activityRule.scenario.onActivity { activity -> - // Make sure that the dialog draws full screen and fits the whole display instead of the - // system bars. dialog = dialogProvider(activity).apply { + // Make sure that the dialog draws full screen and fits the whole display + // instead of the system bars. window.setDecorFitsSystemWindows(false) + + // Disable enter/exit animations. + create() + window.setWindowAnimations(0) + + // Show the dialog. show() } } @@ -74,7 +80,11 @@ class ViewScreenshotTestRule(testSpec: ScreenshotTestSpec) : TestRule { activityRule.scenario.onActivity { // Check that the content is what we expected. val dialog = dialog ?: error("dialog is null") - screenshotRule.screenshotTest(goldenIdentifier, dialog.window.decorView) + try { + screenshotRule.screenshotTest(goldenIdentifier, dialog.window.decorView) + } finally { + dialog.dismiss() + } } } } |