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 25f6384..9111b2a 100644 --- a/app/src/main/kotlin/com/cyb3rko/flashdim/quicksettings/SettingsTile.kt +++ b/app/src/main/kotlin/com/cyb3rko/flashdim/quicksettings/SettingsTile.kt @@ -29,24 +29,7 @@ import com.cyb3rko.flashdim.utils.Safe class SettingsTile : TileService() { private var cameraManager: CameraManager? = null private var description = "" - - override fun onClick() { - if (qsTile.state == Tile.STATE_UNAVAILABLE) return - - var toggleMode = false - try { - Safe.initialize(applicationContext) - toggleMode = Safe.getBoolean(Safe.QUICKTILE_TOGGLE_MODE, true) - } catch (_: Exception) { - Log.e("FlashDim", "Safe operations failed in SettingsTile") - } - - if (toggleMode) { - actAsToggle() - } else { - actAsDimmer() - } - } + private var enabled = false override fun onStartListening() { super.onStartListening() @@ -74,6 +57,41 @@ class SettingsTile : TileService() { cameraManager = null } + override fun onClick() { + if (qsTile.state == Tile.STATE_UNAVAILABLE) return + + var toggleMode = false + try { + Safe.initialize(applicationContext) + toggleMode = Safe.getBoolean(Safe.QUICKTILE_TOGGLE_MODE, true) + } catch (_: Exception) { + Log.e("FlashDim", "Safe operations failed in SettingsTile") + } + + if (toggleMode) { + actAsToggle() + } else { + actAsDimmer() + } + } + + private fun initAsToggle() { + Log.d("FlashDim", "Initializing SettingsTile (toggle)") + cameraManager?.registerTorchCallback( + object : TorchCallback() { + override fun onTorchModeChanged(cameraId: String, enabled: Boolean) { + if (qsTile == null) return + Safe.initialize(applicationContext) + Safe.writeBoolean(Safe.FLASH_ACTIVE, enabled) + this@SettingsTile.enabled = enabled + qsTile.state = if (enabled) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE + qsTile.updateTile() + } + }, + Handler(Looper.getMainLooper()) + ) + } + private fun initAsDimmer() { Log.d("FlashDim", "Initializing SettingsTile (dimmer)") if (Safe.getInt(Safe.MAX_LEVEL, -1) < 2) { @@ -86,7 +104,7 @@ class SettingsTile : TileService() { object : TorchCallback() { override fun onTorchModeChanged(cameraId: String, enabled: Boolean) { if (qsTile == null) return - if (description.isNotEmpty()) qsTile.subtitle = "State: $description" + this@SettingsTile.enabled = enabled qsTile.state = if (enabled) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE qsTile.updateTile() } @@ -96,30 +114,50 @@ class SettingsTile : TileService() { } } - private fun initAsToggle() { - Log.d("FlashDim", "Initializing SettingsTile (toggle)") - cameraManager?.registerTorchCallback( - object : TorchCallback() { - override fun onTorchModeChanged(cameraId: String, enabled: Boolean) { - if (qsTile == null) return - Safe.initialize(applicationContext) - Safe.writeBoolean(Safe.FLASH_ACTIVE, enabled) - qsTile.state = if (enabled) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE - qsTile.updateTile() + private fun actAsToggle() { + var level = -1 + try { + if (Safe.getBoolean(Safe.QUICK_SETTINGS_LINK, false)) { + level = Safe.getInt(Safe.INITIAL_LEVEL, 1) + } + } catch (_: Exception) { + Log.e("FlashDim", "Safe operations failed in SettingsTile") + } + + qsTile.subtitle = null + try { + if (cameraManager == null) { + Log.d("FlashDim", "Initializing CameraManager from SettingsTile (toggle)") + cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager + } + cameraManager?.let { + Log.d("FlashDim", "Toggling flashlight from SettingsTile (toggle)") + when (qsTile.state) { + Tile.STATE_INACTIVE -> sendFlashlightSignal(it, level, true) + Tile.STATE_ACTIVE -> sendFlashlightSignal(it, level, false) } - }, - Handler(Looper.getMainLooper()) - ) + } + } catch (e: Exception) { + Log.e("FlashDim", "Camera access failed in SettingsFilel (toggle)") + handleFlashlightException(e) + e.printStackTrace() + } } private fun actAsDimmer() { - var stage = 0 - try { - stage = Safe.getInt(Safe.QUICKTILE_DIM_STAGE, DIMMER_MIN) - description = stage.description() - } catch (_: Exception) { - Log.e("FlashDim", "Safe operations failed in SettingsTile") + var stage: Int + if (!enabled) { + // torch was disabled externally, continue again from initial state + stage = DIMMER_MIN + } else { + try { + stage = Safe.getInt(Safe.QUICKTILE_DIM_STAGE, DIMMER_MIN) + } catch (_: Exception) { + Log.e("FlashDim", "Safe operations failed in SettingsTile") + stage = DIMMER_MIN + } } + description = stage.description() val maxLevel = Safe.getInt(Safe.MAX_LEVEL, -1) val newLevel = when (stage) { @@ -144,40 +182,15 @@ class SettingsTile : TileService() { handleFlashlightException(e) e.printStackTrace() } - qsTile.subtitle = "State: ${stage.description()}" + qsTile.subtitle = if (!enabled) { + "State: ${DIMMER_MIN.description()}" + } else { + "State: $description" + } qsTile.updateTile() Safe.writeInt(Safe.QUICKTILE_DIM_STAGE, stage.next()) } - private fun actAsToggle() { - var level = -1 - try { - if (Safe.getBoolean(Safe.QUICK_SETTINGS_LINK, false)) { - level = Safe.getInt(Safe.INITIAL_LEVEL, 1) - } - } catch (_: Exception) { - Log.e("FlashDim", "Safe operations failed in SettingsTile") - } - - try { - if (cameraManager == null) { - Log.d("FlashDim", "Initializing CameraManager from SettingsTile (toggle)") - cameraManager = getSystemService(CAMERA_SERVICE) as CameraManager - } - cameraManager?.let { - Log.d("FlashDim", "Toggling flashlight from SettingsTile (toggle)") - when (qsTile.state) { - Tile.STATE_INACTIVE -> sendFlashlightSignal(it, level, true) - Tile.STATE_ACTIVE -> sendFlashlightSignal(it, level, false) - } - } - } catch (e: Exception) { - Log.e("FlashDim", "Camera access failed in SettingsFilel (toggle)") - handleFlashlightException(e) - e.printStackTrace() - } - } - private fun sendFlashlightSignal(cameraManager: CameraManager, level: Int, activate: Boolean) { if (activate) { if (level == -1) { diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index fd29595..732cdc2 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -29,7 +29,7 @@