@@ -51,6 +51,7 @@ import app.grapheneos.camera.ui.showIgnoringShortEdgeMode
5151import app.grapheneos.camera.util.edit
5252import com.google.android.material.dialog.MaterialAlertDialogBuilder
5353import com.google.zxing.BarcodeFormat
54+ import java.util.Collections
5455import java.util.concurrent.ExecutionException
5556import java.util.concurrent.Executors
5657
@@ -111,6 +112,8 @@ class CamConfig(private val mActivity: MainActivity) {
111112
112113 const val ENABLE_ZSL = " enable_zsl"
113114
115+ const val OUTPUT_IMAGE_FORMAT = " output_image_format"
116+
114117 // const val IMAGE_FILE_FORMAT = "image_quality"
115118 // const val VIDEO_FILE_FORMAT = "video_quality"
116119 }
@@ -156,6 +159,8 @@ class CamConfig(private val mActivity: MainActivity) {
156159
157160 const val ENABLE_ZSL = false
158161
162+ const val OUTPUT_IMAGE_FORMAT = " JPEG"
163+
159164 // const val IMAGE_FILE_FORMAT = ""
160165 // const val VIDEO_FILE_FORMAT = ""
161166 }
@@ -195,6 +200,13 @@ class CamConfig(private val mActivity: MainActivity) {
195200 val REAR_CAMERA_SELECTOR = CameraSelector .Builder ()
196201 .requireLensFacing(CameraSelector .LENS_FACING_BACK )
197202 .build()
203+
204+ // Array of image formats currently supported by the camera app
205+ private val supportedImageFormats = arrayOf(
206+ ImageCapture .OUTPUT_FORMAT_RAW ,
207+ ImageCapture .OUTPUT_FORMAT_JPEG ,
208+ ImageCapture .OUTPUT_FORMAT_JPEG_ULTRA_HDR ,
209+ )
198210 }
199211
200212 var camera: Camera ? = null
@@ -555,6 +567,40 @@ class CamConfig(private val mActivity: MainActivity) {
555567 editor.apply ()
556568 }
557569
570+ var outputImageFormat : Int
571+ get() {
572+ return mActivity.settingsDialog.titleToImageFormat(
573+ modePref.getString(
574+ outputImageFormatKey,
575+ SettingValues .Default .OUTPUT_IMAGE_FORMAT
576+ )!!
577+ )
578+ }
579+ set(format) {
580+ val formatTitle = mActivity.settingsDialog.getTitleForImageFormat(format)
581+
582+ val editor = modePref.edit()
583+ editor.putString(outputImageFormatKey, formatTitle)
584+ editor.apply ()
585+ }
586+
587+ private val outputImageFormatKey: String
588+ get() {
589+ val pf = if (lensFacing == CameraSelector .LENS_FACING_FRONT ) {
590+ " FRONT"
591+ } else {
592+ " BACK"
593+ }
594+
595+ return " ${SettingValues .Key .OUTPUT_IMAGE_FORMAT } _$pf "
596+ }
597+
598+ fun getAvailableImageFormats () : Set <Int > {
599+ val cameraInfo = camera?.cameraInfo ? : return Collections .emptySet()
600+ return ImageCapture .getImageCaptureCapabilities(cameraInfo)
601+ .supportedOutputFormats.filter { it in supportedImageFormats }.toSet()
602+ }
603+
558604 val isZslSupported : Boolean by lazy {
559605 camera!! .cameraInfo.isZslSupported
560606 }
@@ -710,9 +756,7 @@ class CamConfig(private val mActivity: MainActivity) {
710756 putBoolean(SettingValues .Key .GEO_TAGGING , SettingValues .Default .GEO_TAGGING )
711757 }
712758
713- if (isVideoMode) {
714- mActivity.settingsDialog.reloadQualities()
715- }
759+ mActivity.settingsDialog.reloadSettings()
716760
717761 if (lensFacing == CameraSelector .LENS_FACING_FRONT ) {
718762 if (! modePref.contains(SettingValues .Key .SELF_ILLUMINATION )) {
@@ -1193,6 +1237,8 @@ class CamConfig(private val mActivity: MainActivity) {
11931237 it.setJpegQuality(photoQuality)
11941238 }
11951239
1240+ it.setOutputFormat(outputImageFormat)
1241+
11961242 it.build()
11971243 }
11981244
0 commit comments