Commit 27f5c075 authored by Mygod's avatar Mygod

Refine DefaultNetworkListener behavior on Android 6.0

parent 385cbba2
...@@ -9,8 +9,6 @@ ...@@ -9,8 +9,6 @@
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>
<!-- This permission is only used on Android 6.0 due to bug: https://stackoverflow.com/a/33509180/2245107 -->
<uses-permission-sdk-23 android:name="android.permission.WRITE_SETTINGS"/>
<uses-feature android:name="android.software.leanback" <uses-feature android:name="android.software.leanback"
android:required="false"/> android:required="false"/>
......
...@@ -35,6 +35,7 @@ import kotlinx.coroutines.CoroutineScope ...@@ -35,6 +35,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.actor import kotlinx.coroutines.channels.actor
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import java.net.UnknownHostException
object DefaultNetworkListener : CoroutineScope { object DefaultNetworkListener : CoroutineScope {
override val coroutineContext get() = Dispatchers.Default override val coroutineContext get() = Dispatchers.Default
...@@ -83,7 +84,9 @@ object DefaultNetworkListener : CoroutineScope { ...@@ -83,7 +84,9 @@ object DefaultNetworkListener : CoroutineScope {
} }
suspend fun start(key: Any, listener: (Network?) -> Unit) = networkActor.send(NetworkMessage.Start(key, listener)) suspend fun start(key: Any, listener: (Network?) -> Unit) = networkActor.send(NetworkMessage.Start(key, listener))
suspend fun get() = NetworkMessage.Get().run { suspend fun get() = if (fallback) @TargetApi(23) {
connectivity.activeNetwork ?: throw UnknownHostException() // failed to listen, return current if available
} else NetworkMessage.Get().run {
networkActor.send(this) networkActor.send(this)
response.await() response.await()
} }
...@@ -99,6 +102,7 @@ object DefaultNetworkListener : CoroutineScope { ...@@ -99,6 +102,7 @@ object DefaultNetworkListener : CoroutineScope {
override fun onLost(network: Network) = runBlocking { networkActor.send(NetworkMessage.Lost(network)) } override fun onLost(network: Network) = runBlocking { networkActor.send(NetworkMessage.Lost(network)) }
} }
private var fallback = false
private val connectivity = app.getSystemService<ConnectivityManager>()!! private val connectivity = app.getSystemService<ConnectivityManager>()!!
private val defaultNetworkRequest = NetworkRequest.Builder() private val defaultNetworkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
...@@ -118,13 +122,13 @@ object DefaultNetworkListener : CoroutineScope { ...@@ -118,13 +122,13 @@ object DefaultNetworkListener : CoroutineScope {
if (Build.VERSION.SDK_INT in 24..27) @TargetApi(24) { if (Build.VERSION.SDK_INT in 24..27) @TargetApi(24) {
connectivity.registerDefaultNetworkCallback(Callback) connectivity.registerDefaultNetworkCallback(Callback)
} else try { } else try {
fallback = false
// we want REQUEST here instead of LISTEN // we want REQUEST here instead of LISTEN
connectivity.requestNetwork(defaultNetworkRequest, Callback) connectivity.requestNetwork(defaultNetworkRequest, Callback)
} catch (e: SecurityException) { } catch (e: SecurityException) {
// known bug: https://stackoverflow.com/a/33509180/2245107 // known bug: https://stackoverflow.com/a/33509180/2245107
if (Build.VERSION.SDK_INT != 23) Crashlytics.logException(e) if (Build.VERSION.SDK_INT != 23) Crashlytics.logException(e)
Toast.makeText(app, e.localizedMessage, Toast.LENGTH_SHORT).show() fallback = true
connectivity.registerNetworkCallback(defaultNetworkRequest, Callback)
} }
} }
private fun unregisterDefaultNetworkListener() = connectivity.unregisterNetworkCallback(Callback) private fun unregisterDefaultNetworkListener() = connectivity.unregisterNetworkCallback(Callback)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment