Add failfast for VpnMonitor.registerCallback
This commit is contained in:
@@ -9,7 +9,6 @@ import android.net.wifi.p2p.WifiP2pGroup
|
|||||||
import android.net.wifi.p2p.WifiP2pInfo
|
import android.net.wifi.p2p.WifiP2pInfo
|
||||||
import android.net.wifi.p2p.WifiP2pManager
|
import android.net.wifi.p2p.WifiP2pManager
|
||||||
import android.os.Binder
|
import android.os.Binder
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import android.support.annotation.StringRes
|
import android.support.annotation.StringRes
|
||||||
import android.support.v4.content.LocalBroadcastManager
|
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 p2pManager: WifiP2pManager
|
||||||
private lateinit var channel: WifiP2pManager.Channel
|
private lateinit var channel: WifiP2pManager.Channel
|
||||||
var group: WifiP2pGroup? = null
|
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 ssid get() = if (status == Status.ACTIVE) group?.networkName else null
|
||||||
val password get() = if (status == Status.ACTIVE) group?.passphrase 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() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
handler = Handler()
|
|
||||||
p2pManager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager
|
p2pManager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager
|
||||||
onChannelDisconnected()
|
onChannelDisconnected()
|
||||||
}
|
}
|
||||||
@@ -190,8 +186,7 @@ class RepeaterService : Service(), WifiP2pManager.ChannelListener, VpnMonitor.Ca
|
|||||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||||
if (status != Status.IDLE) return START_NOT_STICKY
|
if (status != Status.IDLE) return START_NOT_STICKY
|
||||||
status = Status.STARTING
|
status = Status.STARTING
|
||||||
handler.postDelayed(onVpnUnavailable, 4000)
|
VpnMonitor.registerCallback(this) { startFailure(getString(R.string.repeater_vpn_unavailable)) }
|
||||||
VpnMonitor.registerCallback(this)
|
|
||||||
return START_NOT_STICKY
|
return START_NOT_STICKY
|
||||||
}
|
}
|
||||||
private fun startFailure(msg: CharSequence?, group: WifiP2pGroup? = null) {
|
private fun startFailure(msg: CharSequence?, group: WifiP2pGroup? = null) {
|
||||||
@@ -203,50 +198,47 @@ class RepeaterService : Service(), WifiP2pManager.ChannelListener, VpnMonitor.Ca
|
|||||||
/**
|
/**
|
||||||
* startService 2nd stop, also called when VPN re-established
|
* startService 2nd stop, also called when VPN re-established
|
||||||
*/
|
*/
|
||||||
override fun onAvailable(ifname: String) {
|
override fun onAvailable(ifname: String) = when (status) {
|
||||||
handler.removeCallbacks(onVpnUnavailable)
|
Status.STARTING -> {
|
||||||
when (status) {
|
val matcher = patternNetworkInfo.matcher(loggerSu("dumpsys ${Context.WIFI_P2P_SERVICE}") ?: "")
|
||||||
Status.STARTING -> {
|
when {
|
||||||
val matcher = patternNetworkInfo.matcher(loggerSu("dumpsys ${Context.WIFI_P2P_SERVICE}") ?: "")
|
!matcher.find() -> startFailure(getString(R.string.root_unavailable))
|
||||||
when {
|
matcher.group(2) == "true" -> {
|
||||||
!matcher.find() -> startFailure(getString(R.string.root_unavailable))
|
unregisterReceiver()
|
||||||
matcher.group(2) == "true" -> {
|
upstream = ifname
|
||||||
unregisterReceiver()
|
registerReceiver(receiver, intentFilter(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION,
|
||||||
upstream = ifname
|
WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION))
|
||||||
registerReceiver(receiver, intentFilter(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION,
|
LocalBroadcastManager.getInstance(this)
|
||||||
WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION))
|
.registerReceiver(receiver, intentFilter(App.ACTION_CLEAN_ROUTINGS))
|
||||||
LocalBroadcastManager.getInstance(this)
|
receiverRegistered = true
|
||||||
.registerReceiver(receiver, intentFilter(App.ACTION_CLEAN_ROUTINGS))
|
p2pManager.requestGroupInfo(channel, {
|
||||||
receiverRegistered = true
|
when {
|
||||||
p2pManager.requestGroupInfo(channel, {
|
it == null -> doStart()
|
||||||
when {
|
it.isGroupOwner -> doStart(it)
|
||||||
it == null -> doStart()
|
else -> {
|
||||||
it.isGroupOwner -> doStart(it)
|
Log.i(TAG, "Removing old group ($it)")
|
||||||
else -> {
|
p2pManager.removeGroup(channel, object : WifiP2pManager.ActionListener {
|
||||||
Log.i(TAG, "Removing old group ($it)")
|
override fun onSuccess() = doStart()
|
||||||
p2pManager.removeGroup(channel, object : WifiP2pManager.ActionListener {
|
override fun onFailure(reason: Int) {
|
||||||
override fun onSuccess() = doStart()
|
Toast.makeText(this@RepeaterService,
|
||||||
override fun onFailure(reason: Int) {
|
formatReason(R.string.repeater_remove_old_group_failure, reason),
|
||||||
Toast.makeText(this@RepeaterService,
|
Toast.LENGTH_SHORT).show()
|
||||||
formatReason(R.string.repeater_remove_old_group_failure, reason),
|
}
|
||||||
Toast.LENGTH_SHORT).show()
|
})
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
}
|
})
|
||||||
else -> startFailure(getString(R.string.repeater_p2p_unavailable))
|
|
||||||
}
|
}
|
||||||
|
else -> startFailure(getString(R.string.repeater_p2p_unavailable))
|
||||||
}
|
}
|
||||||
Status.ACTIVE -> {
|
|
||||||
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()
|
|
||||||
}
|
|
||||||
else -> throw IllegalStateException("RepeaterService is in unexpected state when receiving onAvailable")
|
|
||||||
}
|
}
|
||||||
|
Status.ACTIVE -> {
|
||||||
|
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() else { }
|
||||||
|
}
|
||||||
|
else -> throw IllegalStateException("RepeaterService is in unexpected state when receiving onAvailable")
|
||||||
}
|
}
|
||||||
override fun onLost(ifname: String) {
|
override fun onLost(ifname: String) {
|
||||||
if (routing?.stop() == false)
|
if (routing?.stop() == false)
|
||||||
|
|||||||
@@ -41,9 +41,21 @@ object VpnMonitor : ConnectivityManager.NetworkCallback() {
|
|||||||
callbacks.forEach { it.onLost(ifname) }
|
callbacks.forEach { it.onLost(ifname) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun registerCallback(callback: Callback) {
|
fun registerCallback(callback: Callback, failfast: (() -> Unit)? = null) {
|
||||||
if (!callbacks.add(callback)) return
|
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)
|
manager.registerNetworkCallback(request, this)
|
||||||
registered = true
|
registered = true
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user