Merge branch 'feature/webtoon-margins' of git://github.com/jleehey/tachiyomi into jleehey-feature/webtoon-margins

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderSettingsSheet.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceDSL.kt
#	app/src/main/res/values/strings.xml
This commit is contained in:
arkon 2020-04-10 11:14:09 -04:00
commit 145a744ce0
12 changed files with 119 additions and 1 deletions

View file

@ -57,6 +57,8 @@ object PreferenceKeys {
const val readWithVolumeKeysInverted = "reader_volume_keys_inverted" const val readWithVolumeKeysInverted = "reader_volume_keys_inverted"
const val marginRatioWebtoon = "margin_ratio_webtoon"
const val portraitColumns = "pref_library_columns_portrait_key" const val portraitColumns = "pref_library_columns_portrait_key"
const val landscapeColumns = "pref_library_columns_landscape_key" const val landscapeColumns = "pref_library_columns_landscape_key"

View file

@ -107,6 +107,8 @@ class PreferencesHelper(val context: Context) {
fun cropBordersWebtoon() = rxPrefs.getBoolean(Keys.cropBordersWebtoon, false) fun cropBordersWebtoon() = rxPrefs.getBoolean(Keys.cropBordersWebtoon, false)
fun marginRatioWebtoon() = rxPrefs.getFloat(Keys.marginRatioWebtoon, 0f)
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)

View file

@ -4,6 +4,7 @@ import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.widget.CompoundButton import android.widget.CompoundButton
import android.widget.Spinner import android.widget.Spinner
import androidx.annotation.ArrayRes
import androidx.core.widget.NestedScrollView import androidx.core.widget.NestedScrollView
import com.f2prateek.rx.preferences.Preference import com.f2prateek.rx.preferences.Preference
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
@ -23,6 +24,7 @@ import kotlinx.android.synthetic.main.reader_settings_sheet.cutout_short
import kotlinx.android.synthetic.main.reader_settings_sheet.fullscreen import kotlinx.android.synthetic.main.reader_settings_sheet.fullscreen
import kotlinx.android.synthetic.main.reader_settings_sheet.keepscreen import kotlinx.android.synthetic.main.reader_settings_sheet.keepscreen
import kotlinx.android.synthetic.main.reader_settings_sheet.long_tap import kotlinx.android.synthetic.main.reader_settings_sheet.long_tap
import kotlinx.android.synthetic.main.reader_settings_sheet.margin_ratio_webtoon
import kotlinx.android.synthetic.main.reader_settings_sheet.page_transitions import kotlinx.android.synthetic.main.reader_settings_sheet.page_transitions
import kotlinx.android.synthetic.main.reader_settings_sheet.pager_prefs_group import kotlinx.android.synthetic.main.reader_settings_sheet.pager_prefs_group
import kotlinx.android.synthetic.main.reader_settings_sheet.rotation_mode import kotlinx.android.synthetic.main.reader_settings_sheet.rotation_mode
@ -112,6 +114,7 @@ class ReaderSettingsSheet(private val activity: ReaderActivity) : BottomSheetDia
webtoon_prefs_group.visible() webtoon_prefs_group.visible()
crop_borders_webtoon.bindToPreference(preferences.cropBordersWebtoon()) crop_borders_webtoon.bindToPreference(preferences.cropBordersWebtoon())
margin_ratio_webtoon.bindToFloatPreference(preferences.marginRatioWebtoon(), R.array.webtoon_margin_ratio_values)
} }
/** /**
@ -131,4 +134,18 @@ class ReaderSettingsSheet(private val activity: ReaderActivity) : BottomSheetDia
} }
setSelection(pref.getOrDefault() - offset, false) setSelection(pref.getOrDefault() - offset, false)
} }
/**
* Binds a spinner to a float preference. The position of the spinner item must
* correlate with the [floatValues] resource item (in arrays.xml), which is a <string-array>
* of float values that will be parsed here and applied to the preference.
*/
private fun Spinner.bindToFloatPreference(pref: Preference<Float>, @ArrayRes floatValuesResource: Int) {
val floatValues = resources.getStringArray(floatValuesResource).map { it.toFloatOrNull() }
onItemSelectedListener = IgnoreFirstSpinnerListener { position ->
pref.set(floatValues[position])
}
setSelection(floatValues.indexOf(pref.getOrDefault()), false)
}
} }

