Fix network state observer

pull/280/head v4.0.5
Koitharu 3 years ago
parent f469369b14
commit 1cbfe017ea
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

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

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

@ -5,14 +5,11 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import java.util.concurrent.atomic.AtomicInteger 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 delegate = MutableStateFlow(initialValue)
private val collectors = AtomicInteger(0) private val collectors = AtomicInteger(0)
protected abstract val initialValue: T
final override val replayCache: List<T> final override val replayCache: List<T>
get() = delegate.replayCache get() = delegate.replayCache

Loading…
Cancel
Save