Loading packages/SystemUI/multivalentTests/src/com/android/systemui/screencapture/record/domain/interactor/ScreenCaptureRecordParametersModelInteractorTest.kt +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) Loading packages/SystemUI/src/com/android/systemui/screencapture/common/shared/model/ScreenCaptureTarget.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading packages/SystemUI/src/com/android/systemui/screencapture/record/smallscreen/ui/viewmodel/RecordDetailsTargetViewModel.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading packages/SystemUI/src/com/android/systemui/screencapture/record/smallscreen/ui/viewmodel/SmallScreenCaptureRecordViewModel.kt +50 −11 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 = Loading Loading @@ -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") } } Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/screencapture/record/domain/interactor/ScreenCaptureRecordParametersModelInteractorTest.kt +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) Loading
packages/SystemUI/src/com/android/systemui/screencapture/common/shared/model/ScreenCaptureTarget.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
packages/SystemUI/src/com/android/systemui/screencapture/record/smallscreen/ui/viewmodel/RecordDetailsTargetViewModel.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
packages/SystemUI/src/com/android/systemui/screencapture/record/smallscreen/ui/viewmodel/SmallScreenCaptureRecordViewModel.kt +50 −11 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 = Loading Loading @@ -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") } } Loading