View file

@ -37,6 +37,9 @@ class WebtoonConfig(preferences: PreferencesHelper = Injekt.get()) {
var alwaysShowChapterTransition = true var alwaysShowChapterTransition = true
private set private set
var marginRatio = 0f
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.marginRatioWebtoon()
.register({ marginRatio = it }, { imagePropertyChangedListener?.invoke() })
} }
fun unsubscribe() { fun unsubscribe() {

View file

@ -2,9 +2,11 @@ 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
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
@ -128,6 +130,10 @@ class WebtoonPageHolder(
if (!viewer.isContinuous) { if (!viewer.isContinuous) {
bottomMargin = 15.dpToPx bottomMargin = 15.dpToPx
} }
val margin = Resources.getSystem().displayMetrics.widthPixels * viewer.config.marginRatio
marginEnd = margin.toInt()
marginStart = margin.toInt()
} }
} }

View file

@ -121,6 +121,8 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr
frame.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT) frame.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
frame.addView(recycler) frame.addView(recycler)
config.imagePropertyChangedListener = { adapter.notifyDataSetChanged() }
} }
private fun checkAllowPreload(page: ReaderPage?): Boolean { private fun checkAllowPreload(page: ReaderPage?): Boolean {

View file

@ -146,6 +146,17 @@ class SettingsReaderController : SettingsController() {
titleRes = R.string.pref_crop_borders titleRes = R.string.pref_crop_borders
defaultValue = false defaultValue = false
} }
floatListPreference {
key = Keys.marginRatioWebtoon
titleRes = R.string.pref_reader_margin
entriesRes = arrayOf(R.string.webtoon_margin_ratio_0,
R.string.webtoon_margin_ratio_10, R.string.webtoon_margin_ratio_15,
R.string.webtoon_margin_ratio_20, R.string.webtoon_margin_ratio_25)
entryValues = arrayOf("0", "0.1", "0.15", "0.2", "0.25")
defaultValue = "0"
summary = "%s"
}
} }
preferenceCategory { preferenceCategory {

View file

@ -14,6 +14,7 @@ import androidx.preference.PreferenceScreen
import androidx.preference.SwitchPreferenceCompat import androidx.preference.SwitchPreferenceCompat
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
import eu.kanade.tachiyomi.widget.preference.BadgePreference import eu.kanade.tachiyomi.widget.preference.BadgePreference
import eu.kanade.tachiyomi.widget.preference.FloatListPreference
import eu.kanade.tachiyomi.widget.preference.IntListPreference import eu.kanade.tachiyomi.widget.preference.IntListPreference
import eu.kanade.tachiyomi.widget.preference.SwitchPreferenceCategory import eu.kanade.tachiyomi.widget.preference.SwitchPreferenceCategory
@ -53,6 +54,10 @@ inline fun PreferenceGroup.intListPreference(block: (@DSL IntListPreference).()
return initThenAdd(IntListPreference(context), block).also(::initDialog) return initThenAdd(IntListPreference(context), block).also(::initDialog)
} }
inline fun PreferenceGroup.floatListPreference(block: (@DSL FloatListPreference).() -> Unit): FloatListPreference {
return initThenAdd(FloatListPreference(context), block).also(::initDialog)
}
inline fun PreferenceGroup.multiSelectListPreference(block: (@DSL MultiSelectListPreference).() -> Unit): MultiSelectListPreference { inline fun PreferenceGroup.multiSelectListPreference(block: (@DSL MultiSelectListPreference).() -> Unit): MultiSelectListPreference {
return initThenAdd(MultiSelectListPreference(context), block).also(::initDialog) return initThenAdd(MultiSelectListPreference(context), block).also(::initDialog)
} }

View file

@ -0,0 +1,26 @@
package eu.kanade.tachiyomi.widget.preference
import android.content.Context
import android.util.AttributeSet
import androidx.preference.ListPreference
class FloatListPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
ListPreference(context, attrs) {
override fun persistString(value: String?): Boolean {
return value != null && persistFloat(value.toFloat())
}
override fun getPersistedString(defaultReturnValue: String?): String? {
// When the underlying preference is using a PreferenceDataStore, there's no way (for now)
// to check if a value is in the store, so we use a most likely unused value as workaround
val defaultIntValue = Float.NEGATIVE_INFINITY
val value = getPersistedFloat(defaultIntValue)
return if (value != defaultIntValue) {
value.toString()
} else {
defaultReturnValue
}
}
}

View file

@ -256,6 +256,25 @@
android:textColor="?android:attr/textColorSecondary" android:textColor="?android:attr/textColorSecondary"
app:layout_constraintTop_toBottomOf="@id/webtoon_prefs" /> app:layout_constraintTop_toBottomOf="@id/webtoon_prefs" />
<TextView
android:id="@+id/margin_ratio_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/pref_reader_margin"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/verticalcenter"
app:layout_constraintBaseline_toBaselineOf="@id/margin_ratio_webtoon"/>
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/margin_ratio_webtoon"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:entries="@array/webtoon_margin_ratio"
app:layout_constraintLeft_toRightOf="@id/verticalcenter"
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
@ -271,7 +290,7 @@
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,margin_ratio_text,margin_ratio_webtoon" />
<androidx.constraintlayout.widget.Guideline <androidx.constraintlayout.widget.Guideline
android:id="@+id/verticalcenter" android:id="@+id/verticalcenter"

View file

@ -54,6 +54,22 @@
<item>@string/scale_type_smart_fit</item> <item>@string/scale_type_smart_fit</item>
</string-array> </string-array>
<string-array name="webtoon_margin_ratio">
<item>@string/webtoon_margin_ratio_0</item>
<item>@string/webtoon_margin_ratio_10</item>
<item>@string/webtoon_margin_ratio_15</item>
<item>@string/webtoon_margin_ratio_20</item>
<item>@string/webtoon_margin_ratio_25</item>
</string-array>
<string-array name="webtoon_margin_ratio_values">
<item>0.0</item>
<item>0.1</item>
<item>0.15</item>
<item>0.2</item>
<item>0.25</item>
</string-array>
<string-array name="image_scale_type_values"> <string-array name="image_scale_type_values">
<item>1</item> <item>1</item>
<item>2</item> <item>2</item>

View file

@ -241,6 +241,7 @@
<string name="pref_read_with_tapping">Tapping</string> <string name="pref_read_with_tapping">Tapping</string>
<string name="pref_read_with_long_tap">Long tap dialog</string> <string name="pref_read_with_long_tap">Long tap dialog</string>
<string name="pref_reader_theme">Background color</string> <string name="pref_reader_theme">Background color</string>
<string name="pref_reader_margin">Margin ratio</string>
<string name="white_background">White</string> <string name="white_background">White</string>
<string name="black_background">Black</string> <string name="black_background">Black</string>
<string name="pref_viewer_type">Default viewer</string> <string name="pref_viewer_type">Default viewer</string>
@ -278,6 +279,11 @@
<string name="color_filter_a_value">A</string> <string name="color_filter_a_value">A</string>
<string name="pref_always_show_chapter_transition">Always show chapter transition</string> <string name="pref_always_show_chapter_transition">Always show chapter transition</string>
<string name="pref_category_reading">Reading</string> <string name="pref_category_reading">Reading</string>
<string name="webtoon_margin_ratio_0">No margin</string>
<string name="webtoon_margin_ratio_10">10%</string>
<string name="webtoon_margin_ratio_15">15%</string>
<string name="webtoon_margin_ratio_20">20%</string>
<string name="webtoon_margin_ratio_25">25%</string>
<!-- Downloads section --> <!-- Downloads section -->
<string name="pref_download_directory">Download location</string> <string name="pref_download_directory">Download location</string>