From b4a4bc40d45d5f417d063f0ce31a0f00e1e00a4a Mon Sep 17 00:00:00 2001 From: MHShetty Date: Wed, 26 Mar 2025 17:58:05 +0530 Subject: [PATCH 1/5] Add string resources (for exposure persistence setting) --- app/src/main/res/values/strings.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9aa6ae1e..bd7610b8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -193,4 +193,8 @@ The video\'s audio recording has been muted The video\'s audio recording has been unmuted + + Miscellaneous + Persist exposure level + Saves the last exposure level that was set by the user From 2573874c883afea86366cd00ad2c9159dd80d267 Mon Sep 17 00:00:00 2001 From: MHShetty Date: Wed, 26 Mar 2025 17:58:37 +0530 Subject: [PATCH 2/5] Add UI code for persistent exposure toggle --- app/src/main/res/layout/more_settings.xml | 75 +++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/app/src/main/res/layout/more_settings.xml b/app/src/main/res/layout/more_settings.xml index c3b8117f..a5bc4729 100644 --- a/app/src/main/res/layout/more_settings.xml +++ b/app/src/main/res/layout/more_settings.xml @@ -719,6 +719,81 @@ + + + + + + + + + + + + + + + + + + + + + + From 3df2bbf94b30a688d9644c10860f8a15cbcce171 Mon Sep 17 00:00:00 2001 From: MHShetty Date: Wed, 26 Mar 2025 18:04:44 +0530 Subject: [PATCH 3/5] Add exposure icon that adapts to theme (light/dark mode) --- app/src/main/res/drawable/exposure_icon_adaptable.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 app/src/main/res/drawable/exposure_icon_adaptable.xml diff --git a/app/src/main/res/drawable/exposure_icon_adaptable.xml b/app/src/main/res/drawable/exposure_icon_adaptable.xml new file mode 100644 index 00000000..f07ede56 --- /dev/null +++ b/app/src/main/res/drawable/exposure_icon_adaptable.xml @@ -0,0 +1,10 @@ + + + From 00198b3c5decc7b79435968b45f5ceb6b7e87632 Mon Sep 17 00:00:00 2001 From: MHShetty Date: Wed, 26 Mar 2025 18:05:39 +0530 Subject: [PATCH 4/5] Add code for persistent exposure functionality --- .../java/app/grapheneos/camera/CamConfig.kt | 56 +++++++++++++++++++ .../camera/ui/seekbar/ExposureBar.kt | 23 ++++---- 2 files changed, 69 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/app/grapheneos/camera/CamConfig.kt b/app/src/main/java/app/grapheneos/camera/CamConfig.kt index 128205f5..f8f3469c 100644 --- a/app/src/main/java/app/grapheneos/camera/CamConfig.kt +++ b/app/src/main/java/app/grapheneos/camera/CamConfig.kt @@ -105,6 +105,10 @@ class CamConfig(private val mActivity: MainActivity) { const val REMOVE_EXIF_AFTER_CAPTURE = "remove_exif_after_capture" + const val PERSIST_EXPOSURE_LEVEL = "persist_exposure_level" + + const val EXPOSURE_LEVEL = "exposure_level" + const val GYROSCOPE_SUGGESTIONS = "gyroscope_suggestions" const val CAMERA_SOUNDS = "camera_sounds" @@ -150,6 +154,10 @@ class CamConfig(private val mActivity: MainActivity) { const val REMOVE_EXIF_AFTER_CAPTURE = true + const val PERSIST_EXPOSURE_LEVEL = false + + const val EXPOSURE_LEVEL = 0 + const val GYROSCOPE_SUGGESTIONS = false const val CAMERA_SOUNDS = true @@ -539,6 +547,50 @@ class CamConfig(private val mActivity: MainActivity) { editor.apply() } + var persistExposureLevel: Boolean + get() { + return commonPref.getBoolean( + SettingValues.Key.PERSIST_EXPOSURE_LEVEL, + SettingValues.Default.PERSIST_EXPOSURE_LEVEL + ) + } + set(value) { + val editor = commonPref.edit() + editor.putBoolean( + SettingValues.Key.PERSIST_EXPOSURE_LEVEL, + value + ) + editor.apply() + } + + private val exposureLevelKey: String + get() { + + val pf = if (lensFacing == CameraSelector.LENS_FACING_FRONT) { + "FRONT" + } else { + "BACK" + } + + return "${SettingValues.Key.EXPOSURE_LEVEL}_$pf" + } + + var exposureLevel: Int + get() { + return modePref.getInt( + exposureLevelKey, + SettingValues.Default.EXPOSURE_LEVEL, + ) + } + set(value) { + val editor = modePref.edit() + editor.putInt( + exposureLevelKey, + value + ) + editor.apply() + } + var gSuggestions: Boolean get() { return commonPref.getBoolean( @@ -1262,6 +1314,10 @@ class CamConfig(private val mActivity: MainActivity) { mActivity.zoomBar.updateThumb(false) + if (persistExposureLevel) { + camera?.cameraControl?.setExposureCompensationIndex(exposureLevel) + } + camera?.cameraInfo?.exposureState?.let { mActivity.exposureBar.setExposureConfig(it) } mActivity.settingsDialog.torchToggle.isChecked = false diff --git a/app/src/main/java/app/grapheneos/camera/ui/seekbar/ExposureBar.kt b/app/src/main/java/app/grapheneos/camera/ui/seekbar/ExposureBar.kt index 1b22d4d2..37c17ef8 100644 --- a/app/src/main/java/app/grapheneos/camera/ui/seekbar/ExposureBar.kt +++ b/app/src/main/java/app/grapheneos/camera/ui/seekbar/ExposureBar.kt @@ -46,12 +46,7 @@ class ExposureBar : AppCompatSeekBar { max = exposureState.exposureCompensationRange.upper min = exposureState.exposureCompensationRange.lower - incrementProgressBy(exposureState.exposureCompensationIndex) - - Log.i("TAG", "Setting progress from setExposureConfig") - progress = (exposureState.exposureCompensationStep.numerator - / exposureState.exposureCompensationStep.denominator) * - exposureState.exposureCompensationIndex + progress = exposureState.exposureCompensationIndex onSizeChanged(width, height, 0, 0) } @@ -109,11 +104,10 @@ class ExposureBar : AppCompatSeekBar { MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_UP -> { progress = max - (max * event.y / (height / 2)).toInt() - Log.i("progress", progress.toString()) - Log.i("max", max.toString()) + Log.d("progress", progress.toString()) + Log.d("max", max.toString()) - mainActivity.camConfig.camera?.cameraControl - ?.setExposureCompensationIndex(progress) + updateExposureCompensationIndex(progress) showPanel() @@ -124,4 +118,13 @@ class ExposureBar : AppCompatSeekBar { } return true } + + private fun updateExposureCompensationIndex(exposureCompensationIndex: Int) { + mainActivity.camConfig.camera?.cameraControl + ?.setExposureCompensationIndex(progress) + + if (mainActivity.camConfig.persistExposureLevel) { + mainActivity.camConfig.exposureLevel = exposureCompensationIndex + } + } } From 659e80e9119c1e20b79dfe1b59ec5f51d1619b61 Mon Sep 17 00:00:00 2001 From: MHShetty Date: Wed, 26 Mar 2025 18:06:50 +0530 Subject: [PATCH 5/5] Make persistent exposure toggle functional --- .../app/grapheneos/camera/ui/activities/MoreSettings.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/app/grapheneos/camera/ui/activities/MoreSettings.kt b/app/src/main/java/app/grapheneos/camera/ui/activities/MoreSettings.kt index 18b228fb..447fb812 100644 --- a/app/src/main/java/app/grapheneos/camera/ui/activities/MoreSettings.kt +++ b/app/src/main/java/app/grapheneos/camera/ui/activities/MoreSettings.kt @@ -236,6 +236,14 @@ open class MoreSettings : AppCompatActivity(), TextView.OnEditorActionListener { } } + val persistExposureToggle = binding.persistExposureLevelToggle + + persistExposureToggle.isChecked = camConfig.persistExposureLevel + + persistExposureToggle.setOnClickListener { + camConfig.persistExposureLevel = persistExposureToggle.isChecked + } + if (!showStorageSettings) { binding.storageLocationSettings.visibility = View.GONE }