Reader background option
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
@@ -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(
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()" }
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user