Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5c6e8ff authored by Chris Göllner's avatar Chris Göllner Committed by Android (Google) Code Review
Browse files

Merge "PSS: Use a fake WindowMetricsProvider in screenshot tests" into main

parents 51735a47 79e5196f
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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
+5 −10
Original line number Diff line number Diff line
@@ -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
        }

+30 −0
Original line number Diff line number Diff line
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()
            )
}
+10 −5
Original line number Diff line number Diff line
@@ -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) }
    }

+44 −0
Original line number Diff line number Diff line
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)
    }
}