package com.vgmlr.kiln
import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager
object KilnIconSync {
private val aliases = (0..7).map { "com.vgmlr.kiln.IconG$it" }
fun iconAccount(accounts: List<KilnAccount>, defaultId: Long): KilnAccount? =
accounts.firstOrNull { it.id == defaultId } ?: accounts.firstOrNull()
private fun set(pm: PackageManager, pkg: String, name: String, on: Boolean) =
pm.setComponentEnabledSetting(
ComponentName(pkg, name),
if (on) PackageManager.COMPONENT_ENABLED_STATE_ENABLED
else PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
)
fun apply(context: Context, bucket: Int) {
val target = bucket.coerceIn(aliases.indices)
val pm = context.packageManager
val pkg = context.packageName
val states = aliases.map { name ->
runCatching {
pm.getComponentEnabledSetting(ComponentName(pkg, name))
}.getOrNull()
}
if (states[target] == null) return
val settled = states.withIndex().all { (i, s) ->
if (s == null) true
else if (i == target) s != PackageManager.COMPONENT_ENABLED_STATE_DISABLED
else s == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
}
if (settled) return
runCatching {
set(pm, pkg, aliases[target], true)
states.forEachIndexed { i, s ->
if (i != target && s != null &&
s != PackageManager.COMPONENT_ENABLED_STATE_DISABLED
) {
set(pm, pkg, aliases[i], false)
}
}
}
}
}