Loading packages/SystemUI/src/com/android/systemui/screencapture/common/ScreenCaptureComponent.kt +8 −5 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.screencapture.common import com.android.systemui.screencapture.common.shared.model.ScreenCaptureActivityIntentParameters import com.android.systemui.screencapture.common.ui.compose.ScreenCaptureContent import com.android.systemui.screencapture.ui.ScreenCaptureActivity import dagger.BindsInstance import dagger.Subcomponent import kotlinx.coroutines.CoroutineScope Loading @@ -32,6 +33,8 @@ import kotlinx.coroutines.CoroutineScope @Subcomponent(modules = [CommonModule::class, FallbackModule::class]) interface ScreenCaptureComponent { val screenCaptureContent: ScreenCaptureContent /** * Dagger Subcomponent Builder for [ScreenCaptureComponent]. * Loading @@ -42,12 +45,14 @@ interface ScreenCaptureComponent { interface Builder { /** The [CoroutineScope] to use coroutines limited to Screen Capture sessions. */ @BindsInstance @ScreenCapture fun setScope(scope: CoroutineScope): Builder @BindsInstance fun setScope(@ScreenCapture scope: CoroutineScope): Builder /** [ScreenCaptureActivityIntentParameters] that has been used to start capture flow. */ @BindsInstance @ScreenCapture fun setParameters(parameters: ScreenCaptureActivityIntentParameters): Builder fun setParameters(@ScreenCapture parameters: ScreenCaptureActivityIntentParameters): Builder @BindsInstance fun setScreenCaptureActivity(@ScreenCapture activity: ScreenCaptureActivity): Builder /** * Builds this [ScreenCaptureComponent]. Actual Subcomponent Builders should override this Loading @@ -55,6 +60,4 @@ interface ScreenCaptureComponent { */ fun build(): ScreenCaptureComponent } val screenCaptureContent: ScreenCaptureContent } packages/SystemUI/src/com/android/systemui/screencapture/common/ui/compose/PrimaryButton.kt +11 −4 Original line number Diff line number Diff line Loading @@ -16,16 +16,21 @@ package com.android.systemui.screencapture.common.ui.compose import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.size import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.android.compose.PlatformButton import com.android.systemui.common.shared.model.Icon as IconModel import com.android.systemui.common.ui.compose.Icon private val ButtonPaddings = PaddingValues(horizontal = 16.dp, vertical = 8.dp) /** Component for a primary button containing text and an optional leading icon. */ @Composable fun PrimaryButton( Loading @@ -33,12 +38,14 @@ fun PrimaryButton( onClick: () -> Unit, modifier: Modifier = Modifier, icon: IconModel? = null, contentPadding: PaddingValues = ButtonPaddings, iconPadding: Dp = 5.dp, ) { PlatformButton(modifier = modifier, onClick = onClick) { PlatformButton(onClick = onClick, modifier = modifier, contentPadding = contentPadding) { if (icon != null) { Icon(icon = icon, modifier = Modifier.size(20.dp)) Spacer(Modifier.size(5.dp)) Icon(icon = icon, modifier = Modifier.size(20.dp).align(Alignment.CenterVertically)) Spacer(Modifier.size(iconPadding)) } Text(text = text, maxLines = 1) Text(text = text, maxLines = 1, modifier = Modifier.align(Alignment.CenterVertically)) } } packages/SystemUI/src/com/android/systemui/screencapture/record/largescreen/ui/compose/PreCaptureUI.kt +8 −1 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import com.android.systemui.res.R import com.android.systemui.screencapture.common.ui.compose.PrimaryButton import com.android.systemui.screencapture.common.ui.compose.loadIcon import com.android.systemui.screencapture.record.largescreen.ui.viewmodel.PreCaptureViewModel import com.android.systemui.screencapture.record.largescreen.ui.viewmodel.ScreenCaptureRegion Loading Loading @@ -58,7 +59,12 @@ fun PreCaptureUI(viewModel: PreCaptureViewModel) { modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.Center).zIndex(0f) ) { PrimaryButton( icon = viewModel.icons?.screenshotButton, icon = loadIcon( viewModel = viewModel, resId = R.drawable.ic_screen_capture_camera, contentDescription = null, ), text = stringResource(R.string.screen_capture_fullscreen_screenshot_button), onClick = { viewModel.takeFullscreenScreenshot() }, ) Loading @@ -71,6 +77,7 @@ fun PreCaptureUI(viewModel: PreCaptureViewModel) { initialWidth = 100.dp, initialHeight = 100.dp, onDragEnd = viewModel::onPartialRegionDragEnd, drawableLoaderViewModel = viewModel, ) } ScreenCaptureRegion.APP_WINDOW -> {} Loading packages/SystemUI/src/com/android/systemui/screencapture/record/largescreen/ui/compose/RegionBox.kt +11 −7 Original line number Diff line number Diff line Loading @@ -39,9 +39,10 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.android.systemui.common.shared.model.Icon as IconModel import com.android.systemui.res.R import com.android.systemui.screencapture.common.ui.compose.PrimaryButton import com.android.systemui.screencapture.common.ui.compose.loadIcon import com.android.systemui.screencapture.common.ui.viewmodel.DrawableLoaderViewModel /** * Determines which zone (corner or edge) of a box is being touched based on the press offset. Loading Loading @@ -96,6 +97,7 @@ fun RegionBox( initialWidth: Dp, initialHeight: Dp, onDragEnd: (offset: Offset, width: Dp, height: Dp) -> Unit, drawableLoaderViewModel: DrawableLoaderViewModel, initialOffset: Offset = Offset.Zero, modifier: Modifier = Modifier, ) { Loading Loading @@ -143,6 +145,7 @@ fun RegionBox( with(density) { rect.height.toDp() }, ) }, drawableLoaderViewModel = drawableLoaderViewModel, modifier = modifier, ) } Loading @@ -163,13 +166,9 @@ private fun ResizableRectangle( onResizeDrag: (dragAmount: Offset, zone: ResizeZone, maxWidth: Float, maxHeight: Float) -> Unit, onBoxDrag: (dragAmount: Offset, maxWidth: Float, maxHeight: Float) -> Unit, onDragEnd: () -> Unit, drawableLoaderViewModel: DrawableLoaderViewModel, modifier: Modifier = Modifier, ) { // TODO(b/422855266): Preload icons in the view model to avoid loading icons in UI thread and // improve performance val screenshotIcon = IconModel.Resource(res = R.drawable.ic_screen_capture_camera, contentDescription = null) // The width of the border stroke around the region box. val borderStrokeWidth = 4.dp // The touch area for detecting an edge or corner resize drag. Loading Loading @@ -245,7 +244,12 @@ private fun ResizableRectangle( onClick = { // TODO(b/417534202): trigger a screenshot of the selected area. }, icon = screenshotIcon, icon = loadIcon( viewModel = drawableLoaderViewModel, resId = R.drawable.ic_screen_capture_camera, contentDescription = null, ), ) } } Loading packages/SystemUI/src/com/android/systemui/screencapture/record/largescreen/ui/viewmodel/PreCaptureViewModel.kt +4 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.lifecycle.HydratedActivatable 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.record.largescreen.domain.interactor.ScreenCaptureRecordLargeScreenFeaturesInteractor import com.android.systemui.screencapture.record.largescreen.domain.interactor.ScreenshotInteractor import dagger.assisted.AssistedFactory Loading Loading @@ -53,7 +55,8 @@ constructor( private val iconProvider: ScreenCaptureIconProvider, private val screenshotInteractor: ScreenshotInteractor, private val featuresInteractor: ScreenCaptureRecordLargeScreenFeaturesInteractor, ) : HydratedActivatable() { private val drawableLoaderViewModelImpl: DrawableLoaderViewModelImpl, ) : HydratedActivatable(), DrawableLoaderViewModel by drawableLoaderViewModelImpl { private val captureTypeSource = MutableStateFlow(ScreenCaptureType.SCREENSHOT) private val captureRegionSource = MutableStateFlow(ScreenCaptureRegion.FULLSCREEN) Loading Loading
packages/SystemUI/src/com/android/systemui/screencapture/common/ScreenCaptureComponent.kt +8 −5 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.screencapture.common import com.android.systemui.screencapture.common.shared.model.ScreenCaptureActivityIntentParameters import com.android.systemui.screencapture.common.ui.compose.ScreenCaptureContent import com.android.systemui.screencapture.ui.ScreenCaptureActivity import dagger.BindsInstance import dagger.Subcomponent import kotlinx.coroutines.CoroutineScope Loading @@ -32,6 +33,8 @@ import kotlinx.coroutines.CoroutineScope @Subcomponent(modules = [CommonModule::class, FallbackModule::class]) interface ScreenCaptureComponent { val screenCaptureContent: ScreenCaptureContent /** * Dagger Subcomponent Builder for [ScreenCaptureComponent]. * Loading @@ -42,12 +45,14 @@ interface ScreenCaptureComponent { interface Builder { /** The [CoroutineScope] to use coroutines limited to Screen Capture sessions. */ @BindsInstance @ScreenCapture fun setScope(scope: CoroutineScope): Builder @BindsInstance fun setScope(@ScreenCapture scope: CoroutineScope): Builder /** [ScreenCaptureActivityIntentParameters] that has been used to start capture flow. */ @BindsInstance @ScreenCapture fun setParameters(parameters: ScreenCaptureActivityIntentParameters): Builder fun setParameters(@ScreenCapture parameters: ScreenCaptureActivityIntentParameters): Builder @BindsInstance fun setScreenCaptureActivity(@ScreenCapture activity: ScreenCaptureActivity): Builder /** * Builds this [ScreenCaptureComponent]. Actual Subcomponent Builders should override this Loading @@ -55,6 +60,4 @@ interface ScreenCaptureComponent { */ fun build(): ScreenCaptureComponent } val screenCaptureContent: ScreenCaptureContent }
packages/SystemUI/src/com/android/systemui/screencapture/common/ui/compose/PrimaryButton.kt +11 −4 Original line number Diff line number Diff line Loading @@ -16,16 +16,21 @@ package com.android.systemui.screencapture.common.ui.compose import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.size import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.android.compose.PlatformButton import com.android.systemui.common.shared.model.Icon as IconModel import com.android.systemui.common.ui.compose.Icon private val ButtonPaddings = PaddingValues(horizontal = 16.dp, vertical = 8.dp) /** Component for a primary button containing text and an optional leading icon. */ @Composable fun PrimaryButton( Loading @@ -33,12 +38,14 @@ fun PrimaryButton( onClick: () -> Unit, modifier: Modifier = Modifier, icon: IconModel? = null, contentPadding: PaddingValues = ButtonPaddings, iconPadding: Dp = 5.dp, ) { PlatformButton(modifier = modifier, onClick = onClick) { PlatformButton(onClick = onClick, modifier = modifier, contentPadding = contentPadding) { if (icon != null) { Icon(icon = icon, modifier = Modifier.size(20.dp)) Spacer(Modifier.size(5.dp)) Icon(icon = icon, modifier = Modifier.size(20.dp).align(Alignment.CenterVertically)) Spacer(Modifier.size(iconPadding)) } Text(text = text, maxLines = 1) Text(text = text, maxLines = 1, modifier = Modifier.align(Alignment.CenterVertically)) } }
packages/SystemUI/src/com/android/systemui/screencapture/record/largescreen/ui/compose/PreCaptureUI.kt +8 −1 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import com.android.systemui.res.R import com.android.systemui.screencapture.common.ui.compose.PrimaryButton import com.android.systemui.screencapture.common.ui.compose.loadIcon import com.android.systemui.screencapture.record.largescreen.ui.viewmodel.PreCaptureViewModel import com.android.systemui.screencapture.record.largescreen.ui.viewmodel.ScreenCaptureRegion Loading Loading @@ -58,7 +59,12 @@ fun PreCaptureUI(viewModel: PreCaptureViewModel) { modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.Center).zIndex(0f) ) { PrimaryButton( icon = viewModel.icons?.screenshotButton, icon = loadIcon( viewModel = viewModel, resId = R.drawable.ic_screen_capture_camera, contentDescription = null, ), text = stringResource(R.string.screen_capture_fullscreen_screenshot_button), onClick = { viewModel.takeFullscreenScreenshot() }, ) Loading @@ -71,6 +77,7 @@ fun PreCaptureUI(viewModel: PreCaptureViewModel) { initialWidth = 100.dp, initialHeight = 100.dp, onDragEnd = viewModel::onPartialRegionDragEnd, drawableLoaderViewModel = viewModel, ) } ScreenCaptureRegion.APP_WINDOW -> {} Loading
packages/SystemUI/src/com/android/systemui/screencapture/record/largescreen/ui/compose/RegionBox.kt +11 −7 Original line number Diff line number Diff line Loading @@ -39,9 +39,10 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.android.systemui.common.shared.model.Icon as IconModel import com.android.systemui.res.R import com.android.systemui.screencapture.common.ui.compose.PrimaryButton import com.android.systemui.screencapture.common.ui.compose.loadIcon import com.android.systemui.screencapture.common.ui.viewmodel.DrawableLoaderViewModel /** * Determines which zone (corner or edge) of a box is being touched based on the press offset. Loading Loading @@ -96,6 +97,7 @@ fun RegionBox( initialWidth: Dp, initialHeight: Dp, onDragEnd: (offset: Offset, width: Dp, height: Dp) -> Unit, drawableLoaderViewModel: DrawableLoaderViewModel, initialOffset: Offset = Offset.Zero, modifier: Modifier = Modifier, ) { Loading Loading @@ -143,6 +145,7 @@ fun RegionBox( with(density) { rect.height.toDp() }, ) }, drawableLoaderViewModel = drawableLoaderViewModel, modifier = modifier, ) } Loading @@ -163,13 +166,9 @@ private fun ResizableRectangle( onResizeDrag: (dragAmount: Offset, zone: ResizeZone, maxWidth: Float, maxHeight: Float) -> Unit, onBoxDrag: (dragAmount: Offset, maxWidth: Float, maxHeight: Float) -> Unit, onDragEnd: () -> Unit, drawableLoaderViewModel: DrawableLoaderViewModel, modifier: Modifier = Modifier, ) { // TODO(b/422855266): Preload icons in the view model to avoid loading icons in UI thread and // improve performance val screenshotIcon = IconModel.Resource(res = R.drawable.ic_screen_capture_camera, contentDescription = null) // The width of the border stroke around the region box. val borderStrokeWidth = 4.dp // The touch area for detecting an edge or corner resize drag. Loading Loading @@ -245,7 +244,12 @@ private fun ResizableRectangle( onClick = { // TODO(b/417534202): trigger a screenshot of the selected area. }, icon = screenshotIcon, icon = loadIcon( viewModel = drawableLoaderViewModel, resId = R.drawable.ic_screen_capture_camera, contentDescription = null, ), ) } } Loading
packages/SystemUI/src/com/android/systemui/screencapture/record/largescreen/ui/viewmodel/PreCaptureViewModel.kt +4 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.lifecycle.HydratedActivatable 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.record.largescreen.domain.interactor.ScreenCaptureRecordLargeScreenFeaturesInteractor import com.android.systemui.screencapture.record.largescreen.domain.interactor.ScreenshotInteractor import dagger.assisted.AssistedFactory Loading Loading @@ -53,7 +55,8 @@ constructor( private val iconProvider: ScreenCaptureIconProvider, private val screenshotInteractor: ScreenshotInteractor, private val featuresInteractor: ScreenCaptureRecordLargeScreenFeaturesInteractor, ) : HydratedActivatable() { private val drawableLoaderViewModelImpl: DrawableLoaderViewModelImpl, ) : HydratedActivatable(), DrawableLoaderViewModel by drawableLoaderViewModelImpl { private val captureTypeSource = MutableStateFlow(ScreenCaptureType.SCREENSHOT) private val captureRegionSource = MutableStateFlow(ScreenCaptureRegion.FULLSCREEN) Loading