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

Commit 3e58b7e0 authored by Wes Okuhara's avatar Wes Okuhara
Browse files

Desktop screenshots: Multidisplay support for partial screenshots

Use the ID of the display containing the pre-capture UI in the
screenshot request argument. Ensure that the display ID is honored by
the screenshot executor for screenshot requests from the pre-capture
UI.

Bug: 433792108
Test: atest PreCaptureViewModelTest
Test: atest ScreenshotInteractorTest
Flag: com.android.systemui.desktop_screen_capture
Change-Id: I1a6c05037d9aadc97a343f3e198defa26f868f02
parent 98e2bfb0
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.systemui.screencapture.record.largescreen.domain.interactor
import android.graphics.Rect
import android.os.Handler
import android.os.UserHandle
import android.view.Display.DEFAULT_DISPLAY
import android.view.WindowManager
import com.android.internal.util.ScreenshotHelper
import com.android.internal.util.ScreenshotRequest
@@ -52,7 +51,7 @@ constructor(
        takeScreenshot(request)
    }

    suspend fun takePartialScreenshot(regionBounds: Rect, displayId: Int = DEFAULT_DISPLAY) {
    suspend fun takePartialScreenshot(regionBounds: Rect, displayId: Int) {
        val bitmap =
            withContext(backgroundContext) {
                requireNotNull(imageCapture.captureDisplay(displayId, regionBounds))
+1 −2
Original line number Diff line number Diff line
@@ -134,8 +134,7 @@ constructor(
        closeUI()

        backgroundScope.launch {
            // TODO(b/430361425) Pass in current display as argument.
            screenshotInteractor.takePartialScreenshot(regionBoxRect)
            screenshotInteractor.takePartialScreenshot(regionBoxRect, displayId)
        }
    }

+5 −5
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.systemui.screencapture.record.largescreen.domain.interactor
import android.graphics.Bitmap
import android.graphics.Rect
import android.os.UserHandle
import android.view.Display.DEFAULT_DISPLAY
import android.view.WindowManager
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -79,13 +78,14 @@ class ScreenshotInteractorTest : SysuiTestCase() {
    }

    @Test
    fun takePartialScreenshot_makesCorrectRequestAndCallsScreenshotHelper() {
    fun takePartialScreenshot_callsScreenshotHelper_withCorrectRequest() {
        testScope.runTest {
            val bounds = Rect(0, 0, 100, 100)
            whenever(kosmos.mockImageCapture.captureDisplay(eq(DEFAULT_DISPLAY), eq(bounds)))
            val displayId = 3
            whenever(kosmos.mockImageCapture.captureDisplay(eq(displayId), eq(bounds)))
                .thenReturn(mockBitmap)

            interactor.takePartialScreenshot(bounds)
            interactor.takePartialScreenshot(bounds, displayId)

            val screenshotRequestCaptor = argumentCaptor<ScreenshotRequest>()
            verify(kosmos.mockImageCapture, times(1)).captureDisplay(any(), eq(bounds))
@@ -98,7 +98,7 @@ class ScreenshotInteractorTest : SysuiTestCase() {
                .isEqualTo(WindowManager.ScreenshotSource.SCREENSHOT_SCREEN_CAPTURE_UI)
            assertThat(capturedRequest.bitmap).isEqualTo(mockBitmap)
            assertThat(capturedRequest.boundsInScreen).isEqualTo(bounds)
            assertThat(capturedRequest.displayId).isEqualTo(DEFAULT_DISPLAY)
            assertThat(capturedRequest.displayId).isEqualTo(displayId)
            assertThat(capturedRequest.userId).isEqualTo(UserHandle.USER_CURRENT)
        }
    }
+8 −1
Original line number Diff line number Diff line
@@ -211,8 +211,11 @@ class PreCaptureViewModelTest : SysuiTestCase() {
        }

    @Test
    fun takePartialScreenshot_callsScreenshotInteractor() =
    fun takePartialScreenshot_callsScreenshotInteractor_withCorrectRequest() =
        testScope.runTest {
            val displayId = 3
            whenever(kosmos.mockScreenCaptureActivity.displayId).thenReturn(displayId)

            viewModel.updateCaptureType(ScreenCaptureType.SCREENSHOT)
            viewModel.updateCaptureRegion(ScreenCaptureRegion.PARTIAL)

@@ -227,10 +230,14 @@ class PreCaptureViewModelTest : SysuiTestCase() {
            val screenshotRequestCaptor = argumentCaptor<ScreenshotRequest>()
            verify(kosmos.mockScreenshotHelper, times(1))
                .takeScreenshot(screenshotRequestCaptor.capture(), any(), isNull())

            val capturedRequest = screenshotRequestCaptor.lastValue
            assertThat(capturedRequest.type).isEqualTo(WindowManager.TAKE_SCREENSHOT_PROVIDED_IMAGE)
            assertThat(capturedRequest.source)
                .isEqualTo(WindowManager.ScreenshotSource.SCREENSHOT_SCREEN_CAPTURE_UI)
            assertThat(capturedRequest.bitmap).isEqualTo(mockBitmap)
            assertThat(capturedRequest.boundsInScreen).isEqualTo(regionBox)
            assertThat(capturedRequest.displayId).isEqualTo(displayId)
        }

    @Test