110 lines
3.0 KiB
Kotlin
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()
|
|
}
|
|
|
|
}
|