Add failfast for VpnMonitor.registerCallback

This commit is contained in:
Mygod
2018-02-11 02:56:18 -08:00
parent 2bdf90a922
commit 2b03bff1a3
2 changed files with 52 additions and 48 deletions

View File

@@ -9,7 +9,6 @@ import android.net.wifi.p2p.WifiP2pGroup
import android.net.wifi.p2p.WifiP2pInfo
import android.net.wifi.p2p.WifiP2pManager
import android.os.Binder
import android.os.Handler
import android.os.Looper
import android.support.annotation.StringRes
import android.support.v4.content.LocalBroadcastManager
@@ -118,7 +117,6 @@ class RepeaterService : Service(), WifiP2pManager.ChannelListener, VpnMonitor.Ca
}
}
private lateinit var handler: Handler
private lateinit var p2pManager: WifiP2pManager
private lateinit var channel: WifiP2pManager.Channel
var group: WifiP2pGroup? = null
@@ -148,7 +146,6 @@ class RepeaterService : Service(), WifiP2pManager.ChannelListener, VpnMonitor.Ca
}
}
}
private val onVpnUnavailable = Runnable { startFailure(getString(R.string.repeater_vpn_unavailable)) }
val ssid get() = if (status == Status.ACTIVE) group?.networkName else null
val password get() = if (status == Status.ACTIVE) group?.passphrase else null
@@ -173,7 +170,6 @@ class RepeaterService : Service(), WifiP2pManager.ChannelListener, VpnMonitor.Ca
override fun onCreate() {
super.onCreate()
handler = Handler()
p2pManager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager
onChannelDisconnected()
}
@@ -190,8 +186,7 @@ class RepeaterService : Service(), WifiP2pManager.ChannelListener, VpnMonitor.Ca
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (status != Status.IDLE) return START_NOT_STICKY
status = Status.STARTING
handler.postDelayed(onVpnUnavailable, 4000)
VpnMonitor.registerCallback(this)
VpnMonitor.registerCallback(this) { startFailure(getString(R.string.repeater_vpn_unavailable)) }
return START_NOT_STICKY
}
private fun startFailure(msg: CharSequence?, group: WifiP2pGroup? = null) {
@@ -203,9 +198,7 @@ class RepeaterService : Service(), WifiP2pManager.ChannelListener, VpnMonitor.Ca
/**
* startService 2nd stop, also called when VPN re-established
*/
override fun onAvailable(ifname: String) {
handler.removeCallbacks(onVpnUnavailable)
when (status) {
override fun onAvailable(ifname: String) = when (status) {
Status.STARTING -> {
val matcher = patternNetworkInfo.matcher(loggerSu("dumpsys ${Context.WIFI_P2P_SERVICE}") ?: "")
when {
@@ -243,11 +236,10 @@ class RepeaterService : Service(), WifiP2pManager.ChannelListener, VpnMonitor.Ca
val routing = routing
check(!routing!!.started)
if (!initRouting(ifname, routing.downstream, routing.hostAddress))
Toast.makeText(this, getText(R.string.noisy_su_failure), Toast.LENGTH_SHORT).show()
Toast.makeText(this, getText(R.string.noisy_su_failure), Toast.LENGTH_SHORT).show() else { }
}
else -> throw IllegalStateException("RepeaterService is in unexpected state when receiving onAvailable")
}
}
override fun onLost(ifname: String) {
if (routing?.stop() == false)
Toast.makeText(this, getText(R.string.noisy_su_failure), Toast.LENGTH_SHORT).show()

View File

@@ -41,9 +41,21 @@ object VpnMonitor : ConnectivityManager.NetworkCallback() {
callbacks.forEach { it.onLost(ifname) }
}
fun registerCallback(callback: Callback) {
fun registerCallback(callback: Callback, failfast: (() -> Unit)? = null) {
if (!callbacks.add(callback)) return
if (registered) available.forEach { callback.onAvailable(it.value) } else {
if (registered) {
if (failfast != null && available.isEmpty()) {
callbacks.remove(callback)
failfast()
} else available.forEach { callback.onAvailable(it.value) }
} else if (failfast != null && manager.allNetworks.all {
val cap = manager.getNetworkCapabilities(it)
!cap.hasTransport(NetworkCapabilities.TRANSPORT_VPN) ||
cap.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
}) {
callbacks.remove(callback)
failfast()
} else {
manager.registerNetworkCallback(request, this)
registered = true
}