Skip to content

Instantly share code, notes, and snippets.

@zakrodionov
Last active September 10, 2023 14:15
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zakrodionov/04bc52cb2c2f0aaba5c12a4b6da2575b to your computer and use it in GitHub Desktop.
Save zakrodionov/04bc52cb2c2f0aaba5c12a4b6da2575b to your computer and use it in GitHub Desktop.
Observe network status
package com.zakrodionov.commonApp.app.platform
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.ConnectivityManager
import android.net.Network
import android.os.Build
import androidx.core.content.ContextCompat.getSystemService
typealias NetworkChangedListener = (isConnected: Boolean) -> Unit
class ConnectivityListener(private val context: Context) {
private val networkChangedListeners = arrayListOf<NetworkChangedListener>()
//region used on api < 24
private val intentFilter by lazy {
IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
}
private val networkBroadcastReceiver by lazy {
object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val isConnected = isConnected()
networkChangedListeners.forEach { it.invoke(isConnected) }
}
}
}
//endregion
private val networkCallback by lazy {
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
networkChangedListeners.forEach { it.invoke(true) }
}
override fun onLost(network: Network) {
networkChangedListeners.forEach { it.invoke(false) }
}
}
}
init {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
getConnectivityManager()?.registerDefaultNetworkCallback(networkCallback)
} else {
context.registerReceiver(networkBroadcastReceiver, intentFilter)
}
}
fun addListener(networkChangedListener: NetworkChangedListener) {
networkChangedListeners.add(networkChangedListener)
}
fun removeListener(networkChangedListener: NetworkChangedListener) {
networkChangedListeners.remove(networkChangedListener)
}
fun removeAll() {
networkChangedListeners.clear()
}
fun isConnected(): Boolean {
val activeNetwork = getConnectivityManager()?.activeNetworkInfo
val isConnected = activeNetwork?.isConnectedOrConnecting == true
return isConnected
}
fun getConnectivityManager() = getSystemService(context, ConnectivityManager::class.java)
}
class ConnectivityListenerLiveData(private val context: Context) : LiveData<Boolean>() {
//region used on api < 24
private val intentFilter by lazy {
IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
}
private val networkBroadcastReceiver by lazy {
object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val isConn = isConnected()
postValue(isConn)
}
}
}
//endregion
private val networkCallback by lazy {
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
postValue(true)
}
override fun onLost(network: Network) {
postValue(false)
}
}
}
override fun onActive() {
super.onActive()
registerObserver()
}
override fun onInactive() {
unregisterObserver()
super.onInactive()
}
private fun registerObserver() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
getConnectivityManager()?.registerDefaultNetworkCallback(networkCallback)
} else {
context.registerReceiver(networkBroadcastReceiver, intentFilter)
}
}
private fun unregisterObserver() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
getConnectivityManager()?.unregisterNetworkCallback(networkCallback)
} else {
context.unregisterReceiver(networkBroadcastReceiver)
}
}
fun isConnected(): Boolean {
val activeNetwork = getConnectivityManager()?.activeNetworkInfo
val isConnected = activeNetwork?.isConnectedOrConnecting == true
return isConnected
}
fun getConnectivityManager() = getSystemService(context, ConnectivityManager::class.java)
}
package com.zakrodionov.commonApp.app.platform
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.ConnectivityManager
import android.net.Network
import android.os.Build
import androidx.core.content.ContextCompat.getSystemService
import androidx.lifecycle.MutableLiveData
class ConnectivityListener(private val context: Context) {
val isConnected = MutableLiveData<Boolean>()
//region used on api < 24
private val intentFilter by lazy {
IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
}
private val networkBroadcastReceiver by lazy {
object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val isConn = isConnected()
isConnected.postValue(isConn)
}
}
}
//endregion
private val networkCallback by lazy {
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
isConnected.postValue(true)
}
override fun onLost(network: Network) {
isConnected.postValue(false)
}
}
}
init {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
getConnectivityManager()?.registerDefaultNetworkCallback(networkCallback)
} else {
context.registerReceiver(networkBroadcastReceiver, intentFilter)
}
}
fun isConnected(): Boolean {
val activeNetwork = getConnectivityManager()?.activeNetworkInfo
val isConnected = activeNetwork?.isConnectedOrConnecting == true
return isConnected
}
fun getConnectivityManager() = getSystemService(context, ConnectivityManager::class.java)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment