From 0b4126377339a2663e9931330d356cad125147f9 Mon Sep 17 00:00:00 2001 From: Paige McAuliffe Date: Wed, 5 Feb 2025 10:54:26 -0800 Subject: [PATCH] Fix DisplaySizeRule for failing tests and support using DisplaySizeRule without ActivityScenario/AndroidComposeTestRule This simplifies the implementation of DisplaySizeRule using "wm size reset" and supports resetting the display size without an activity in the resumed state. PiperOrigin-RevId: 723574207 --- espresso/device/CHANGELOG.md | 3 + .../espresso/device/rules/DisplaySizeRule.kt | 74 ++----------------- .../androidx/test/espresso/intent/BUILD | 3 +- 3 files changed, 9 insertions(+), 71 deletions(-) diff --git a/espresso/device/CHANGELOG.md b/espresso/device/CHANGELOG.md index 8e6a2b2c4..c7e94e032 100644 --- a/espresso/device/CHANGELOG.md +++ b/espresso/device/CHANGELOG.md @@ -5,6 +5,9 @@ `androidx.test.espresso:espresso-device:{version}` is released. **Bug Fixes** +Fix DisplaySizeRule not consistently restoring to original emulator state for + failing tests +Support using DisplaySizeRule without an activity in the resumed state **New Features** diff --git a/espresso/device/java/androidx/test/espresso/device/rules/DisplaySizeRule.kt b/espresso/device/java/androidx/test/espresso/device/rules/DisplaySizeRule.kt index 6e0e9c995..2574182f8 100644 --- a/espresso/device/java/androidx/test/espresso/device/rules/DisplaySizeRule.kt +++ b/espresso/device/java/androidx/test/espresso/device/rules/DisplaySizeRule.kt @@ -15,21 +15,9 @@ */ package androidx.test.espresso.device.rules -import android.app.Activity -import android.content.res.Configuration -import android.util.Log -import android.view.View -import android.view.ViewGroup -import androidx.test.espresso.device.common.calculateCurrentDisplayWidthAndHeightPx import androidx.test.espresso.device.common.executeShellCommand import androidx.test.espresso.device.common.getDeviceApiLevel -import androidx.test.espresso.device.common.getResumedActivityOrNull -import androidx.test.espresso.device.controller.DeviceControllerOperationException import androidx.test.platform.device.UnsupportedDeviceOperationException -import androidx.test.runner.lifecycle.ActivityLifecycleCallback -import androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry -import androidx.test.runner.lifecycle.Stage -import java.util.concurrent.CountDownLatch import org.junit.rules.TestRule import org.junit.runner.Description import org.junit.runners.model.Statement @@ -45,63 +33,11 @@ class DisplaySizeRule : TestRule { ) } - val startingDisplaySize = calculateCurrentDisplayWidthAndHeightPx() - statement.evaluate() - - if (startingDisplaySize != calculateCurrentDisplayWidthAndHeightPx()) { - val activity = getResumedActivityOrNull() - if (activity != null) { - val latch = CountDownLatch(1) - val container: ViewGroup = - activity.getWindow().findViewById(android.R.id.content) as ViewGroup - val activityView: View = - object : View(activity) { - override fun onConfigurationChanged(newConfig: Configuration?) { - super.onConfigurationChanged(newConfig) - if (startingDisplaySize == calculateCurrentDisplayWidthAndHeightPx()) { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d( - TAG, - "View configuration changed. Display size restored to starting size." - ) - } - latch.countDown() - } - } - } - activity.runOnUiThread { container.addView(activityView) } - val activityLifecyleCallback: ActivityLifecycleCallback = - object : ActivityLifecycleCallback { - override fun onActivityLifecycleChanged(activity: Activity, stage: Stage) { - if ( - activity.getLocalClassName() == activity.getLocalClassName() && - stage == Stage.PAUSED && - startingDisplaySize == calculateCurrentDisplayWidthAndHeightPx() - ) { - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Activity restarted. Display size restored to starting size.") - } - latch.countDown() - } - } - } - ActivityLifecycleMonitorRegistry.getInstance() - .addLifecycleCallback(activityLifecyleCallback) - - executeShellCommand( - "wm size ${startingDisplaySize.first}x${startingDisplaySize.second}" - ) - latch.await() - - activity.runOnUiThread { container.removeView(activityView) } - ActivityLifecycleMonitorRegistry.getInstance() - .removeLifecycleCallback(activityLifecyleCallback) - } else { - throw DeviceControllerOperationException( - "Device could not be set to the requested display size because there are no activities in" + - " the resumed stage." - ) - } + try { + statement.evaluate() + } finally { + // Always reset the display size to it's original size + executeShellCommand("wm size reset") } } } diff --git a/espresso/intents/javatests/androidx/test/espresso/intent/BUILD b/espresso/intents/javatests/androidx/test/espresso/intent/BUILD index d31054b63..049498fdd 100644 --- a/espresso/intents/javatests/androidx/test/espresso/intent/BUILD +++ b/espresso/intents/javatests/androidx/test/espresso/intent/BUILD @@ -18,8 +18,7 @@ axt_android_library_test( name = "RuntimePermissionStubberIntegrationTest", srcs = ["RuntimePermissionStubberIntegrationTest.java"], args = ["--clear_package_data"], - device_list = devices( - ), + device_list = devices(), manifest = "AndroidManifest.xml", deps = [ "//core",