summaryrefslogtreecommitdiff
path: root/feature/preview/src/main/java/com/google/jetpackcamera/feature/preview/ui/PreviewScreenComponents.kt
diff options
context:
space:
mode:
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.kt98
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)
+ )
}
}