diff options
Diffstat (limited to 'feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/ui/PreviewScreenComponents.kt')
-rw-r--r-- | feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/ui/PreviewScreenComponents.kt | 98 |
1 files changed, 81 insertions, 17 deletions
diff --git a/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/ui/PreviewScreenComponents.kt b/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/ui/PreviewScreenComponents.kt index a952bcf..01f09c8 100644 --- a/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/ui/PreviewScreenComponents.kt +++ b/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/ui/PreviewScreenComponents.kt @@ -18,6 +18,7 @@ package com.google.jetpackcamera.feature.preview.ui import android.util.Log import android.view.Display import android.view.View +import android.widget.Toast import androidx.camera.core.Preview import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween @@ -44,24 +45,67 @@ import androidx.compose.material3.IconButton import androidx.compose.material3.SuggestionChip import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.google.jetpackcamera.feature.preview.R import com.google.jetpackcamera.feature.preview.VideoRecordingState import com.google.jetpackcamera.settings.model.AspectRatio +import com.google.jetpackcamera.settings.model.Stabilization +import com.google.jetpackcamera.settings.model.SupportedStabilizationMode import com.google.jetpackcamera.viewfinder.CameraPreview import kotlinx.coroutines.CompletableDeferred private const val TAG = "PreviewScreen" -/** this is the preview surface display. This view implements gestures tap to focus, pinch to zoom, - * and double tap to flip camera */ +/** + * An invisible box that will display a [Toast] with specifications set by a [ToastMessage]. + * + * @param toastMessage the specifications for the [Toast]. + * @param onToastShown called once the Toast has been displayed. + */ +@Composable +fun ShowTestableToast( + modifier: Modifier = Modifier, + toastMessage: ToastMessage, + onToastShown: () -> Unit +) { + val toastShownStatus = remember { mutableStateOf(false) } + Box( + // box seems to need to have some size to be detected by UiAutomator + modifier = modifier + .size(20.dp) + .testTag(toastMessage.testTag) + ) { + // prevents toast from being spammed + if (!toastShownStatus.value) { + Toast.makeText( + LocalContext.current, + stringResource(id = toastMessage.stringResource), + toastMessage.toastLength + ) + .show() + toastShownStatus.value = true + onToastShown() + } + } + Log.d(TAG, "Toast Displayed with message: ${stringResource(id = toastMessage.stringResource)}") +} + +/** + * this is the preview surface display. This view implements gestures tap to focus, pinch to zoom, + * and double-tap to flip camera + */ @Composable fun PreviewDisplay( onTapToFocus: (Display, Int, Int, Float, Float) -> Unit, @@ -140,6 +184,29 @@ fun PreviewDisplay( } } +@Composable +fun StabilizationIcon( + supportedStabilizationMode: List<SupportedStabilizationMode>, + videoStabilization: Stabilization, + previewStabilization: Stabilization +) { + if (supportedStabilizationMode.isNotEmpty() && + (videoStabilization == Stabilization.ON || previewStabilization == Stabilization.ON) + ) { + val descriptionText = if (videoStabilization == Stabilization.ON) { + stringResource(id = R.string.stabilization_icon_description_preview_and_video) + } else { + // previewStabilization will not be on for high quality + stringResource(id = R.string.stabilization_icon_description_video_only) + } + Icon( + painter = painterResource(id = R.drawable.baseline_video_stable_24), + contentDescription = descriptionText, + tint = Color.White + ) + } +} + /** * A temporary button that can be added to preview for quick testing purposes */ @@ -160,21 +227,18 @@ fun FlipCameraButton( enabledCondition: Boolean, onClick: () -> Unit ) { - Box(modifier = modifier) { - IconButton( - modifier = Modifier - .align(Alignment.Center) - .size(40.dp), - onClick = onClick, - enabled = enabledCondition - ) { - Icon( - imageVector = Icons.Filled.Refresh, - tint = Color.White, - contentDescription = stringResource(id = R.string.flip_camera_content_description), - modifier = Modifier.size(72.dp) - ) - } + IconButton( + modifier = modifier + .size(40.dp), + onClick = onClick, + enabled = enabledCondition + ) { + Icon( + imageVector = Icons.Filled.Refresh, + tint = Color.White, + contentDescription = stringResource(id = R.string.flip_camera_content_description), + modifier = Modifier.size(72.dp) + ) } } |