summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/main/java/org/lineageos/aperture/CameraActivity.kt19
-rw-r--r--app/src/main/java/org/lineageos/aperture/SettingsActivity.kt24
-rw-r--r--app/src/main/java/org/lineageos/aperture/camera/Camera.kt3
-rw-r--r--app/src/main/java/org/lineageos/aperture/ext/SharedPreferences.kt24
-rw-r--r--app/src/main/res/values/arrays.xml2
-rw-r--r--app/src/main/res/values/strings.xml3
-rw-r--r--app/src/main/res/xml/root_preferences.xml7
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"