Forked from andrewsafwatsamuel/ConnectivityListener.kt
Created
March 8, 2022 08:40
-
-
Save mo7amd89/cdd21958e6da0be2a222732e8851c208 to your computer and use it in GitHub Desktop.
Android connectivity listener
This file contains hidden or 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
import android.annotation.TargetApi | |
import android.content.BroadcastReceiver | |
import android.content.Context | |
import android.content.Intent | |
import android.content.IntentFilter | |
import android.net.* | |
import android.os.Build | |
import androidx.annotation.RequiresApi | |
import androidx.lifecycle.LiveData | |
@Suppress("DEPRECATION") | |
class ConnectivityListener(private val context: Context) : LiveData<Boolean>() { | |
private val connectivityManager by lazy { context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager } | |
private lateinit var callbackManager: ConnectivityManager.NetworkCallback | |
override fun onActive() { | |
super.onActive() | |
updateConnection() | |
when { | |
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> { | |
connectivityManager.registerDefaultNetworkCallback(connectivityManagerCallback()) | |
} | |
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP -> { | |
lollipopNetworkRequester() | |
} | |
else -> { | |
context.registerReceiver( | |
networkReceiver, | |
IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) | |
) | |
} | |
} | |
} | |
override fun onInactive() { | |
super.onInactive() | |
when { | |
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP -> { | |
if (::callbackManager.isInitialized) connectivityManager.unregisterNetworkCallback(callbackManager) | |
} | |
else -> context.unregisterReceiver(networkReceiver) | |
} | |
} | |
@TargetApi(Build.VERSION_CODES.LOLLIPOP) | |
private fun lollipopNetworkRequester() { | |
val requestBuilder = NetworkRequest.Builder() | |
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) | |
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) | |
connectivityManager?.registerNetworkCallback(requestBuilder.build(), connectivityManagerCallback()) | |
} | |
private fun connectivityManagerCallback(): ConnectivityManager.NetworkCallback { | |
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) throw IllegalAccessError("Error") | |
callbackManager = @RequiresApi(Build.VERSION_CODES.LOLLIPOP) | |
object : ConnectivityManager.NetworkCallback() { | |
override fun onLost(network: Network) { | |
super.onLost(network) | |
postValue(false) | |
} | |
override fun onAvailable(network: Network) { | |
super.onAvailable(network) | |
postValue(true) | |
} | |
} | |
return callbackManager | |
} | |
private val networkReceiver = object : BroadcastReceiver() { | |
override fun onReceive(context: Context?, intent: Intent?) { | |
updateConnection() | |
} | |
} | |
private fun updateConnection() { | |
val activeNetwork: NetworkInfo? = connectivityManager.activeNetworkInfo | |
postValue(activeNetwork?.isConnected == true) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment