Reader background option

This commit is contained in:
Koitharu
2023-07-14 14:33:55 +03:00
parent 44a2b6db11
commit eec750789d
11 changed files with 82 additions and 18 deletions

View File

@@ -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"

View File

@@ -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()
}
}

View File

@@ -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(

View File

@@ -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()
}
}

View File

@@ -13,7 +13,7 @@ import org.koitharu.kotatsu.reader.ui.config.ReaderSettings
abstract class BasePageHolder<B : ViewBinding>(
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<B : ViewBinding>(
var boundData: ReaderPage? = null
private set
override fun onConfigChanged() {
settings.applyBackground(itemView)
}
fun requireData(): ReaderPage {
return checkNotNull(boundData) { "Calling requireData() before bind()" }
}

View File

@@ -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()
}
}

View File

@@ -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<ListPreference>(AppSettings.KEY_READER_MODE)?.run {
entryValues = arrayOf(
ReaderMode.STANDARD,
ReaderMode.REVERSED,
ReaderMode.WEBTOON,
).names()
entryValues = ReaderMode.values().names()
setDefaultValueCompat(ReaderMode.STANDARD.name)
}
findPreference<ListPreference>(AppSettings.KEY_READER_BACKGROUND)?.run {
entryValues = ReaderBackground.values().names()
setDefaultValueCompat(ReaderBackground.DEFAULT.name)
}
findPreference<MultiSelectListPreference>(AppSettings.KEY_READER_SWITCHERS)?.run {
summaryProvider = MultiSummaryProvider(R.string.gestures_only)
}
findPreference<ListPreference>(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()

View File

@@ -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">
<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
android:id="@+id/ssiv"

View File

@@ -58,4 +58,11 @@
<item>HTTP</item>
<item>SOCKS (v4/v5)</item>
</string-array>
<string-array name="reader_backgrounds">
<item>@string/system_default</item>
<item>@string/color_light</item>
<item>@string/color_dark</item>
<item>@string/color_white</item>
<item>@string/color_black</item>
</string-array>
</resources>

View File

@@ -453,4 +453,9 @@
<string name="this_month">This month</string>
<string name="voice_search">Voice search</string>
<string name="related_manga">Related manga</string>
<string name="color_light">Light</string>
<string name="color_dark">Dark</string>
<string name="color_white">White</string>
<string name="color_black">Black</string>
<string name="background">Background</string>
</resources>

View File

@@ -60,6 +60,12 @@
android:key="reader_slider"
android:title="@string/reader_slider" />
<ListPreference
android:entries="@array/reader_backgrounds"
android:key="reader_background"
android:title="@string/background"
app:useSimpleSummaryProvider="true" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="pages_numbers"