Skip to content

Commit

Permalink
Add code to support UI of fps setting
Browse files Browse the repository at this point in the history
(show appropriate options in dropdown and selection of default fps)
  • Loading branch information
MHShetty committed Jun 7, 2024
1 parent 6270878 commit 278228a
Showing 1 changed file with 113 additions and 8 deletions.
121 changes: 113 additions & 8 deletions app/src/main/java/app/grapheneos/camera/ui/SettingsDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import android.os.Handler
import android.os.Looper
import android.provider.Settings
import android.util.Log
import android.util.Range
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
Expand Down Expand Up @@ -54,8 +55,13 @@ class SettingsDialog(val mActivity: MainActivity) :
private var aRToggle: ToggleButton
var torchToggle: ToggleButton
private var gridToggle: ImageView

var videoQualitySpinner: Spinner
var videoFrameRateSpinner: Spinner

private lateinit var vQAdapter: ArrayAdapter<String>
private lateinit var vFRAdapter: ArrayAdapter<String>

private var focusTimeoutSpinner: Spinner
private var timerSpinner: Spinner

Expand All @@ -77,6 +83,7 @@ class SettingsDialog(val mActivity: MainActivity) :
private var enableEISSetting: View
private var selfIlluminationSetting: View
private var videoQualitySetting: View
private var videoFrameRateSetting: LinearLayout
private var timerSetting: View

var settingsFrame: View
Expand Down Expand Up @@ -231,6 +238,24 @@ class SettingsDialog(val mActivity: MainActivity) :
override fun onNothingSelected(p0: AdapterView<*>?) {}
}

videoFrameRateSpinner = binding.videoFrameRateSpinner

videoFrameRateSpinner.onItemSelectedListener =
object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(
p0: AdapterView<*>?,
p1: View?,
position: Int,
p3: Long
) {
val choice = vFRAdapter.getItem(position) as String
Log.i("TAG", "choice: ${choice}")
updateVideoFrameRate(choice)
}

override fun onNothingSelected(p0: AdapterView<*>?) {}
}

qRadio = binding.qualityRadio
lRadio = binding.latencyRadio

Expand Down Expand Up @@ -320,6 +345,7 @@ class SettingsDialog(val mActivity: MainActivity) :
enableEISSetting = binding.enableEisSetting
selfIlluminationSetting = binding.selfIlluminationSetting
videoQualitySetting = binding.videoQualitySetting
videoFrameRateSetting = binding.videoFrameRateSetting
timerSetting = binding.timerSetting

includeAudioToggle = binding.includeAudioSwitch
Expand Down Expand Up @@ -369,19 +395,22 @@ class SettingsDialog(val mActivity: MainActivity) :
fun showOnlyRelevantSettings() {
@androidx.camera.camera2.interop.ExperimentalCamera2Interop
if (camConfig.isVideoMode) {
includeAudioSetting.visibility = View.VISIBLE
enableEISSetting.visibility = View.GONE
for (mode in Camera2CameraInfo.from(camConfig.camera!!.cameraInfo)
.getCameraCharacteristic(CameraCharacteristics
.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES)!!){
if (mode == CameraMetadata.CONTROL_VIDEO_STABILIZATION_MODE_ON)
enableEISSetting.visibility = View.VISIBLE
}
includeAudioSetting.visibility = View.VISIBLE
videoQualitySetting.visibility = View.VISIBLE
videoFrameRateSpinner.visibility = View.VISIBLE
videoFrameRateSetting.visibility = View.VISIBLE
} else {
includeAudioSetting.visibility = View.GONE
enableEISSetting.visibility = View.GONE
videoQualitySetting.visibility = View.GONE
videoFrameRateSetting.visibility = View.GONE
}

selfIlluminationSetting.visibility =
Expand Down Expand Up @@ -439,6 +468,21 @@ class SettingsDialog(val mActivity: MainActivity) :
}
}

fun updateVideoFrameRate(choice: String, resCam: Boolean = true) {

val videoFrameRate = titleToFrameRateRange(choice)

if (videoFrameRate == camConfig.videoFrameRate) return

camConfig.videoFrameRate = videoFrameRate

if (resCam) {
camConfig.startCamera(true)
} else {
videoFrameRateSpinner.setSelection(vFRAdapter.getPosition(choice))
}
}

