Loading packages/SystemUI/src/com/android/systemui/screencapture/record/largescreen/ui/viewmodel/PreCaptureViewModel.kt +35 −1 Original line number Diff line number Diff line Loading @@ -27,6 +27,9 @@ import com.android.systemui.screencapture.common.ui.viewmodel.DrawableLoaderView import com.android.systemui.screencapture.domain.interactor.ScreenCaptureUiInteractor import com.android.systemui.screencapture.record.largescreen.domain.interactor.LargeScreenCaptureFeaturesInteractor import com.android.systemui.screencapture.record.largescreen.domain.interactor.ScreenshotInteractor import com.android.systemui.screenrecord.ScreenRecordingAudioSource import com.android.systemui.screenrecord.domain.ScreenRecordingParameters import com.android.systemui.screenrecord.domain.interactor.ScreenRecordingServiceInteractor import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject Loading Loading @@ -60,6 +63,7 @@ constructor( private val featuresInteractor: LargeScreenCaptureFeaturesInteractor, private val drawableLoaderViewModelImpl: DrawableLoaderViewModelImpl, private val screenCaptureUiInteractor: ScreenCaptureUiInteractor, private val screenRecordingServiceInteractor: ScreenRecordingServiceInteractor, ) : HydratedActivatable(), DrawableLoaderViewModel by drawableLoaderViewModelImpl { private val isShowingUiFlow = MutableStateFlow(true) Loading Loading @@ -121,7 +125,7 @@ constructor( fun beginCapture() { when (captureTypeSource.value) { ScreenCaptureType.SCREENSHOT -> takeScreenshot() ScreenCaptureType.SCREEN_RECORD -> {} ScreenCaptureType.SCREEN_RECORD -> startRecording() } } Loading Loading @@ -155,6 +159,36 @@ constructor( closeUi() } private fun startRecording() { when (captureRegionSource.value) { ScreenCaptureRegion.FULLSCREEN -> startFullscreenRecording() ScreenCaptureRegion.PARTIAL -> {} ScreenCaptureRegion.APP_WINDOW -> {} } } private fun startFullscreenRecording() { require(captureTypeSource.value == ScreenCaptureType.SCREEN_RECORD) require(captureRegionSource.value == ScreenCaptureRegion.FULLSCREEN) // Hide the pre-capture UI before starting the recording. // TODO(b/437970158): Show the countdown before starting recording. hideUi() closeUi() backgroundScope.launch { screenRecordingServiceInteractor.startRecording( // TODO(b/437971334): Get options from the UI. ScreenRecordingParameters( captureTarget = null, // Fullscreen. audioSource = ScreenRecordingAudioSource.INTERNAL, displayId = displayId, shouldShowTaps = false, ) ) } } /** * 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: Loading packages/SystemUI/tests/src/com/android/systemui/screencapture/record/largescreen/ui/viewmodel/PreCaptureViewModelTest.kt +27 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,10 @@ import com.android.systemui.lifecycle.activateIn import com.android.systemui.res.R import com.android.systemui.screencapture.common.shared.model.ScreenCaptureUiState import com.android.systemui.screencapture.data.repository.screenCaptureUiRepository import com.android.systemui.screenrecord.ScreenRecordingAudioSource import com.android.systemui.screenrecord.domain.ScreenRecordingParameters import com.android.systemui.screenrecord.domain.interactor.ScreenRecordingServiceInteractor import com.android.systemui.screenrecord.domain.interactor.screenRecordingServiceInteractor import com.android.systemui.screenshot.mockImageCapture import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat Loading Loading @@ -64,10 +68,13 @@ class PreCaptureViewModelTest : SysuiTestCase() { private val viewModel: PreCaptureViewModel by lazy { kosmos.preCaptureViewModelFactory.create(displayId) } @Mock private lateinit var mockScreenRecordingServiceInteractor: ScreenRecordingServiceInteractor @Before fun setUp() { MockitoAnnotations.openMocks(this) kosmos.screenRecordingServiceInteractor = mockScreenRecordingServiceInteractor viewModel.activateIn(testScope) } Loading Loading @@ -213,6 +220,26 @@ class PreCaptureViewModelTest : SysuiTestCase() { assertThat(capturedRequest.displayId).isEqualTo(displayId) } @Test fun beginCapture_forFullScreenRecording_startsRecordingWithCorrectParameters() = kosmos.runTest { viewModel.updateCaptureType(ScreenCaptureType.SCREEN_RECORD) viewModel.updateCaptureRegion(ScreenCaptureRegion.FULLSCREEN) viewModel.beginCapture() val paramsCaptor = argumentCaptor<ScreenRecordingParameters>() verify(mockScreenRecordingServiceInteractor, times(1)) .startRecording(paramsCaptor.capture()) val capturedParams = paramsCaptor.lastValue with(capturedParams) { assertThat(captureTarget).isNull() assertThat(audioSource).isEqualTo(ScreenRecordingAudioSource.INTERNAL) assertThat(this.displayId).isEqualTo(displayId) assertThat(shouldShowTaps).isFalse() } } @Test @DisableFlags(Flags.FLAG_LARGE_SCREEN_SCREENSHOT_APP_WINDOW) fun captureRegionButtonViewModels_excludesAppWindowWithFeatureDisabled() = Loading packages/SystemUI/tests/utils/src/com/android/systemui/screencapture/record/largescreen/ui/viewmodel/PreCaptureViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import com.android.systemui.screencapture.common.ui.viewmodel.drawableLoaderView import com.android.systemui.screencapture.domain.interactor.screenCaptureUiInteractor import com.android.systemui.screencapture.record.largescreen.domain.interactor.largeScreenCaptureFeaturesInteractor import com.android.systemui.screencapture.record.largescreen.domain.interactor.screenshotInteractor import com.android.systemui.screenrecord.domain.interactor.screenRecordingServiceInteractor val Kosmos.preCaptureViewModelFactory by Fixture { object : PreCaptureViewModel.Factory { Loading @@ -37,6 +38,7 @@ val Kosmos.preCaptureViewModelFactory by Fixture { featuresInteractor = largeScreenCaptureFeaturesInteractor, drawableLoaderViewModelImpl = drawableLoaderViewModelImpl, screenCaptureUiInteractor = screenCaptureUiInteractor, screenRecordingServiceInteractor = screenRecordingServiceInteractor, ) } } Loading packages/SystemUI/tests/utils/src/com/android/systemui/screenrecord/domain/interactor/ScreenRecordingServiceInteractorKosmos.kt +1 −1 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.screenrecord.screenRecordUxController import com.android.systemui.user.data.repository.userRepository val Kosmos.screenRecordingServiceInteractor: ScreenRecordingServiceInteractor by var Kosmos.screenRecordingServiceInteractor: ScreenRecordingServiceInteractor by Kosmos.Fixture { ScreenRecordingServiceInteractor( applicationContext, Loading Loading
packages/SystemUI/src/com/android/systemui/screencapture/record/largescreen/ui/viewmodel/PreCaptureViewModel.kt +35 −1 Original line number Diff line number Diff line Loading @@ -27,6 +27,9 @@ import com.android.systemui.screencapture.common.ui.viewmodel.DrawableLoaderView import com.android.systemui.screencapture.domain.interactor.ScreenCaptureUiInteractor import com.android.systemui.screencapture.record.largescreen.domain.interactor.LargeScreenCaptureFeaturesInteractor import com.android.systemui.screencapture.record.largescreen.domain.interactor.ScreenshotInteractor import com.android.systemui.screenrecord.ScreenRecordingAudioSource import com.android.systemui.screenrecord.domain.ScreenRecordingParameters import com.android.systemui.screenrecord.domain.interactor.ScreenRecordingServiceInteractor import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject Loading Loading @@ -60,6 +63,7 @@ constructor( private val featuresInteractor: LargeScreenCaptureFeaturesInteractor, private val drawableLoaderViewModelImpl: DrawableLoaderViewModelImpl, private val screenCaptureUiInteractor: ScreenCaptureUiInteractor, private val screenRecordingServiceInteractor: ScreenRecordingServiceInteractor, ) : HydratedActivatable(), DrawableLoaderViewModel by drawableLoaderViewModelImpl { private val isShowingUiFlow = MutableStateFlow(true) Loading Loading @@ -121,7 +125,7 @@ constructor( fun beginCapture() { when (captureTypeSource.value) { ScreenCaptureType.SCREENSHOT -> takeScreenshot() ScreenCaptureType.SCREEN_RECORD -> {} ScreenCaptureType.SCREEN_RECORD -> startRecording() } } Loading Loading @@ -155,6 +159,36 @@ constructor( closeUi() } private fun startRecording() { when (captureRegionSource.value) { ScreenCaptureRegion.FULLSCREEN -> startFullscreenRecording() ScreenCaptureRegion.PARTIAL -> {} ScreenCaptureRegion.APP_WINDOW -> {} } } private fun startFullscreenRecording() { require(captureTypeSource.value == ScreenCaptureType.SCREEN_RECORD) require(captureRegionSource.value == ScreenCaptureRegion.FULLSCREEN) // Hide the pre-capture UI before starting the recording. // TODO(b/437970158): Show the countdown before starting recording. hideUi() closeUi() backgroundScope.launch { screenRecordingServiceInteractor.startRecording( // TODO(b/437971334): Get options from the UI. ScreenRecordingParameters( captureTarget = null, // Fullscreen. audioSource = ScreenRecordingAudioSource.INTERNAL, displayId = displayId, shouldShowTaps = false, ) ) } } /** * 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: Loading
packages/SystemUI/tests/src/com/android/systemui/screencapture/record/largescreen/ui/viewmodel/PreCaptureViewModelTest.kt +27 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,10 @@ import com.android.systemui.lifecycle.activateIn import com.android.systemui.res.R import com.android.systemui.screencapture.common.shared.model.ScreenCaptureUiState import com.android.systemui.screencapture.data.repository.screenCaptureUiRepository import com.android.systemui.screenrecord.ScreenRecordingAudioSource import com.android.systemui.screenrecord.domain.ScreenRecordingParameters import com.android.systemui.screenrecord.domain.interactor.ScreenRecordingServiceInteractor import com.android.systemui.screenrecord.domain.interactor.screenRecordingServiceInteractor import com.android.systemui.screenshot.mockImageCapture import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat Loading Loading @@ -64,10 +68,13 @@ class PreCaptureViewModelTest : SysuiTestCase() { private val viewModel: PreCaptureViewModel by lazy { kosmos.preCaptureViewModelFactory.create(displayId) } @Mock private lateinit var mockScreenRecordingServiceInteractor: ScreenRecordingServiceInteractor @Before fun setUp() { MockitoAnnotations.openMocks(this) kosmos.screenRecordingServiceInteractor = mockScreenRecordingServiceInteractor viewModel.activateIn(testScope) } Loading Loading @@ -213,6 +220,26 @@ class PreCaptureViewModelTest : SysuiTestCase() { assertThat(capturedRequest.displayId).isEqualTo(displayId) } @Test fun beginCapture_forFullScreenRecording_startsRecordingWithCorrectParameters() = kosmos.runTest { viewModel.updateCaptureType(ScreenCaptureType.SCREEN_RECORD) viewModel.updateCaptureRegion(ScreenCaptureRegion.FULLSCREEN) viewModel.beginCapture() val paramsCaptor = argumentCaptor<ScreenRecordingParameters>() verify(mockScreenRecordingServiceInteractor, times(1)) .startRecording(paramsCaptor.capture()) val capturedParams = paramsCaptor.lastValue with(capturedParams) { assertThat(captureTarget).isNull() assertThat(audioSource).isEqualTo(ScreenRecordingAudioSource.INTERNAL) assertThat(this.displayId).isEqualTo(displayId) assertThat(shouldShowTaps).isFalse() } } @Test @DisableFlags(Flags.FLAG_LARGE_SCREEN_SCREENSHOT_APP_WINDOW) fun captureRegionButtonViewModels_excludesAppWindowWithFeatureDisabled() = Loading
packages/SystemUI/tests/utils/src/com/android/systemui/screencapture/record/largescreen/ui/viewmodel/PreCaptureViewModelKosmos.kt +2 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import com.android.systemui.screencapture.common.ui.viewmodel.drawableLoaderView import com.android.systemui.screencapture.domain.interactor.screenCaptureUiInteractor import com.android.systemui.screencapture.record.largescreen.domain.interactor.largeScreenCaptureFeaturesInteractor import com.android.systemui.screencapture.record.largescreen.domain.interactor.screenshotInteractor import com.android.systemui.screenrecord.domain.interactor.screenRecordingServiceInteractor val Kosmos.preCaptureViewModelFactory by Fixture { object : PreCaptureViewModel.Factory { Loading @@ -37,6 +38,7 @@ val Kosmos.preCaptureViewModelFactory by Fixture { featuresInteractor = largeScreenCaptureFeaturesInteractor, drawableLoaderViewModelImpl = drawableLoaderViewModelImpl, screenCaptureUiInteractor = screenCaptureUiInteractor, screenRecordingServiceInteractor = screenRecordingServiceInteractor, ) } } Loading
packages/SystemUI/tests/utils/src/com/android/systemui/screenrecord/domain/interactor/ScreenRecordingServiceInteractorKosmos.kt +1 −1 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.screenrecord.screenRecordUxController import com.android.systemui.user.data.repository.userRepository val Kosmos.screenRecordingServiceInteractor: ScreenRecordingServiceInteractor by var Kosmos.screenRecordingServiceInteractor: ScreenRecordingServiceInteractor by Kosmos.Fixture { ScreenRecordingServiceInteractor( applicationContext, Loading