diff --git a/app/src/main/kotlin/com/cyb3rko/flashdim/Camera.kt b/app/src/main/kotlin/com/cyb3rko/flashdim/Camera.kt index ef4830f..3b47e0f 100644 --- a/app/src/main/kotlin/com/cyb3rko/flashdim/Camera.kt +++ b/app/src/main/kotlin/com/cyb3rko/flashdim/Camera.kt @@ -75,16 +75,30 @@ internal class Camera(activity: AppCompatActivity) { fun doesDeviceHaveFlash(packageManager: PackageManager): Boolean = packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH) + fun getValidFlashLevel( + cameraManager: CameraManager, + cameraId: String, + requestedLevel: Int + ): Int { + if (requestedLevel < 1) return -1 + + val maxLevel = cameraManager.getCameraCharacteristics(cameraId) + .get(CameraCharacteristics.FLASH_INFO_STRENGTH_MAXIMUM_LEVEL) + ?: return -1 + return requestedLevel.coerceAtMost(maxLevel) + } + fun sendLightLevel(context: Context, level: Int, activate: Boolean) { try { val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager val cameraId = cameraManager.cameraIdList[0] if (activate) { - if (level == -1) { + val validLevel = getValidFlashLevel(cameraManager, cameraId, level) + if (validLevel == -1) { cameraManager.setTorchMode(cameraId, true) } else { - cameraManager.turnOnTorchWithStrengthLevel(cameraId, level) + cameraManager.turnOnTorchWithStrengthLevel(cameraId, validLevel) } } else { cameraManager.setTorchMode(cameraId, false) diff --git a/app/src/main/kotlin/com/cyb3rko/flashdim/activities/MainActivity.kt b/app/src/main/kotlin/com/cyb3rko/flashdim/activities/MainActivity.kt index 4679bfc..4405317 100644 --- a/app/src/main/kotlin/com/cyb3rko/flashdim/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/cyb3rko/flashdim/activities/MainActivity.kt @@ -96,7 +96,8 @@ class MainActivity : AppCompatActivity() { maxLevel = camera.maxLevel Safe.initialize(this) Safe.writeInt(Safe.MAX_LEVEL, maxLevel) - if (Safe.getInt(Safe.PREFERRED_LEVEL, -1) == -1) { + val preferredLevel = Safe.getInt(Safe.PREFERRED_LEVEL, -1) + if (maxLevel > 0 && preferredLevel !in 1..maxLevel) { Safe.writeInt(Safe.PREFERRED_LEVEL, maxLevel) } diff --git a/app/src/main/kotlin/com/cyb3rko/flashdim/quicksettings/SettingsTile.kt b/app/src/main/kotlin/com/cyb3rko/flashdim/quicksettings/SettingsTile.kt index d7f6666..01b7417 100644 --- a/app/src/main/kotlin/com/cyb3rko/flashdim/quicksettings/SettingsTile.kt +++ b/app/src/main/kotlin/com/cyb3rko/flashdim/quicksettings/SettingsTile.kt @@ -23,6 +23,7 @@ import android.os.Looper import android.service.quicksettings.Tile import android.service.quicksettings.TileService import android.util.Log +import com.cyb3rko.flashdim.Camera import com.cyb3rko.flashdim.handleFlashlightException import com.cyb3rko.flashdim.utils.Safe @@ -192,14 +193,16 @@ class SettingsTile : TileService() { } private fun sendFlashlightSignal(cameraManager: CameraManager, level: Int, activate: Boolean) { + val cameraId = cameraManager.cameraIdList[0] if (activate) { - if (level == -1) { - cameraManager.setTorchMode(cameraManager.cameraIdList[0], true) + val validLevel = Camera.getValidFlashLevel(cameraManager, cameraId, level) + if (validLevel == -1) { + cameraManager.setTorchMode(cameraId, true) } else { - cameraManager.turnOnTorchWithStrengthLevel(cameraManager.cameraIdList[0], level) + cameraManager.turnOnTorchWithStrengthLevel(cameraId, validLevel) } } else { - cameraManager.setTorchMode(cameraManager.cameraIdList[0], false) + cameraManager.setTorchMode(cameraId, false) } }