Skip to content

Commit a0d5d40

Browse files
committed
Allow to blacklist cameras for JPEG / DNG support (currently only Google Pixel 6a)
1 parent 80e4ec7 commit a0d5d40

File tree

6 files changed

+91
-64
lines changed

6 files changed

+91
-64
lines changed

app/src/main/java/com/dan/simplerawcamera/CameraActivity.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1447,9 +1447,7 @@ class CameraActivity : AppCompatActivity() {
14471447

14481448
captureRequestBuilder.set(
14491449
CaptureRequest.NOISE_REDUCTION_MODE,
1450-
if (Settings.NOISE_REDUCTION_ENABLED == settings.noiseReduction ||
1451-
(Settings.NOISE_REDUCTION_JPEG_ONLY == settings.noiseReduction && Settings.PHOTO_TYPE_JPEG == settings.takePhotoModes)
1452-
) {
1450+
if (settings.noiseReduction) {
14531451
CaptureRequest.NOISE_REDUCTION_MODE_HIGH_QUALITY
14541452
} else {
14551453
CaptureRequest.NOISE_REDUCTION_MODE_OFF
@@ -1487,10 +1485,10 @@ class CameraActivity : AppCompatActivity() {
14871485
captureRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW)
14881486
captureRequestBuilder.set(
14891487
CaptureRequest.NOISE_REDUCTION_MODE,
1490-
if (Settings.NOISE_REDUCTION_DISABLED == settings.noiseReduction) {
1491-
CaptureRequest.NOISE_REDUCTION_MODE_OFF
1492-
} else {
1488+
if (settings.noiseReduction) {
14931489
CaptureRequest.NOISE_REDUCTION_MODE_FAST
1490+
} else {
1491+
CaptureRequest.NOISE_REDUCTION_MODE_OFF
14941492
}
14951493
)
14961494
}

app/src/main/java/com/dan/simplerawcamera/CameraInfo.kt

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,21 @@ class CameraInfo(
3333

3434
companion object {
3535

36+
private val BLACKLIST_JPEG = listOf(
37+
Pair("Google", "Pixel 6a")
38+
)
39+
40+
private val BLACKLIST_DNG = listOf<Pair<String,String>>(
41+
)
42+
43+
private val device = Pair(Build.MANUFACTURER, Build.MODEL)
44+
45+
val supportJpeg: Boolean = !BLACKLIST_JPEG.contains(device)
46+
val supportDng: Boolean = !BLACKLIST_DNG.contains(device)
47+
3648
private fun getCameraInfo(cameraId: String, physicalId: String?, characteristics: CameraCharacteristics): CameraInfo? {
3749
val level = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) as Int
38-
if (level != CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL && level < CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3) return null
50+
if (level != CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL && level != CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3) return null
3951

4052
val keys = characteristics.keys
4153

@@ -94,26 +106,26 @@ class CameraInfo(
94106
fun getValidCameras(cameraManager: CameraManager): ArrayList<CameraInfo> {
95107
val validCameras = ArrayList<CameraInfo>()
96108

109+
if (!supportJpeg && !supportDng) return validCameras
110+
97111
try {
98112
val cameraIds = cameraManager.cameraIdList
99113

100114
for (cameraId in cameraIds) {
101115
try {
102116
val characteristics = cameraManager.getCameraCharacteristics(cameraId)
103-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
104-
val physicalCameraIds = characteristics.physicalCameraIds
105-
if (physicalCameraIds.size >= 1) {
106-
physicalCameraIds.forEach { physicalCameraId ->
107-
if (null != physicalCameraId ) {
108-
getCameraInfo(
109-
cameraId,
110-
physicalCameraId,
111-
cameraManager.getCameraCharacteristics(physicalCameraId)
112-
)?.apply { validCameras.add(this) }
113-
}
117+
val physicalCameraIds = characteristics.physicalCameraIds
118+
if (physicalCameraIds.size >= 1) {
119+
physicalCameraIds.forEach { physicalCameraId ->
120+
if (null != physicalCameraId ) {
121+
getCameraInfo(
122+
cameraId,
123+
physicalCameraId,
124+
cameraManager.getCameraCharacteristics(physicalCameraId)
125+
)?.apply { validCameras.add(this) }
114126
}
115-
continue
116127
}
128+
continue
117129
}
118130

119131
getCameraInfo(cameraId, null, characteristics)?.apply { validCameras.add(this) }

app/src/main/java/com/dan/simplerawcamera/Settings.kt

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,6 @@ class Settings( private val activity: Activity) {
4545
const val FLASH_MODE_ON = 1
4646
const val FLASH_MODE_TORCH = 2
4747

48-
const val NOISE_REDUCTION_DISABLED = 0
49-
const val NOISE_REDUCTION_JPEG_ONLY = 1
50-
const val NOISE_REDUCTION_ENABLED = 2
51-
5248
val SEQUENCE_DELAY_START_OPTIONS = arrayOf(2, 5, 10)
5349
val SEQUENCE_DELAY_BETWEEN_OPTIONS = arrayOf(0, 1, 5, 10, 30, 60, 120, 300, 600)
5450
val SEQUENCE_NUMBER_OF_PHOTOS_OPTIONS = arrayOf(1, 3, 5, 10, 0)
@@ -69,7 +65,7 @@ class Settings( private val activity: Activity) {
6965
var frameType: Int = FRAME_TYPE_NONE
7066
var continuousMode: Boolean = true
7167
var takePhotoModes: Int = PHOTO_TYPE_JPEG_DNG
72-
var noiseReduction: Int = NOISE_REDUCTION_JPEG_ONLY
68+
var noiseReduction: Boolean = true
7369
var sequenceDelayStart: Int = 2
7470
var sequenceDelayBetween: Int = 0
7571
var sequenceNumberOfPhotos: Int = 0
@@ -91,21 +87,58 @@ class Settings( private val activity: Activity) {
9187
}
9288
}
9389

90+
private fun fixProperties() {
91+
if (!CameraInfo.supportDng) {
92+
takePhotoModes = PHOTO_TYPE_JPEG
93+
} else if (!CameraInfo.supportJpeg) {
94+
takePhotoModes = PHOTO_TYPE_DNG
95+
}
96+
}
97+
98+
private fun callSafe(f: ()->Unit ) {
99+
try {
100+
f()
101+
} catch (e: Exception) {
102+
e.printStackTrace()
103+
}
104+
}
105+
94106
private fun loadProperties() {
95107
val preferences = activity.getPreferences(Context.MODE_PRIVATE)
96108

97109
forEachSettingProperty { property ->
98-
when( property.returnType ) {
99-
Boolean::class.createType() -> property.setter.call( this, preferences.getBoolean( property.name, property.getter.call(this) as Boolean ) )
100-
Int::class.createType() -> property.setter.call( this, preferences.getInt( property.name, property.getter.call(this) as Int ) )
101-
Long::class.createType() -> property.setter.call( this, preferences.getLong( property.name, property.getter.call(this) as Long ) )
102-
Float::class.createType() -> property.setter.call( this, preferences.getFloat( property.name, property.getter.call(this) as Float ) )
103-
String::class.createType() -> property.setter.call( this, preferences.getString( property.name, property.getter.call(this) as String ) )
110+
callSafe {
111+
when (property.returnType) {
112+
Boolean::class.createType() -> property.setter.call(
113+
this,
114+
preferences.getBoolean(property.name, property.getter.call(this) as Boolean)
115+
)
116+
Int::class.createType() -> property.setter.call(
117+
this,
118+
preferences.getInt(property.name, property.getter.call(this) as Int)
119+
)
120+
Long::class.createType() -> property.setter.call(
121+
this,
122+
preferences.getLong(property.name, property.getter.call(this) as Long)
123+
)
124+
Float::class.createType() -> property.setter.call(
125+
this,
126+
preferences.getFloat(property.name, property.getter.call(this) as Float)
127+
)
128+
String::class.createType() -> property.setter.call(
129+
this,
130+
preferences.getString(property.name, property.getter.call(this) as String)
131+
)
132+
}
104133
}
105134
}
135+
136+
fixProperties()
106137
}
107138

108139
fun saveProperties() {
140+
fixProperties()
141+
109142
val preferences = activity.getPreferences(Context.MODE_PRIVATE)
110143
val editor = preferences.edit()
111144

@@ -119,7 +152,7 @@ class Settings( private val activity: Activity) {
119152
}
120153
}
121154

122-
editor.commit()
155+
editor.apply()
123156
}
124157

125158
fun getArrayValue( value: Int, delta: Int, array: Array<Int> ): Int {

app/src/main/java/com/dan/simplerawcamera/SettingsDialog.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,15 @@ class SettingsDialog(private val cameraActivity: CameraActivity, private val lis
3131
dialog.window?.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
3232
}
3333

34-
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
34+
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
3535
val binding = SettingsBinding.inflate( inflater )
3636

37-
binding.spinnerPhotoModes.setSelection( cameraActivity.settings.takePhotoModes )
38-
binding.spinnerNoiseReductionModes.setSelection( cameraActivity.settings.noiseReduction )
37+
if (!CameraInfo.supportDng || !CameraInfo.supportJpeg) {
38+
binding.spinnerPhotoModes.visibility = View.GONE
39+
}
40+
41+
binding.spinnerPhotoModes.setSelection(cameraActivity.settings.takePhotoModes)
42+
binding.switchNoiseReduction.isChecked = cameraActivity.settings.noiseReduction
3943
binding.switchContinuousMode.isChecked = cameraActivity.settings.continuousMode
4044
binding.switchShowGrid.isChecked = cameraActivity.settings.showGrid
4145
binding.spinnerShowFraming.setSelection( cameraActivity.settings.frameType )
@@ -50,8 +54,11 @@ class SettingsDialog(private val cameraActivity: CameraActivity, private val lis
5054
binding.btnCancel.setOnClickListener { dismiss() }
5155

5256
binding.btnOK.setOnClickListener {
53-
cameraActivity.settings.takePhotoModes = binding.spinnerPhotoModes.selectedItemPosition
54-
cameraActivity.settings.noiseReduction = binding.spinnerNoiseReductionModes.selectedItemPosition
57+
if (CameraInfo.supportDng && CameraInfo.supportJpeg) {
58+
cameraActivity.settings.takePhotoModes = binding.spinnerPhotoModes.selectedItemPosition
59+
}
60+
61+
cameraActivity.settings.noiseReduction = binding.switchNoiseReduction.isChecked
5562
cameraActivity.settings.continuousMode = binding.switchContinuousMode.isChecked
5663
cameraActivity.settings.showGrid = binding.switchShowGrid.isChecked
5764
cameraActivity.settings.frameType = binding.spinnerShowFraming.selectedItemPosition

app/src/main/res/layout/settings.xml

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -139,30 +139,13 @@
139139
android:spinnerMode="dropdown" />
140140
</LinearLayout>
141141

142-
<LinearLayout
142+
<Switch
143+
android:id="@+id/switchNoiseReduction"
143144
android:layout_width="match_parent"
144145
android:layout_height="wrap_content"
145-
android:gravity="center_vertical"
146-
android:orientation="horizontal"
147-
android:paddingTop="10dp">
148-
149-
<TextView
150-
android:id="@+id/textView6"
151-
android:layout_width="wrap_content"
152-
android:layout_height="wrap_content"
153-
android:layout_marginRight="16dp"
154-
android:layout_weight="0"
155-
android:text="Noise reduction:"
156-
android:textColor="@color/black" />
157-
158-
<Spinner
159-
android:id="@+id/spinnerNoiseReductionModes"
160-
android:layout_width="wrap_content"
161-
android:layout_height="wrap_content"
162-
android:layout_weight="1"
163-
android:entries="@array/noise_reduction_modes"
164-
android:spinnerMode="dropdown" />
165-
</LinearLayout>
146+
android:paddingTop="10dp"
147+
android:paddingBottom="10dp"
148+
android:text="Noise reduction:" />
166149

167150
<Switch
168151
android:id="@+id/switchContinuousMode"

app/src/main/res/values/strings.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,4 @@
1515
<item>JPEG &amp; DNG</item>
1616
</string-array>
1717

18-
<string-array name="noise_reduction_modes">
19-
<item>Disabled</item>
20-
<item>JPEG Only Mode</item>
21-
<item>Enabled</item>
22-
</string-array>
23-
2418
</resources>

0 commit comments

Comments
 (0)