Last active
September 10, 2023 14:15
-
-
Save zakrodionov/04bc52cb2c2f0aaba5c12a4b6da2575b to your computer and use it in GitHub Desktop.
Observe network status
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
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) | |
} |
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
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) | |
} |
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
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