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

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

Screen capture: Call interactor for fullscreen screenshots

Both the ScreenCaptureViewModel and ScreenshotInteractors are setup. The
next step is to have the view model call the interactor when the user
initiates a fullscreen screenshot.

Bug: 427476661
Test: atest ScreenCaptureViewModelTest
Flag: com.android.systemui.desktop_screen_capture
Change-Id: I0be4fefe40c7419e9bda2243b5be21c0b63ed13d
parent c4f3054c
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.Context
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.lifecycle.HydratedActivatable
import com.android.systemui.res.R
import com.android.systemui.screencapture.domain.interactor.ScreenshotInteractor
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.coroutineScope
@@ -42,8 +43,9 @@ enum class ScreenCaptureRegion {
class ScreenCaptureViewModel
@AssistedInject
constructor(
    @Application private val context: Context,
    @Application private val applicationContext: Context,
    private val iconProvider: ScreenCaptureIconProvider,
    private val screenshotInteractor: ScreenshotInteractor,
) : HydratedActivatable() {
    private val captureTypeSource = MutableStateFlow(ScreenCaptureType.SCREENSHOT)
    private val captureRegionSource = MutableStateFlow(ScreenCaptureRegion.FULLSCREEN)
@@ -81,6 +83,15 @@ constructor(
        captureRegionSource.value = selectedRegion
    }

    suspend fun takeFullscreenScreenshot() {
        require(captureTypeSource.value == ScreenCaptureType.SCREENSHOT)
        require(captureRegionSource.value == ScreenCaptureRegion.FULLSCREEN)

        screenshotInteractor.takeFullscreenScreenshot()

        // TODO(b/427500006) Close the window after requesting a fullscreen screenshot.
    }

    override suspend fun onActivated() {
        coroutineScope { launch { iconProvider.collectIcons() } }
    }
@@ -92,13 +103,14 @@ constructor(
        return listOf(
            RadioButtonGroupItemViewModel(
                icon = icons?.screenRecord,
                label = context.getString(R.string.screen_capture_toolbar_record_button),
                label = applicationContext.getString(R.string.screen_capture_toolbar_record_button),
                isSelected = selectedType == ScreenCaptureType.SCREEN_RECORD,
                onClick = { updateCaptureType(ScreenCaptureType.SCREEN_RECORD) },
            ),
            RadioButtonGroupItemViewModel(
                icon = icons?.screenshot,
                label = context.getString(R.string.screen_capture_toolbar_capture_button),
                label =
                    applicationContext.getString(R.string.screen_capture_toolbar_capture_button),
                isSelected = selectedType == ScreenCaptureType.SCREENSHOT,
                onClick = { updateCaptureType(ScreenCaptureType.SCREENSHOT) },
            ),
+49 −0
Original line number Diff line number Diff line
@@ -16,18 +16,29 @@

package com.android.systemui.screencapture.ui.viewmodel

import android.view.WindowManager
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.internal.util.ScreenshotRequest
import com.android.internal.util.mockScreenshotHelper
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlin.test.assertFailsWith
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers.isNull
import org.mockito.Captor
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.any
import org.mockito.kotlin.times
import org.mockito.kotlin.verify

@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -35,10 +46,12 @@ class ScreenCaptureViewModelTest : SysuiTestCase() {
    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
    private val testScope = kosmos.testScope

    @Captor private lateinit var screenshotRequestCaptor: ArgumentCaptor<ScreenshotRequest>
    private val viewModel: ScreenCaptureViewModel by lazy { kosmos.screenCaptureViewModel }

    @Before
    fun setUp() {
        MockitoAnnotations.openMocks(this)
        viewModel.activateIn(testScope)
    }

@@ -105,4 +118,40 @@ class ScreenCaptureViewModelTest : SysuiTestCase() {
            assertThat(partialButton3.isSelected).isFalse()
            assertThat(fullscreenButton3.isSelected).isFalse()
        }

    @Test
    fun takeFullscreenScreenshot_callsScreenshotInteractor() =
        testScope.runTest {
            viewModel.updateCaptureType(ScreenCaptureType.SCREENSHOT)
            viewModel.updateCaptureRegion(ScreenCaptureRegion.FULLSCREEN)

            viewModel.takeFullscreenScreenshot()

            verify(kosmos.mockScreenshotHelper, times(1))
                .takeScreenshot(screenshotRequestCaptor.capture(), any(), isNull())
            val capturedRequest = screenshotRequestCaptor.value
            assertThat(capturedRequest.type).isEqualTo(WindowManager.TAKE_SCREENSHOT_FULLSCREEN)
        }

    @Test
    fun takeFullscreenScreenshot_validatesCaptureType() =
        testScope.runTest {
            viewModel.updateCaptureType(ScreenCaptureType.SCREEN_RECORD)
            viewModel.updateCaptureRegion(ScreenCaptureRegion.FULLSCREEN)

            assertFailsWith(IllegalArgumentException::class) {
                viewModel.takeFullscreenScreenshot()
            }
        }

    @Test
    fun takeFullscreenScreenshot_validatesCaptureRegion() =
        testScope.runTest {
            viewModel.updateCaptureType(ScreenCaptureType.SCREENSHOT)
            viewModel.updateCaptureRegion(ScreenCaptureRegion.PARTIAL)

            assertFailsWith(IllegalArgumentException::class) {
                viewModel.takeFullscreenScreenshot()
            }
        }
}
+3 −1
Original line number Diff line number Diff line
@@ -19,10 +19,12 @@ package com.android.systemui.screencapture.ui.viewmodel
import android.content.applicationContext
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.screencapture.domain.interactor.screenshotInteractor

val Kosmos.screenCaptureViewModel by Fixture {
    ScreenCaptureViewModel(
        context = applicationContext,
        applicationContext = applicationContext,
        iconProvider = screenCaptureIconProviderKosmos,
        screenshotInteractor = screenshotInteractor,
    )
}