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

Commit abe94f4e authored by Anton Potapov's avatar Anton Potapov
Browse files

Pass target parameters to recording

Flag: com.android.systemui.new_screen_record_toolbar
Fixes: 428171948
Test: manual on foldable: check that recording a single app and fullscreen work
Change-Id: I19e883405c00d58bb822f870a7b2dfec080415f3
parent fcd301bf
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.screencapture.record.domain.interactor

import android.view.Display
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -52,7 +53,7 @@ class ScreenCaptureRecordParametersModelInteractorTest : SysuiTestCase() {
    @Test
    fun testChangingTarget() =
        kosmos.runTest {
            val newTarget = ScreenCaptureTarget.App(taskId = 1)
            val newTarget = ScreenCaptureTarget.App(displayId = Display.DEFAULT_DISPLAY, taskId = 1)
            val target by collectLastValue(underTest.parameters.map { it.target })
            assertThat(target).isNotEqualTo(newTarget)

+1 −1
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ sealed interface ScreenCaptureTarget {
    data class Region(val displayId: Int, val rect: Rect) : ScreenCaptureTarget

    /** A full app. */
    data class App(val taskId: Int) : ScreenCaptureTarget
    data class App(val displayId: Int, val taskId: Int) : ScreenCaptureTarget

    /** Content within an app. */
    data class AppContent(val contentId: Int) : ScreenCaptureTarget
+1 −1
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ sealed interface RecordDetailsTargetItemViewModel {
        RecordDetailsTargetItemViewModel {

        override val screenCaptureTarget: ScreenCaptureTarget? =
            task?.taskId?.let(ScreenCaptureTarget::App)
            task?.run { ScreenCaptureTarget.App(displayId = displayId, taskId = taskId) }

        override val labelRes: Int = R.string.screen_record_single_app
        override val isSelectable: Boolean = true
+50 −11
Original line number Diff line number Diff line
@@ -16,13 +16,19 @@

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

import android.app.ActivityOptions
import android.app.ActivityOptions.LaunchCookie
import android.app.ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS
import android.app.IActivityTaskManager
import android.media.projection.StopReason
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import com.android.app.tracing.coroutines.launchTraced
import com.android.systemui.lifecycle.HydratedActivatable
import com.android.systemui.mediaprojection.MediaProjectionCaptureTarget
import com.android.systemui.screencapture.common.ScreenCaptureUiScope
import com.android.systemui.screencapture.common.shared.model.ScreenCaptureTarget
import com.android.systemui.screencapture.common.shared.model.ScreenCaptureType
import com.android.systemui.screencapture.common.ui.viewmodel.DrawableLoaderViewModel
import com.android.systemui.screencapture.common.ui.viewmodel.DrawableLoaderViewModelImpl
@@ -45,6 +51,7 @@ constructor(
    recordDetailsTargetViewModelFactory: RecordDetailsTargetViewModel.Factory,
    private val drawableLoaderViewModelImpl: DrawableLoaderViewModelImpl,
    private val screenCaptureUiInteractor: ScreenCaptureUiInteractor,
    private val activityTaskManager: IActivityTaskManager,
) : HydratedActivatable(), DrawableLoaderViewModel by drawableLoaderViewModelImpl {

    val recordDetailsAppSelectorViewModel: RecordDetailsAppSelectorViewModel =
@@ -120,18 +127,50 @@ constructor(
        if (screenRecordingServiceInteractor.status.value.isRecording) {
            screenRecordingServiceInteractor.stopRecording(StopReason.STOP_HOST_APP)
        } else {
            startRecording()
            dismiss()
        }
    }

    private fun startRecording() {
        val shouldShowTaps = recordDetailsParametersViewModel.shouldShowTaps ?: return
        val audioSource = recordDetailsParametersViewModel.audioSource ?: return
            // TODO(b/428686600) pass actual parameters
        when (val target = recordDetailsTargetViewModel.currentTarget?.screenCaptureTarget) {
            is ScreenCaptureTarget.Fullscreen ->
                screenRecordingServiceInteractor.startRecording(
                    ScreenRecordingParameters(
                        captureTarget = null,
                    displayId = 0,
                        displayId = target.displayId,
                        shouldShowTaps = shouldShowTaps,
                        audioSource = audioSource,
                    )
                )
            dismiss()
            is ScreenCaptureTarget.App -> {
                val cookie = LaunchCookie("screen_record")
                activityTaskManager.startActivityFromRecents(
                    target.taskId,
                    ActivityOptions.makeBasic()
                        .apply {
                            pendingIntentBackgroundActivityStartMode =
                                MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS
                            setLaunchCookie(cookie)
                        }
                        .toBundle(),
                )
                screenRecordingServiceInteractor.startRecording(
                    ScreenRecordingParameters(
                        captureTarget =
                            MediaProjectionCaptureTarget(
                                launchCookie = cookie,
                                taskId = target.taskId,
                            ),
                        displayId = target.displayId,
                        shouldShowTaps = shouldShowTaps,
                        audioSource = audioSource,
                    )
                )
            }
            else -> error("Unsupported target=$target")
        }
    }