Lazily start IpNeighbourMonitor in qs tiles

This commit is contained in:
Mygod
2020-06-20 23:43:20 -04:00
parent 72d79ed822
commit 490f6c5115
4 changed files with 21 additions and 2 deletions

View File

@@ -1,6 +1,7 @@
package be.mygod.vpnhotspot.manage package be.mygod.vpnhotspot.manage
import android.service.quicksettings.Tile import android.service.quicksettings.Tile
import androidx.annotation.CallSuper
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import be.mygod.vpnhotspot.R import be.mygod.vpnhotspot.R
import be.mygod.vpnhotspot.net.IpNeighbour import be.mygod.vpnhotspot.net.IpNeighbour
@@ -11,15 +12,28 @@ import java.net.Inet4Address
@RequiresApi(24) @RequiresApi(24)
abstract class IpNeighbourMonitoringTileService : KillableTileService(), IpNeighbourMonitor.Callback { abstract class IpNeighbourMonitoringTileService : KillableTileService(), IpNeighbourMonitor.Callback {
private var neighbours: Collection<IpNeighbour> = emptyList() private var neighbours: Collection<IpNeighbour> = emptyList()
private var canRegister = false
abstract fun updateTile() abstract fun updateTile()
@CallSuper
override fun onStartListening() { override fun onStartListening() {
super.onStartListening() super.onStartListening()
IpNeighbourMonitor.registerCallback(this) synchronized(this) { canRegister = true }
} }
/**
* Lazily start [IpNeighbourMonitor], which could invoke root.
*/
protected fun listenForClients() = synchronized(this) {
if (canRegister) IpNeighbourMonitor.registerCallback(this)
}
@CallSuper
override fun onStopListening() { override fun onStopListening() {
synchronized(this) {
canRegister = false
IpNeighbourMonitor.unregisterCallback(this) IpNeighbourMonitor.unregisterCallback(this)
}
super.onStopListening() super.onStopListening()
} }

View File

@@ -40,6 +40,7 @@ class LocalOnlyHotspotTileService : IpNeighbourMonitoringTileService() {
state = Tile.STATE_ACTIVE state = Tile.STATE_ACTIVE
label = binder.configuration?.ssid ?: getText(R.string.tethering_temp_hotspot) label = binder.configuration?.ssid ?: getText(R.string.tethering_temp_hotspot)
subtitleDevices { it == iface } subtitleDevices { it == iface }
listenForClients()
} }
updateTile() updateTile()
} }

View File

@@ -92,6 +92,7 @@ sealed class TetheringTileService : IpNeighbourMonitoringTileService(), Tetherin
state = Tile.STATE_ACTIVE state = Tile.STATE_ACTIVE
icon = if (interested.all(binder::isActive)) tileOn else tileOff icon = if (interested.all(binder::isActive)) tileOn else tileOff
subtitleDevices(interested::contains) subtitleDevices(interested::contains)
listenForClients()
} }
} }
label = getText(labelString) label = getText(labelString)
@@ -179,6 +180,7 @@ sealed class TetheringTileService : IpNeighbourMonitoringTileService(), Tetherin
state = Tile.STATE_ACTIVE state = Tile.STATE_ACTIVE
icon = if (interested.isNotEmpty() && interested.all(binder::isActive)) tileOn else tileOff icon = if (interested.isNotEmpty() && interested.all(binder::isActive)) tileOn else tileOff
subtitleDevices(interested::contains) subtitleDevices(interested::contains)
listenForClients()
} }
false -> { false -> {
state = Tile.STATE_INACTIVE state = Tile.STATE_INACTIVE

View File

@@ -6,6 +6,7 @@ import android.os.Build
import android.os.IBinder import android.os.IBinder
import android.service.quicksettings.Tile import android.service.quicksettings.Tile
import android.service.quicksettings.TileService import android.service.quicksettings.TileService
import androidx.annotation.CallSuper
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
@RequiresApi(24) @RequiresApi(24)
@@ -19,6 +20,7 @@ abstract class KillableTileService : TileService(), ServiceConnection {
if (Build.VERSION.SDK_INT >= 29) subtitle = value if (Build.VERSION.SDK_INT >= 29) subtitle = value
} }
@CallSuper
override fun onServiceConnected(name: ComponentName?, service: IBinder?) { override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
if (tapPending) { if (tapPending) {
tapPending = false tapPending = false