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
import android.service.quicksettings.Tile
import androidx.annotation.CallSuper
import androidx.annotation.RequiresApi
import be.mygod.vpnhotspot.R
import be.mygod.vpnhotspot.net.IpNeighbour
@@ -11,15 +12,28 @@ import java.net.Inet4Address
@RequiresApi(24)
abstract class IpNeighbourMonitoringTileService : KillableTileService(), IpNeighbourMonitor.Callback {
private var neighbours: Collection<IpNeighbour> = emptyList()
private var canRegister = false
abstract fun updateTile()
@CallSuper
override fun 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() {
IpNeighbourMonitor.unregisterCallback(this)
synchronized(this) {
canRegister = false
IpNeighbourMonitor.unregisterCallback(this)
}
super.onStopListening()
}

View File

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

View File

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

View File

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