From eec750789db51d778a7273b22eed9094567b796a Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 14 Jul 2023 14:33:55 +0300 Subject: [PATCH] Reader background option --- .../kotatsu/core/prefs/AppSettings.kt | 4 +++ .../kotatsu/core/prefs/ReaderBackground.kt | 25 +++++++++++++++++++ .../koitharu/kotatsu/main/ui/MainViewModel.kt | 4 +-- .../reader/ui/config/ReaderSettings.kt | 13 +++++++++- .../kotatsu/reader/ui/pager/BasePageHolder.kt | 6 ++++- .../reader/ui/pager/PageHolderDelegate.kt | 9 ++++++- .../settings/ReaderSettingsFragment.kt | 18 ++++++------- app/src/main/res/layout/item_page.xml | 3 +-- app/src/main/res/values/arrays.xml | 7 ++++++ app/src/main/res/values/strings.xml | 5 ++++ app/src/main/res/xml/pref_reader.xml | 6 +++++ 11 files changed, 82 insertions(+), 18 deletions(-) create mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/ReaderBackground.kt diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt index ff07b0b5d..a074240a9 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -130,6 +130,9 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { val readerAnimation: Boolean get() = prefs.getBoolean(KEY_READER_ANIMATION, false) + val readerBackground: ReaderBackground + get() = prefs.getEnumValue(KEY_READER_BACKGROUND, ReaderBackground.DEFAULT) + val defaultReaderMode: ReaderMode get() = prefs.getEnumValue(KEY_READER_MODE, ReaderMode.STANDARD) @@ -454,6 +457,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { const val KEY_SYNC_SETTINGS = "sync_settings" const val KEY_READER_BAR = "reader_bar" const val KEY_READER_SLIDER = "reader_slider" + const val KEY_READER_BACKGROUND = "reader_background" const val KEY_SHORTCUTS = "dynamic_shortcuts" const val KEY_READER_TAPS_LTR = "reader_taps_ltr" const val KEY_LOCAL_LIST_ORDER = "local_order" diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/ReaderBackground.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/ReaderBackground.kt new file mode 100644 index 000000000..5422b0322 --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/ReaderBackground.kt @@ -0,0 +1,25 @@ +package org.koitharu.kotatsu.core.prefs + +import android.content.Context +import android.view.ContextThemeWrapper +import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.toDrawable +import org.koitharu.kotatsu.core.util.ext.getThemeDrawable +import com.google.android.material.R as materialR + +enum class ReaderBackground { + + DEFAULT, LIGHT, DARK, WHITE, BLACK; + + fun resolve(context: Context) = when (this) { + DEFAULT -> context.getThemeDrawable(android.R.attr.windowBackground) + LIGHT -> ContextThemeWrapper(context, materialR.style.ThemeOverlay_Material3_Light) + .getThemeDrawable(android.R.attr.windowBackground) + + DARK -> ContextThemeWrapper(context, materialR.style.ThemeOverlay_Material3_Dark) + .getThemeDrawable(android.R.attr.windowBackground) + + WHITE -> ContextCompat.getColor(context, android.R.color.white).toDrawable() + BLACK -> ContextCompat.getColor(context, android.R.color.black).toDrawable() + } +} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainViewModel.kt index df3904911..6473bbc96 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainViewModel.kt @@ -51,10 +51,10 @@ class MainViewModel @Inject constructor( val counters = combine( trackingRepository.observeUpdatedMangaCount(), - flow { emit(settings.newSources) }, + flow { emit(settings.newSources.size) }, ) { tracks, newSources -> val a = SparseIntArray(2) - a[R.id.nav_explore] = newSources.size + a[R.id.nav_explore] = newSources a[R.id.nav_feed] = tracks a }.stateIn( diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/config/ReaderSettings.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/config/ReaderSettings.kt index c1b5f5f4b..4c404680d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/config/ReaderSettings.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/config/ReaderSettings.kt @@ -1,6 +1,7 @@ package org.koitharu.kotatsu.reader.ui.config import android.content.SharedPreferences +import android.view.View import androidx.lifecycle.MediatorLiveData import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -31,6 +32,11 @@ class ReaderSettings( val isPagesNumbersEnabled: Boolean get() = settings.isPagesNumbersEnabled + fun applyBackground(view: View) { + val bg = settings.readerBackground + view.background = bg.resolve(view.context) + } + override fun onInactive() { super.onInactive() settings.unsubscribe(internalObserver) @@ -64,7 +70,12 @@ class ReaderSettings( } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { - if (key == AppSettings.KEY_ZOOM_MODE || key == AppSettings.KEY_PAGES_NUMBERS || key == AppSettings.KEY_WEBTOON_ZOOM) { + if ( + key == AppSettings.KEY_ZOOM_MODE || + key == AppSettings.KEY_PAGES_NUMBERS || + key == AppSettings.KEY_WEBTOON_ZOOM || + key == AppSettings.KEY_READER_BACKGROUND + ) { notifyChanged() } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt index a5f032ff6..b4b94ffb7 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/BasePageHolder.kt @@ -13,7 +13,7 @@ import org.koitharu.kotatsu.reader.ui.config.ReaderSettings abstract class BasePageHolder( protected val binding: B, loader: PageLoader, - settings: ReaderSettings, + private val settings: ReaderSettings, networkState: NetworkState, exceptionResolver: ExceptionResolver, ) : RecyclerView.ViewHolder(binding.root), PageHolderDelegate.Callback { @@ -28,6 +28,10 @@ abstract class BasePageHolder( var boundData: ReaderPage? = null private set + override fun onConfigChanged() { + settings.applyBackground(itemView) + } + fun requireData(): ReaderPage { return checkNotNull(boundData) { "Calling requireData() before bind()" } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt index 617e79839..1935d104a 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/PageHolderDelegate.kt @@ -18,10 +18,10 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.plus import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver import org.koitharu.kotatsu.core.os.NetworkState +import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.ui.config.ReaderSettings -import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug import java.io.File import java.io.IOException @@ -39,6 +39,10 @@ class PageHolderDelegate( private var file: File? = null private var error: Throwable? = null + init { + callback.onConfigChanged() + } + fun onBind(page: MangaPage) { val prevJob = job job = scope.launch { @@ -107,6 +111,7 @@ class PageHolderDelegate( if (state == State.SHOWN) { callback.onImageShowing(readerSettings) } + callback.onConfigChanged() } private fun tryConvert(file: File, e: Exception) { @@ -178,5 +183,7 @@ class PageHolderDelegate( fun onImageShown() fun onProgressChanged(progress: Int) + + fun onConfigChanged() } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt index 672073926..8c2b792ac 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt @@ -10,6 +10,7 @@ import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.ZoomMode import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.prefs.ReaderBackground import org.koitharu.kotatsu.core.prefs.ReaderMode import org.koitharu.kotatsu.core.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.util.ext.setDefaultValueCompat @@ -24,23 +25,18 @@ class ReaderSettingsFragment : override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.pref_reader) findPreference(AppSettings.KEY_READER_MODE)?.run { - entryValues = arrayOf( - ReaderMode.STANDARD, - ReaderMode.REVERSED, - ReaderMode.WEBTOON, - ).names() + entryValues = ReaderMode.values().names() setDefaultValueCompat(ReaderMode.STANDARD.name) } + findPreference(AppSettings.KEY_READER_BACKGROUND)?.run { + entryValues = ReaderBackground.values().names() + setDefaultValueCompat(ReaderBackground.DEFAULT.name) + } findPreference(AppSettings.KEY_READER_SWITCHERS)?.run { summaryProvider = MultiSummaryProvider(R.string.gestures_only) } findPreference(AppSettings.KEY_ZOOM_MODE)?.run { - entryValues = arrayOf( - ZoomMode.FIT_CENTER, - ZoomMode.FIT_HEIGHT, - ZoomMode.FIT_WIDTH, - ZoomMode.KEEP_START, - ).names() + entryValues = ZoomMode.values().names() setDefaultValueCompat(ZoomMode.FIT_CENTER.name) } updateReaderModeDependency() diff --git a/app/src/main/res/layout/item_page.xml b/app/src/main/res/layout/item_page.xml index 3634cf169..6100fb225 100644 --- a/app/src/main/res/layout/item_page.xml +++ b/app/src/main/res/layout/item_page.xml @@ -4,8 +4,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="?android:windowBackground"> + android:layout_height="match_parent"> HTTP SOCKS (v4/v5) + + @string/system_default + @string/color_light + @string/color_dark + @string/color_white + @string/color_black + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d101efb28..e1f2e9f5f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -453,4 +453,9 @@ This month Voice search Related manga + Light + Dark + White + Black + Background diff --git a/app/src/main/res/xml/pref_reader.xml b/app/src/main/res/xml/pref_reader.xml index a078e2928..9cb6dc6c4 100644 --- a/app/src/main/res/xml/pref_reader.xml +++ b/app/src/main/res/xml/pref_reader.xml @@ -60,6 +60,12 @@ android:key="reader_slider" android:title="@string/reader_slider" /> + +