Handle deprecated connectivity intent filter.

main
Alex Hart 2022-12-12 13:18:16 -04:00 zatwierdzone przez Cody Henthorne
rodzic de558bc87c
commit 4f167feaf5
1 zmienionych plików z 50 dodań i 9 usunięć

Wyświetl plik

@ -5,23 +5,64 @@ 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.annotation.RequiresApi
import io.reactivex.rxjava3.core.Observable
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
object InternetConnectionObserver {
fun observe(): Observable<Boolean> = Observable.create {
val application = ApplicationDependencies.getApplication()
/**
* Observe network availability changes.
*/
fun observe(): Observable<Boolean> {
return if (Build.VERSION.SDK_INT >= 24) {
observeApi24()
} else {
observeApi19()
}
}
val observer = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (!it.isDisposed) {
it.onNext(NetworkConstraint.isMet(application))
@RequiresApi(24)
private fun observeApi24(): Observable<Boolean> {
return Observable.create {
val application = ApplicationDependencies.getApplication()
val connectivityManager = ServiceUtil.getConnectivityManager(application)
val callback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
it.onNext(true)
}
override fun onLost(network: Network) {
it.onNext(false)
}
}
}
it.setCancellable { application.unregisterReceiver(observer) }
application.registerReceiver(observer, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION))
connectivityManager.registerDefaultNetworkCallback(callback)
it.setCancellable {
connectivityManager.unregisterNetworkCallback(callback)
}
}
}
@Suppress("DEPRECATION")
private fun observeApi19(): Observable<Boolean> {
return Observable.create {
val application = ApplicationDependencies.getApplication()
val observer = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (!it.isDisposed) {
it.onNext(NetworkConstraint.isMet(application))
}
}
}
it.setCancellable { application.unregisterReceiver(observer) }
application.registerReceiver(observer, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION))
}
}
}