Use 1.x preference abstraction (#8020)

* Use 1.x preference abstraction

- Uses SharedPreferences compared to 1.x impl which uses DataStore but it breaks all settings screens currently
- Move PreferencesHelper to new PreferenceStore
  - PreferencesHelper should be split into smaller preference stores and be in core or domain
- Remove flow preferences as new PreferenceStore handles changes for us

Co-authored-by: inorichi <3521738+inorichi@users.noreply.github.com>

* Fix PreferenceMutableState not updating

* Fix changes not emitting on first subscription

Co-authored-by: inorichi <3521738+inorichi@users.noreply.github.com>
This commit is contained in:
Andreas
2022-09-17 17:48:24 +02:00
committed by GitHub
parent bc8c45832e
commit 0086743a53
64 changed files with 698 additions and 340 deletions
@@ -194,7 +194,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
initializeMenu()
// Finish when incognito mode is disabled
preferences.incognitoMode().asFlow()
preferences.incognitoMode().changes()
.drop(1)
.onEach { if (!it) finish() }
.launchIn(lifecycleScope)
@@ -446,7 +446,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
presenter.setMangaReadingMode(newReadingMode.flagValue)
menuToggleToast?.cancel()
if (!preferences.showReadingMode()) {
if (!preferences.showReadingMode().get()) {
menuToggleToast = toast(newReadingMode.stringRes)
}
@@ -480,7 +480,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
updateCropBordersShortcut()
listOf(preferences.cropBorders(), preferences.cropBordersWebtoon())
.forEach { pref ->
pref.asFlow()
pref.changes()
.onEach { updateCropBordersShortcut() }
.launchIn(lifecycleScope)
}
@@ -493,7 +493,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
popupMenu(
items = OrientationType.values().map { it.flagValue to it.stringRes },
selectedItemId = presenter.manga?.orientationType
?: preferences.defaultOrientationType(),
?: preferences.defaultOrientationType().get(),
) {
val newOrientation = OrientationType.fromPreference(itemId)
@@ -635,7 +635,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
updateViewerInset(preferences.fullscreen().get())
binding.viewerContainer.addView(newViewer.getView())
if (preferences.showReadingMode()) {
if (preferences.showReadingMode().get()) {
showReadingModeToast(presenter.getMangaReadingMode())
}
@@ -949,7 +949,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
* Initializes the reader subscriptions.
*/
init {
preferences.readerTheme().asFlow()
preferences.readerTheme().changes()
.onEach {
binding.readerContainer.setBackgroundResource(
when (preferences.readerTheme().get()) {
@@ -962,41 +962,41 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
}
.launchIn(lifecycleScope)
preferences.showPageNumber().asFlow()
preferences.showPageNumber().changes()
.onEach { setPageNumberVisibility(it) }
.launchIn(lifecycleScope)
preferences.trueColor().asFlow()
preferences.trueColor().changes()
.onEach { setTrueColor(it) }
.launchIn(lifecycleScope)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
preferences.cutoutShort().asFlow()
preferences.cutoutShort().changes()
.onEach { setCutoutShort(it) }
.launchIn(lifecycleScope)
}
preferences.keepScreenOn().asFlow()
preferences.keepScreenOn().changes()
.onEach { setKeepScreenOn(it) }
.launchIn(lifecycleScope)
preferences.customBrightness().asFlow()
preferences.customBrightness().changes()
.onEach { setCustomBrightness(it) }
.launchIn(lifecycleScope)
preferences.colorFilter().asFlow()
preferences.colorFilter().changes()
.onEach { setColorFilter(it) }
.launchIn(lifecycleScope)
preferences.colorFilterMode().asFlow()
preferences.colorFilterMode().changes()
.onEach { setColorFilter(preferences.colorFilter().get()) }
.launchIn(lifecycleScope)
merge(preferences.grayscale().asFlow(), preferences.invertedColors().asFlow())
merge(preferences.grayscale().changes(), preferences.invertedColors().changes())
.onEach { setLayerPaint(preferences.grayscale().get(), preferences.invertedColors().get()) }
.launchIn(lifecycleScope)
preferences.fullscreen().asFlow()
preferences.fullscreen().changes()
.onEach {
WindowCompat.setDecorFitsSystemWindows(window, !it)
updateViewerInset(it)
@@ -1060,7 +1060,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
*/
private fun setCustomBrightness(enabled: Boolean) {
if (enabled) {
preferences.customBrightnessValue().asFlow()
preferences.customBrightnessValue().changes()
.sample(100)
.onEach { setCustomBrightnessValue(it) }
.launchIn(lifecycleScope)
@@ -1074,7 +1074,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
*/
private fun setColorFilter(enabled: Boolean) {
if (enabled) {
preferences.colorFilterValue().asFlow()
preferences.colorFilterValue().changes()
.sample(100)
.onEach { setColorFilterValue(it) }
.launchIn(lifecycleScope)
@@ -140,11 +140,11 @@ class ReaderPresenter(
?: error("Requested chapter of id $chapterId not found in chapter list")
val chaptersForReader = when {
(preferences.skipRead() || preferences.skipFiltered()) -> {
(preferences.skipRead().get() || preferences.skipFiltered().get()) -> {
val filteredChapters = chapters.filterNot {
when {
preferences.skipRead() && it.read -> true
preferences.skipFiltered() -> {
preferences.skipRead().get() && it.read -> true
preferences.skipFiltered().get() -> {
(manga.readFilter == DomainManga.CHAPTER_SHOW_READ.toInt() && !it.read) ||
(manga.readFilter == DomainManga.CHAPTER_SHOW_UNREAD.toInt() && it.read) ||
(manga.downloadedFilter == DomainManga.CHAPTER_SHOW_DOWNLOADED.toInt() && !downloadManager.isChapterDownloaded(it.name, it.scanlator, manga.title, manga.source)) ||
@@ -502,7 +502,7 @@ class ReaderPresenter(
private fun deleteChapterIfNeeded(currentChapter: ReaderChapter) {
// Determine which chapter should be deleted and enqueue
val currentChapterPosition = chapterList.indexOf(currentChapter)
val removeAfterReadSlots = preferences.removeAfterReadSlots()
val removeAfterReadSlots = preferences.removeAfterReadSlots().get()
val chapterToDelete = chapterList.getOrNull(currentChapterPosition - removeAfterReadSlots)
if (removeAfterReadSlots != 0 && chapterDownload != null) {
@@ -619,7 +619,7 @@ class ReaderPresenter(
* Returns the viewer position used by this manga or the default one.
*/
fun getMangaReadingMode(resolveDefault: Boolean = true): Int {
val default = preferences.defaultReadingMode()
val default = preferences.defaultReadingMode().get()
val readingMode = ReadingModeType.fromPreference(manga?.readingModeType)
return when {
resolveDefault && readingMode == ReadingModeType.DEFAULT -> default
@@ -656,7 +656,7 @@ class ReaderPresenter(
* Returns the orientation type used by this manga or the default one.
*/
fun getMangaOrientationType(resolveDefault: Boolean = true): Int {
val default = preferences.defaultOrientationType()
val default = preferences.defaultOrientationType().get()
val orientation = OrientationType.fromPreference(manga?.orientationType)
return when {
resolveDefault && orientation == OrientationType.DEFAULT -> default
@@ -714,7 +714,7 @@ class ReaderPresenter(
val filename = generateFilename(manga, page)
// Pictures directory.
val relativePath = if (preferences.folderPerManga()) DiskUtil.buildValidFilename(manga.title) else ""
val relativePath = if (preferences.folderPerManga().get()) DiskUtil.buildValidFilename(manga.title) else ""
// Copy file in background.
try {
@@ -818,7 +818,7 @@ class ReaderPresenter(
* will run in a background thread and errors are ignored.
*/
private fun updateTrackChapterRead(readerChapter: ReaderChapter) {
if (!preferences.autoUpdateTrack()) return
if (!preferences.autoUpdateTrack().get()) return
val manga = manga ?: return
val chapterRead = readerChapter.chapter.chapter_number.toDouble()
@@ -32,15 +32,15 @@ class ReaderColorFilterSettings @JvmOverloads constructor(context: Context, attr
init {
addView(binding.root)
preferences.colorFilter().asFlow()
preferences.colorFilter().changes()
.onEach { setColorFilter(it) }
.launchIn((context as ReaderActivity).lifecycleScope)
preferences.colorFilterMode().asFlow()
preferences.colorFilterMode().changes()
.onEach { setColorFilter(preferences.colorFilter().get()) }
.launchIn(context.lifecycleScope)
preferences.customBrightness().asFlow()
preferences.customBrightness().changes()
.onEach { setCustomBrightness(it) }
.launchIn(context.lifecycleScope)
@@ -139,7 +139,7 @@ class ReaderColorFilterSettings @JvmOverloads constructor(context: Context, attr
*/
private fun setCustomBrightness(enabled: Boolean) {
if (enabled) {
preferences.customBrightnessValue().asFlow()
preferences.customBrightnessValue().changes()
.sample(100)
.onEach { setCustomBrightnessValue(it) }
.launchIn((context as ReaderActivity).lifecycleScope)
@@ -167,7 +167,7 @@ class ReaderColorFilterSettings @JvmOverloads constructor(context: Context, attr
*/
private fun setColorFilter(enabled: Boolean) {
if (enabled) {
preferences.colorFilterValue().asFlow()
preferences.colorFilterValue().changes()
.sample(100)
.onEach { setColorFilterValue(it) }
.launchIn((context as ReaderActivity).lifecycleScope)
@@ -1,6 +1,6 @@
package eu.kanade.tachiyomi.ui.reader.viewer
import com.fredporciuncula.flow.preferences.Preference
import eu.kanade.tachiyomi.core.preference.Preference
import eu.kanade.tachiyomi.data.preference.PreferenceValues.TappingInvertMode
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import kotlinx.coroutines.CoroutineScope
@@ -80,7 +80,7 @@ abstract class ViewerConfig(preferences: PreferencesHelper, private val scope: C
valueAssignment: (T) -> Unit,
onChanged: (T) -> Unit = {},
) {
asFlow()
changes()
.onEach { valueAssignment(it) }
.distinctUntilChanged()
.onEach { onChanged(it) }
@@ -78,7 +78,7 @@ class PagerConfig(
preferences.pagerNavInverted()
.register({ tappingInverted = it }, { navigator.invertMode = it })
preferences.pagerNavInverted().asFlow()
preferences.pagerNavInverted().changes()
.drop(1)
.onEach { navigationModeChangedListener?.invoke() }
.launchIn(scope)
@@ -51,7 +51,7 @@ class WebtoonConfig(
preferences.webtoonNavInverted()
.register({ tappingInverted = it }, { navigator.invertMode = it })
preferences.webtoonNavInverted().asFlow()
preferences.webtoonNavInverted().changes()
.drop(1)
.onEach { navigationModeChangedListener?.invoke() }
.launchIn(scope)
@@ -71,7 +71,7 @@ class WebtoonConfig(
},
)
preferences.readerTheme().asFlow()
preferences.readerTheme().changes()
.drop(1)
.distinctUntilChanged()
.onEach { themeChangedListener?.invoke() }