Fix network state observer

This commit is contained in:
Koitharu
2022-11-30 09:22:51 +02:00
parent f469369b14
commit 1cbfe017ea
3 changed files with 21 additions and 24 deletions

View File

@@ -25,6 +25,7 @@ import org.koitharu.kotatsu.BuildConfig
import org.koitharu.kotatsu.base.ui.util.ActivityRecreationHandle
import org.koitharu.kotatsu.core.db.MangaDatabase
import org.koitharu.kotatsu.core.network.*
import org.koitharu.kotatsu.core.os.NetworkState
import org.koitharu.kotatsu.core.os.ShortcutsUpdater
import org.koitharu.kotatsu.core.parser.MangaLoaderContextImpl
import org.koitharu.kotatsu.core.parser.MangaRepository
@@ -39,6 +40,7 @@ import org.koitharu.kotatsu.search.ui.MangaSuggestionsProvider
import org.koitharu.kotatsu.settings.backup.BackupObserver
import org.koitharu.kotatsu.sync.domain.SyncController
import org.koitharu.kotatsu.utils.IncognitoModeIndicator
import org.koitharu.kotatsu.utils.ext.connectivityManager
import org.koitharu.kotatsu.utils.ext.isLowRamDevice
import org.koitharu.kotatsu.utils.image.CoilImageGetter
import org.koitharu.kotatsu.widget.WidgetUpdater
@@ -81,6 +83,12 @@ interface AppModule {
}.build()
}
@Provides
@Singleton
fun provideNetworkState(
@ApplicationContext context: Context
) = NetworkState(context.connectivityManager)
@Provides
@Singleton
fun provideMangaDatabase(

View File

@@ -1,29 +1,21 @@
package org.koitharu.kotatsu.core.os
import android.content.Context
import android.net.ConnectivityManager
import android.net.ConnectivityManager.NetworkCallback
import android.net.Network
import android.net.NetworkRequest
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.flow.first
import org.koitharu.kotatsu.utils.MediatorStateFlow
import org.koitharu.kotatsu.utils.ext.connectivityManager
import org.koitharu.kotatsu.utils.ext.isNetworkAvailable
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class NetworkState @Inject constructor(
@ApplicationContext context: Context,
) : MediatorStateFlow<Boolean>() {
class NetworkState(
private val connectivityManager: ConnectivityManager,
) : MediatorStateFlow<Boolean>(connectivityManager.isNetworkAvailable) {
private val connectivityManager = context.connectivityManager
private val callback = NetworkCallbackImpl()
override val initialValue: Boolean
get() = connectivityManager.isNetworkAvailable
override fun onActive() {
invalidate()
val request = NetworkRequest.Builder().build()
connectivityManager.registerNetworkCallback(request, callback)
}
@@ -39,16 +31,16 @@ class NetworkState @Inject constructor(
first { it }
}
private fun invalidate() {
publishValue(connectivityManager.isNetworkAvailable)
}
private inner class NetworkCallbackImpl : NetworkCallback() {
override fun onAvailable(network: Network) = update()
override fun onAvailable(network: Network) = invalidate()
override fun onLost(network: Network) = update()
override fun onLost(network: Network) = invalidate()
override fun onUnavailable() = update()
private fun update() {
publishValue(connectivityManager.isNetworkAvailable)
}
override fun onUnavailable() = invalidate()
}
}

View File

@@ -5,14 +5,11 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import java.util.concurrent.atomic.AtomicInteger
abstract class MediatorStateFlow<T> : StateFlow<T> {
abstract class MediatorStateFlow<T>(initialValue: T) : StateFlow<T> {
@Suppress("LeakingThis")
private val delegate = MutableStateFlow(initialValue)
private val collectors = AtomicInteger(0)
protected abstract val initialValue: T
final override val replayCache: List<T>
get() = delegate.replayCache