Created
January 10, 2023 13:49
-
-
Save hmshohrab/fcef63c524c50afcde0d9affe3d5db41 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sealed class NetworkStatus { | |
object Available : NetworkStatus() | |
object Unavailable : NetworkStatus() | |
} | |
class NetworkStatusHelper(private val context: Context) : LiveData<NetworkStatus>() { | |
val valideNetworkConnections : ArrayList<Network> = ArrayList() | |
var connectivityManager: ConnectivityManager = | |
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager | |
private lateinit var connectivityManagerCallback: ConnectivityManager.NetworkCallback | |
fun announceStatus(){ | |
if (valideNetworkConnections.isNotEmpty()){ | |
postValue(NetworkStatus.Available) | |
} else { | |
postValue(NetworkStatus.Unavailable) | |
} | |
} | |
fun getConnectivityManagerCallback() = | |
object : ConnectivityManager.NetworkCallback(){ | |
override fun onAvailable(network: Network) { | |
super.onAvailable(network) | |
val networkCapability = connectivityManager.getNetworkCapabilities(network) | |
val hasNetworkConnection = networkCapability?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)?:false | |
if (hasNetworkConnection){ | |
determineInternetAccess(network) | |
} | |
} | |
override fun onLost(network: Network) { | |
super.onLost(network) | |
valideNetworkConnections.remove(network) | |
announceStatus() | |
} | |
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { | |
super.onCapabilitiesChanged(network, networkCapabilities) | |
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)){ | |
determineInternetAccess(network) | |
} else { | |
valideNetworkConnections.remove(network) | |
} | |
announceStatus() | |
} | |
} | |
private fun determineInternetAccess(network: Network) { | |
CoroutineScope(Dispatchers.IO).launch{ | |
if (InernetAvailablity.check()){ | |
withContext(Dispatchers.Main){ | |
valideNetworkConnections.add(network) | |
announceStatus() | |
} | |
} | |
} | |
} | |
override fun onActive() { | |
super.onActive() | |
connectivityManagerCallback = getConnectivityManagerCallback() | |
val networkRequest = NetworkRequest | |
.Builder() | |
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) | |
.build() | |
connectivityManager.registerNetworkCallback(networkRequest, connectivityManagerCallback) | |
} | |
override fun onInactive() { | |
super.onInactive() | |
connectivityManager.unregisterNetworkCallback(connectivityManagerCallback) | |
} | |
} | |
object InernetAvailablity { | |
fun check() : Boolean { | |
return try { | |
val socket = Socket() | |
socket.connect(InetSocketAddress("8.8.8.8",53)) | |
socket.close() | |
true | |
} catch ( e: Exception){ | |
e.printStackTrace() | |
false | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment