diff options
| author | 2023-10-04 12:52:45 +0100 | |
|---|---|---|
| committer | 2023-10-04 12:57:41 +0100 | |
| commit | 79e5196fae3d3df7a90e078150e83214a5fe0b1d (patch) | |
| tree | 71d488ad842322713658ddc8f61d26150baacf3a | |
| parent | 6d617f789eb2a9f6f3a36d6c87f42c075fdc9f6f (diff) | |
PSS: Use a fake WindowMetricsProvider in screenshot tests
This is an attempt to reduce flakiness of the test. It seems that the
values returned from WM are not stable in between tests.
Change-Id: Id04546fb72f2ec9d00eb4719e27cfa145cac1e1e
Fixes: 302599732
Test: TaskPreviewSizeProviderTest.kt
Test: WindowMetricsProviderImplTest.kt
Test: atest SystemUIGoogleScreenshotTests:MediaProjectionAppSelectorScreenshotTest
5 files changed, 93 insertions, 15 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt index 72aea040ba05..2217509167ef 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorComponent.kt @@ -33,6 +33,8 @@ import com.android.systemui.mediaprojection.appselector.data.RecentTaskThumbnail import com.android.systemui.mediaprojection.appselector.data.ShellRecentTaskListProvider import com.android.systemui.mediaprojection.appselector.view.MediaProjectionRecentsViewController import com.android.systemui.mediaprojection.appselector.view.TaskPreviewSizeProvider +import com.android.systemui.mediaprojection.appselector.view.WindowMetricsProvider +import com.android.systemui.mediaprojection.appselector.view.WindowMetricsProviderImpl import com.android.systemui.mediaprojection.devicepolicy.MediaProjectionDevicePolicyModule import com.android.systemui.mediaprojection.devicepolicy.PersonalProfile import com.android.systemui.mediaprojection.permission.MediaProjectionPermissionActivity @@ -106,6 +108,8 @@ interface MediaProjectionAppSelectorModule { impl: TaskPreviewSizeProvider ): DefaultLifecycleObserver + @Binds fun windowMetricsProvider(impl: WindowMetricsProviderImpl): WindowMetricsProvider + companion object { @Provides @MediaProjectionAppSelector diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/TaskPreviewSizeProvider.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/TaskPreviewSizeProvider.kt index 864d35af41b4..c829471f53f3 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/TaskPreviewSizeProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/TaskPreviewSizeProvider.kt @@ -19,8 +19,6 @@ package com.android.systemui.mediaprojection.appselector.view import android.content.Context import android.content.res.Configuration import android.graphics.Rect -import android.view.WindowInsets.Type -import android.view.WindowManager import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import com.android.systemui.mediaprojection.appselector.MediaProjectionAppSelectorScope @@ -36,7 +34,7 @@ class TaskPreviewSizeProvider @Inject constructor( private val context: Context, - private val windowManager: WindowManager, + private val windowMetricsProvider: WindowMetricsProvider, private val configurationController: ConfigurationController, ) : CallbackController<TaskPreviewSizeListener>, ConfigurationListener, DefaultLifecycleObserver { @@ -62,17 +60,14 @@ constructor( } private fun calculateSize(): Rect { - val windowMetrics = windowManager.maximumWindowMetrics - val maximumWindowHeight = windowMetrics.bounds.height() - val width = windowMetrics.bounds.width() + val maxWindowBounds = windowMetricsProvider.maximumWindowBounds + val maximumWindowHeight = maxWindowBounds.height() + val width = maxWindowBounds.width() var height = maximumWindowHeight val isLargeScreen = isLargeScreen(context) if (isLargeScreen) { - val taskbarSize = - windowManager.currentWindowMetrics.windowInsets - .getInsets(Type.tappableElement()) - .bottom + val taskbarSize = windowMetricsProvider.currentWindowInsets.bottom height -= taskbarSize } diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/WindowMetricsProvider.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/WindowMetricsProvider.kt new file mode 100644 index 000000000000..193292032868 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/WindowMetricsProvider.kt @@ -0,0 +1,30 @@ +package com.android.systemui.mediaprojection.appselector.view + +import android.graphics.Insets +import android.graphics.Rect +import android.view.WindowInsets +import android.view.WindowManager +import javax.inject.Inject + +/** Provides values related to window metrics. */ +interface WindowMetricsProvider { + + val maximumWindowBounds: Rect + + val currentWindowInsets: Insets +} + +class WindowMetricsProviderImpl +@Inject +constructor( + private val windowManager: WindowManager, +) : WindowMetricsProvider { + override val maximumWindowBounds: Rect + get() = windowManager.maximumWindowMetrics.bounds + + override val currentWindowInsets: Insets + get() = + windowManager.currentWindowMetrics.windowInsets.getInsets( + WindowInsets.Type.tappableElement() + ) +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/TaskPreviewSizeProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/TaskPreviewSizeProviderTest.kt index 906420d03bed..9630ee32d456 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/TaskPreviewSizeProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/TaskPreviewSizeProviderTest.kt @@ -46,6 +46,7 @@ class TaskPreviewSizeProviderTest : SysuiTestCase() { private val mockContext = mock<Context>() private val resources = mock<Resources>() private val windowManager = mock<WindowManager>() + private val windowMetricsProvider = mock<WindowMetricsProvider>() private val sizeUpdates = arrayListOf<Rect>() private val testConfigurationController = FakeConfigurationController() @@ -112,13 +113,12 @@ class TaskPreviewSizeProviderTest : SysuiTestCase() { } private fun givenTaskbarSize(size: Int) { - val windowInsets = - WindowInsets.Builder() - .setInsets(Type.tappableElement(), Insets.of(Rect(0, 0, 0, size))) - .build() + val insets = Insets.of(Rect(0, 0, 0, size)) + val windowInsets = WindowInsets.Builder().setInsets(Type.tappableElement(), insets).build() val windowMetrics = WindowMetrics(windowManager.maximumWindowMetrics.bounds, windowInsets) whenever(windowManager.maximumWindowMetrics).thenReturn(windowMetrics) whenever(windowManager.currentWindowMetrics).thenReturn(windowMetrics) + whenever(windowMetricsProvider.currentWindowInsets).thenReturn(insets) } private fun givenDisplay(width: Int, height: Int, isTablet: Boolean = false) { @@ -126,6 +126,7 @@ class TaskPreviewSizeProviderTest : SysuiTestCase() { val windowMetrics = WindowMetrics(bounds, { null }, 1.0f) whenever(windowManager.maximumWindowMetrics).thenReturn(windowMetrics) whenever(windowManager.currentWindowMetrics).thenReturn(windowMetrics) + whenever(windowMetricsProvider.maximumWindowBounds).thenReturn(bounds) val minDimension = min(width, height) @@ -147,7 +148,11 @@ class TaskPreviewSizeProviderTest : SysuiTestCase() { } } - return TaskPreviewSizeProvider(mockContext, windowManager, testConfigurationController) + return TaskPreviewSizeProvider( + mockContext, + windowMetricsProvider, + testConfigurationController + ) .also { it.addCallback(listener) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/WindowMetricsProviderImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/WindowMetricsProviderImplTest.kt new file mode 100644 index 000000000000..fe18454ec06c --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/WindowMetricsProviderImplTest.kt @@ -0,0 +1,44 @@ +package com.android.systemui.mediaprojection.appselector.view + +import android.graphics.Insets +import android.graphics.Rect +import android.view.WindowManager +import android.view.WindowMetrics +import androidx.core.view.WindowInsetsCompat +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.util.mockito.mock +import com.android.systemui.util.mockito.whenever +import com.google.common.truth.Truth.assertThat +import org.junit.Test + +@SmallTest +class WindowMetricsProviderImplTest : SysuiTestCase() { + + private val windowManager = mock<WindowManager>() + private val windowMetricsProvider = WindowMetricsProviderImpl(windowManager) + + @Test + fun getMaximumWindowBounds_returnsValueFromWMMaxWindowMetrics() { + val bounds = Rect(/* left= */ 100, /* top= */ 200, /* right= */ 300, /* bottom= */ 400) + val metrics = + WindowMetrics(bounds, /* windowInsetsSupplier= */ { null }, /* density= */ 1.0f) + whenever(windowManager.maximumWindowMetrics).thenReturn(metrics) + + assertThat(windowMetricsProvider.maximumWindowBounds).isEqualTo(bounds) + } + + @Test + fun getCurrentWindowInsets_returnsFromWMCurrentWindowMetrics() { + val bounds = Rect() + val insets = + Insets.of(Rect(/* left= */ 123, /* top= */ 456, /* right= */ 789, /* bottom= */ 1012)) + val windowInsets = + android.view.WindowInsets.Builder() + .setInsets(WindowInsetsCompat.Type.tappableElement(), insets) + .build() + whenever(windowManager.currentWindowMetrics).thenReturn(WindowMetrics(bounds, windowInsets)) + + assertThat(windowMetricsProvider.currentWindowInsets).isEqualTo(insets) + } +} |