Skip to content

Commit 3e7e6e7

Browse files
committed
Only show EIS settings when available
(uses the official CameraX API)
1 parent 1154e35 commit 3e7e6e7

File tree

3 files changed

+38
-20
lines changed

3 files changed

+38
-20
lines changed

app/src/main/java/app/grapheneos/camera/CamConfig.kt

+35-11
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import android.annotation.SuppressLint
44
import android.app.AlertDialog
55
import android.content.Context
66
import android.content.SharedPreferences
7-
import android.hardware.camera2.CameraMetadata
8-
import android.hardware.camera2.CaptureRequest
97
import android.net.Uri
108
import android.os.Build
119
import android.provider.MediaStore
@@ -18,9 +16,9 @@ import android.view.animation.Animation
1816
import android.view.animation.LinearInterpolator
1917
import android.widget.Button
2018
import androidx.annotation.StringRes
21-
import androidx.camera.camera2.interop.Camera2Interop
2219
import androidx.camera.core.AspectRatio
2320
import androidx.camera.core.Camera
21+
import androidx.camera.core.CameraInfo
2422
import androidx.camera.core.CameraSelector
2523
import androidx.camera.core.ImageAnalysis
2624
import androidx.camera.core.ImageCapture
@@ -218,6 +216,10 @@ class CamConfig(private val mActivity: MainActivity) {
218216

219217
var lastCapturedItem: CapturedItem? = null
220218

219+
private var frontCameraInfo : CameraInfo? = null
220+
221+
private var rearCameraInfo : CameraInfo? = null
222+
221223
init {
222224
if (mActivity !is SecureActivity) {
223225
CapturedItems.init(mActivity, this)
@@ -429,7 +431,7 @@ class CamConfig(private val mActivity: MainActivity) {
429431

430432
var enableEIS: Boolean
431433
get() {
432-
return mActivity.settingsDialog.enableEISToggle.isChecked
434+
return isStabilizationSupported() && mActivity.settingsDialog.enableEISToggle.isChecked
433435
}
434436
set(value) {
435437
val editor = commonPref.edit()
@@ -532,6 +534,10 @@ class CamConfig(private val mActivity: MainActivity) {
532534
camera!!.cameraInfo.isZslSupported
533535
}
534536

537+
fun isStabilizationSupported() : Boolean {
538+
return Recorder.getVideoCapabilities(getCurrentCameraInfo()).isStabilizationSupported
539+
}
540+
535541
fun shouldShowGyroscope(): Boolean {
536542
return isInPhotoMode && gSuggestions
537543
}
@@ -894,6 +900,11 @@ class CamConfig(private val mActivity: MainActivity) {
894900
startCamera(true)
895901
}
896902

903+
private fun getCurrentCameraInfo() : CameraInfo {
904+
return if (lensFacing == CameraSelector.LENS_FACING_BACK) rearCameraInfo!!
905+
else frontCameraInfo!!
906+
}
907+
897908
fun toggleCameraSelector() {
898909

899910
// Manually switch to the opposite lens facing
@@ -937,6 +948,12 @@ class CamConfig(private val mActivity: MainActivity) {
937948
return
938949
}
939950

951+
// Select a single camera for front/rear facing
952+
for (cameraInfo in cameraProvider!!.availableCameraInfos) {
953+
if (cameraInfo.lensFacing == CameraSelector.LENS_FACING_FRONT) frontCameraInfo = cameraInfo
954+
else if (cameraInfo.lensFacing == CameraSelector.LENS_FACING_BACK) rearCameraInfo = cameraInfo
955+
}
956+
940957
// Manually switch to the other lens facing (if the default lens facing isn't
941958
// supported for the current device)
942959
if (!isLensFacingSupported(lensFacing)) {
@@ -963,11 +980,11 @@ class CamConfig(private val mActivity: MainActivity) {
963980
}
964981

965982
private fun isLensFacingSupported(lensFacing : Int) : Boolean {
966-
val tCameraSelector = CameraSelector.Builder()
967-
.requireLensFacing(lensFacing)
968-
.build()
969-
970-
return cameraProvider?.hasCamera(tCameraSelector) ?: false
983+
return when(lensFacing) {
984+
CameraSelector.LENS_FACING_FRONT -> frontCameraInfo != null
985+
CameraSelector.LENS_FACING_BACK -> rearCameraInfo != null
986+
else -> false
987+
}
971988
}
972989

973990
// Start the camera with latest hard configuration
@@ -992,7 +1009,15 @@ class CamConfig(private val mActivity: MainActivity) {
9921009
if (mActivity.isDestroyed || mActivity.isFinishing) return
9931010

9941011
cameraSelector = CameraSelector.Builder()
995-
.requireLensFacing(lensFacing)
1012+
.addCameraFilter {
1013+
return@addCameraFilter listOf(
1014+
if (lensFacing == CameraSelector.LENS_FACING_BACK) {
1015+
rearCameraInfo
1016+
} else {
1017+
frontCameraInfo
1018+
}
1019+
)
1020+
}
9961021
.build()
9971022

9981023
val builder = ImageCapture.Builder()
@@ -1111,7 +1136,6 @@ class CamConfig(private val mActivity: MainActivity) {
11111136
ResolutionSelector.Builder().setAspectRatioStrategy(aspectRatioStrategy).build()
11121137
)
11131138

1114-
@androidx.camera.camera2.interop.ExperimentalCamera2Interop
11151139
if (isVideoMode) {
11161140
previewBuilder.setPreviewStabilizationEnabled(enableEIS)
11171141
}

app/src/main/java/app/grapheneos/camera/ui/SettingsDialog.kt

+1-8
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import android.widget.Spinner
2929
import android.widget.ToggleButton
3030
import androidx.annotation.StringRes
3131
import androidx.appcompat.widget.SwitchCompat
32-
import androidx.camera.camera2.interop.Camera2CameraInfo
3332
import androidx.camera.core.AspectRatio
3433
import androidx.camera.core.CameraSelector
3534
import androidx.camera.core.DynamicRange
@@ -367,17 +366,11 @@ class SettingsDialog(val mActivity: MainActivity) :
367366
}
368367

369368
fun showOnlyRelevantSettings() {
370-
@androidx.camera.camera2.interop.ExperimentalCamera2Interop
371369
if (camConfig.isVideoMode) {
372370
includeAudioSetting.visibility = View.VISIBLE
373371
enableEISSetting.visibility = View.GONE
374-
for (mode in Camera2CameraInfo.from(camConfig.camera!!.cameraInfo)
375-
.getCameraCharacteristic(CameraCharacteristics
376-
.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES)!!){
377-
if (mode == CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_ON)
378-
enableEISSetting.visibility = View.VISIBLE
379-
}
380372
videoQualitySetting.visibility = View.VISIBLE
373+
if (camConfig.isStabilizationSupported()) enableEISSetting.visibility = View.VISIBLE
381374
} else {
382375
includeAudioSetting.visibility = View.GONE
383376
enableEISSetting.visibility = View.GONE

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,8 @@
233233
android:layout_height="wrap_content"
234234
android:paddingVertical="@dimen/settings_dialog_menu_item_vertical"
235235
android:paddingHorizontal="@dimen/settings_dialog_menu_item_horizontal"
236-
android:orientation="horizontal">
236+
android:orientation="horizontal"
237+
android:visibility="gone">
237238

238239
<TextView
239240
android:layout_height="wrap_content"

0 commit comments

Comments
 (0)