fun titleToQuality(title: String): Quality {
return when (title) {
"2160p (UHD)" -> Quality.UHD
Expand All @@ -452,6 +496,22 @@ class SettingsDialog(val mActivity: MainActivity) :
}
}

fun titleToFrameRateRange(title: String): Range<Int> {
val titleWithoutFps = title.dropLast(4)

if (titleWithoutFps.contains("-")) {
val lUArr = titleWithoutFps.split("-")

val lower = lUArr[0].dropLast(1).toInt()
val upper = lUArr[1].drop(1).toInt()

return Range(lower, upper)
} else {
val fps = titleWithoutFps.toInt()
return Range(fps, fps)
}
}

private var wasSelfIlluminationOn = false

fun selfIllumination() {
Expand Down Expand Up @@ -620,17 +680,41 @@ class SettingsDialog(val mActivity: MainActivity) :
return Recorder.getVideoCapabilities(cameraInfo).getSupportedQualities(DynamicRange.SDR)
}

private fun getAvailableVideoFrameRates(): List<Range<Int>> {
val resSet = camConfig.camera?.cameraInfo?.supportedFrameRateRanges ?: Collections.emptySet()
// Individual fps -> Ranged fps (sorted by lower value of range and then upper for each lower value)
val resList = resSet.sortedWith(compareBy<Range<Int>> { it.lower != it.upper }.thenBy { it.lower }.thenBy { it.upper })
return resList
}

private fun getAvailableQTitles(): List<String> {
val titles = arrayListOf<String>()

getAvailableQualities().forEach {
titles.add(getTitleFor(it))
titles.add(getTitleForQuality(it))
}

return titles
}

private fun getTitleFor(quality: Quality): String {
private fun getAvailableFRTitles(): List<String> {
val titles = arrayListOf<String>()

getAvailableVideoFrameRates().forEach {
titles.add(getTitleForFrameRateRange(it))
}

return titles
}
fun getTitleForFrameRateRange(range: Range<Int>) : String {
if (range.lower == range.upper) {
return "${range.lower} fps"
} else {
return "${range.lower} - ${range.upper} fps"
}
}

private fun getTitleForQuality(quality: Quality): String {
return when (quality) {
Quality.UHD -> "2160p (UHD)"
Quality.FHD -> "1080p (FHD)"
Expand All @@ -643,6 +727,8 @@ class SettingsDialog(val mActivity: MainActivity) :
}
}



fun updateGridToggleUI() {
mActivity.previewGrid.postInvalidate()
gridToggle.setImageResource(
Expand Down Expand Up @@ -691,14 +777,15 @@ class SettingsDialog(val mActivity: MainActivity) :
slideDialogDown()
}

fun reloadQualities() {
fun reloadVideoSettings() {

val titles = getAvailableQTitles()
val qualityTitles = getAvailableQTitles()
val frameRateTitles = getAvailableFRTitles()

vQAdapter = ArrayAdapter<String>(
mActivity,
android.R.layout.simple_spinner_item,
titles
qualityTitles
)

vQAdapter.setDropDownViewResource(
Expand All @@ -707,8 +794,26 @@ class SettingsDialog(val mActivity: MainActivity) :

videoQualitySpinner.adapter = vQAdapter

if (camConfig.videoQuality != Quality.HIGHEST) {
videoQualitySpinner.setSelection(titles.indexOf(getTitleFor(camConfig.videoQuality)))
vFRAdapter = ArrayAdapter<String>(
mActivity,
android.R.layout.simple_spinner_item,
frameRateTitles
)

vFRAdapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item
)

videoFrameRateSpinner.adapter = vFRAdapter

videoFrameRateSpinner.setSelection(vFRAdapter.getPosition(getTitleForFrameRateRange(camConfig.videoFrameRate)))

if (camConfig.videoQuality != CamConfig.SettingValues.Default.VIDEO_QUALITY) {
videoQualitySpinner.setSelection(vQAdapter.getPosition(getTitleForQuality(camConfig.videoQuality)))
}
}

companion object {

}
}

0 comments on commit 278228a

Please sign in to comment.