From aec73830b0ef15b27bc01cfccac04c7c3c8be772 Mon Sep 17 00:00:00 2001 From: Caren Chang Date: Mon, 15 Apr 2024 12:55:12 -0700 Subject: [PATCH] add loading icon when saving video --- .../android/samples/socialite/ui/camera/Camera.kt | 12 ++++++++++++ .../samples/socialite/ui/camera/CameraViewModel.kt | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/app/src/main/java/com/google/android/samples/socialite/ui/camera/Camera.kt b/app/src/main/java/com/google/android/samples/socialite/ui/camera/Camera.kt index 3381dcd5..677f4b3e 100644 --- a/app/src/main/java/com/google/android/samples/socialite/ui/camera/Camera.kt +++ b/app/src/main/java/com/google/android/samples/socialite/ui/camera/Camera.kt @@ -41,6 +41,7 @@ import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Autorenew import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -48,6 +49,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -76,6 +78,8 @@ fun Camera( modifier: Modifier = Modifier, viewModel: CameraViewModel = hiltViewModel(), ) { + val isSavingVideo = viewModel.isSavingVideo.collectAsState() + var surfaceProvider by remember { mutableStateOf(null) } var cameraSelector by remember { mutableStateOf(CameraSelector.DEFAULT_BACK_CAMERA) } var captureMode by remember { mutableStateOf(CaptureMode.PHOTO) } @@ -308,6 +312,14 @@ fun Camera( } } } + + if (isSavingVideo.value) { + CircularProgressIndicator( + modifier = Modifier.align(Alignment.Center) + .background(MaterialTheme.colorScheme.primaryContainer, CircleShape) + .padding(8.dp), + ) + } } } else { CameraAndRecordAudioPermission(cameraAndRecordAudioPermissionState) { diff --git a/app/src/main/java/com/google/android/samples/socialite/ui/camera/CameraViewModel.kt b/app/src/main/java/com/google/android/samples/socialite/ui/camera/CameraViewModel.kt index 7036fe3e..78a45219 100644 --- a/app/src/main/java/com/google/android/samples/socialite/ui/camera/CameraViewModel.kt +++ b/app/src/main/java/com/google/android/samples/socialite/ui/camera/CameraViewModel.kt @@ -58,6 +58,7 @@ import java.text.SimpleDateFormat import java.util.Locale import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch @HiltViewModel @@ -70,6 +71,9 @@ class CameraViewModel @Inject constructor( private lateinit var camera: Camera private lateinit var extensionsManager: ExtensionsManager + private val _isSavingVideo = MutableStateFlow(false) + val isSavingVideo: StateFlow = _isSavingVideo + val chatId: Long? = savedStateHandle.get("chatId") var viewFinderState = MutableStateFlow(ViewFinderState()) @@ -231,6 +235,7 @@ class CameraViewModel @Inject constructor( recordingState = event if (event is VideoRecordEvent.Finalize) { onMediaCaptured(Media(event.outputResults.outputUri, MediaType.VIDEO)) + _isSavingVideo.value = false } } @@ -255,6 +260,8 @@ class CameraViewModel @Inject constructor( } fun saveVideo() { + _isSavingVideo.value = true + if (currentRecording == null || recordingState is VideoRecordEvent.Finalize) { return }