diff --git a/app/src/androidTest/java/com/google/jetpackcamera/BackgroundDeviceTest.kt b/app/src/androidTest/java/com/google/jetpackcamera/BackgroundDeviceTest.kt
index 57f0e4ca6..fa7daaea7 100644
--- a/app/src/androidTest/java/com/google/jetpackcamera/BackgroundDeviceTest.kt
+++ b/app/src/androidTest/java/com/google/jetpackcamera/BackgroundDeviceTest.kt
@@ -16,6 +16,7 @@
package com.google.jetpackcamera
import android.os.Build
+import androidx.compose.ui.test.isNotSelected
import androidx.compose.ui.test.junit4.createEmptyComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick
@@ -27,14 +28,18 @@ import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.Until
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.TruthJUnit.assume
+import com.google.jetpackcamera.settings.ui.BTN_DIALOG_STREAM_CONFIG_OPTION_MULTI_STREAM_CAPTURE_TAG
+import com.google.jetpackcamera.settings.ui.BTN_DIALOG_STREAM_CONFIG_OPTION_SINGLE_STREAM_TAG
+import com.google.jetpackcamera.settings.ui.BTN_OPEN_DIALOG_SETTING_STREAM_CONFIG_TAG
import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_DROP_DOWN
import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_FLIP_CAMERA_BUTTON
import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_RATIO_1_1_BUTTON
import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_RATIO_BUTTON
-import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_STREAM_CONFIG_BUTTON
import com.google.jetpackcamera.utils.APP_START_TIMEOUT_MILLIS
import com.google.jetpackcamera.utils.TEST_REQUIRED_PERMISSIONS
import com.google.jetpackcamera.utils.runMainActivityScenarioTest
+import com.google.jetpackcamera.utils.visitSettingDialog
+import com.google.jetpackcamera.utils.visitSettingsScreen
import com.google.jetpackcamera.utils.waitForCaptureButton
import org.junit.Before
import org.junit.Rule
@@ -135,27 +140,30 @@ class BackgroundDeviceTest {
}
@Test
- fun toggleCaptureMode_then_background_foreground() = runMainActivityScenarioTest {
+ fun toggleStreamConfig_then_background_foreground() = runMainActivityScenarioTest {
// Skip this test on devices that don't support single stream
assumeSupportsSingleStream()
// Wait for the capture button to be displayed
composeTestRule.waitForCaptureButton()
- // Navigate to quick settings
- composeTestRule.onNodeWithTag(QUICK_SETTINGS_DROP_DOWN)
- .assertExists()
- .performClick()
-
- // Click the flip camera button
- composeTestRule.onNodeWithTag(QUICK_SETTINGS_STREAM_CONFIG_BUTTON)
- .assertExists()
- .performClick()
-
- // Exit quick settings
- composeTestRule.onNodeWithTag(QUICK_SETTINGS_DROP_DOWN)
- .assertExists()
- .performClick()
+ composeTestRule.visitSettingsScreen {
+ visitSettingDialog(
+ settingTestTag = BTN_OPEN_DIALOG_SETTING_STREAM_CONFIG_TAG,
+ dialogTestTag = BTN_DIALOG_STREAM_CONFIG_OPTION_SINGLE_STREAM_TAG,
+ disabledMessage = "Stream configuration component is disabled"
+ ) {
+ val singleStreamNode =
+ onNodeWithTag(BTN_DIALOG_STREAM_CONFIG_OPTION_SINGLE_STREAM_TAG)
+ if (isNotSelected().matches(singleStreamNode.fetchSemanticsNode())) {
+ singleStreamNode.performClick()
+ } else {
+ onNodeWithTag(
+ BTN_DIALOG_STREAM_CONFIG_OPTION_MULTI_STREAM_CAPTURE_TAG
+ ).performClick()
+ }
+ }
+ }
backgroundThenForegroundApp()
}
diff --git a/app/src/androidTest/java/com/google/jetpackcamera/ConcurrentCameraTest.kt b/app/src/androidTest/java/com/google/jetpackcamera/ConcurrentCameraTest.kt
index f5b01b2a3..12e8762e7 100644
--- a/app/src/androidTest/java/com/google/jetpackcamera/ConcurrentCameraTest.kt
+++ b/app/src/androidTest/java/com/google/jetpackcamera/ConcurrentCameraTest.kt
@@ -40,7 +40,6 @@ import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_FLIP_CAMERA
import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_HDR_BUTTON
import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_RATIO_1_1_BUTTON
import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_RATIO_BUTTON
-import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_STREAM_CONFIG_BUTTON
import com.google.jetpackcamera.ui.components.capture.R
import com.google.jetpackcamera.ui.components.capture.VIDEO_CAPTURE_SUCCESS_TAG
import com.google.jetpackcamera.utils.TEST_REQUIRED_PERMISSIONS
@@ -236,11 +235,6 @@ class ConcurrentCameraTest {
.performClick()
.assertConcurrentCameraMode(ConcurrentCameraMode.DUAL)
- // Assert the capture mode button is disabled
- onNodeWithTag(QUICK_SETTINGS_STREAM_CONFIG_BUTTON)
- .assertExists()
- .assert(isNotEnabled())
-
// Assert the HDR button is disabled
onNodeWithTag(QUICK_SETTINGS_HDR_BUTTON)
.assertExists()
diff --git a/feature/settings/src/androidTest/java/com/google/jetpackcamera/settings/CameraAppSettingsViewModelTest.kt b/feature/settings/src/androidTest/java/com/google/jetpackcamera/settings/CameraAppSettingsViewModelTest.kt
index 6d09cf21a..f37e8415f 100644
--- a/feature/settings/src/androidTest/java/com/google/jetpackcamera/settings/CameraAppSettingsViewModelTest.kt
+++ b/feature/settings/src/androidTest/java/com/google/jetpackcamera/settings/CameraAppSettingsViewModelTest.kt
@@ -26,6 +26,7 @@ import com.google.common.truth.Truth.assertThat
import com.google.jetpackcamera.model.CaptureMode
import com.google.jetpackcamera.model.DarkMode
import com.google.jetpackcamera.model.LensFacing
+import com.google.jetpackcamera.model.proto.ImageOutputFormat as ImageOutputFormatProto
import com.google.jetpackcamera.settings.model.TYPICAL_SYSTEM_CONSTRAINTS
import java.io.File
import kotlinx.coroutines.CoroutineScope
@@ -194,6 +195,30 @@ internal class CameraAppSettingsViewModelTest {
assertThat(initialDarkMode).isEqualTo(DarkMode.DARK)
assertThat(newDarkMode).isEqualTo(DarkMode.SYSTEM)
}
+
+ @Test
+ fun streamConfigDisabled_whenUltraHdrEnabled() = runTest(StandardTestDispatcher()) {
+ // Set image format to Ultra HDR in datastore
+ testDataStore.updateData { currentSettings ->
+ currentSettings.toBuilder()
+ .setImageFormatStatus(
+ ImageOutputFormatProto.IMAGE_OUTPUT_FORMAT_JPEG_ULTRA_HDR
+ )
+ .build()
+ }
+ advanceUntilIdle()
+
+ val uiState = settingsViewModel.settingsUiState.first {
+ it is SettingsUiState.Enabled
+ }
+
+ val streamConfigUiState = assertIsEnabled(uiState).streamConfigUiState
+ assertThat(streamConfigUiState).isInstanceOf(StreamConfigUiState.Disabled::class.java)
+ val disabledRationale =
+ (streamConfigUiState as StreamConfigUiState.Disabled).disabledRationale
+ assertThat(disabledRationale)
+ .isInstanceOf(DisabledRationale.UltraHdrUnsupportedRationale::class.java)
+ }
}
private fun assertIsEnabled(settingsUiState: SettingsUiState): SettingsUiState.Enabled =
diff --git a/feature/settings/src/main/java/com/google/jetpackcamera/settings/SettingsUiState.kt b/feature/settings/src/main/java/com/google/jetpackcamera/settings/SettingsUiState.kt
index 08bb81e29..afc760f27 100644
--- a/feature/settings/src/main/java/com/google/jetpackcamera/settings/SettingsUiState.kt
+++ b/feature/settings/src/main/java/com/google/jetpackcamera/settings/SettingsUiState.kt
@@ -27,11 +27,13 @@ import com.google.jetpackcamera.model.VideoQuality
import com.google.jetpackcamera.settings.DisabledRationale.DeviceUnsupportedRationale
import com.google.jetpackcamera.settings.DisabledRationale.LensUnsupportedRationale
import com.google.jetpackcamera.settings.model.DEFAULT_CAMERA_APP_SETTINGS
+import com.google.jetpackcamera.settings.ui.CONCURRENT_CAMERA_ENABLED_TAG
import com.google.jetpackcamera.settings.ui.DEVICE_UNSUPPORTED_TAG
import com.google.jetpackcamera.settings.ui.FPS_UNSUPPORTED_TAG
import com.google.jetpackcamera.settings.ui.LENS_UNSUPPORTED_TAG
import com.google.jetpackcamera.settings.ui.PERMISSION_RECORD_AUDIO_NOT_GRANTED_TAG
import com.google.jetpackcamera.settings.ui.STABILIZATION_UNSUPPORTED_TAG
+import com.google.jetpackcamera.settings.ui.ULTRA_HDR_ENABLED_TAG
import com.google.jetpackcamera.settings.ui.VIDEO_QUALITY_UNSUPPORTED_TAG
internal const val FIVE_SECONDS_DURATION = 5_000L
internal const val TEN_SECONDS_DURATION = 10_000L
@@ -109,6 +111,18 @@ sealed interface DisabledRationale {
override val testTag = VIDEO_QUALITY_UNSUPPORTED_TAG
}
+ data class ConcurrentCameraUnsupportedRationale(override val affectedSettingNameResId: Int) :
+ DisabledRationale {
+ override val reasonTextResId: Int = R.string.concurrent_camera_enabled
+ override val testTag = CONCURRENT_CAMERA_ENABLED_TAG
+ }
+
+ data class UltraHdrUnsupportedRationale(override val affectedSettingNameResId: Int) :
+ DisabledRationale {
+ override val reasonTextResId: Int = R.string.ultra_hdr_enabled
+ override val testTag = ULTRA_HDR_ENABLED_TAG
+ }
+
sealed interface LensUnsupportedRationale : DisabledRationale {
data class FrontLensUnsupportedRationale(override val affectedSettingNameResId: Int) :
LensUnsupportedRationale {
@@ -231,6 +245,8 @@ sealed interface AspectRatioUiState {
sealed interface StreamConfigUiState {
data class Enabled(val currentStreamConfig: StreamConfig, val additionalContext: String = "") :
StreamConfigUiState
+
+ data class Disabled(val disabledRationale: DisabledRationale) : StreamConfigUiState
}
sealed interface DarkModeUiState {
diff --git a/feature/settings/src/main/java/com/google/jetpackcamera/settings/SettingsViewModel.kt b/feature/settings/src/main/java/com/google/jetpackcamera/settings/SettingsViewModel.kt
index 20e209170..ae50a142e 100644
--- a/feature/settings/src/main/java/com/google/jetpackcamera/settings/SettingsViewModel.kt
+++ b/feature/settings/src/main/java/com/google/jetpackcamera/settings/SettingsViewModel.kt
@@ -23,9 +23,11 @@ import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.MultiplePermissionsState
import com.google.accompanist.permissions.isGranted
import com.google.jetpackcamera.model.AspectRatio
+import com.google.jetpackcamera.model.ConcurrentCameraMode
import com.google.jetpackcamera.model.DarkMode
import com.google.jetpackcamera.model.DynamicRange
import com.google.jetpackcamera.model.FlashMode
+import com.google.jetpackcamera.model.ImageOutputFormat
import com.google.jetpackcamera.model.LensFacing
import com.google.jetpackcamera.model.LowLightBoostPriority
import com.google.jetpackcamera.model.StabilizationMode
@@ -76,7 +78,7 @@ class SettingsViewModel @Inject constructor(
updatedSettings.videoQuality
SettingsUiState.Enabled(
aspectRatioUiState = AspectRatioUiState.Enabled(updatedSettings.aspectRatio),
- streamConfigUiState = StreamConfigUiState.Enabled(updatedSettings.streamConfig),
+ streamConfigUiState = getStreamConfigUiState(updatedSettings),
maxVideoDurationUiState = MaxVideoDurationUiState.Enabled(
updatedSettings.maxVideoDurationMillis
),
@@ -193,6 +195,26 @@ class SettingsViewModel @Inject constructor(
)
}
+ private fun getStreamConfigUiState(cameraAppSettings: CameraAppSettings): StreamConfigUiState {
+ if (cameraAppSettings.concurrentCameraMode == ConcurrentCameraMode.DUAL) {
+ return StreamConfigUiState.Disabled(
+ DisabledRationale.ConcurrentCameraUnsupportedRationale(
+ R.string.stream_config_rationale_prefix
+ )
+ )
+ }
+
+ if (cameraAppSettings.imageFormat == ImageOutputFormat.JPEG_ULTRA_HDR) {
+ return StreamConfigUiState.Disabled(
+ DisabledRationale.UltraHdrUnsupportedRationale(
+ R.string.stream_config_rationale_prefix
+ )
+ )
+ }
+
+ return StreamConfigUiState.Enabled(cameraAppSettings.streamConfig)
+ }
+
private fun getAudioUiState(isAudioEnabled: Boolean, permissionGranted: Boolean): AudioUiState =
if (permissionGranted) {
if (isAudioEnabled) {
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 2290e154d..9af308012 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
@@ -357,40 +357,51 @@ fun StreamConfigSetting(
modifier = modifier.testTag(BTN_OPEN_DIALOG_SETTING_STREAM_CONFIG_TAG),
title = stringResource(R.string.stream_config_title),
leadingIcon = null,
- enabled = true,
+ enabled = streamConfigUiState is StreamConfigUiState.Enabled,
description =
- if (streamConfigUiState is StreamConfigUiState.Enabled) {
- when (streamConfigUiState.currentStreamConfig) {
- StreamConfig.MULTI_STREAM -> stringResource(
- id = R.string.stream_config_description_multi_stream
- )
+ when (streamConfigUiState) {
+ is StreamConfigUiState.Enabled -> {
+ when (streamConfigUiState.currentStreamConfig) {
+ StreamConfig.MULTI_STREAM -> stringResource(
+ id = R.string.stream_config_description_multi_stream
+ )
- StreamConfig.SINGLE_STREAM -> stringResource(
- id = R.string.stream_config_description_single_stream
- )
+ StreamConfig.SINGLE_STREAM -> stringResource(
+ id = R.string.stream_config_description_single_stream
+ )
+ }
+ }
+
+ is StreamConfigUiState.Disabled -> {
+ disabledRationaleString(disabledRationale = streamConfigUiState.disabledRationale)
}
- } else {
- TODO("stream config currently has no disabled criteria")
},
popupContents = {
- Column(Modifier.selectableGroup()) {
- SingleChoiceSelector(
- modifier = Modifier.testTag(
- BTN_DIALOG_STREAM_CONFIG_OPTION_MULTI_STREAM_CAPTURE_TAG
- ),
- text = stringResource(id = R.string.stream_config_selector_multi_stream),
- selected = streamConfigUiState.currentStreamConfig == StreamConfig.MULTI_STREAM,
- enabled = true,
- onClick = { setStreamConfig(StreamConfig.MULTI_STREAM) }
- )
- SingleChoiceSelector(
- modifier = Modifier.testTag(BTN_DIALOG_STREAM_CONFIG_OPTION_SINGLE_STREAM_TAG),
- text = stringResource(id = R.string.stream_config_description_single_stream),
- selected = streamConfigUiState.currentStreamConfig ==
- StreamConfig.SINGLE_STREAM,
- enabled = true,
- onClick = { setStreamConfig(StreamConfig.SINGLE_STREAM) }
- )
+ if (streamConfigUiState is StreamConfigUiState.Enabled) {
+ Column(Modifier.selectableGroup()) {
+ SingleChoiceSelector(
+ modifier = Modifier.testTag(
+ BTN_DIALOG_STREAM_CONFIG_OPTION_MULTI_STREAM_CAPTURE_TAG
+ ),
+ text = stringResource(id = R.string.stream_config_selector_multi_stream),
+ selected = streamConfigUiState.currentStreamConfig ==
+ StreamConfig.MULTI_STREAM,
+ enabled = true,
+ onClick = { setStreamConfig(StreamConfig.MULTI_STREAM) }
+ )
+ SingleChoiceSelector(
+ modifier = Modifier.testTag(
+ BTN_DIALOG_STREAM_CONFIG_OPTION_SINGLE_STREAM_TAG
+ ),
+ text = stringResource(
+ id = R.string.stream_config_description_single_stream
+ ),
+ selected = streamConfigUiState.currentStreamConfig ==
+ StreamConfig.SINGLE_STREAM,
+ enabled = true,
+ onClick = { setStreamConfig(StreamConfig.SINGLE_STREAM) }
+ )
+ }
}
}
)
@@ -1094,6 +1105,16 @@ fun disabledRationaleString(disabledRationale: DisabledRationale): String =
disabledRationale.reasonTextResId,
stringResource(disabledRationale.affectedSettingNameResId)
)
+
+ is DisabledRationale.ConcurrentCameraUnsupportedRationale -> stringResource(
+ disabledRationale.reasonTextResId,
+ stringResource(disabledRationale.affectedSettingNameResId)
+ )
+
+ is DisabledRationale.UltraHdrUnsupportedRationale -> stringResource(
+ disabledRationale.reasonTextResId,
+ stringResource(disabledRationale.affectedSettingNameResId)
+ )
}
@Preview(name = "Light Mode")
diff --git a/feature/settings/src/main/java/com/google/jetpackcamera/settings/ui/TestTags.kt b/feature/settings/src/main/java/com/google/jetpackcamera/settings/ui/TestTags.kt
index 6f9fe1c6a..18cdfbc74 100644
--- a/feature/settings/src/main/java/com/google/jetpackcamera/settings/ui/TestTags.kt
+++ b/feature/settings/src/main/java/com/google/jetpackcamera/settings/ui/TestTags.kt
@@ -37,6 +37,8 @@ const val LENS_UNSUPPORTED_TAG = "LensUnsupportedTag"
const val FPS_UNSUPPORTED_TAG = "FpsUnsupportedTag"
const val VIDEO_QUALITY_UNSUPPORTED_TAG = "VideoQualityUnsupportedTag"
const val PERMISSION_RECORD_AUDIO_NOT_GRANTED_TAG = "PermissionRecordAudioNotGrantedTag"
+const val CONCURRENT_CAMERA_ENABLED_TAG = "ConcurrentCameraEnabledTag"
+const val ULTRA_HDR_ENABLED_TAG = "UltraHdrEnabledTag"
// Settings w/ no dialog
const val BTN_SWITCH_SETTING_LENS_FACING_TAG = "btn_switch_setting_lens_facing_tag"
diff --git a/feature/settings/src/main/res/values/strings.xml b/feature/settings/src/main/res/values/strings.xml
index 0a4cde7cb..cb14b2238 100644
--- a/feature/settings/src/main/res/values/strings.xml
+++ b/feature/settings/src/main/res/values/strings.xml
@@ -159,6 +159,9 @@
%1$s is unsupported by the current video quality
%1$s requires permission to record audio
+ %1$s is unsupported when Concurrent Camera is active
+ %1$s is unsupported when Ultra HDR is enabled
+
Stabilization
@@ -178,6 +181,7 @@
Fixed frame rate
Mute
+ Stream configuration
Version
diff --git a/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/TestTags.kt b/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/TestTags.kt
index 9bf92ba3c..d9cdfc25a 100644
--- a/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/TestTags.kt
+++ b/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/TestTags.kt
@@ -77,7 +77,6 @@ const val QUICK_SETTINGS_BOTTOM_SHEET = "QuickSettingsBottomSheet"
const val QUICK_SETTINGS_CLOSE_EXPANDED_BUTTON = "QuickSettingsCloseExpandedButton"
const val QUICK_SETTINGS_SCROLL_CONTAINER = "QuickSettingsScrollContainer"
-const val QUICK_SETTINGS_STREAM_CONFIG_BUTTON = "QuickSettingsStreamConfigButton"
const val QUICK_SETTINGS_CONCURRENT_CAMERA_MODE_BUTTON = "QuickSettingsConcurrentCameraModeButton"
const val QUICK_SETTINGS_HDR_BUTTON = "QuickSettingsHdrButton"
const val QUICK_SETTINGS_FLASH_BUTTON = "QuickSettingsFlashButton"
diff --git a/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/quicksettings/QuickSettingsEnums.kt b/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/quicksettings/QuickSettingsEnums.kt
index fe886da50..e5b248f02 100644
--- a/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/quicksettings/QuickSettingsEnums.kt
+++ b/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/quicksettings/QuickSettingsEnums.kt
@@ -105,22 +105,6 @@ enum class CameraAspectRatio : QuickSettingsEnum {
}
}
-enum class CameraStreamConfig : QuickSettingsEnum {
- MULTI_STREAM {
- override fun getDrawableResId() = R.drawable.multi_stream_icon
-
- override fun getTextResId() = R.string.quick_settings_stream_config_multi
- override fun getDescriptionResId() = R.string.quick_settings_stream_config_multi_description
- },
- SINGLE_STREAM {
- override fun getDrawableResId() = R.drawable.single_stream_capture_icon
-
- override fun getTextResId() = R.string.quick_settings_stream_config_single
- override fun getDescriptionResId() =
- R.string.quick_settings_stream_config_single_description
- }
-}
-
enum class CameraDynamicRange : QuickSettingsEnum {
SDR {
diff --git a/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/quicksettings/QuickSettingsScreen.kt b/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/quicksettings/QuickSettingsScreen.kt
index f7eff696e..f86db89c4 100644
--- a/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/quicksettings/QuickSettingsScreen.kt
+++ b/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/quicksettings/QuickSettingsScreen.kt
@@ -32,14 +32,12 @@ import com.google.jetpackcamera.model.DynamicRange
import com.google.jetpackcamera.model.FlashMode
import com.google.jetpackcamera.model.ImageOutputFormat
import com.google.jetpackcamera.model.LensFacing
-import com.google.jetpackcamera.model.StreamConfig
import com.google.jetpackcamera.ui.components.capture.BTN_QUICK_SETTINGS_FOCUS_CAPTURE_MODE
import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_CONCURRENT_CAMERA_MODE_BUTTON
import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_FLASH_BUTTON
import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_FLIP_CAMERA_BUTTON
import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_HDR_BUTTON
import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_RATIO_BUTTON
-import com.google.jetpackcamera.ui.components.capture.QUICK_SETTINGS_STREAM_CONFIG_BUTTON
import com.google.jetpackcamera.ui.components.capture.R
import com.google.jetpackcamera.ui.components.capture.SETTINGS_BUTTON
import com.google.jetpackcamera.ui.components.capture.quicksettings.ui.QuickFlipCamera
@@ -47,7 +45,6 @@ import com.google.jetpackcamera.ui.components.capture.quicksettings.ui.QuickNavS
import com.google.jetpackcamera.ui.components.capture.quicksettings.ui.QuickSetConcurrentCamera
import com.google.jetpackcamera.ui.components.capture.quicksettings.ui.QuickSetFlash
import com.google.jetpackcamera.ui.components.capture.quicksettings.ui.QuickSetHdr
-import com.google.jetpackcamera.ui.components.capture.quicksettings.ui.QuickSetStreamConfig
import com.google.jetpackcamera.ui.components.capture.quicksettings.ui.QuickSettingsBottomSheet as BottomSheetComponent
import com.google.jetpackcamera.ui.components.capture.quicksettings.ui.ToggleFocusedQuickSetCaptureMode
import com.google.jetpackcamera.ui.components.capture.quicksettings.ui.ToggleFocusedQuickSetRatio
@@ -61,7 +58,6 @@ import com.google.jetpackcamera.ui.uistate.capture.ConcurrentCameraUiState
import com.google.jetpackcamera.ui.uistate.capture.FlashModeUiState
import com.google.jetpackcamera.ui.uistate.capture.FlipLensUiState
import com.google.jetpackcamera.ui.uistate.capture.HdrUiState
-import com.google.jetpackcamera.ui.uistate.capture.StreamConfigUiState
import com.google.jetpackcamera.ui.uistate.capture.compound.FocusedQuickSetting
import com.google.jetpackcamera.ui.uistate.capture.compound.QuickSettingsUiState
@@ -146,18 +142,6 @@ fun QuickSettingsBottomSheet(
)
}
- add {
- QuickSetStreamConfig(
- modifier = Modifier.testTag(
- QUICK_SETTINGS_STREAM_CONFIG_BUTTON
- ),
- setStreamConfig = { c: StreamConfig ->
- quickSettingsController.setStreamConfig(c)
- },
- streamConfigUiState = quickSettingsUiState.streamConfigUiState
- )
- }
-
add {
QuickSetHdr(
modifier = Modifier.testTag(QUICK_SETTINGS_HDR_BUTTON),
@@ -258,14 +242,6 @@ fun ExpandedQuickSettingsUiPreview() {
)
),
hdrUiState = HdrUiState.Unavailable,
- streamConfigUiState = StreamConfigUiState.Available(
- selectedStreamConfig = StreamConfig.MULTI_STREAM,
- availableStreamConfigs = listOf(
- SingleSelectableUiState.SelectableUi(StreamConfig.SINGLE_STREAM),
- SingleSelectableUiState.SelectableUi(StreamConfig.MULTI_STREAM)
- ),
- isActive = false
- ),
quickSettingsIsOpen = true
),
onNavigateToSettings = {},
@@ -320,14 +296,6 @@ fun ExpandedQuickSettingsUiPreview_WithHdr() {
selectedDynamicRange = DynamicRange.HLG10,
selectedImageFormat = ImageOutputFormat.JPEG_ULTRA_HDR
),
- streamConfigUiState = StreamConfigUiState.Available(
- selectedStreamConfig = StreamConfig.MULTI_STREAM,
- availableStreamConfigs = listOf(
- SingleSelectableUiState.SelectableUi(StreamConfig.SINGLE_STREAM),
- SingleSelectableUiState.SelectableUi(StreamConfig.MULTI_STREAM)
- ),
- isActive = false
- ),
quickSettingsIsOpen = true
),
onNavigateToSettings = { },
@@ -350,8 +318,6 @@ class NoOpQuickSettingsController : QuickSettingsController {
override fun setAspectRatio(aspectRatio: AspectRatio) {}
- override fun setStreamConfig(streamConfig: StreamConfig) {}
-
override fun setDynamicRange(dynamicRange: DynamicRange) {}
override fun setImageFormat(imageOutputFormat: ImageOutputFormat) {}
diff --git a/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/quicksettings/ui/QuickSettingsComponents.kt b/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/quicksettings/ui/QuickSettingsComponents.kt
index de1613c65..5cc231288 100644
--- a/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/quicksettings/ui/QuickSettingsComponents.kt
+++ b/ui/components/capture/src/main/java/com/google/jetpackcamera/ui/components/capture/quicksettings/ui/QuickSettingsComponents.kt
@@ -75,7 +75,6 @@ import com.google.jetpackcamera.model.DynamicRange
import com.google.jetpackcamera.model.FlashMode
import com.google.jetpackcamera.model.ImageOutputFormat
import com.google.jetpackcamera.model.LensFacing
-import com.google.jetpackcamera.model.StreamConfig
import com.google.jetpackcamera.ui.components.capture.BTN_QUICK_SETTINGS_FOCUSED_CAPTURE_MODE_IMAGE_ONLY
import com.google.jetpackcamera.ui.components.capture.BTN_QUICK_SETTINGS_FOCUSED_CAPTURE_MODE_OPTION_STANDARD
import com.google.jetpackcamera.ui.components.capture.BTN_QUICK_SETTINGS_FOCUSED_CAPTURE_MODE_VIDEO_ONLY
@@ -94,7 +93,6 @@ import com.google.jetpackcamera.ui.components.capture.quicksettings.CameraConcur
import com.google.jetpackcamera.ui.components.capture.quicksettings.CameraDynamicRange
import com.google.jetpackcamera.ui.components.capture.quicksettings.CameraFlashMode
import com.google.jetpackcamera.ui.components.capture.quicksettings.CameraLensFace
-import com.google.jetpackcamera.ui.components.capture.quicksettings.CameraStreamConfig
import com.google.jetpackcamera.ui.components.capture.quicksettings.QuickSettingsEnum
import com.google.jetpackcamera.ui.controller.quicksettings.QuickSettingsController
import com.google.jetpackcamera.ui.uistate.SingleSelectableUiState
@@ -105,7 +103,6 @@ import com.google.jetpackcamera.ui.uistate.capture.ConcurrentCameraUiState
import com.google.jetpackcamera.ui.uistate.capture.FlashModeUiState
import com.google.jetpackcamera.ui.uistate.capture.FlipLensUiState
import com.google.jetpackcamera.ui.uistate.capture.HdrUiState
-import com.google.jetpackcamera.ui.uistate.capture.StreamConfigUiState
import kotlin.math.min
@Composable
@@ -406,32 +403,6 @@ fun QuickFlipCamera(
}
}
-@Composable
-fun QuickSetStreamConfig(
- setStreamConfig: (StreamConfig) -> Unit,
- streamConfigUiState: StreamConfigUiState,
- modifier: Modifier = Modifier
-) {
- if (streamConfigUiState is StreamConfigUiState.Available) {
- val enum: CameraStreamConfig =
- when (streamConfigUiState.selectedStreamConfig) {
- StreamConfig.MULTI_STREAM -> CameraStreamConfig.MULTI_STREAM
- StreamConfig.SINGLE_STREAM -> CameraStreamConfig.SINGLE_STREAM
- }
- QuickSettingToggleButton(
- modifier = modifier,
- enum = enum,
- onClick = {
- when (streamConfigUiState.selectedStreamConfig) {
- StreamConfig.MULTI_STREAM -> setStreamConfig(StreamConfig.SINGLE_STREAM)
- StreamConfig.SINGLE_STREAM -> setStreamConfig(StreamConfig.MULTI_STREAM)
- }
- },
- enabled = streamConfigUiState.isActive
- )
- }
-}
-
@Composable
fun QuickSetConcurrentCamera(
setConcurrentCameraMode: (ConcurrentCameraMode) -> Unit,
diff --git a/ui/components/capture/src/main/res/drawable/multi_stream_icon.xml b/ui/components/capture/src/main/res/drawable/multi_stream_icon.xml
deleted file mode 100644
index 834ee33a9..000000000
--- a/ui/components/capture/src/main/res/drawable/multi_stream_icon.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
diff --git a/ui/components/capture/src/main/res/drawable/single_stream_capture_icon.xml b/ui/components/capture/src/main/res/drawable/single_stream_capture_icon.xml
deleted file mode 100644
index cc818a10f..000000000
--- a/ui/components/capture/src/main/res/drawable/single_stream_capture_icon.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
diff --git a/ui/components/capture/src/main/res/values/strings.xml b/ui/components/capture/src/main/res/values/strings.xml
index b551cfec0..f85c8d88b 100644
--- a/ui/components/capture/src/main/res/values/strings.xml
+++ b/ui/components/capture/src/main/res/values/strings.xml
@@ -105,11 +105,6 @@
Flash on
Low Light Boost on
-
- Single Stream
- Multi Stream
- Single-stream capture mode on
- Multi-stream capture mode on
diff --git a/ui/controller/impl/src/main/java/com/google/jetpackcamera/ui/controller/impl/QuickSettingsControllerImpl.kt b/ui/controller/impl/src/main/java/com/google/jetpackcamera/ui/controller/impl/QuickSettingsControllerImpl.kt
index 3bfac592c..36b72675e 100644
--- a/ui/controller/impl/src/main/java/com/google/jetpackcamera/ui/controller/impl/QuickSettingsControllerImpl.kt
+++ b/ui/controller/impl/src/main/java/com/google/jetpackcamera/ui/controller/impl/QuickSettingsControllerImpl.kt
@@ -24,7 +24,6 @@ import com.google.jetpackcamera.model.ExternalCaptureMode
import com.google.jetpackcamera.model.FlashMode
import com.google.jetpackcamera.model.ImageOutputFormat
import com.google.jetpackcamera.model.LensFacing
-import com.google.jetpackcamera.model.StreamConfig
import com.google.jetpackcamera.ui.controller.quicksettings.QuickSettingsController
import com.google.jetpackcamera.ui.uistate.capture.TrackedCaptureUiState
import com.google.jetpackcamera.ui.uistate.capture.compound.FocusedQuickSetting
@@ -87,12 +86,6 @@ class QuickSettingsControllerImpl(
}
}
- override fun setStreamConfig(streamConfig: StreamConfig) {
- scope.launch {
- cameraSystem.setStreamConfig(streamConfig)
- }
- }
-
override fun setDynamicRange(dynamicRange: DynamicRange) {
if (externalCaptureMode != ExternalCaptureMode.ImageCapture &&
externalCaptureMode != ExternalCaptureMode.MultipleImageCapture
diff --git a/ui/controller/src/main/java/com/google/jetpackcamera/ui/controller/quicksettings/QuickSettingsController.kt b/ui/controller/src/main/java/com/google/jetpackcamera/ui/controller/quicksettings/QuickSettingsController.kt
index e0f40f4ac..a80968e14 100644
--- a/ui/controller/src/main/java/com/google/jetpackcamera/ui/controller/quicksettings/QuickSettingsController.kt
+++ b/ui/controller/src/main/java/com/google/jetpackcamera/ui/controller/quicksettings/QuickSettingsController.kt
@@ -22,7 +22,6 @@ import com.google.jetpackcamera.model.DynamicRange
import com.google.jetpackcamera.model.FlashMode
import com.google.jetpackcamera.model.ImageOutputFormat
import com.google.jetpackcamera.model.LensFacing
-import com.google.jetpackcamera.model.StreamConfig
import com.google.jetpackcamera.ui.uistate.capture.compound.FocusedQuickSetting
/**
@@ -62,13 +61,6 @@ interface QuickSettingsController {
*/
fun setAspectRatio(aspectRatio: AspectRatio)
- /**
- * Sets the stream configuration (e.g., single stream for performance, multi-stream for flexibility).
- *
- * @param streamConfig The stream configuration to set.
- */
- fun setStreamConfig(streamConfig: StreamConfig)
-
/**
* Sets the dynamic range (e.g., SDR, HDR).
*
diff --git a/ui/controller/testing/src/main/java/com/google/jetpackcamera/ui/controller/testing/FakeQuickSettingsController.kt b/ui/controller/testing/src/main/java/com/google/jetpackcamera/ui/controller/testing/FakeQuickSettingsController.kt
index a53ac0a3f..4c9723c2a 100644
--- a/ui/controller/testing/src/main/java/com/google/jetpackcamera/ui/controller/testing/FakeQuickSettingsController.kt
+++ b/ui/controller/testing/src/main/java/com/google/jetpackcamera/ui/controller/testing/FakeQuickSettingsController.kt
@@ -22,7 +22,6 @@ import com.google.jetpackcamera.model.DynamicRange
import com.google.jetpackcamera.model.FlashMode
import com.google.jetpackcamera.model.ImageOutputFormat
import com.google.jetpackcamera.model.LensFacing
-import com.google.jetpackcamera.model.StreamConfig
import com.google.jetpackcamera.ui.controller.quicksettings.QuickSettingsController
import com.google.jetpackcamera.ui.uistate.capture.compound.FocusedQuickSetting
@@ -34,7 +33,6 @@ import com.google.jetpackcamera.ui.uistate.capture.compound.FocusedQuickSetting
* @param setLensFacingAction The action to perform when [setLensFacing] is called.
* @param setFlashAction The action to perform when [setFlash] is called.
* @param setAspectRatioAction The action to perform when [setAspectRatio] is called.
- * @param setStreamConfigAction The action to perform when [setStreamConfig] is called.
* @param setDynamicRangeAction The action to perform when [setDynamicRange] is called.
* @param setImageFormatAction The action to perform when [setImageFormat] is called.
* @param setConcurrentCameraModeAction The action to perform when [setConcurrentCameraMode] is called.
@@ -46,7 +44,6 @@ class FakeQuickSettingsController(
var setLensFacingAction: (LensFacing) -> Unit = {},
var setFlashAction: (FlashMode) -> Unit = {},
var setAspectRatioAction: (AspectRatio) -> Unit = {},
- var setStreamConfigAction: (StreamConfig) -> Unit = {},
var setDynamicRangeAction: (DynamicRange) -> Unit = {},
var setImageFormatAction: (ImageOutputFormat) -> Unit = {},
var setConcurrentCameraModeAction: (ConcurrentCameraMode) -> Unit = {},
@@ -72,10 +69,6 @@ class FakeQuickSettingsController(
setAspectRatioAction(aspectRatio)
}
- override fun setStreamConfig(streamConfig: StreamConfig) {
- setStreamConfigAction(streamConfig)
- }
-
override fun setDynamicRange(dynamicRange: DynamicRange) {
setDynamicRangeAction(dynamicRange)
}
diff --git a/ui/controller/testing/src/test/java/com/google/jetpackcamera/ui/controller/testing/FakeQuickSettingsControllerTest.kt b/ui/controller/testing/src/test/java/com/google/jetpackcamera/ui/controller/testing/FakeQuickSettingsControllerTest.kt
index 5a4af8ac0..6e05cbeed 100644
--- a/ui/controller/testing/src/test/java/com/google/jetpackcamera/ui/controller/testing/FakeQuickSettingsControllerTest.kt
+++ b/ui/controller/testing/src/test/java/com/google/jetpackcamera/ui/controller/testing/FakeQuickSettingsControllerTest.kt
@@ -23,7 +23,6 @@ import com.google.jetpackcamera.model.DynamicRange
import com.google.jetpackcamera.model.FlashMode
import com.google.jetpackcamera.model.ImageOutputFormat
import com.google.jetpackcamera.model.LensFacing
-import com.google.jetpackcamera.model.StreamConfig
import com.google.jetpackcamera.ui.uistate.capture.compound.FocusedQuickSetting
import org.junit.Test
import org.junit.runner.RunWith
@@ -71,14 +70,6 @@ class FakeQuickSettingsControllerTest {
assertThat(calledValue).isEqualTo(AspectRatio.THREE_FOUR)
}
- @Test
- fun setStreamConfig_invokesAction() {
- var calledValue: StreamConfig? = null
- val controller = FakeQuickSettingsController(setStreamConfigAction = { calledValue = it })
- controller.setStreamConfig(StreamConfig.SINGLE_STREAM)
- assertThat(calledValue).isEqualTo(StreamConfig.SINGLE_STREAM)
- }
-
@Test
fun setDynamicRange_invokesAction() {
var calledValue: DynamicRange? = null
diff --git a/ui/uistate/capture/src/main/java/com/google/jetpackcamera/ui/uistate/capture/StreamConfigUiState.kt b/ui/uistate/capture/src/main/java/com/google/jetpackcamera/ui/uistate/capture/StreamConfigUiState.kt
deleted file mode 100644
index d5dd77638..000000000
--- a/ui/uistate/capture/src/main/java/com/google/jetpackcamera/ui/uistate/capture/StreamConfigUiState.kt
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.jetpackcamera.ui.uistate.capture
-
-import com.google.jetpackcamera.model.StreamConfig
-import com.google.jetpackcamera.ui.uistate.SingleSelectableUiState
-
-/**
- * Defines the UI state for stream configuration, which includes settings for resolution and aspect
- * ratio.
- *
- * This sealed interface represents the different states of the stream configuration UI.
- */
-sealed interface StreamConfigUiState {
- /**
- * Stream configuration is unavailable.
- */
- data object Unavailable : StreamConfigUiState
-
- /**
- * Stream configuration is available.
- *
- * @param selectedStreamConfig The currently selected stream configuration.
- * @param availableStreamConfigs A list of all available stream configurations, each represented
- * by a [SingleSelectableUiState] to indicate its current selection and interaction status.
- * @param isActive Indicates whether the stream configuration UI is currently active (e.g., visible).
- */
- data class Available(
- val selectedStreamConfig: StreamConfig,
- val availableStreamConfigs: List>,
- val isActive: Boolean
- ) : StreamConfigUiState {
- init {
- val isSelectedModePresentAndSelectable = availableStreamConfigs.any { state ->
- state is SingleSelectableUiState.SelectableUi && state.value == selectedStreamConfig
- }
-
- check(isSelectedModePresentAndSelectable) {
- "Selected stream config $selectedStreamConfig is not among the available and" +
- "selectable configs. Available configs: ${
- availableStreamConfigs.mapNotNull {
- if (it is SingleSelectableUiState.SelectableUi) it.value else null
- }
- }"
- }
- }
- }
-
- companion object
-}
diff --git a/ui/uistate/capture/src/main/java/com/google/jetpackcamera/ui/uistate/capture/compound/QuickSettingsUiState.kt b/ui/uistate/capture/src/main/java/com/google/jetpackcamera/ui/uistate/capture/compound/QuickSettingsUiState.kt
index 49cab445f..ad42a597a 100644
--- a/ui/uistate/capture/src/main/java/com/google/jetpackcamera/ui/uistate/capture/compound/QuickSettingsUiState.kt
+++ b/ui/uistate/capture/src/main/java/com/google/jetpackcamera/ui/uistate/capture/compound/QuickSettingsUiState.kt
@@ -21,7 +21,6 @@ import com.google.jetpackcamera.ui.uistate.capture.ConcurrentCameraUiState
import com.google.jetpackcamera.ui.uistate.capture.FlashModeUiState
import com.google.jetpackcamera.ui.uistate.capture.FlipLensUiState
import com.google.jetpackcamera.ui.uistate.capture.HdrUiState
-import com.google.jetpackcamera.ui.uistate.capture.StreamConfigUiState
/**
* Defines the UI state for the quick settings panel.
@@ -44,7 +43,6 @@ sealed interface QuickSettingsUiState {
* @param flashModeUiState The UI state for the flash mode setting.
* @param flipLensUiState The UI state for the flip lens (front/back camera) button.
* @param hdrUiState The UI state for the HDR (High Dynamic Range) setting.
- * @param streamConfigUiState The UI state for stream configuration.
* @param quickSettingsIsOpen Indicates whether the quick settings panel is currently open.
* @param focusedQuickSetting The specific quick setting that is currently focused by the user,
* allowing for more detailed interaction (e.g., showing a sub-menu).
@@ -56,7 +54,6 @@ sealed interface QuickSettingsUiState {
val flashModeUiState: FlashModeUiState,
val flipLensUiState: FlipLensUiState,
val hdrUiState: HdrUiState,
- val streamConfigUiState: StreamConfigUiState,
val quickSettingsIsOpen: Boolean = false,
val focusedQuickSetting: FocusedQuickSetting = FocusedQuickSetting.NONE
) : QuickSettingsUiState
diff --git a/ui/uistateadapter/capture/src/main/java/com/google/jetpackcamera/ui/uistateadapter/capture/ConcurrentCameraUiStateAdapter.kt b/ui/uistateadapter/capture/src/main/java/com/google/jetpackcamera/ui/uistateadapter/capture/ConcurrentCameraUiStateAdapter.kt
index df5addfaf..15c5928a4 100644
--- a/ui/uistateadapter/capture/src/main/java/com/google/jetpackcamera/ui/uistateadapter/capture/ConcurrentCameraUiStateAdapter.kt
+++ b/ui/uistateadapter/capture/src/main/java/com/google/jetpackcamera/ui/uistateadapter/capture/ConcurrentCameraUiStateAdapter.kt
@@ -25,7 +25,6 @@ import com.google.jetpackcamera.settings.model.CameraAppSettings
import com.google.jetpackcamera.settings.model.CameraSystemConstraints
import com.google.jetpackcamera.ui.uistate.capture.CaptureModeUiState
import com.google.jetpackcamera.ui.uistate.capture.ConcurrentCameraUiState
-import com.google.jetpackcamera.ui.uistate.capture.StreamConfigUiState
/**
* Creates a [ConcurrentCameraUiState] based on the current camera and system state.
@@ -44,7 +43,6 @@ import com.google.jetpackcamera.ui.uistate.capture.StreamConfigUiState
* @param systemConstraints The capabilities and limitations of the device's camera hardware.
* @param externalCaptureMode The mode indicating if the camera was launched by an external intent.
* @param captureModeUiState The current state of the capture mode selection UI.
- * @param streamConfigUiState The current state of the stream configuration UI.
* @return A [ConcurrentCameraUiState.Available] object containing the currently selected
* concurrent camera mode and a boolean indicating if the feature is currently enabled and
* can be interacted with.
@@ -53,8 +51,7 @@ fun ConcurrentCameraUiState.Companion.from(
cameraAppSettings: CameraAppSettings,
systemConstraints: CameraSystemConstraints,
externalCaptureMode: ExternalCaptureMode,
- captureModeUiState: CaptureModeUiState,
- streamConfigUiState: StreamConfigUiState
+ captureModeUiState: CaptureModeUiState
): ConcurrentCameraUiState {
return ConcurrentCameraUiState.Available(
selectedConcurrentCameraMode = cameraAppSettings.concurrentCameraMode,
@@ -71,9 +68,8 @@ fun ConcurrentCameraUiState.Companion.from(
DEFAULT_HDR_DYNAMIC_RANGE &&
cameraAppSettings.imageFormat !=
DEFAULT_HDR_IMAGE_OUTPUT
- ) && !(
- streamConfigUiState is StreamConfigUiState.Available &&
- streamConfigUiState.selectedStreamConfig == StreamConfig.SINGLE_STREAM
+ ) && (
+ cameraAppSettings.streamConfig != StreamConfig.SINGLE_STREAM
) && (
cameraAppSettings.flashMode != FlashMode.LOW_LIGHT_BOOST
)
diff --git a/ui/uistateadapter/capture/src/main/java/com/google/jetpackcamera/ui/uistateadapter/capture/StreamConfigsUiStateAdapter.kt b/ui/uistateadapter/capture/src/main/java/com/google/jetpackcamera/ui/uistateadapter/capture/StreamConfigsUiStateAdapter.kt
deleted file mode 100644
index 81653a520..000000000
--- a/ui/uistateadapter/capture/src/main/java/com/google/jetpackcamera/ui/uistateadapter/capture/StreamConfigsUiStateAdapter.kt
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.google.jetpackcamera.ui.uistateadapter.capture
-
-import com.google.jetpackcamera.model.ConcurrentCameraMode
-import com.google.jetpackcamera.model.ImageOutputFormat
-import com.google.jetpackcamera.model.StreamConfig
-import com.google.jetpackcamera.settings.model.CameraAppSettings
-import com.google.jetpackcamera.ui.uistate.capture.StreamConfigUiState
-import com.google.jetpackcamera.ui.uistateadapter.Utils
-
-private val ORDERED_UI_SUPPORTED_STREAM_CONFIGS = listOf(
- StreamConfig.SINGLE_STREAM,
- StreamConfig.MULTI_STREAM
-)
-
-/**
- * Creates a [StreamConfigUiState] based on the provided camera settings.
- *
- * This function determines the availability and selection state of stream configurations, which
- * control whether the camera operates using a single stream or multiple streams. The UI for this
- * setting is made available only if more than one stream configuration is supported. The control
- * is marked as inactive (disabled) if concurrent camera mode is active or if the image format
- * is set to Ultra HDR, as these features are incompatible with changing the stream configuration.
- *
- * @param cameraAppSettings The current application settings, which provide the selected
- * [StreamConfig], [ConcurrentCameraMode], and [ImageOutputFormat].
- *
- * @return A [StreamConfigUiState] which will be:
- * - [StreamConfigUiState.Available] if multiple stream configs are supported, containing the
- * current selection, the list of available options, and whether the UI control should be active.
- * - [StreamConfigUiState.Unavailable] if only one or zero stream configs are supported, meaning
- * the user cannot change this setting.
- */
-fun StreamConfigUiState.Companion.from(cameraAppSettings: CameraAppSettings): StreamConfigUiState {
- return createFrom(
- cameraAppSettings.streamConfig,
- ORDERED_UI_SUPPORTED_STREAM_CONFIGS.toSet(),
- cameraAppSettings.concurrentCameraMode,
- cameraAppSettings.imageFormat
- )
-}
-
-private fun createFrom(
- selectedStreamConfig: StreamConfig,
- supportedStreamConfigs: Set,
- concurrentCameraMode: ConcurrentCameraMode,
- imageOutputFormat: ImageOutputFormat
-): StreamConfigUiState {
- // Ensure we at least support one flash mode
- check(supportedStreamConfigs.isNotEmpty()) {
- "No stream config supported."
- }
-
- val availableStreamConfigs =
- Utils.getSelectableListFromValues(
- supportedStreamConfigs,
- ORDERED_UI_SUPPORTED_STREAM_CONFIGS
- )
-
- return if (supportedStreamConfigs.size <= 1) {
- // If we only support one lens, then return "Unavailable".
- StreamConfigUiState.Unavailable
- } else {
- StreamConfigUiState.Available(
- selectedStreamConfig = selectedStreamConfig,
- availableStreamConfigs = availableStreamConfigs,
- isActive = !(
- concurrentCameraMode == ConcurrentCameraMode.DUAL ||
- imageOutputFormat == ImageOutputFormat.JPEG_ULTRA_HDR
- )
- )
- }
-}
diff --git a/ui/uistateadapter/capture/src/main/java/com/google/jetpackcamera/ui/uistateadapter/capture/compound/QuickSettingsUiStateAdapter.kt b/ui/uistateadapter/capture/src/main/java/com/google/jetpackcamera/ui/uistateadapter/capture/compound/QuickSettingsUiStateAdapter.kt
index 2563adac4..ddd979a4b 100644
--- a/ui/uistateadapter/capture/src/main/java/com/google/jetpackcamera/ui/uistateadapter/capture/compound/QuickSettingsUiStateAdapter.kt
+++ b/ui/uistateadapter/capture/src/main/java/com/google/jetpackcamera/ui/uistateadapter/capture/compound/QuickSettingsUiStateAdapter.kt
@@ -24,7 +24,6 @@ import com.google.jetpackcamera.ui.uistate.capture.ConcurrentCameraUiState
import com.google.jetpackcamera.ui.uistate.capture.FlashModeUiState
import com.google.jetpackcamera.ui.uistate.capture.FlipLensUiState
import com.google.jetpackcamera.ui.uistate.capture.HdrUiState
-import com.google.jetpackcamera.ui.uistate.capture.StreamConfigUiState
import com.google.jetpackcamera.ui.uistate.capture.compound.FocusedQuickSetting
import com.google.jetpackcamera.ui.uistate.capture.compound.QuickSettingsUiState
import com.google.jetpackcamera.ui.uistateadapter.capture.from
@@ -59,7 +58,6 @@ fun QuickSettingsUiState.Companion.from(
focusedQuickSetting: FocusedQuickSetting,
externalCaptureMode: ExternalCaptureMode
): QuickSettingsUiState {
- val streamConfigUiState = StreamConfigUiState.from(cameraAppSettings)
return QuickSettingsUiState.Available(
aspectRatioUiState = aspectRatioUiState,
captureModeUiState = captureModeUiState,
@@ -67,13 +65,11 @@ fun QuickSettingsUiState.Companion.from(
cameraAppSettings,
systemConstraints,
externalCaptureMode,
- captureModeUiState,
- streamConfigUiState
+ captureModeUiState
),
flashModeUiState = flashModeUiState,
flipLensUiState = flipLensUiState,
hdrUiState = hdrUiState,
- streamConfigUiState = streamConfigUiState,
quickSettingsIsOpen = quickSettingsIsOpen,
focusedQuickSetting = focusedQuickSetting
)