Fix network state observer
This commit is contained in:
@@ -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() {
|
||||||
|
|
||||||
override fun onAvailable(network: Network) = update()
|
|
||||||
|
|
||||||
override fun onLost(network: Network) = update()
|
|
||||||
|
|
||||||
override fun onUnavailable() = update()
|
|
||||||
|
|
||||||
private fun update() {
|
|
||||||
publishValue(connectivityManager.isNetworkAvailable)
|
publishValue(connectivityManager.isNetworkAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private inner class NetworkCallbackImpl : NetworkCallback() {
|
||||||
|
|
||||||
|
override fun onAvailable(network: Network) = invalidate()
|
||||||
|
|
||||||
|
override fun onLost(network: Network) = invalidate()
|
||||||
|
|
||||||
|
override fun onUnavailable() = invalidate()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user