mirror of
https://github.com/mihonapp/mihon.git
synced 2025-11-15 05:27:28 +01:00
Add manga-wised rotation mode settings (#4841)
* Add manga-wised rotation mode settings Based on #3522 Co-authored-by: bboyz269 <4453811+bboyz269@users.noreply.github.com> * Fix small mistakes * Complete TODOs * Rename functions rotation -> orientation * Fix orientation icon not changing Bug from video * Fix bug with force portrait not being force if a default value Bug from video * Backup viewer_flag as a seperate field in so legacy/forks doesn't crash * Make viewer_flags nullable so old backups viewer gets restored * Add migration for old rotation and viewer to new defaults ones * Rename variable in enums * Fix migration after OrientationType was changed * Remove untrue comment Co-authored-by: bboyz269 <4453811+bboyz269@users.noreply.github.com>
This commit is contained in:
@@ -149,9 +149,9 @@ class SearchPresenter(
|
||||
|
||||
// Update reading preferences
|
||||
manga.chapter_flags = prevManga.chapter_flags
|
||||
db.updateFlags(manga).executeAsBlocking()
|
||||
manga.viewer = prevManga.viewer
|
||||
db.updateMangaViewer(manga).executeAsBlocking()
|
||||
db.updateChapterFlags(manga).executeAsBlocking()
|
||||
manga.viewer_flags = prevManga.viewer_flags
|
||||
db.updateViewerFlags(manga).executeAsBlocking()
|
||||
|
||||
// Update date added
|
||||
if (replace) {
|
||||
|
||||
@@ -436,15 +436,15 @@ class MangaPresenter(
|
||||
|
||||
fun getChapterSort(): (Chapter, Chapter) -> Int {
|
||||
return when (manga.sorting) {
|
||||
Manga.SORTING_SOURCE -> when (sortDescending()) {
|
||||
Manga.CHAPTER_SORTING_SOURCE -> when (sortDescending()) {
|
||||
true -> { c1, c2 -> c1.source_order.compareTo(c2.source_order) }
|
||||
false -> { c1, c2 -> c2.source_order.compareTo(c1.source_order) }
|
||||
}
|
||||
Manga.SORTING_NUMBER -> when (sortDescending()) {
|
||||
Manga.CHAPTER_SORTING_NUMBER -> when (sortDescending()) {
|
||||
true -> { c1, c2 -> c2.chapter_number.compareTo(c1.chapter_number) }
|
||||
false -> { c1, c2 -> c1.chapter_number.compareTo(c2.chapter_number) }
|
||||
}
|
||||
Manga.SORTING_UPLOAD_DATE -> when (sortDescending()) {
|
||||
Manga.CHAPTER_SORTING_UPLOAD_DATE -> when (sortDescending()) {
|
||||
true -> { c1, c2 -> c2.date_upload.compareTo(c1.date_upload) }
|
||||
false -> { c1, c2 -> c1.date_upload.compareTo(c2.date_upload) }
|
||||
}
|
||||
@@ -564,8 +564,8 @@ class MangaPresenter(
|
||||
* Reverses the sorting and requests an UI update.
|
||||
*/
|
||||
fun reverseSortOrder() {
|
||||
manga.setChapterOrder(if (sortDescending()) Manga.SORT_ASC else Manga.SORT_DESC)
|
||||
db.updateFlags(manga).executeAsBlocking()
|
||||
manga.setChapterOrder(if (sortDescending()) Manga.CHAPTER_SORT_ASC else Manga.CHAPTER_SORT_DESC)
|
||||
db.updateChapterFlags(manga).executeAsBlocking()
|
||||
refreshChapters()
|
||||
}
|
||||
|
||||
@@ -576,10 +576,10 @@ class MangaPresenter(
|
||||
fun setUnreadFilter(state: State) {
|
||||
manga.readFilter = when (state) {
|
||||
State.IGNORE -> Manga.SHOW_ALL
|
||||
State.INCLUDE -> Manga.SHOW_UNREAD
|
||||
State.EXCLUDE -> Manga.SHOW_READ
|
||||
State.INCLUDE -> Manga.CHAPTER_SHOW_UNREAD
|
||||
State.EXCLUDE -> Manga.CHAPTER_SHOW_READ
|
||||
}
|
||||
db.updateFlags(manga).executeAsBlocking()
|
||||
db.updateChapterFlags(manga).executeAsBlocking()
|
||||
refreshChapters()
|
||||
}
|
||||
|
||||
@@ -590,10 +590,10 @@ class MangaPresenter(
|
||||
fun setDownloadedFilter(state: State) {
|
||||
manga.downloadedFilter = when (state) {
|
||||
State.IGNORE -> Manga.SHOW_ALL
|
||||
State.INCLUDE -> Manga.SHOW_DOWNLOADED
|
||||
State.EXCLUDE -> Manga.SHOW_NOT_DOWNLOADED
|
||||
State.INCLUDE -> Manga.CHAPTER_SHOW_DOWNLOADED
|
||||
State.EXCLUDE -> Manga.CHAPTER_SHOW_NOT_DOWNLOADED
|
||||
}
|
||||
db.updateFlags(manga).executeAsBlocking()
|
||||
db.updateChapterFlags(manga).executeAsBlocking()
|
||||
refreshChapters()
|
||||
}
|
||||
|
||||
@@ -604,10 +604,10 @@ class MangaPresenter(
|
||||
fun setBookmarkedFilter(state: State) {
|
||||
manga.bookmarkedFilter = when (state) {
|
||||
State.IGNORE -> Manga.SHOW_ALL
|
||||
State.INCLUDE -> Manga.SHOW_BOOKMARKED
|
||||
State.EXCLUDE -> Manga.SHOW_NOT_BOOKMARKED
|
||||
State.INCLUDE -> Manga.CHAPTER_SHOW_BOOKMARKED
|
||||
State.EXCLUDE -> Manga.CHAPTER_SHOW_NOT_BOOKMARKED
|
||||
}
|
||||
db.updateFlags(manga).executeAsBlocking()
|
||||
db.updateChapterFlags(manga).executeAsBlocking()
|
||||
refreshChapters()
|
||||
}
|
||||
|
||||
@@ -617,7 +617,7 @@ class MangaPresenter(
|
||||
*/
|
||||
fun setDisplayMode(mode: Int) {
|
||||
manga.displayMode = mode
|
||||
db.updateFlags(manga).executeAsBlocking()
|
||||
db.updateChapterFlags(manga).executeAsBlocking()
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -626,7 +626,7 @@ class MangaPresenter(
|
||||
*/
|
||||
fun setSorting(sort: Int) {
|
||||
manga.sorting = sort
|
||||
db.updateFlags(manga).executeAsBlocking()
|
||||
db.updateChapterFlags(manga).executeAsBlocking()
|
||||
refreshChapters()
|
||||
}
|
||||
|
||||
@@ -645,8 +645,8 @@ class MangaPresenter(
|
||||
return State.INCLUDE
|
||||
}
|
||||
return when (manga.downloadedFilter) {
|
||||
Manga.SHOW_DOWNLOADED -> State.INCLUDE
|
||||
Manga.SHOW_NOT_DOWNLOADED -> State.EXCLUDE
|
||||
Manga.CHAPTER_SHOW_DOWNLOADED -> State.INCLUDE
|
||||
Manga.CHAPTER_SHOW_NOT_DOWNLOADED -> State.EXCLUDE
|
||||
else -> State.IGNORE
|
||||
}
|
||||
}
|
||||
@@ -656,8 +656,8 @@ class MangaPresenter(
|
||||
*/
|
||||
fun onlyBookmarked(): State {
|
||||
return when (manga.bookmarkedFilter) {
|
||||
Manga.SHOW_BOOKMARKED -> State.INCLUDE
|
||||
Manga.SHOW_NOT_BOOKMARKED -> State.EXCLUDE
|
||||
Manga.CHAPTER_SHOW_BOOKMARKED -> State.INCLUDE
|
||||
Manga.CHAPTER_SHOW_NOT_BOOKMARKED -> State.EXCLUDE
|
||||
else -> State.IGNORE
|
||||
}
|
||||
}
|
||||
@@ -667,8 +667,8 @@ class MangaPresenter(
|
||||
*/
|
||||
fun onlyUnread(): State {
|
||||
return when (manga.readFilter) {
|
||||
Manga.SHOW_UNREAD -> State.INCLUDE
|
||||
Manga.SHOW_READ -> State.EXCLUDE
|
||||
Manga.CHAPTER_SHOW_UNREAD -> State.INCLUDE
|
||||
Manga.CHAPTER_SHOW_READ -> State.EXCLUDE
|
||||
else -> State.IGNORE
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ class ChapterHolder(
|
||||
val chapter = item.chapter
|
||||
|
||||
binding.chapterTitle.text = when (manga.displayMode) {
|
||||
Manga.DISPLAY_NUMBER -> {
|
||||
Manga.CHAPTER_DISPLAY_NUMBER -> {
|
||||
val number = adapter.decimalFormat.format(chapter.chapter_number.toDouble())
|
||||
itemView.context.getString(R.string.display_mode_chapter, number)
|
||||
}
|
||||
|
||||
@@ -152,11 +152,11 @@ class ChaptersSettingsSheet(
|
||||
}
|
||||
|
||||
source.state =
|
||||
if (sorting == Manga.SORTING_SOURCE) order else Item.MultiSort.SORT_NONE
|
||||
if (sorting == Manga.CHAPTER_SORTING_SOURCE) order else Item.MultiSort.SORT_NONE
|
||||
chapterNum.state =
|
||||
if (sorting == Manga.SORTING_NUMBER) order else Item.MultiSort.SORT_NONE
|
||||
if (sorting == Manga.CHAPTER_SORTING_NUMBER) order else Item.MultiSort.SORT_NONE
|
||||
uploadDate.state =
|
||||
if (sorting == Manga.SORTING_UPLOAD_DATE) order else Item.MultiSort.SORT_NONE
|
||||
if (sorting == Manga.CHAPTER_SORTING_UPLOAD_DATE) order else Item.MultiSort.SORT_NONE
|
||||
}
|
||||
|
||||
override fun onItemClicked(item: Item) {
|
||||
@@ -175,9 +175,9 @@ class ChaptersSettingsSheet(
|
||||
}
|
||||
|
||||
when (item) {
|
||||
source -> presenter.setSorting(Manga.SORTING_SOURCE)
|
||||
chapterNum -> presenter.setSorting(Manga.SORTING_NUMBER)
|
||||
uploadDate -> presenter.setSorting(Manga.SORTING_UPLOAD_DATE)
|
||||
source -> presenter.setSorting(Manga.CHAPTER_SORTING_SOURCE)
|
||||
chapterNum -> presenter.setSorting(Manga.CHAPTER_SORTING_NUMBER)
|
||||
uploadDate -> presenter.setSorting(Manga.CHAPTER_SORTING_UPLOAD_DATE)
|
||||
else -> throw Exception("Unknown sorting")
|
||||
}
|
||||
|
||||
@@ -209,8 +209,8 @@ class ChaptersSettingsSheet(
|
||||
|
||||
override fun initModels() {
|
||||
val mode = presenter.manga.displayMode
|
||||
displayTitle.checked = mode == Manga.DISPLAY_NAME
|
||||
displayChapterNum.checked = mode == Manga.DISPLAY_NUMBER
|
||||
displayTitle.checked = mode == Manga.CHAPTER_DISPLAY_NAME
|
||||
displayChapterNum.checked = mode == Manga.CHAPTER_DISPLAY_NUMBER
|
||||
}
|
||||
|
||||
override fun onItemClicked(item: Item) {
|
||||
@@ -221,8 +221,8 @@ class ChaptersSettingsSheet(
|
||||
item.checked = true
|
||||
|
||||
when (item) {
|
||||
displayTitle -> presenter.setDisplayMode(Manga.DISPLAY_NAME)
|
||||
displayChapterNum -> presenter.setDisplayMode(Manga.DISPLAY_NUMBER)
|
||||
displayTitle -> presenter.setDisplayMode(Manga.CHAPTER_DISPLAY_NAME)
|
||||
displayChapterNum -> presenter.setDisplayMode(Manga.CHAPTER_DISPLAY_NUMBER)
|
||||
else -> throw NotImplementedError("Unknown display mode")
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,6 @@ import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
|
||||
import eu.kanade.tachiyomi.data.notification.Notifications
|
||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||
import eu.kanade.tachiyomi.data.preference.asImmediateFlow
|
||||
import eu.kanade.tachiyomi.data.preference.toggle
|
||||
import eu.kanade.tachiyomi.databinding.ReaderActivityBinding
|
||||
import eu.kanade.tachiyomi.ui.base.activity.BaseRxActivity
|
||||
@@ -63,7 +62,6 @@ import eu.kanade.tachiyomi.util.view.setTooltip
|
||||
import eu.kanade.tachiyomi.util.view.showBar
|
||||
import eu.kanade.tachiyomi.widget.SimpleAnimationListener
|
||||
import eu.kanade.tachiyomi.widget.SimpleSeekBarListener
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.drop
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
@@ -358,12 +356,12 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
|
||||
setOnClickListener {
|
||||
popupMenu(
|
||||
items = ReadingModeType.values().map { it.prefValue to it.stringRes },
|
||||
selectedItemId = presenter.getMangaViewer(resolveDefault = false),
|
||||
items = ReadingModeType.values().map { it.flagValue to it.stringRes },
|
||||
selectedItemId = presenter.getMangaReadingMode(resolveDefault = false),
|
||||
) {
|
||||
val newReadingMode = ReadingModeType.fromPreference(itemId)
|
||||
|
||||
presenter.setMangaViewer(newReadingMode.prefValue)
|
||||
presenter.setMangaReadingMode(newReadingMode.flagValue)
|
||||
|
||||
menuToggleToast?.cancel()
|
||||
if (!preferences.showReadingMode()) {
|
||||
@@ -379,28 +377,28 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
|
||||
setOnClickListener {
|
||||
popupMenu(
|
||||
items = OrientationType.values().map { it.prefValue to it.stringRes },
|
||||
selectedItemId = preferences.rotation().get(),
|
||||
items = OrientationType.values().map { it.flagValue to it.stringRes },
|
||||
selectedItemId = presenter.manga?.orientationType
|
||||
?: preferences.defaultOrientationType(),
|
||||
) {
|
||||
val newOrientation = OrientationType.fromPreference(itemId)
|
||||
|
||||
preferences.rotation().set(newOrientation.prefValue)
|
||||
setOrientation(newOrientation.flag)
|
||||
presenter.setMangaOrientationType(newOrientation.flagValue)
|
||||
|
||||
updateOrientationShortcut(newOrientation.flagValue)
|
||||
|
||||
menuToggleToast?.cancel()
|
||||
menuToggleToast = toast(newOrientation.stringRes)
|
||||
}
|
||||
}
|
||||
}
|
||||
preferences.rotation().asImmediateFlow { updateRotationShortcut(it) }
|
||||
.launchIn(lifecycleScope)
|
||||
|
||||
// Crop borders
|
||||
with(binding.actionCropBorders) {
|
||||
setTooltip(R.string.pref_crop_borders)
|
||||
|
||||
setOnClickListener {
|
||||
val isPagerType = ReadingModeType.isPagerType(presenter.getMangaViewer())
|
||||
val isPagerType = ReadingModeType.isPagerType(presenter.getMangaReadingMode())
|
||||
if (isPagerType) {
|
||||
preferences.cropBorders().toggle()
|
||||
} else {
|
||||
@@ -431,13 +429,13 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateRotationShortcut(preference: Int) {
|
||||
private fun updateOrientationShortcut(preference: Int) {
|
||||
val orientation = OrientationType.fromPreference(preference)
|
||||
binding.actionRotation.setImageResource(orientation.iconRes)
|
||||
}
|
||||
|
||||
private fun updateCropBordersShortcut() {
|
||||
val isPagerType = ReadingModeType.isPagerType(presenter.getMangaViewer())
|
||||
val isPagerType = ReadingModeType.isPagerType(presenter.getMangaReadingMode())
|
||||
val enabled = if (isPagerType) {
|
||||
preferences.cropBorders().get()
|
||||
} else {
|
||||
@@ -529,10 +527,10 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
fun setManga(manga: Manga) {
|
||||
val prevViewer = viewer
|
||||
|
||||
val viewerMode = ReadingModeType.fromPreference(presenter.getMangaViewer(resolveDefault = false))
|
||||
val viewerMode = ReadingModeType.fromPreference(presenter.getMangaReadingMode(resolveDefault = false))
|
||||
binding.actionReadingMode.setImageResource(viewerMode.iconRes)
|
||||
|
||||
val newViewer = when (presenter.getMangaViewer()) {
|
||||
val newViewer = when (presenter.getMangaReadingMode()) {
|
||||
ReadingModeType.LEFT_TO_RIGHT.prefValue -> L2RPagerViewer(this)
|
||||
ReadingModeType.VERTICAL.prefValue -> VerticalPagerViewer(this)
|
||||
ReadingModeType.WEBTOON.prefValue -> WebtoonViewer(this)
|
||||
@@ -540,6 +538,8 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
else -> R2LPagerViewer(this)
|
||||
}
|
||||
|
||||
setOrientation(presenter.getMangaOrientationType())
|
||||
|
||||
// Destroy previous viewer if there was one
|
||||
if (prevViewer != null) {
|
||||
prevViewer.destroy()
|
||||
@@ -549,7 +549,7 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
binding.viewerContainer.addView(newViewer.getView())
|
||||
|
||||
if (preferences.showReadingMode()) {
|
||||
showReadingModeToast(presenter.getMangaViewer())
|
||||
showReadingModeToast(presenter.getMangaReadingMode())
|
||||
}
|
||||
|
||||
binding.toolbar.title = manga.title
|
||||
@@ -777,7 +777,7 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
/**
|
||||
* Forces the user preferred [orientation] on the activity.
|
||||
*/
|
||||
private fun setOrientation(orientation: Int) {
|
||||
fun setOrientation(orientation: Int) {
|
||||
val newOrientation = OrientationType.fromPreference(orientation)
|
||||
if (newOrientation.flag != requestedOrientation) {
|
||||
requestedOrientation = newOrientation.flag
|
||||
@@ -793,14 +793,6 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
* Initializes the reader subscriptions.
|
||||
*/
|
||||
init {
|
||||
preferences.rotation().asImmediateFlow { setOrientation(it) }
|
||||
.drop(1)
|
||||
.onEach {
|
||||
delay(250)
|
||||
setOrientation(it)
|
||||
}
|
||||
.launchIn(lifecycleScope)
|
||||
|
||||
preferences.readerTheme().asFlow()
|
||||
.drop(1) // We only care about updates
|
||||
.onEach { recreate() }
|
||||
|
||||
@@ -20,6 +20,8 @@ import eu.kanade.tachiyomi.ui.reader.loader.ChapterLoader
|
||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
|
||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
|
||||
import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
||||
import eu.kanade.tachiyomi.util.isLocal
|
||||
import eu.kanade.tachiyomi.util.lang.byteSize
|
||||
import eu.kanade.tachiyomi.util.lang.launchIO
|
||||
@@ -101,13 +103,13 @@ class ReaderPresenter(
|
||||
return@filter false
|
||||
} else if (preferences.skipFiltered()) {
|
||||
if (
|
||||
(manga.readFilter == Manga.SHOW_READ && !it.read) ||
|
||||
(manga.readFilter == Manga.SHOW_UNREAD && it.read) ||
|
||||
(manga.readFilter == Manga.CHAPTER_SHOW_READ && !it.read) ||
|
||||
(manga.readFilter == Manga.CHAPTER_SHOW_UNREAD && it.read) ||
|
||||
(
|
||||
manga.downloadedFilter == Manga.SHOW_DOWNLOADED &&
|
||||
manga.downloadedFilter == Manga.CHAPTER_SHOW_DOWNLOADED &&
|
||||
!downloadManager.isChapterDownloaded(it, manga)
|
||||
) ||
|
||||
(manga.bookmarkedFilter == Manga.SHOW_BOOKMARKED && !it.bookmark)
|
||||
(manga.bookmarkedFilter == Manga.CHAPTER_SHOW_BOOKMARKED && !it.bookmark)
|
||||
) {
|
||||
return@filter false
|
||||
}
|
||||
@@ -127,9 +129,9 @@ class ReaderPresenter(
|
||||
}
|
||||
|
||||
when (manga.sorting) {
|
||||
Manga.SORTING_SOURCE -> ChapterLoadBySource().get(chaptersForReader)
|
||||
Manga.SORTING_NUMBER -> ChapterLoadByNumber().get(chaptersForReader, selectedChapter)
|
||||
Manga.SORTING_UPLOAD_DATE -> ChapterLoadByUploadDate().get(chaptersForReader)
|
||||
Manga.CHAPTER_SORTING_SOURCE -> ChapterLoadBySource().get(chaptersForReader)
|
||||
Manga.CHAPTER_SORTING_NUMBER -> ChapterLoadByNumber().get(chaptersForReader, selectedChapter)
|
||||
Manga.CHAPTER_SORTING_UPLOAD_DATE -> ChapterLoadByUploadDate().get(chaptersForReader)
|
||||
else -> error("Unknown sorting method")
|
||||
}.map(::ReaderChapter)
|
||||
}
|
||||
@@ -489,18 +491,21 @@ class ReaderPresenter(
|
||||
/**
|
||||
* Returns the viewer position used by this manga or the default one.
|
||||
*/
|
||||
fun getMangaViewer(resolveDefault: Boolean = true): Int {
|
||||
val manga = manga ?: return preferences.defaultViewer()
|
||||
return if (resolveDefault && manga.viewer == 0) preferences.defaultViewer() else manga.viewer
|
||||
fun getMangaReadingMode(resolveDefault: Boolean = true): Int {
|
||||
val default = preferences.defaultReadingMode()
|
||||
return when {
|
||||
resolveDefault && manga?.readingModeType == ReadingModeType.DEFAULT.flagValue -> default
|
||||
else -> manga?.readingModeType ?: default
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the viewer position for the open manga.
|
||||
*/
|
||||
fun setMangaViewer(viewer: Int) {
|
||||
fun setMangaReadingMode(readingModeType: Int) {
|
||||
val manga = manga ?: return
|
||||
manga.viewer = viewer
|
||||
db.updateMangaViewer(manga).executeAsBlocking()
|
||||
manga.readingModeType = readingModeType
|
||||
db.updateViewerFlags(manga).executeAsBlocking()
|
||||
|
||||
Observable.timer(250, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
|
||||
.subscribeFirst({ view, _ ->
|
||||
@@ -517,6 +522,36 @@ class ReaderPresenter(
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the orientation type used by this manga or the default one.
|
||||
*/
|
||||
fun getMangaOrientationType(): Int {
|
||||
val default = preferences.defaultOrientationType()
|
||||
return when (manga?.orientationType) {
|
||||
OrientationType.DEFAULT.flagValue -> default
|
||||
else -> manga?.orientationType ?: default
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the orientation type for the open manga.
|
||||
*/
|
||||
fun setMangaOrientationType(rotationType: Int) {
|
||||
val manga = manga ?: return
|
||||
manga.orientationType = rotationType
|
||||
db.updateViewerFlags(manga).executeAsBlocking()
|
||||
|
||||
Timber.i("Manga orientation is ${manga.orientationType}")
|
||||
|
||||
Observable.timer(250, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
|
||||
.subscribeFirst({ view, _ ->
|
||||
val currChapters = viewerChaptersRelay.value
|
||||
if (currChapters != null) {
|
||||
view.setOrientation(getMangaOrientationType())
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the image of this [page] in the given [directory] and returns the file location.
|
||||
*/
|
||||
|
||||
@@ -5,16 +5,20 @@ import androidx.annotation.DrawableRes
|
||||
import androidx.annotation.StringRes
|
||||
import eu.kanade.tachiyomi.R
|
||||
|
||||
enum class OrientationType(val prefValue: Int, val flag: Int, @StringRes val stringRes: Int, @DrawableRes val iconRes: Int) {
|
||||
FREE(1, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, R.string.rotation_free, R.drawable.ic_screen_rotation_24dp),
|
||||
PORTRAIT(2, ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT, R.string.rotation_portrait, R.drawable.ic_stay_current_portrait_24dp),
|
||||
LANDSCAPE(3, ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE, R.string.rotation_landscape, R.drawable.ic_stay_current_landscape_24dp),
|
||||
LOCKED_PORTRAIT(4, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, R.string.rotation_force_portrait, R.drawable.ic_screen_lock_portrait_24dp),
|
||||
LOCKED_LANDSCAPE(5, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, R.string.rotation_force_landscape, R.drawable.ic_screen_lock_landscape_24dp),
|
||||
;
|
||||
enum class OrientationType(val prefValue: Int, val flag: Int, @StringRes val stringRes: Int, @DrawableRes val iconRes: Int, val flagValue: Int) {
|
||||
// TODO Default icon
|
||||
DEFAULT(0, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, R.string.default_rotation_type, R.drawable.ic_screen_rotation_24dp, 0x00000000),
|
||||
FREE(1, ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED, R.string.rotation_free, R.drawable.ic_screen_rotation_24dp, 0x00000008),
|
||||
PORTRAIT(2, ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT, R.string.rotation_portrait, R.drawable.ic_stay_current_portrait_24dp, 0x00000010),
|
||||
LANDSCAPE(3, ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE, R.string.rotation_landscape, R.drawable.ic_stay_current_landscape_24dp, 0x00000018),
|
||||
LOCKED_PORTRAIT(4, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, R.string.rotation_force_portrait, R.drawable.ic_screen_lock_portrait_24dp, 0x00000020),
|
||||
LOCKED_LANDSCAPE(5, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, R.string.rotation_force_landscape, R.drawable.ic_screen_lock_landscape_24dp, 0x00000028);
|
||||
|
||||
companion object {
|
||||
fun fromPreference(preference: Int): OrientationType =
|
||||
values().find { it.prefValue == preference } ?: FREE
|
||||
const val MASK = 0x00000038
|
||||
|
||||
fun fromPreference(preference: Int?): OrientationType = values().find { it.flagValue == preference } ?: FREE
|
||||
|
||||
fun fromSpinner(position: Int?) = values().find { value -> value.prefValue == position } ?: DEFAULT
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@ class ReaderGeneralSettings @JvmOverloads constructor(context: Context, attrs: A
|
||||
* Init general reader preferences.
|
||||
*/
|
||||
private fun initGeneralPreferences() {
|
||||
binding.rotationMode.bindToPreference(preferences.rotation(), 1)
|
||||
binding.backgroundColor.bindToIntPreference(preferences.readerTheme(), R.array.reader_themes_values)
|
||||
binding.showPageNumber.bindToPreference(preferences.showPageNumber())
|
||||
binding.fullscreen.bindToPreference(preferences.fullscreen())
|
||||
|
||||
@@ -43,16 +43,23 @@ class ReaderReadingModeSettings @JvmOverloads constructor(context: Context, attr
|
||||
*/
|
||||
private fun initGeneralPreferences() {
|
||||
binding.viewer.onItemSelectedListener = { position ->
|
||||
(context as ReaderActivity).presenter.setMangaViewer(position)
|
||||
val readingModeType = ReadingModeType.fromSpinner(position)
|
||||
(context as ReaderActivity).presenter.setMangaReadingMode(readingModeType.flagValue)
|
||||
|
||||
val mangaViewer = (context as ReaderActivity).presenter.getMangaViewer()
|
||||
if (mangaViewer == ReadingModeType.WEBTOON.prefValue || mangaViewer == ReadingModeType.CONTINUOUS_VERTICAL.prefValue) {
|
||||
val mangaViewer = (context as ReaderActivity).presenter.getMangaReadingMode()
|
||||
if (mangaViewer == ReadingModeType.WEBTOON.flagValue || mangaViewer == ReadingModeType.CONTINUOUS_VERTICAL.flagValue) {
|
||||
initWebtoonPreferences()
|
||||
} else {
|
||||
initPagerPreferences()
|
||||
}
|
||||
}
|
||||
binding.viewer.setSelection((context as ReaderActivity).presenter.manga?.viewer ?: 0)
|
||||
binding.viewer.setSelection((context as ReaderActivity).presenter.manga?.readingModeType.let { ReadingModeType.fromPreference(it).prefValue })
|
||||
|
||||
binding.rotationMode.onItemSelectedListener = { position ->
|
||||
val rotationType = OrientationType.fromSpinner(position)
|
||||
(context as ReaderActivity).presenter.setMangaOrientationType(rotationType.flagValue)
|
||||
}
|
||||
binding.rotationMode.setSelection((context as ReaderActivity).presenter.manga?.orientationType.let { OrientationType.fromPreference(it).prefValue })
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -4,21 +4,25 @@ import androidx.annotation.DrawableRes
|
||||
import androidx.annotation.StringRes
|
||||
import eu.kanade.tachiyomi.R
|
||||
|
||||
enum class ReadingModeType(val prefValue: Int, @StringRes val stringRes: Int, @DrawableRes val iconRes: Int) {
|
||||
DEFAULT(0, R.string.default_viewer, R.drawable.ic_reader_default_24dp),
|
||||
LEFT_TO_RIGHT(1, R.string.left_to_right_viewer, R.drawable.ic_reader_ltr_24dp),
|
||||
RIGHT_TO_LEFT(2, R.string.right_to_left_viewer, R.drawable.ic_reader_rtl_24dp),
|
||||
VERTICAL(3, R.string.vertical_viewer, R.drawable.ic_reader_vertical_24dp),
|
||||
WEBTOON(4, R.string.webtoon_viewer, R.drawable.ic_reader_webtoon_24dp),
|
||||
CONTINUOUS_VERTICAL(5, R.string.vertical_plus_viewer, R.drawable.ic_reader_continuous_vertical_24dp),
|
||||
enum class ReadingModeType(val prefValue: Int, @StringRes val stringRes: Int, @DrawableRes val iconRes: Int, val flagValue: Int) {
|
||||
DEFAULT(0, R.string.default_viewer, R.drawable.ic_reader_default_24dp, 0x00000000),
|
||||
LEFT_TO_RIGHT(1, R.string.left_to_right_viewer, R.drawable.ic_reader_ltr_24dp, 0x00000001),
|
||||
RIGHT_TO_LEFT(2, R.string.right_to_left_viewer, R.drawable.ic_reader_rtl_24dp, 0x00000002),
|
||||
VERTICAL(3, R.string.vertical_viewer, R.drawable.ic_reader_vertical_24dp, 0x00000003),
|
||||
WEBTOON(4, R.string.webtoon_viewer, R.drawable.ic_reader_webtoon_24dp, 0x00000004),
|
||||
CONTINUOUS_VERTICAL(5, R.string.vertical_plus_viewer, R.drawable.ic_reader_continuous_vertical_24dp, 0x00000005),
|
||||
;
|
||||
|
||||
companion object {
|
||||
fun fromPreference(preference: Int): ReadingModeType = values().find { it.prefValue == preference } ?: DEFAULT
|
||||
const val MASK = 0x00000007
|
||||
|
||||
fun fromPreference(preference: Int?): ReadingModeType = values().find { it.flagValue == preference } ?: DEFAULT
|
||||
|
||||
fun isPagerType(preference: Int): Boolean {
|
||||
val mode = fromPreference(preference)
|
||||
return mode == LEFT_TO_RIGHT || mode == RIGHT_TO_LEFT || mode == VERTICAL
|
||||
}
|
||||
|
||||
fun fromSpinner(position: Int?) = values().find { value -> value.prefValue == position } ?: DEFAULT
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,9 +122,9 @@ class HistoryPresenter : BasePresenter<HistoryController>() {
|
||||
}
|
||||
|
||||
val sortFunction: (Chapter, Chapter) -> Int = when (manga.sorting) {
|
||||
Manga.SORTING_SOURCE -> { c1, c2 -> c2.source_order.compareTo(c1.source_order) }
|
||||
Manga.SORTING_NUMBER -> { c1, c2 -> c1.chapter_number.compareTo(c2.chapter_number) }
|
||||
Manga.SORTING_UPLOAD_DATE -> { c1, c2 -> c1.date_upload.compareTo(c2.date_upload) }
|
||||
Manga.CHAPTER_SORTING_SOURCE -> { c1, c2 -> c2.source_order.compareTo(c1.source_order) }
|
||||
Manga.CHAPTER_SORTING_NUMBER -> { c1, c2 -> c1.chapter_number.compareTo(c2.chapter_number) }
|
||||
Manga.CHAPTER_SORTING_UPLOAD_DATE -> { c1, c2 -> c1.date_upload.compareTo(c2.date_upload) }
|
||||
else -> throw NotImplementedError("Unknown sorting method")
|
||||
}
|
||||
|
||||
@@ -133,8 +133,8 @@ class HistoryPresenter : BasePresenter<HistoryController>() {
|
||||
|
||||
val currChapterIndex = chapters.indexOfFirst { chapter.id == it.id }
|
||||
return when (manga.sorting) {
|
||||
Manga.SORTING_SOURCE -> chapters.getOrNull(currChapterIndex + 1)
|
||||
Manga.SORTING_NUMBER -> {
|
||||
Manga.CHAPTER_SORTING_SOURCE -> chapters.getOrNull(currChapterIndex + 1)
|
||||
Manga.CHAPTER_SORTING_NUMBER -> {
|
||||
val chapterNumber = chapter.chapter_number
|
||||
|
||||
((currChapterIndex + 1) until chapters.size)
|
||||
@@ -144,7 +144,7 @@ class HistoryPresenter : BasePresenter<HistoryController>() {
|
||||
it.chapter_number <= chapterNumber + 1
|
||||
}
|
||||
}
|
||||
Manga.SORTING_UPLOAD_DATE -> {
|
||||
Manga.CHAPTER_SORTING_UPLOAD_DATE -> {
|
||||
chapters.drop(currChapterIndex + 1)
|
||||
.firstOrNull { it.date_upload >= chapter.date_upload }
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@ import androidx.preference.PreferenceScreen
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues.TappingInvertMode
|
||||
import eu.kanade.tachiyomi.data.preference.asImmediateFlow
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
||||
import eu.kanade.tachiyomi.util.preference.defaultValue
|
||||
import eu.kanade.tachiyomi.util.preference.entriesRes
|
||||
import eu.kanade.tachiyomi.util.preference.intListPreference
|
||||
@@ -23,7 +25,7 @@ class SettingsReaderController : SettingsController() {
|
||||
titleRes = R.string.pref_category_reader
|
||||
|
||||
intListPreference {
|
||||
key = Keys.defaultViewer
|
||||
key = Keys.defaultReadingMode
|
||||
titleRes = R.string.pref_viewer_type
|
||||
entriesRes = arrayOf(
|
||||
R.string.left_to_right_viewer,
|
||||
@@ -32,8 +34,9 @@ class SettingsReaderController : SettingsController() {
|
||||
R.string.webtoon_viewer,
|
||||
R.string.vertical_plus_viewer
|
||||
)
|
||||
entryValues = arrayOf("1", "2", "3", "4", "5")
|
||||
defaultValue = "2"
|
||||
entryValues = ReadingModeType.values().drop(1)
|
||||
.map { value -> "${value.flagValue}" }.toTypedArray()
|
||||
defaultValue = "${ReadingModeType.RIGHT_TO_LEFT.flagValue}"
|
||||
summary = "%s"
|
||||
}
|
||||
intListPreference {
|
||||
@@ -74,7 +77,7 @@ class SettingsReaderController : SettingsController() {
|
||||
titleRes = R.string.pref_category_display
|
||||
|
||||
intListPreference {
|
||||
key = Keys.rotation
|
||||
key = Keys.defaultOrientationType
|
||||
titleRes = R.string.pref_rotation_type
|
||||
entriesRes = arrayOf(
|
||||
R.string.rotation_free,
|
||||
@@ -83,8 +86,9 @@ class SettingsReaderController : SettingsController() {
|
||||
R.string.rotation_force_portrait,
|
||||
R.string.rotation_force_landscape,
|
||||
)
|
||||
entryValues = arrayOf("1", "2", "3", "4", "5")
|
||||
defaultValue = "1"
|
||||
entryValues = OrientationType.values().drop(1)
|
||||
.map { value -> "${value.flagValue}" }.toTypedArray()
|
||||
defaultValue = "${OrientationType.FREE.flagValue}"
|
||||
summary = "%s"
|
||||
}
|
||||
intListPreference {
|
||||
|
||||
Reference in New Issue
Block a user