1
Fork 0
PrivateDNSQuickTile/app/src/main/java/dev/jlelse/dnsqt/PrivateDnsTileService.kt

110 lines
3.0 KiB
Kotlin

package dev.jlelse.dnsqt
import android.content.pm.PackageManager
import android.graphics.drawable.Icon
import android.provider.Settings
import android.service.quicksettings.Tile
import android.service.quicksettings.TileService
class PrivateDnsTileService : TileService() {
companion object {
const val DNS_MODE_OFF = "off"
const val DNS_MODE_AUTO = "opportunistic"
const val DNS_MODE_ON = "hostname"
}
override fun onStartListening() {
super.onStartListening()
if (!checkPermission()) {
return
}
updateTile()
}
override fun onClick() {
super.onClick()
if (!checkPermission()) {
return
}
val mode = getMode()
when {
mode.equals(DNS_MODE_OFF, ignoreCase = true) -> changeMode(DNS_MODE_AUTO)
mode.equals(DNS_MODE_AUTO, ignoreCase = true) -> {
val provider = getProvider()
if (provider?.isNotEmpty() == true) {
changeMode(DNS_MODE_ON)
} else {
changeMode(DNS_MODE_OFF)
}
}
mode.equals(DNS_MODE_ON, ignoreCase = true) -> changeMode(DNS_MODE_OFF)
}
}
private fun getMode(): String? = Settings.Global.getString(contentResolver, "private_dns_mode")
private fun getProvider(): String? =
Settings.Global.getString(contentResolver, "private_dns_specifier")
private fun checkPermission(): Boolean {
if (checkCallingOrSelfPermission("android.permission.WRITE_SECURE_SETTINGS") == PackageManager.PERMISSION_DENIED) {
noPermissionTile()
return false
}
return true
}
private fun changeMode(dnsMode: String) {
Settings.Global.putString(contentResolver, "private_dns_mode", dnsMode)
updateTile()
}
private fun updateTile() {
val mode = getMode()
when {
mode.equals(DNS_MODE_OFF, ignoreCase = true) -> refreshTile(
Tile.STATE_INACTIVE, getString(R.string.dns_off), R.drawable.ic_dns_off
)
mode.equals(DNS_MODE_AUTO, ignoreCase = true) -> refreshTile(
Tile.STATE_ACTIVE, getString(R.string.dns_auto), R.drawable.ic_dns_auto
)
mode.equals(DNS_MODE_ON, ignoreCase = true) -> {
val provider = getProvider()
if (provider?.isNotEmpty() == true) {
refreshTile(Tile.STATE_ACTIVE, provider, R.drawable.ic_dns_on)
} else {
noPermissionTile()
}
}
}
}
private fun noPermissionTile() {
refreshTile(
Tile.STATE_UNAVAILABLE, getString(R.string.no_permission), R.drawable.ic_no_permission
)
}
private fun refreshTile(state: Int, label: String, icon: Int) {
val tile = qsTile
tile.state = state
tile.label = label
tile.icon = Icon.createWithResource(this, icon)
tile.updateTile()
}
}