forked from Louvorg/ReaderForSelfoss-multiplatform
Include a local copy of the connectivity-status library to solve a bug
This commit is contained in:
4
connectionstatus/src/androidMain/AndroidManifest.xml
Normal file
4
connectionstatus/src/androidMain/AndroidManifest.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.github.ln12.library">
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||
</manifest>
|
||||
@@ -0,0 +1,85 @@
|
||||
package com.github.ln12.library
|
||||
|
||||
import android.content.Context
|
||||
import android.net.ConnectivityManager
|
||||
import android.net.Network
|
||||
import android.net.NetworkCapabilities
|
||||
import android.net.NetworkRequest
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
|
||||
// From library com.github.ln-12:multiplatform-connectivity-status:1.1.0
|
||||
// https://github.com/ln-12/multiplatform-connectivity-status
|
||||
// Copyright 2021 Lorenzo Neumann
|
||||
// Edited by davidoskky as here: https://github.com/ln-12/multiplatform-connectivity-status/pull/4
|
||||
actual class ConnectivityStatus(private val context: Context) {
|
||||
actual val isNetworkConnected = MutableStateFlow(false)
|
||||
|
||||
private var connectivityManager: ConnectivityManager? = null
|
||||
private val networkCallback = object : ConnectivityManager.NetworkCallback() {
|
||||
override fun onAvailable(network: Network) {
|
||||
Log.d("Connectivity status", "Connected")
|
||||
isNetworkConnected.value = true
|
||||
}
|
||||
|
||||
override fun onLost(network: Network) {
|
||||
Log.d("Connectivity status", "Disconnected")
|
||||
isNetworkConnected.value = false
|
||||
}
|
||||
}
|
||||
|
||||
actual fun start() {
|
||||
try {
|
||||
if (connectivityManager == null) {
|
||||
connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
// API 24 and above
|
||||
connectivityManager!!.registerDefaultNetworkCallback(networkCallback)
|
||||
|
||||
val currentNetwork = connectivityManager!!.activeNetwork
|
||||
|
||||
if(currentNetwork == null) {
|
||||
isNetworkConnected.value = false
|
||||
|
||||
Log.d("Connectivity status", "Disconnected")
|
||||
}
|
||||
} else {
|
||||
// API 23 and below
|
||||
val networkRequest = NetworkRequest.Builder().apply {
|
||||
addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||
addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
|
||||
}
|
||||
}.build()
|
||||
|
||||
connectivityManager!!.registerNetworkCallback(networkRequest, networkCallback)
|
||||
|
||||
val currentNetwork = connectivityManager!!.activeNetworkInfo
|
||||
|
||||
if(currentNetwork == null || (
|
||||
currentNetwork.type != ConnectivityManager.TYPE_ETHERNET &&
|
||||
currentNetwork.type != ConnectivityManager.TYPE_WIFI &&
|
||||
currentNetwork.type != ConnectivityManager.TYPE_MOBILE
|
||||
)) {
|
||||
isNetworkConnected.value = false
|
||||
|
||||
Log.d("Connectivity status", "Disconnected")
|
||||
}
|
||||
}
|
||||
|
||||
Log.d("Connectivity status", "Started")
|
||||
} catch (e: Exception) {
|
||||
Log.d("Connectivity status", "Failed to start: ${e.message.toString()}")
|
||||
e.printStackTrace()
|
||||
isNetworkConnected.value = false
|
||||
}
|
||||
}
|
||||
|
||||
actual fun stop() {
|
||||
connectivityManager?.unregisterNetworkCallback(networkCallback)
|
||||
Log.d("Connectivity status", "Stopped")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.github.ln12.library
|
||||
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
|
||||
// From library com.github.ln-12:multiplatform-connectivity-status:1.1.0
|
||||
// https://github.com/ln-12/multiplatform-connectivity-status
|
||||
// Copyright 2021 Lorenzo Neumann
|
||||
expect class ConnectivityStatus {
|
||||
val isNetworkConnected: MutableStateFlow<Boolean>
|
||||
fun start()
|
||||
fun stop()
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package com.github.ln12.library
|
||||
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import cocoapods.Reachability.*
|
||||
import kotlinx.coroutines.MainScope
|
||||
import kotlinx.coroutines.flow.collect
|
||||
import kotlinx.coroutines.launch
|
||||
import platform.Foundation.NSLog
|
||||
import platform.darwin.dispatch_async
|
||||
import platform.darwin.dispatch_get_main_queue
|
||||
import kotlin.native.concurrent.freeze
|
||||
|
||||
|
||||
// From library com.github.ln-12:multiplatform-connectivity-status:1.1.0
|
||||
// https://github.com/ln-12/multiplatform-connectivity-status
|
||||
// Copyright 2021 Lorenzo Neumann
|
||||
actual class ConnectivityStatus {
|
||||
actual val isNetworkConnected = MutableStateFlow(false)
|
||||
|
||||
private var reachability: Reachability? = null
|
||||
|
||||
// Swift can't directly use a MutableStateFlow, so the status
|
||||
// is exposed via a lambda/closure
|
||||
fun getStatus(success: (Boolean) -> Unit) {
|
||||
MainScope().launch {
|
||||
isNetworkConnected.collect { status ->
|
||||
success(status)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
actual fun start() {
|
||||
dispatch_async(dispatch_get_main_queue()) {
|
||||
reachability = Reachability.reachabilityForInternetConnection()
|
||||
|
||||
val reachableCallback = { reach: Reachability? ->
|
||||
dispatch_async(dispatch_get_main_queue(), {
|
||||
NSLog("Connected")
|
||||
|
||||
isNetworkConnected.value = true
|
||||
}.freeze())
|
||||
}.freeze()
|
||||
reachability?.reachableBlock = reachableCallback
|
||||
|
||||
val unreachableCallback = { reach: Reachability? ->
|
||||
dispatch_async(dispatch_get_main_queue(), {
|
||||
NSLog("Disconnected")
|
||||
|
||||
isNetworkConnected.value = false
|
||||
}.freeze())
|
||||
}.freeze()
|
||||
reachability?.unreachableBlock = unreachableCallback
|
||||
|
||||
reachability?.startNotifier()
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), {
|
||||
isNetworkConnected.value = reachability?.isReachable() ?: false
|
||||
|
||||
NSLog("Initial reachability: ${reachability?.isReachable()}")
|
||||
}.freeze())
|
||||
}
|
||||
}
|
||||
|
||||
actual fun stop() {
|
||||
reachability?.stopNotifier()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user