diff options
author | Sebastiano Barezzi <barezzisebastiano@gmail.com> | 2022-12-24 19:11:25 +0100 |
---|---|---|
committer | LuK1337 <priv.luk@gmail.com> | 2023-05-06 20:09:27 +0200 |
commit | 52092b9fe8475d0a97cd7125fc47c6c5c86e6f98 (patch) | |
tree | 764a70237881e78becd4047354b0eb98e170e226 | |
parent | 4f4f41a22444f2f82489aed0555154aa2f887787 (diff) |
Aperture: Split ZSL toggle from photo capture mode
* Also disable vendor extensions if enabled
Change-Id: I72c2242595dee8ed986f8e38d3f27eff5174e6b7
7 files changed, 61 insertions, 21 deletions
diff --git a/app/src/main/java/org/lineageos/aperture/CameraActivity.kt b/app/src/main/java/org/lineageos/aperture/CameraActivity.kt index 9bdbe85..192e77e 100644 --- a/app/src/main/java/org/lineageos/aperture/CameraActivity.kt +++ b/app/src/main/java/org/lineageos/aperture/CameraActivity.kt @@ -197,6 +197,10 @@ open class CameraActivity : AppCompatActivity() { updateGalleryButton() } + // Photo + private var photoCaptureMode: Int? = null + get() = field!! + // Video private val supportedVideoQualities: List<Quality> get() = camera.supportedVideoQualities.keys.toList() @@ -1084,8 +1088,15 @@ open class CameraActivity : AppCompatActivity() { } } + photoCaptureMode = sharedPreferences.photoCaptureMode.takeIf { + it != ImageCapture.CAPTURE_MODE_ZERO_SHUTTER_LAG || camera.supportsZsl + } ?: ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY + // Only photo mode supports vendor extensions for now - val cameraSelector = if (cameraMode == CameraMode.PHOTO) { + val cameraSelector = if ( + cameraMode == CameraMode.PHOTO && + photoCaptureMode != ImageCapture.CAPTURE_MODE_ZERO_SHUTTER_LAG + ) { cameraManager.extensionsManager.getExtensionEnabledCameraSelector( camera.cameraSelector, sharedPreferences.photoEffect ) @@ -1120,7 +1131,7 @@ open class CameraActivity : AppCompatActivity() { cameraController.setEnabledUseCases(cameraUseCases) // Restore settings that needs a rebind - cameraController.imageCaptureMode = sharedPreferences.photoCaptureMode + cameraController.imageCaptureMode = photoCaptureMode as Int // Bind camera controller to lifecycle cameraController.bindToLifecycle(this) @@ -1580,7 +1591,9 @@ open class CameraActivity : AppCompatActivity() { */ private fun updatePhotoEffectIcon() { effectButton.isVisible = - cameraMode == CameraMode.PHOTO && camera.supportedExtensionModes.size > 1 + cameraMode == CameraMode.PHOTO && + photoCaptureMode != ImageCapture.CAPTURE_MODE_ZERO_SHUTTER_LAG && + camera.supportedExtensionModes.size > 1 sharedPreferences.photoEffect.let { effectButton.setCompoundDrawablesWithIntrinsicBounds( diff --git a/app/src/main/java/org/lineageos/aperture/SettingsActivity.kt b/app/src/main/java/org/lineageos/aperture/SettingsActivity.kt index 2ccdae8..b94da52 100644 --- a/app/src/main/java/org/lineageos/aperture/SettingsActivity.kt +++ b/app/src/main/java/org/lineageos/aperture/SettingsActivity.kt @@ -15,6 +15,7 @@ import android.view.View import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity +import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreference @@ -55,6 +56,10 @@ class SettingsActivity : AppCompatActivity() { } class SettingsFragment : PreferenceFragmentCompat() { + private val enableZsl by lazy { findPreference<SwitchPreference>("enable_zsl")!! } + private val photoCaptureMode by lazy { + findPreference<ListPreference>("photo_capture_mode")!! + } private val saveLocation by lazy { findPreference<SwitchPreference>("save_location") } private val shutterSound by lazy { findPreference<SwitchPreference>("shutter_sound") } @@ -71,6 +76,21 @@ class SettingsActivity : AppCompatActivity() { } } + private val photoCaptureModePreferenceChangeListener = + Preference.OnPreferenceChangeListener { preference, newValue -> + val currentPhotoCaptureMode = if (preference == photoCaptureMode) { + newValue as String + } else { + photoCaptureMode.value + } + + val enableZslCanBeEnabled = currentPhotoCaptureMode == "minimize_latency" + enableZsl.isChecked = enableZsl.isChecked && enableZslCanBeEnabled + enableZsl.isEnabled = enableZslCanBeEnabled + + true + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -93,6 +113,10 @@ class SettingsActivity : AppCompatActivity() { } } shutterSound?.isVisible = !CameraSoundsUtils.mustPlaySounds + + // Photo capture mode + photoCaptureMode.onPreferenceChangeListener = photoCaptureModePreferenceChangeListener + enableZsl.isEnabled = photoCaptureMode.value == "minimize_latency" } } } diff --git a/app/src/main/java/org/lineageos/aperture/camera/Camera.kt b/app/src/main/java/org/lineageos/aperture/camera/Camera.kt index 4a97794..d59bede 100644 --- a/app/src/main/java/org/lineageos/aperture/camera/Camera.kt +++ b/app/src/main/java/org/lineageos/aperture/camera/Camera.kt @@ -21,6 +21,7 @@ import kotlin.reflect.safeCast */ @androidx.camera.camera2.interop.ExperimentalCamera2Interop @androidx.camera.core.ExperimentalLensFacing +@androidx.camera.core.ExperimentalZeroShutterLag class Camera(cameraInfo: CameraInfo, cameraManager: CameraManager) { val cameraSelector = cameraInfo.cameraSelector @@ -82,6 +83,8 @@ class Camera(cameraInfo: CameraInfo, cameraManager: CameraManager) { } }.toList() + val supportsZsl = cameraInfo.isZslSupported + override fun equals(other: Any?): Boolean { val camera = this::class.safeCast(other) ?: return false return this.cameraId == camera.cameraId diff --git a/app/src/main/java/org/lineageos/aperture/ext/SharedPreferences.kt b/app/src/main/java/org/lineageos/aperture/ext/SharedPreferences.kt index 8f94b66..e91a4a6 100644 --- a/app/src/main/java/org/lineageos/aperture/ext/SharedPreferences.kt +++ b/app/src/main/java/org/lineageos/aperture/ext/SharedPreferences.kt @@ -116,28 +116,22 @@ internal var SharedPreferences.lastMicMode: Boolean // Photos prefs private const val PHOTO_CAPTURE_MODE_KEY = "photo_capture_mode" private const val PHOTO_CAPTURE_MODE_DEFAULT = "minimize_latency" +private const val ENABLE_ZSL_KEY = "enable_zsl" +private const val ENABLE_ZSL_DEFAULT = false -internal var SharedPreferences.photoCaptureMode: Int +internal val SharedPreferences.photoCaptureMode: Int @androidx.camera.core.ExperimentalZeroShutterLag get() = when (getString(PHOTO_CAPTURE_MODE_KEY, PHOTO_CAPTURE_MODE_DEFAULT)) { "maximize_quality" -> ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY - "minimize_latency" -> ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY - "zero_shutter_lag" -> ImageCapture.CAPTURE_MODE_ZERO_SHUTTER_LAG + "minimize_latency" -> + if (getBoolean(ENABLE_ZSL_KEY, ENABLE_ZSL_DEFAULT)) { + ImageCapture.CAPTURE_MODE_ZERO_SHUTTER_LAG + } else { + ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY + } // Default to minimize latency else -> ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY } - @androidx.camera.core.ExperimentalZeroShutterLag - set(value) = edit { - putString( - PHOTO_CAPTURE_MODE_KEY, when (value) { - ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY -> "maximize_quality" - ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY -> "minimize_latency" - ImageCapture.CAPTURE_MODE_ZERO_SHUTTER_LAG -> "zero_shutter_lag" - // Default to maximize quality - else -> PHOTO_CAPTURE_MODE_DEFAULT - } - ) - } private const val PHOTO_FFC_MIRROR = "photo_ffc_mirror" private const val PHOTO_FFC_MIRROR_DEFAULT = true diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index d4f83ee..ba97cc1 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -8,12 +8,10 @@ <string-array name="photo_capture_mode_entries" translatable="false"> <item>@string/photo_capture_mode_maximize_quality</item> <item>@string/photo_capture_mode_minimize_latency</item> - <item>@string/photo_capture_mode_zsl</item> </string-array> <string-array name="photo_capture_mode_values" translatable="false"> <item>maximize_quality</item> <item>minimize_latency</item> - <item>zero_shutter_lag</item> </string-array> </resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7e4ad4c..6625d99 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -98,7 +98,8 @@ <string name="photo_capture_mode_title">Capture mode</string> <string name="photo_capture_mode_maximize_quality">Maximize quality</string> <string name="photo_capture_mode_minimize_latency">Minimize latency</string> - <string name="photo_capture_mode_zsl">Zero shutter lag (experimental)</string> + <string name="enable_zsl_title">Enable ZSL when available</string> + <string name="enable_zsl_summary">Use Zero-Shutter Lag mode when the camera supports it. On this mode photo effects are disabled. Note that this mode is currently experimental</string> <string name="photo_ffc_mirror_title">Mirror front camera</string> <string name="photo_ffc_mirror_summary">Save front camera photos as they appear in the preview</string> diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index b71d2e1..efac396 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -53,6 +53,13 @@ app:useSimpleSummaryProvider="true" /> <SwitchPreference + app:defaultValue="false" + app:iconSpaceReserved="false" + app:key="enable_zsl" + app:summary="@string/enable_zsl_summary" + app:title="@string/enable_zsl_title" /> + + <SwitchPreference app:defaultValue="true" app:iconSpaceReserved="false" app:key="photo_ffc_mirror" |