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

Commit 67184f6f authored by Wes Okuhara's avatar Wes Okuhara
Browse files

Desktop screenshots: Refactor capture method after user click

When the user clicks the capture button either for screenshots or screen
recording, it consolidates to a single method which then determines
which action to take based on the current state.

Additionally, after ag/34814866 landed, this fixes some comments so that
they no longer refer to the obsolete activity.

Also fixes the casing convention for various methods and members to
adhere to the Kotlin style guide.

Bug: 435225255
Test: atest PreCaptureViewModelTest
Flag: com.android.systemui.large_screen_screencapture
Change-Id: Ibe79ed0eddbb728cb29c456ea599e0df0196d5aa
parent fe6783b8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ import com.android.systemui.dagger.SysUISingleton
import javax.inject.Inject

@SysUISingleton
class ScreenCaptureRecordLargeScreenFeaturesInteractor @Inject constructor() {
class LargeScreenCaptureFeaturesInteractor @Inject constructor() {
    val appWindowRegionSupported = Flags.largeScreenScreenshotAppWindow()

    val screenRecordingSupported = Flags.largeScreenRecording()
+2 −2
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ import com.android.systemui.screencapture.record.largescreen.ui.viewmodel.PreCap
import javax.inject.Inject

@ScreenCaptureScope
class LargeScreenCaptureRecordContent
class LargeScreenCaptureContent
@Inject
constructor(private val viewModelFactory: PreCaptureViewModel.Factory) : ScreenCaptureContent {

@@ -35,7 +35,7 @@ constructor(private val viewModelFactory: PreCaptureViewModel.Factory) : ScreenC
        val viewModel: PreCaptureViewModel =
            rememberViewModel("PreCaptureViewModel") { viewModelFactory.create(displayId) }

        if (viewModel.isShowingUI) {
        if (viewModel.isShowingUi) {
            PreCaptureUI(viewModel = viewModel)
        }
    }
+3 −3
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ fun PreCaptureUI(viewModel: PreCaptureViewModel) {
            PreCaptureToolbar(
                viewModel = viewModel,
                expanded = true,
                onCloseClick = { viewModel.closeUI() },
                onCloseClick = { viewModel.closeUi() },
            )
        }

@@ -89,7 +89,7 @@ fun PreCaptureUI(viewModel: PreCaptureViewModel) {
                                        R.string.screen_capture_fullscreen_record_button
                                }
                            ),
                        onClick = { viewModel.takeFullscreenScreenshot() },
                        onClick = viewModel::beginCapture,
                    )
                }
            }
@@ -116,7 +116,7 @@ fun PreCaptureUI(viewModel: PreCaptureViewModel) {
                        ),
                    buttonIcon = icon,
                    onRegionSelected = { rect: Rect -> viewModel.updateRegionBox(rect) },
                    onCaptureClick = { viewModel.takePartialScreenshot() },
                    onCaptureClick = viewModel::beginCapture,
                )
            }

