diff --git a/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt index 459ac9e8b..b5cf78270 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt @@ -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( diff --git a/app/src/main/java/org/koitharu/kotatsu/core/os/NetworkState.kt b/app/src/main/java/org/koitharu/kotatsu/core/os/NetworkState.kt index 49d1704d6..207886065 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/os/NetworkState.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/os/NetworkState.kt @@ -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() { +class NetworkState( + private val connectivityManager: ConnectivityManager, +) : MediatorStateFlow(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() } } diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/MediatorStateFlow.kt b/app/src/main/java/org/koitharu/kotatsu/utils/MediatorStateFlow.kt index 618d098b0..01c637b38 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/MediatorStateFlow.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/MediatorStateFlow.kt @@ -5,14 +5,11 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import java.util.concurrent.atomic.AtomicInteger -abstract class MediatorStateFlow : StateFlow { +abstract class MediatorStateFlow(initialValue: T) : StateFlow { - @Suppress("LeakingThis") private val delegate = MutableStateFlow(initialValue) private val collectors = AtomicInteger(0) - protected abstract val initialValue: T - final override val replayCache: List get() = delegate.replayCache