mirror of
https://github.com/tachiyomiorg/tachiyomi.git
synced 2024-12-23 21:01:51 +01:00
Adding webtoon side margins + continuous vertical
Co-Authored-By: arkon <arkon@users.noreply.github.com> Co-Authored-By: morcefaster <51055657+morcefaster@users.noreply.github.com>
This commit is contained in:
parent
907c4b77a8
commit
0af41005f8
@ -51,6 +51,8 @@ object PreferenceKeys {
|
|||||||
|
|
||||||
const val readWithVolumeKeysInverted = "reader_volume_keys_inverted"
|
const val readWithVolumeKeysInverted = "reader_volume_keys_inverted"
|
||||||
|
|
||||||
|
const val webtoonSidePadding = "webtoon_side_padding"
|
||||||
|
|
||||||
const val updateOnlyNonCompleted = "pref_update_only_non_completed_key"
|
const val updateOnlyNonCompleted = "pref_update_only_non_completed_key"
|
||||||
|
|
||||||
const val autoUpdateTrack = "pref_auto_update_manga_sync_key"
|
const val autoUpdateTrack = "pref_auto_update_manga_sync_key"
|
||||||
|
@ -95,6 +95,8 @@ class PreferencesHelper(val context: Context) {
|
|||||||
|
|
||||||
fun cropBordersWebtoon() = rxPrefs.getBoolean(Keys.cropBordersWebtoon, false)
|
fun cropBordersWebtoon() = rxPrefs.getBoolean(Keys.cropBordersWebtoon, false)
|
||||||
|
|
||||||
|
fun webtoonSidePadding() = rxPrefs.getInteger(Keys.webtoonSidePadding, 0)
|
||||||
|
|
||||||
fun readWithTapping() = rxPrefs.getBoolean(Keys.readWithTapping, true)
|
fun readWithTapping() = rxPrefs.getBoolean(Keys.readWithTapping, true)
|
||||||
|
|
||||||
fun readWithLongTap() = rxPrefs.getBoolean(Keys.readWithLongTap, true)
|
fun readWithLongTap() = rxPrefs.getBoolean(Keys.readWithLongTap, true)
|
||||||
|
@ -144,6 +144,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>(),
|
|||||||
const val RIGHT_TO_LEFT = 2
|
const val RIGHT_TO_LEFT = 2
|
||||||
const val VERTICAL = 3
|
const val VERTICAL = 3
|
||||||
const val WEBTOON = 4
|
const val WEBTOON = 4
|
||||||
|
const val VERTICAL_PLUS = 5
|
||||||
|
|
||||||
fun newIntent(context: Context, manga: Manga, chapter: Chapter):
|
fun newIntent(context: Context, manga: Manga, chapter: Chapter):
|
||||||
Intent {
|
Intent {
|
||||||
@ -402,6 +403,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>(),
|
|||||||
RIGHT_TO_LEFT -> R2LPagerViewer(this)
|
RIGHT_TO_LEFT -> R2LPagerViewer(this)
|
||||||
VERTICAL -> VerticalPagerViewer(this)
|
VERTICAL -> VerticalPagerViewer(this)
|
||||||
WEBTOON -> WebtoonViewer(this)
|
WEBTOON -> WebtoonViewer(this)
|
||||||
|
VERTICAL_PLUS -> WebtoonViewer(this, isContinuous = false)
|
||||||
else -> L2RPagerViewer(this)
|
else -> L2RPagerViewer(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.CompoundButton
|
import android.widget.CompoundButton
|
||||||
import android.widget.Spinner
|
import android.widget.Spinner
|
||||||
|
import androidx.annotation.ArrayRes
|
||||||
import com.f2prateek.rx.preferences.Preference
|
import com.f2prateek.rx.preferences.Preference
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
@ -55,7 +56,7 @@ class ReaderSettingsSheet(private val activity: ReaderActivity) :
|
|||||||
.getOrDefault() == 0 && activity.window.decorView.rootWindowInsets.systemWindowInsetRight == 0 && activity.window.decorView.rootWindowInsets.systemWindowInsetLeft == 0
|
.getOrDefault() == 0 && activity.window.decorView.rootWindowInsets.systemWindowInsetRight == 0 && activity.window.decorView.rootWindowInsets.systemWindowInsetLeft == 0
|
||||||
) window?.decorView?.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
|
) window?.decorView?.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
|
||||||
val height = activity.window.decorView.rootWindowInsets.systemWindowInsetBottom
|
val height = activity.window.decorView.rootWindowInsets.systemWindowInsetBottom
|
||||||
sheetBehavior.peekHeight = 500.dpToPx + height
|
sheetBehavior.peekHeight = 550.dpToPx + height
|
||||||
|
|
||||||
sheetBehavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
|
sheetBehavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
|
||||||
override fun onSlide(bottomSheet: View, progress: Float) {
|
override fun onSlide(bottomSheet: View, progress: Float) {
|
||||||
@ -87,7 +88,7 @@ class ReaderSettingsSheet(private val activity: ReaderActivity) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
setBottomEdge(
|
setBottomEdge(
|
||||||
if (activity.viewer is PagerViewer) page_transitions else crop_borders_webtoon, activity
|
if (activity.viewer is PagerViewer) page_transitions else webtoon_side_padding, activity
|
||||||
)
|
)
|
||||||
|
|
||||||
close_button.setOnClickListener {
|
close_button.setOnClickListener {
|
||||||
@ -138,6 +139,7 @@ class ReaderSettingsSheet(private val activity: ReaderActivity) :
|
|||||||
webtoon_prefs_group.visible()
|
webtoon_prefs_group.visible()
|
||||||
pager_prefs_group.gone()
|
pager_prefs_group.gone()
|
||||||
crop_borders_webtoon.bindToPreference(preferences.cropBordersWebtoon())
|
crop_borders_webtoon.bindToPreference(preferences.cropBordersWebtoon())
|
||||||
|
webtoon_side_padding.bindToIntPreference(preferences.webtoonSidePadding(), R.array.webtoon_side_padding_values)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -162,4 +164,17 @@ class ReaderSettingsSheet(private val activity: ReaderActivity) :
|
|||||||
}
|
}
|
||||||
setSelection(pref.getOrDefault() - offset, false)
|
setSelection(pref.getOrDefault() - offset, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Binds a spinner to an int preference. The position of the spinner item must
|
||||||
|
* correlate with the [intValues] resource item (in arrays.xml), which is a <string-array>
|
||||||
|
* of int values that will be parsed here and applied to the preference.
|
||||||
|
*/
|
||||||
|
private fun Spinner.bindToIntPreference(pref: Preference<Int>, @ArrayRes intValuesResource: Int) {
|
||||||
|
val intValues = resources.getStringArray(intValuesResource).map { it.toIntOrNull() }
|
||||||
|
onItemSelectedListener = IgnoreFirstSpinnerListener { position ->
|
||||||
|
pref.set(intValues[position])
|
||||||
|
}
|
||||||
|
setSelection(intValues.indexOf(pref.getOrDefault()), false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import android.view.ViewGroup
|
|||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import androidx.recyclerview.widget.DiffUtil
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
|
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
|
||||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
|
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
|
||||||
@ -12,7 +13,7 @@ import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
|
|||||||
/**
|
/**
|
||||||
* RecyclerView Adapter used by this [viewer] to where [ViewerChapters] updates are posted.
|
* RecyclerView Adapter used by this [viewer] to where [ViewerChapters] updates are posted.
|
||||||
*/
|
*/
|
||||||
class WebtoonAdapter(val viewer: WebtoonViewer) : androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder>() {
|
class WebtoonAdapter(val viewer: WebtoonViewer) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of currently set items.
|
* List of currently set items.
|
||||||
@ -20,6 +21,7 @@ class WebtoonAdapter(val viewer: WebtoonViewer) : androidx.recyclerview.widget.R
|
|||||||
var items: List<Any> = emptyList()
|
var items: List<Any> = emptyList()
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
var currentChapter: ReaderChapter? = null
|
||||||
/**
|
/**
|
||||||
* Updates this adapter with the given [chapters]. It handles setting a few pages of the
|
* Updates this adapter with the given [chapters]. It handles setting a few pages of the
|
||||||
* next/previous chapter to allow seamless transitions.
|
* next/previous chapter to allow seamless transitions.
|
||||||
@ -48,6 +50,8 @@ class WebtoonAdapter(val viewer: WebtoonViewer) : androidx.recyclerview.widget.R
|
|||||||
newItems.addAll(currPages)
|
newItems.addAll(currPages)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
currentChapter = chapters.currChapter
|
||||||
|
|
||||||
// Add next chapter transition and pages.
|
// Add next chapter transition and pages.
|
||||||
if (forceTransition || chapters.nextChapter?.state !is ReaderChapter.State.Loaded) {
|
if (forceTransition || chapters.nextChapter?.state !is ReaderChapter.State.Loaded) {
|
||||||
newItems.add(ChapterTransition.Next(chapters.currChapter, chapters.nextChapter))
|
newItems.add(ChapterTransition.Next(chapters.currChapter, chapters.nextChapter))
|
||||||
@ -89,7 +93,7 @@ class WebtoonAdapter(val viewer: WebtoonViewer) : androidx.recyclerview.widget.R
|
|||||||
/**
|
/**
|
||||||
* Creates a new view holder for an item with the given [viewType].
|
* Creates a new view holder for an item with the given [viewType].
|
||||||
*/
|
*/
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||||
return when (viewType) {
|
return when (viewType) {
|
||||||
PAGE_VIEW -> {
|
PAGE_VIEW -> {
|
||||||
val view = FrameLayout(parent.context)
|
val view = FrameLayout(parent.context)
|
||||||
@ -106,7 +110,7 @@ class WebtoonAdapter(val viewer: WebtoonViewer) : androidx.recyclerview.widget.R
|
|||||||
/**
|
/**
|
||||||
* Binds an existing view [holder] with the item at the given [position].
|
* Binds an existing view [holder] with the item at the given [position].
|
||||||
*/
|
*/
|
||||||
override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) {
|
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
||||||
val item = items[position]
|
val item = items[position]
|
||||||
when (holder) {
|
when (holder) {
|
||||||
is WebtoonPageHolder -> holder.bind(item as ReaderPage)
|
is WebtoonPageHolder -> holder.bind(item as ReaderPage)
|
||||||
@ -117,7 +121,7 @@ class WebtoonAdapter(val viewer: WebtoonViewer) : androidx.recyclerview.widget.R
|
|||||||
/**
|
/**
|
||||||
* Recycles an existing view [holder] before adding it to the view pool.
|
* Recycles an existing view [holder] before adding it to the view pool.
|
||||||
*/
|
*/
|
||||||
override fun onViewRecycled(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder) {
|
override fun onViewRecycled(holder: RecyclerView.ViewHolder) {
|
||||||
when (holder) {
|
when (holder) {
|
||||||
is WebtoonPageHolder -> holder.recycle()
|
is WebtoonPageHolder -> holder.recycle()
|
||||||
is WebtoonTransitionHolder -> holder.recycle()
|
is WebtoonTransitionHolder -> holder.recycle()
|
||||||
|
@ -37,6 +37,9 @@ class WebtoonConfig(preferences: PreferencesHelper = Injekt.get()) {
|
|||||||
var alwaysShowChapterTransition = true
|
var alwaysShowChapterTransition = true
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
var sidePadding = 0
|
||||||
|
private set
|
||||||
|
|
||||||
init {
|
init {
|
||||||
preferences.readWithTapping()
|
preferences.readWithTapping()
|
||||||
.register({ tappingEnabled = it })
|
.register({ tappingEnabled = it })
|
||||||
@ -58,6 +61,9 @@ class WebtoonConfig(preferences: PreferencesHelper = Injekt.get()) {
|
|||||||
|
|
||||||
preferences.alwaysShowChapterTransition()
|
preferences.alwaysShowChapterTransition()
|
||||||
.register({ alwaysShowChapterTransition = it })
|
.register({ alwaysShowChapterTransition = it })
|
||||||
|
|
||||||
|
preferences.webtoonSidePadding()
|
||||||
|
.register({ sidePadding = it }, { imagePropertyChangedListener?.invoke() })
|
||||||
}
|
}
|
||||||
|
|
||||||
fun unsubscribe() {
|
fun unsubscribe() {
|
||||||
|
@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.reader.viewer.webtoon
|
|||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.content.res.Resources
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.view.Gravity
|
import android.view.Gravity
|
||||||
@ -120,6 +121,19 @@ class WebtoonPageHolder(
|
|||||||
fun bind(page: ReaderPage) {
|
fun bind(page: ReaderPage) {
|
||||||
this.page = page
|
this.page = page
|
||||||
observeStatus()
|
observeStatus()
|
||||||
|
refreshLayoutParams()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun refreshLayoutParams() {
|
||||||
|
frame.layoutParams = FrameLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT).apply {
|
||||||
|
if (!viewer.isContinuous) {
|
||||||
|
bottomMargin = 15.dpToPx
|
||||||
|
}
|
||||||
|
|
||||||
|
val margin = Resources.getSystem().displayMetrics.widthPixels * (viewer.config.sidePadding / 100f)
|
||||||
|
marginEnd = margin.toInt()
|
||||||
|
marginStart = margin.toInt()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -14,11 +14,13 @@ import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
|
|||||||
import eu.kanade.tachiyomi.ui.reader.viewer.BaseViewer
|
import eu.kanade.tachiyomi.ui.reader.viewer.BaseViewer
|
||||||
import rx.subscriptions.CompositeSubscription
|
import rx.subscriptions.CompositeSubscription
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
import kotlin.math.max
|
||||||
|
import kotlin.math.min
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of a [BaseViewer] to display pages with a [RecyclerView].
|
* Implementation of a [BaseViewer] to display pages with a [RecyclerView].
|
||||||
*/
|
*/
|
||||||
class WebtoonViewer(val activity: ReaderActivity) : BaseViewer {
|
class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = true) : BaseViewer {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recycler view used by this viewer.
|
* Recycler view used by this viewer.
|
||||||
@ -70,10 +72,11 @@ class WebtoonViewer(val activity: ReaderActivity) : BaseViewer {
|
|||||||
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
|
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
|
||||||
val position = layoutManager.findLastEndVisibleItemPosition()
|
val position = layoutManager.findLastEndVisibleItemPosition()
|
||||||
val item = adapter.items.getOrNull(position)
|
val item = adapter.items.getOrNull(position)
|
||||||
|
val allowPreload = checkAllowPreload(item as? ReaderPage)
|
||||||
if (item != null && currentPage != item) {
|
if (item != null && currentPage != item) {
|
||||||
currentPage = item
|
currentPage = item
|
||||||
when (item) {
|
when (item) {
|
||||||
is ReaderPage -> onPageSelected(item, position)
|
is ReaderPage -> onPageSelected(item, allowPreload)
|
||||||
is ChapterTransition -> onTransitionSelected(item)
|
is ChapterTransition -> onTransitionSelected(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -113,10 +116,34 @@ class WebtoonViewer(val activity: ReaderActivity) : BaseViewer {
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
config.imagePropertyChangedListener = {
|
||||||
|
refreshAdapter()
|
||||||
|
}
|
||||||
|
|
||||||
frame.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
|
frame.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
|
||||||
frame.addView(recycler)
|
frame.addView(recycler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun checkAllowPreload(page: ReaderPage?): Boolean {
|
||||||
|
// Page is transition page - preload allowed
|
||||||
|
page == null ?: return true
|
||||||
|
|
||||||
|
// Initial opening - preload allowed
|
||||||
|
currentPage == null ?: return true
|
||||||
|
|
||||||
|
val nextItem = adapter.items.getOrNull(adapter.items.count() - 1)
|
||||||
|
val nextChapter = (nextItem as? ChapterTransition.Next)?.to ?: (nextItem as? ReaderPage)?.chapter
|
||||||
|
|
||||||
|
// Allow preload for
|
||||||
|
// 1. Going between pages of same chapter
|
||||||
|
// 2. Next chapter page
|
||||||
|
return when (page!!.chapter) {
|
||||||
|
(currentPage as? ReaderPage)?.chapter -> true
|
||||||
|
nextChapter -> true
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the view this viewer uses.
|
* Returns the view this viewer uses.
|
||||||
*/
|
*/
|
||||||
@ -137,18 +164,20 @@ class WebtoonViewer(val activity: ReaderActivity) : BaseViewer {
|
|||||||
* Called from the RecyclerView listener when a [page] is marked as active. It notifies the
|
* Called from the RecyclerView listener when a [page] is marked as active. It notifies the
|
||||||
* activity of the change and requests the preload of the next chapter if this is the last page.
|
* activity of the change and requests the preload of the next chapter if this is the last page.
|
||||||
*/
|
*/
|
||||||
private fun onPageSelected(page: ReaderPage, position: Int) {
|
private fun onPageSelected(page: ReaderPage, allowPreload: Boolean) {
|
||||||
val pages = page.chapter.pages!! // Won't be null because it's the loaded chapter
|
val pages = page.chapter.pages!! // Won't be null because it's the loaded chapter
|
||||||
Timber.d("onPageSelected: ${page.number}/${pages.size}")
|
Timber.d("onPageSelected: ${page.number}/${pages.size}")
|
||||||
activity.onPageSelected(page)
|
activity.onPageSelected(page)
|
||||||
|
|
||||||
// Preload next chapter once we're within the last 3 pages of the current chapter
|
// Preload next chapter once we're within the last 3 pages of the current chapter
|
||||||
val inPreloadRange = pages.size - page.number < 3
|
val inPreloadRange = pages.size - page.number < 3
|
||||||
if (inPreloadRange) {
|
if (inPreloadRange && allowPreload && page.chapter == adapter.currentChapter) {
|
||||||
Timber.d("Request preload next chapter because we're at page ${page.number} of ${pages.size}")
|
Timber.d("Request preload next chapter because we're at page ${page.number} of ${pages.size}")
|
||||||
val transition = adapter.items.getOrNull(pages.size + 1) as? ChapterTransition.Next
|
val nextItem = adapter.items.getOrNull(adapter.items.size - 1)
|
||||||
if (transition?.to != null) {
|
val transitionChapter = (nextItem as? ChapterTransition.Next)?.to ?: (nextItem as?ReaderPage)?.chapter
|
||||||
activity.requestPreloadChapter(transition.to)
|
if (transitionChapter != null) {
|
||||||
|
Timber.d("Requesting to preload chapter ${transitionChapter.chapter.chapter_number}")
|
||||||
|
activity.requestPreloadChapter(transitionChapter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -255,4 +284,15 @@ class WebtoonViewer(val activity: ReaderActivity) : BaseViewer {
|
|||||||
override fun handleGenericMotionEvent(event: MotionEvent): Boolean {
|
override fun handleGenericMotionEvent(event: MotionEvent): Boolean {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies adapter of changes around the current page to trigger a relayout in the recycler.
|
||||||
|
* Used when an image configuration is changed.
|
||||||
|
*/
|
||||||
|
private fun refreshAdapter() {
|
||||||
|
val position = layoutManager.findLastEndVisibleItemPosition()
|
||||||
|
adapter.notifyItemRangeChanged(
|
||||||
|
max(0, position - 2),
|
||||||
|
min(position + 2, adapter.itemCount - 1))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,8 @@ class SettingsReaderController : SettingsController() {
|
|||||||
key = Keys.defaultViewer
|
key = Keys.defaultViewer
|
||||||
titleRes = R.string.default_viewer
|
titleRes = R.string.default_viewer
|
||||||
entriesRes = arrayOf(R.string.left_to_right_viewer, R.string.right_to_left_viewer,
|
entriesRes = arrayOf(R.string.left_to_right_viewer, R.string.right_to_left_viewer,
|
||||||
R.string.vertical_viewer, R.string.webtoon)
|
R.string.vertical_viewer, R.string.webtoon, R.string.continuous_vertical)
|
||||||
entryRange = 1..4
|
entryRange = 1..5
|
||||||
defaultValue = 1
|
defaultValue = 1
|
||||||
}
|
}
|
||||||
intListPreference(activity) {
|
intListPreference(activity) {
|
||||||
|
@ -98,7 +98,7 @@
|
|||||||
app:layout_constraintStart_toEndOf="@id/bottom_line"
|
app:layout_constraintStart_toEndOf="@id/bottom_line"
|
||||||
app:layout_constraintTop_toBottomOf="@id/rotation_mode" />
|
app:layout_constraintTop_toBottomOf="@id/rotation_mode" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.SwitchCompat
|
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||||
android:id="@+id/show_page_number"
|
android:id="@+id/show_page_number"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -107,7 +107,7 @@
|
|||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary"
|
||||||
app:layout_constraintTop_toBottomOf="@id/background_color" />
|
app:layout_constraintTop_toBottomOf="@id/background_color" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.SwitchCompat
|
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||||
android:id="@+id/true_color"
|
android:id="@+id/true_color"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -118,7 +118,7 @@
|
|||||||
app:layout_constraintTop_toBottomOf="@id/show_page_number"
|
app:layout_constraintTop_toBottomOf="@id/show_page_number"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.SwitchCompat
|
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||||
android:id="@+id/fullscreen"
|
android:id="@+id/fullscreen"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -127,7 +127,7 @@
|
|||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary"
|
||||||
app:layout_constraintTop_toBottomOf="@id/true_color" />
|
app:layout_constraintTop_toBottomOf="@id/true_color" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.SwitchCompat
|
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||||
android:id="@+id/keepscreen"
|
android:id="@+id/keepscreen"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -136,7 +136,7 @@
|
|||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary"
|
||||||
app:layout_constraintTop_toBottomOf="@id/fullscreen" />
|
app:layout_constraintTop_toBottomOf="@id/fullscreen" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.SwitchCompat
|
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||||
android:id="@+id/always_show_chapter_transition"
|
android:id="@+id/always_show_chapter_transition"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -201,7 +201,7 @@
|
|||||||
app:layout_constraintStart_toEndOf="@id/bottom_line"
|
app:layout_constraintStart_toEndOf="@id/bottom_line"
|
||||||
app:layout_constraintTop_toBottomOf="@id/scale_type" />
|
app:layout_constraintTop_toBottomOf="@id/scale_type" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.SwitchCompat
|
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||||
android:id="@+id/crop_borders"
|
android:id="@+id/crop_borders"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -210,7 +210,7 @@
|
|||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary"
|
||||||
app:layout_constraintTop_toBottomOf="@id/zoom_start" />
|
app:layout_constraintTop_toBottomOf="@id/zoom_start" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.SwitchCompat
|
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||||
android:id="@+id/page_transitions"
|
android:id="@+id/page_transitions"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
@ -233,16 +233,37 @@
|
|||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/end_general_preferences" />
|
app:layout_constraintTop_toBottomOf="@id/end_general_preferences" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.SwitchCompat
|
<com.google.android.material.switchmaterial.SwitchMaterial
|
||||||
android:id="@+id/crop_borders_webtoon"
|
android:id="@+id/crop_borders_webtoon"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:text="@string/crop_borders"
|
android:text="@string/crop_borders"
|
||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@id/webtoon_prefs" />
|
app:layout_constraintTop_toBottomOf="@id/webtoon_prefs" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/webtoon_side_padding_text"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/pref_webtoon_side_padding"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/bottom_line"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintBaseline_toBaselineOf="@id/webtoon_side_padding"/>
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatSpinner
|
||||||
|
android:id="@+id/webtoon_side_padding"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="@id/spinner_end"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/bottom_line"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
android:entries="@array/webtoon_side_padding"
|
||||||
|
app:layout_constraintRight_toRightOf="@id/spinner_end"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/crop_borders_webtoon"/>
|
||||||
|
|
||||||
<!-- Groups of preferences -->
|
<!-- Groups of preferences -->
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.Group
|
<androidx.constraintlayout.widget.Group
|
||||||
@ -250,7 +271,8 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:constraint_referenced_ids="pager_prefs,scale_type,scale_type_text,zoom_start_text,zoom_start,crop_borders,page_transitions"
|
app:constraint_referenced_ids="pager_prefs,scale_type,scale_type_text,
|
||||||
|
zoom_start_text,zoom_start,crop_borders,page_transitions"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.Group
|
<androidx.constraintlayout.widget.Group
|
||||||
@ -258,7 +280,8 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:constraint_referenced_ids="webtoon_prefs,crop_borders_webtoon" />
|
app:constraint_referenced_ids="webtoon_prefs,crop_borders_webtoon,
|
||||||
|
webtoon_side_padding_text,webtoon_side_padding" />
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.Guideline
|
<androidx.constraintlayout.widget.Guideline
|
||||||
android:id="@+id/bottom_line"
|
android:id="@+id/bottom_line"
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
<item>@string/right_to_left_viewer</item>
|
<item>@string/right_to_left_viewer</item>
|
||||||
<item>@string/vertical_viewer</item>
|
<item>@string/vertical_viewer</item>
|
||||||
<item>@string/webtoon</item>
|
<item>@string/webtoon</item>
|
||||||
|
<item>@string/continuous_vertical</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="reader_themes">
|
<string-array name="reader_themes">
|
||||||
@ -25,6 +26,22 @@
|
|||||||
<item>@string/smart_fit</item>
|
<item>@string/smart_fit</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="webtoon_side_padding">
|
||||||
|
<item>@string/webtoon_side_padding_0</item>
|
||||||
|
<item>@string/webtoon_side_padding_10</item>
|
||||||
|
<item>@string/webtoon_side_padding_15</item>
|
||||||
|
<item>@string/webtoon_side_padding_20</item>
|
||||||
|
<item>@string/webtoon_side_padding_25</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="webtoon_side_padding_values">
|
||||||
|
<item>0</item>
|
||||||
|
<item>10</item>
|
||||||
|
<item>15</item>
|
||||||
|
<item>20</item>
|
||||||
|
<item>25</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
<string-array name="zoom_start">
|
<string-array name="zoom_start">
|
||||||
<item>@string/automatic</item>
|
<item>@string/automatic</item>
|
||||||
<item>@string/left</item>
|
<item>@string/left</item>
|
||||||
@ -44,5 +61,4 @@
|
|||||||
<item>@string/multiply</item>
|
<item>@string/multiply</item>
|
||||||
<item>@string/screen</item>
|
<item>@string/screen</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -291,6 +291,7 @@
|
|||||||
<string name="left_to_right_viewer">Left to right</string>
|
<string name="left_to_right_viewer">Left to right</string>
|
||||||
<string name="right_to_left_viewer">Right to left</string>
|
<string name="right_to_left_viewer">Right to left</string>
|
||||||
<string name="vertical_viewer">Vertical</string>
|
<string name="vertical_viewer">Vertical</string>
|
||||||
|
<string name="continuous_vertical">Continuous vertical</string>
|
||||||
<string name="pager_viewer">Pager</string>
|
<string name="pager_viewer">Pager</string>
|
||||||
<string name="scale_type">Scale type</string>
|
<string name="scale_type">Scale type</string>
|
||||||
<string name="fit_screen">Fit screen</string>
|
<string name="fit_screen">Fit screen</string>
|
||||||
@ -309,6 +310,12 @@
|
|||||||
<string name="smart_based_on_page">Smart (based on page)</string>
|
<string name="smart_based_on_page">Smart (based on page)</string>
|
||||||
<string name="smart_based_on_page_and_theme">Smart (based on page and theme)</string>
|
<string name="smart_based_on_page_and_theme">Smart (based on page and theme)</string>
|
||||||
<string name="always_show_chapter_transition">Always show chapter transition</string>
|
<string name="always_show_chapter_transition">Always show chapter transition</string>
|
||||||
|
<string name="pref_webtoon_side_padding">Side padding</string>
|
||||||
|
<string name="webtoon_side_padding_0">None</string>
|
||||||
|
<string name="webtoon_side_padding_10">10%</string>
|
||||||
|
<string name="webtoon_side_padding_15">15%</string>
|
||||||
|
<string name="webtoon_side_padding_20">20%</string>
|
||||||
|
<string name="webtoon_side_padding_25">25%</string>
|
||||||
|
|
||||||
<!-- Manga details -->
|
<!-- Manga details -->
|
||||||
<string name="about_this_">About this %1$s</string>
|
<string name="about_this_">About this %1$s</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user