+32 −21
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ import com.android.systemui.res.R
import com.android.systemui.screencapture.common.ui.viewmodel.DrawableLoaderViewModel
import com.android.systemui.screencapture.common.ui.viewmodel.DrawableLoaderViewModelImpl
import com.android.systemui.screencapture.domain.interactor.ScreenCaptureUiInteractor
import com.android.systemui.screencapture.record.largescreen.domain.interactor.ScreenCaptureRecordLargeScreenFeaturesInteractor
import com.android.systemui.screencapture.record.largescreen.domain.interactor.LargeScreenCaptureFeaturesInteractor
import com.android.systemui.screencapture.record.largescreen.domain.interactor.ScreenshotInteractor
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
@@ -56,19 +56,19 @@ constructor(
    @Background private val backgroundScope: CoroutineScope,
    private val iconProvider: ScreenCaptureIconProvider,
    private val screenshotInteractor: ScreenshotInteractor,
    private val featuresInteractor: ScreenCaptureRecordLargeScreenFeaturesInteractor,
    private val featuresInteractor: LargeScreenCaptureFeaturesInteractor,
    private val drawableLoaderViewModelImpl: DrawableLoaderViewModelImpl,
    private val screenCaptureUiInteractor: ScreenCaptureUiInteractor,
) : HydratedActivatable(), DrawableLoaderViewModel by drawableLoaderViewModelImpl {

    private val isShowingUIFlow = MutableStateFlow(true)
    private val isShowingUiFlow = MutableStateFlow(true)
    private val captureTypeSource = MutableStateFlow(ScreenCaptureType.SCREENSHOT)
    private val captureRegionSource = MutableStateFlow(ScreenCaptureRegion.FULLSCREEN)
    private val regionBoxSource = MutableStateFlow<Rect?>(null)

    val icons: ScreenCaptureIcons? by iconProvider.icons.hydratedStateOf()

    val isShowingUI: Boolean by isShowingUIFlow.hydratedStateOf()
    val isShowingUi: Boolean by isShowingUiFlow.hydratedStateOf()

    // TODO(b/423697394) Init default value to be user's previously selected option
    val captureType: ScreenCaptureType by captureTypeSource.hydratedStateOf()
@@ -116,28 +116,38 @@ constructor(
        regionBoxSource.value = bounds
    }

    fun takeFullscreenScreenshot() {
        require(captureTypeSource.value == ScreenCaptureType.SCREENSHOT)
        require(captureRegionSource.value == ScreenCaptureRegion.FULLSCREEN)
    /** Initiates capture of the screen depending on the currently chosen capture type. */
    fun beginCapture() {
        when (captureTypeSource.value) {
            ScreenCaptureType.SCREENSHOT -> takeScreenshot()
            ScreenCaptureType.SCREEN_RECORD -> {}
        }
    }

    private fun takeScreenshot() {
        when (captureRegionSource.value) {
            ScreenCaptureRegion.FULLSCREEN -> takeFullscreenScreenshot()
            ScreenCaptureRegion.PARTIAL -> takePartialScreenshot()
            ScreenCaptureRegion.APP_WINDOW -> {}
        }
    }

    private fun takeFullscreenScreenshot() {
        // Finishing the activity is not guaranteed to complete before the screenshot is taken.
        // Since the pre-capture UI should not be included in the screenshot, hide the UI first.
        hideUI()
        closeUI()
        hideUi()
        closeUi()

        backgroundScope.launch { screenshotInteractor.takeFullscreenScreenshot(displayId) }
    }

    fun takePartialScreenshot() {
        require(captureTypeSource.value == ScreenCaptureType.SCREENSHOT)
        require(captureRegionSource.value == ScreenCaptureRegion.PARTIAL)

    private fun takePartialScreenshot() {
        val regionBoxRect = requireNotNull(regionBoxSource.value)

        // Finishing the activity is not guaranteed to complete before the screenshot is taken.
        // Since the pre-capture UI should not be included in the screenshot, hide the UI first.
        hideUI()
        closeUI()
        hideUi()
        closeUi()

        backgroundScope.launch {
            screenshotInteractor.takePartialScreenshot(regionBoxRect, displayId)
@@ -145,15 +155,16 @@ constructor(
    }

    /**
     * Simply hides all Composables from being visible in the [ScreenCaptureActivity], but does NOT
     * close the activity. See [closeUI] for closing the activity.
     * Simply hides all Composables from being visible, which avoids the parent window close
     * animation. This is useful to ensure the UI is not visible before a screenshot is taken. Note:
     * this does NOT close the parent window. See [closeUi] for closing the window.
     */
    fun hideUI() {
        isShowingUIFlow.value = false
    fun hideUi() {
        isShowingUiFlow.value = false
    }

    /** Closes the UI by finishing the parent [ScreenCaptureActivity]. */
    fun closeUI() {
    /** Closes the UI by hiding the parent window. */
    fun closeUi() {
        screenCaptureUiInteractor.hide(
            com.android.systemui.screencapture.common.shared.model.ScreenCaptureType.RECORD
        )
+3 −3
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ import androidx.compose.runtime.remember
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.screencapture.common.ScreenCaptureScope
import com.android.systemui.screencapture.common.ui.compose.ScreenCaptureContent
import com.android.systemui.screencapture.record.largescreen.ui.compose.LargeScreenCaptureRecordContent
import com.android.systemui.screencapture.record.largescreen.ui.compose.LargeScreenCaptureContent
import com.android.systemui.screencapture.record.smallscreen.ui.compose.SmallScreenCaptureRecordContent
import com.android.systemui.screencapture.record.ui.viewmodel.ScreenCaptureRecordViewModel
import dagger.Lazy
@@ -35,7 +35,7 @@ class ScreenCaptureRecordContent
@Inject
constructor(
    private val screenCaptureRecordViewModelFactory: ScreenCaptureRecordViewModel.Factory,
    private val largeScreenCaptureRecordContent: Lazy<LargeScreenCaptureRecordContent>,
    private val largeScreenCaptureContent: Lazy<LargeScreenCaptureContent>,
    private val smallScreenCaptureRecordContent: Lazy<SmallScreenCaptureRecordContent>,
) : ScreenCaptureContent {

@@ -49,7 +49,7 @@ constructor(
            remember(viewModel.isLargeScreen) {
                derivedStateOf {
                    when (viewModel.isLargeScreen) {
                        true -> largeScreenCaptureRecordContent.get()
                        true -> largeScreenCaptureContent.get()
                        false -> smallScreenCaptureRecordContent.get()
                        else -> null
                    }
Loading