diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 3be2f59ae..0db1ae441 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -14,3 +14,4 @@ -keep class org.koitharu.kotatsu.core.exceptions.* { *; } -keep class org.koitharu.kotatsu.settings.NotificationSettingsLegacyFragment +-keep class org.koitharu.kotatsu.core.prefs.ScreenshotsPolicy { *; } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 48929d3ad..86e2aa20d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -2,7 +2,6 @@ package org.koitharu.kotatsu.core.prefs import android.content.Context import android.content.SharedPreferences -import android.net.ConnectivityManager import android.net.Uri import android.provider.Settings import androidx.appcompat.app.AppCompatDelegate @@ -17,6 +16,7 @@ import org.koitharu.kotatsu.core.network.DoHProvider import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.shelf.domain.ShelfSection +import org.koitharu.kotatsu.utils.ext.connectivityManager import org.koitharu.kotatsu.utils.ext.getEnumValue import org.koitharu.kotatsu.utils.ext.observe import org.koitharu.kotatsu.utils.ext.putEnumValue @@ -34,6 +34,7 @@ import javax.inject.Singleton class AppSettings @Inject constructor(@ApplicationContext context: Context) { private val prefs = PreferenceManager.getDefaultSharedPreferences(context) + private val connectivityManager = context.connectivityManager private val remoteSources = EnumSet.allOf(MangaSource::class.java).apply { remove(MangaSource.LOCAL) @@ -156,6 +157,11 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { val isDynamicShortcutsEnabled: Boolean get() = prefs.getBoolean(KEY_SHORTCUTS, true) + fun isContentPrefetchEnabled(): Boolean { + val policy = NetworkPolicy.from(prefs.getString(KEY_PREFETCH_CONTENT, null), NetworkPolicy.NEVER) + return policy.isNetworkAllowed(connectivityManager) + } + var sourcesOrder: List get() = prefs.getString(KEY_SOURCES_ORDER, null) ?.split('|') @@ -234,12 +240,9 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { val isWebtoonZoomEnable: Boolean get() = prefs.getBoolean(KEY_WEBTOON_ZOOM, true) - fun isPagesPreloadAllowed(cm: ConnectivityManager): Boolean { - return when (prefs.getString(KEY_PAGES_PRELOAD, null)?.toIntOrNull()) { - NETWORK_ALWAYS -> true - NETWORK_NEVER -> false - else -> cm.isActiveNetworkMetered - } + fun isPagesPreloadEnabled(): Boolean { + val policy = NetworkPolicy.from(prefs.getString(KEY_PAGES_PRELOAD, null), NetworkPolicy.NON_METERED) + return policy.isNetworkAllowed(connectivityManager) } fun getDateFormat(format: String = prefs.getString(KEY_DATE_FORMAT, "").orEmpty()): DateFormat = @@ -293,7 +296,6 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { const val TRACK_FAVOURITES = "favourites" const val KEY_LIST_MODE = "list_mode_2" - const val KEY_APP_SECTION = "app_section_2" const val KEY_THEME = "theme" const val KEY_DYNAMIC_THEME = "dynamic_theme" const val KEY_THEME_AMOLED = "amoled_theme" @@ -355,13 +357,10 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { const val KEY_LOCAL_LIST_ORDER = "local_order" const val KEY_WEBTOON_ZOOM = "webtoon_zoom" const val KEY_SHELF_SECTIONS = "shelf_sections_2" + const val KEY_PREFETCH_CONTENT = "prefetch_content" // About const val KEY_APP_UPDATE = "app_update" const val KEY_APP_TRANSLATION = "about_app_translation" - - private const val NETWORK_NEVER = 0 - private const val NETWORK_ALWAYS = 1 - private const val NETWORK_NON_METERED = 2 } } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/NetworkPolicy.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/NetworkPolicy.kt new file mode 100644 index 000000000..8be2cf0c7 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/NetworkPolicy.kt @@ -0,0 +1,26 @@ +package org.koitharu.kotatsu.core.prefs + +import android.net.ConnectivityManager + +enum class NetworkPolicy( + private val key: Int, +) { + + NEVER(0), + ALWAYS(1), + NON_METERED(2); + + fun isNetworkAllowed(cm: ConnectivityManager) = when (this) { + NEVER -> false + ALWAYS -> true + NON_METERED -> !cm.isActiveNetworkMetered + } + + companion object { + + fun from(key: String?, default: NetworkPolicy): NetworkPolicy { + val intKey = key?.toIntOrNull() ?: return default + return enumValues().find { it.key == intKey } ?: default + } + } +} diff --git a/app/src/main/java/org/koitharu/kotatsu/details/service/MangaPrefetchService.kt b/app/src/main/java/org/koitharu/kotatsu/details/service/MangaPrefetchService.kt index a579c5d96..225d1042c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/service/MangaPrefetchService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/service/MangaPrefetchService.kt @@ -90,7 +90,7 @@ class MangaPrefetchService : CoroutineIntentService() { if (entryPoint.contentCache is StubContentCache) { return false } - return true + return entryPoint.settings.isContentPrefetchEnabled() } } } diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt b/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt index 0dd6af652..0ac53f720 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/domain/PageLoader.kt @@ -1,12 +1,10 @@ package org.koitharu.kotatsu.reader.domain -import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri import androidx.collection.LongSparseArray import androidx.collection.set -import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope @@ -31,7 +29,6 @@ import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.await import org.koitharu.kotatsu.reader.ui.pager.ReaderPage -import org.koitharu.kotatsu.utils.ext.connectivityManager import org.koitharu.kotatsu.utils.ext.printStackTraceDebug import org.koitharu.kotatsu.utils.ext.withProgress import org.koitharu.kotatsu.utils.progress.ProgressDeferred @@ -50,13 +47,11 @@ class PageLoader @Inject constructor( private val okHttp: OkHttpClient, private val cache: PagesCache, private val settings: AppSettings, - @ApplicationContext context: Context, private val mangaRepositoryFactory: MangaRepository.Factory, ) : Closeable { val loaderScope = CoroutineScope(SupervisorJob() + InternalErrorHandler() + Dispatchers.Default) - private val connectivityManager = context.connectivityManager private val tasks = LongSparseArray>() private val convertLock = Mutex() private var repository: MangaRepository? = null @@ -73,7 +68,7 @@ class PageLoader @Inject constructor( } fun isPrefetchApplicable(): Boolean { - return repository is RemoteMangaRepository && settings.isPagesPreloadAllowed(connectivityManager) + return repository is RemoteMangaRepository && settings.isPagesPreloadEnabled() } fun prefetch(pages: List) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 10218f426..3d0c42d0b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -399,4 +399,5 @@ Also clear information about new chapters Compact Source disabled + Content preloading diff --git a/app/src/main/res/xml/pref_content.xml b/app/src/main/res/xml/pref_content.xml index 3866595dd..e060edc5d 100644 --- a/app/src/main/res/xml/pref_content.xml +++ b/app/src/main/res/xml/pref_content.xml @@ -19,6 +19,14 @@ android:title="@string/dns_over_https" app:useSimpleSummaryProvider="true" /> + + - \ No newline at end of file + diff --git a/app/src/main/res/xml/pref_reader.xml b/app/src/main/res/xml/pref_reader.xml index eedcddc3e..525a46202 100644 --- a/app/src/main/res/xml/pref_reader.xml +++ b/app/src/main/res/xml/pref_reader.xml @@ -61,20 +61,19 @@ android:title="@string/show_pages_numbers" />