diff --git a/domain/camera/src/main/java/com/google/jetpackcamera/domain/camera/CameraXCameraUseCase.kt b/domain/camera/src/main/java/com/google/jetpackcamera/domain/camera/CameraXCameraUseCase.kt index 5d82f0f4c..d707f93ac 100644 --- a/domain/camera/src/main/java/com/google/jetpackcamera/domain/camera/CameraXCameraUseCase.kt +++ b/domain/camera/src/main/java/com/google/jetpackcamera/domain/camera/CameraXCameraUseCase.kt @@ -131,7 +131,10 @@ constructor( currentSettings.value = settingsRepository.cameraAppSettings.first() } - private fun getSupportedFrameRates(): Set { + /** + * Returns the union of supported fixed frame rates fom a device's cameras + */ + private fun getDeviceSupportedFrameRates(): Set { val supportedFixedFrameRates = mutableSetOf() cameraProvider.availableCameraInfos.forEach { cameraInfo -> cameraInfo.supportedFrameRateRanges.forEach { e -> @@ -143,6 +146,23 @@ constructor( return supportedFixedFrameRates } + /** + * Returns the union of supported stabilization modes for a device's cameras + */ + private fun getDeviceSupportedStabilizations(): Set { + val deviceSupportedStabilizationModes = mutableSetOf() + + cameraProvider.availableCameraInfos.forEach { cameraInfo -> + if (isPreviewStabilizationSupported(cameraInfo)) { + deviceSupportedStabilizationModes.add(SupportedStabilizationMode.ON) + } + if (isVideoStabilizationSupported(cameraInfo)) { + deviceSupportedStabilizationModes.add(SupportedStabilizationMode.HIGH_QUALITY) + } + } + return deviceSupportedStabilizationModes + } + /** * Camera settings that persist as long as a camera is running. * @@ -202,19 +222,23 @@ constructor( cameraProvider.availableCameraInfos ).first() + // get device-supported fixed frame rates settingsRepository.updateSupportedFixedFrameRate( - getSupportedFrameRates(), + getDeviceSupportedFrameRates(), sessionSettings.targetFrameRate ) + + // get device-supported stabilization modes + val supportedStabilizationModes = getDeviceSupportedStabilizations() + settingsRepository.updatePreviewStabilizationSupported( - isPreviewStabilizationSupported(cameraInfo) + supportedStabilizationModes.contains(SupportedStabilizationMode.ON) ) settingsRepository.updateVideoStabilizationSupported( - isVideoStabilizationSupported(cameraInfo) + supportedStabilizationModes.contains(SupportedStabilizationMode.HIGH_QUALITY) ) - val supportedStabilizationModes = - settingsRepository.cameraAppSettings.first().supportedStabilizationModes + settingsRepository.cameraAppSettings.first().supportedStabilizationModes val initialTransientSettings = transientSettings .filterNotNull() @@ -223,7 +247,7 @@ constructor( val useCaseGroup = createUseCaseGroup( sessionSettings, initialTransientSettings, - supportedStabilizationModes, + supportedStabilizationModes.toList(), effect = when (sessionSettings.captureMode) { CaptureMode.SINGLE_STREAM -> SingleSurfaceForcingEffect(coroutineScope) CaptureMode.MULTI_STREAM -> null diff --git a/feature/settings/src/main/java/com/google/jetpackcamera/settings/ui/SettingsComponents.kt b/feature/settings/src/main/java/com/google/jetpackcamera/settings/ui/SettingsComponents.kt index e10af9539..1ae0ce20c 100644 --- a/feature/settings/src/main/java/com/google/jetpackcamera/settings/ui/SettingsComponents.kt +++ b/feature/settings/src/main/java/com/google/jetpackcamera/settings/ui/SettingsComponents.kt @@ -19,9 +19,7 @@ import android.content.res.Configuration import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.selection.selectable import androidx.compose.foundation.selection.selectableGroup @@ -388,7 +386,11 @@ fun StabilizationSetting( }, popupContents = { Column(Modifier.selectableGroup()) { - Spacer(modifier = Modifier.height(10.dp)) + Text( + text = stringResource(id = R.string.lens_stabilization_disclaimer), + fontStyle = FontStyle.Italic, + color = MaterialTheme.colorScheme.onPrimaryContainer + ) // on (preview) selector // disabled if target fps != (30 or off) diff --git a/feature/settings/src/main/res/values/strings.xml b/feature/settings/src/main/res/values/strings.xml index 822bb3fed..ad8aff654 100644 --- a/feature/settings/src/main/res/values/strings.xml +++ b/feature/settings/src/main/res/values/strings.xml @@ -99,6 +99,8 @@ %d *Available stabilization modes may change due to selected frame rate. + *Some devices may not support stabilization on both lens. + Version