Skip to content

feat(Tile/Dimmer): restart cycle if torch was disabled #78

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 81 additions & 68 deletions app/src/main/kotlin/com/cyb3rko/flashdim/quicksettings/SettingsTile.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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)
[email protected] = 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) {
Expand All @@ -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"
[email protected] = enabled
qsTile.state = if (enabled) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE
qsTile.updateTile()
}
Expand All @@ -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) {
Expand All @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/xml/preferences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

<SwitchPreferenceCompat
app:key="quick_settings_toggle"
app:defaultValue="false"
app:defaultValue="true"
app:title="@string/preference_item_quick_settings_simple"
app:summary="@string/preference_item_quick_settings_simple_summary"
app:icon="@drawable/ic_link_scaled" />
Expand Down