Disable tethering QS tiles if receiver does not work

Also fixes a memory leak.
This commit is contained in:
Mygod
2019-05-10 11:27:34 +08:00
parent 7f41850a61
commit cb589560f7
2 changed files with 38 additions and 24 deletions

View File

@@ -9,7 +9,7 @@ import be.mygod.vpnhotspot.util.broadcastReceiver
@RequiresApi(24) @RequiresApi(24)
abstract class TetherListeningTileService : KillableTileService() { abstract class TetherListeningTileService : KillableTileService() {
protected var tethered: List<String> = emptyList() protected var tethered: List<String>? = null
private val receiver = broadcastReceiver { _, intent -> private val receiver = broadcastReceiver { _, intent ->
tethered = intent.tetheredIfaces tethered = intent.tetheredIfaces
@@ -18,8 +18,9 @@ abstract class TetherListeningTileService : KillableTileService() {
override fun onStartListening() { override fun onStartListening() {
super.onStartListening() super.onStartListening()
val intent = registerReceiver(receiver, IntentFilter(TetheringManager.ACTION_TETHER_STATE_CHANGED)) tethered = registerReceiver(receiver, IntentFilter(TetheringManager.ACTION_TETHER_STATE_CHANGED))
if (intent != null) tethered = intent.tetheredIfaces ?.tetheredIfaces
updateTile()
} }
override fun onStopListening() { override fun onStopListening() {

View File

@@ -29,7 +29,7 @@ sealed class TetheringTileService : TetherListeningTileService(), TetheringManag
protected abstract val labelString: Int protected abstract val labelString: Int
protected abstract val tetherType: TetherType protected abstract val tetherType: TetherType
protected open val icon get() = tetherType.icon protected open val icon get() = tetherType.icon
protected val interested get() = tethered.filter { TetherType.ofInterface(it) == tetherType } protected val interested get() = tethered?.filter { TetherType.ofInterface(it) == tetherType }
protected var binder: TetheringService.Binder? = null protected var binder: TetheringService.Binder? = null
protected abstract fun start() protected abstract fun start()
@@ -52,19 +52,27 @@ sealed class TetheringTileService : TetherListeningTileService(), TetheringManag
} }
override fun onServiceDisconnected(name: ComponentName?) { override fun onServiceDisconnected(name: ComponentName?) {
binder?.routingsChanged?.remove(this)
binder = null binder = null
} }
override fun updateTile() { override fun updateTile() {
qsTile?.run { qsTile?.run {
val interested = interested val interested = interested
if (interested.isEmpty()) { when {
state = Tile.STATE_INACTIVE interested == null -> {
icon = tileOff state = Tile.STATE_UNAVAILABLE
} else { icon = tileOff
val binder = binder ?: return }
state = Tile.STATE_ACTIVE interested.isEmpty() -> {
icon = if (interested.all(binder::isActive)) tileOn else tileOff state = Tile.STATE_INACTIVE
icon = tileOff
}
else -> {
val binder = binder ?: return
state = Tile.STATE_ACTIVE
icon = if (interested.all(binder::isActive)) tileOn else tileOff
}
} }
label = getText(labelString) label = getText(labelString)
updateTile() updateTile()
@@ -88,7 +96,7 @@ sealed class TetheringTileService : TetherListeningTileService(), TetheringManag
} }
} }
override fun onClick() { override fun onClick() {
val interested = interested val interested = interested ?: return
if (interested.isEmpty()) safeInvoker { start() } else { if (interested.isEmpty()) safeInvoker { start() } else {
val binder = binder val binder = binder
if (binder == null) tapPending = true else { if (binder == null) tapPending = true else {
@@ -146,11 +154,14 @@ sealed class TetheringTileService : TetherListeningTileService(), TetheringManag
override fun updateTile() { override fun updateTile() {
qsTile?.run { qsTile?.run {
when (tethering?.active) { val interested = interested
if (interested == null) {
state = Tile.STATE_UNAVAILABLE
icon = tileOff
} else when (tethering?.active) {
true -> { true -> {
val binder = binder ?: return val binder = binder ?: return
state = Tile.STATE_ACTIVE state = Tile.STATE_ACTIVE
val interested = interested
icon = if (interested.isNotEmpty() && interested.all(binder::isActive)) tileOn else tileOff icon = if (interested.isNotEmpty() && interested.all(binder::isActive)) tileOn else tileOff
} }
false -> { false -> {
@@ -164,18 +175,20 @@ sealed class TetheringTileService : TetherListeningTileService(), TetheringManag
} }
} }
override fun onClick() = when (tethering?.active) { override fun onClick() {
true -> { when (tethering?.active) {
val binder = binder true -> {
if (binder == null) tapPending = true else { val binder = binder
val inactive = interested.filterNot(binder::isActive) if (binder == null) tapPending = true else {
if (inactive.isEmpty()) safeInvoker { stop() } val inactive = (interested ?: return).filterNot(binder::isActive)
else ContextCompat.startForegroundService(this, Intent(this, TetheringService::class.java) if (inactive.isEmpty()) safeInvoker { stop() }
.putExtra(TetheringService.EXTRA_ADD_INTERFACES, inactive.toTypedArray())) else ContextCompat.startForegroundService(this, Intent(this, TetheringService::class.java)
.putExtra(TetheringService.EXTRA_ADD_INTERFACES, inactive.toTypedArray()))
}
} }
false -> safeInvoker { start() }
else -> tapPending = true
} }
false -> safeInvoker { start() }
else -> tapPending = true
} }
} }