diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt index 58388547c..26e25aa29 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -51,6 +51,8 @@ object PreferenceKeys { const val readWithVolumeKeysInverted = "reader_volume_keys_inverted" + const val webtoonMarginRatio = "margin_ratio" + const val portraitColumns = "pref_library_columns_portrait_key" const val landscapeColumns = "pref_library_columns_landscape_key" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index 68e6371ee..bb5be1c25 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -79,6 +79,8 @@ class PreferencesHelper(val context: Context) { fun readWithVolumeKeysInverted() = rxPrefs.getBoolean(Keys.readWithVolumeKeysInverted, false) + fun marginRatio() = rxPrefs.getInteger(Keys.webtoonMarginRatio, 0) + fun portraitColumns() = rxPrefs.getInteger(Keys.portraitColumns, 0) fun landscapeColumns() = rxPrefs.getInteger(Keys.landscapeColumns, 0) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderSettingsSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderSettingsSheet.kt index b798f3b49..5f88b26fa 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderSettingsSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderSettingsSheet.kt @@ -82,6 +82,7 @@ class ReaderSettingsSheet(private val activity: ReaderActivity) : BottomSheetDia private fun initWebtoonPreferences() { webtoon_prefs_group.visible() crop_borders_webtoon.bindToPreference(preferences.cropBordersWebtoon()) + margin_ratio_webtoon.bindToPreference(preferences.marginRatio()) } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt index 7ac8a220a..31ca89323 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt @@ -34,6 +34,9 @@ class WebtoonConfig(preferences: PreferencesHelper = Injekt.get()) { var doubleTapAnimDuration = 500 private set + var marginRatio = 0f + private set + init { preferences.readWithTapping() .register({ tappingEnabled = it }) @@ -52,6 +55,23 @@ class WebtoonConfig(preferences: PreferencesHelper = Injekt.get()) { preferences.readWithVolumeKeysInverted() .register({ volumeKeysInverted = it }) + + preferences.marginRatio() + .register({ marginFromPreference(it) }, { imagePropertyChangedListener?.invoke() }) + } + + private fun marginFromPreference(position: Int) { + marginRatio = when (position) { + 1 -> PageMargin.TEN_PERCENT + 2 -> PageMargin.TWENTY_FIVE_PERCENT + else -> PageMargin.NO_MARGIN + } + } + + object PageMargin { + const val NO_MARGIN = 0f + const val TEN_PERCENT = 0.1f + const val TWENTY_FIVE_PERCENT = 0.25f } fun unsubscribe() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt index 754dbb7e1..34fb025d4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt @@ -2,11 +2,13 @@ package eu.kanade.tachiyomi.ui.reader.viewer.webtoon import android.annotation.SuppressLint import android.content.Intent +import android.content.res.Resources import android.graphics.drawable.Drawable import android.net.Uri import android.support.v7.widget.AppCompatButton import android.support.v7.widget.AppCompatImageView import android.view.Gravity +import android.view.View import android.view.ViewGroup import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT @@ -111,7 +113,7 @@ class WebtoonPageHolder( private var readImageHeaderSubscription: Subscription? = null init { - frame.layoutParams = FrameLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT) + refreshLayoutParams() } /** @@ -120,6 +122,15 @@ class WebtoonPageHolder( fun bind(page: ReaderPage) { this.page = page observeStatus() + refreshLayoutParams() + } + + private fun refreshLayoutParams() { + frame.layoutParams = FrameLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT).apply { + val margin = Resources.getSystem().displayMetrics.widthPixels * viewer.config.marginRatio + marginEnd = margin.toInt() + marginStart = margin.toInt() + } } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt index 6adee83c2..a2cb85597 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt @@ -110,6 +110,8 @@ class WebtoonViewer(val activity: ReaderActivity) : BaseViewer { frame.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT) frame.addView(recycler) + + config.imagePropertyChangedListener = { adapter.notifyDataSetChanged() } } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/PreferenceDSL.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/PreferenceDSL.kt index 6fc05d1af..138ebf76e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/PreferenceDSL.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/PreferenceDSL.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.setting import android.support.graphics.drawable.VectorDrawableCompat import android.support.v4.graphics.drawable.DrawableCompat import android.support.v7.preference.* +import eu.kanade.tachiyomi.widget.preference.FloatListPreference import eu.kanade.tachiyomi.widget.preference.IntListPreference @DslMarker @@ -37,6 +38,10 @@ inline fun PreferenceGroup.intListPreference(block: (@DSL IntListPreference).() 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 { return initThenAdd(MultiSelectListPreference(context), block).also(::initDialog) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt index ae59d13f1..e5958fdac 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt @@ -112,6 +112,16 @@ class SettingsReaderController : SettingsController() { titleRes = R.string.pref_crop_borders defaultValue = false } + + floatListPreference { + key = Keys.webtoonMarginRatio + titleRes = R.string.pref_reader_theme + entriesRes = arrayOf(R.string.webtoon_margin_ratio_0, + R.string.webtoon_margin_ratio_10, R.string.webtoon_margin_ratio_25) + entryValues = arrayOf("0", "1", "2") + defaultValue = "0" + summary = "%s" + } } preferenceCategory { titleRes = R.string.pref_reader_navigation diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/FloatListPreference.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/FloatListPreference.kt new file mode 100644 index 000000000..fb7d66e63 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/FloatListPreference.kt @@ -0,0 +1,26 @@ +package eu.kanade.tachiyomi.widget.preference + +import android.content.Context +import android.support.v7.preference.ListPreference +import android.util.AttributeSet + +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 + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/reader_settings_sheet.xml b/app/src/main/res/layout/reader_settings_sheet.xml index d28155d70..12435ba18 100644 --- a/app/src/main/res/layout/reader_settings_sheet.xml +++ b/app/src/main/res/layout/reader_settings_sheet.xml @@ -240,6 +240,25 @@ android:textColor="?android:attr/textColorSecondary" app:layout_constraintTop_toBottomOf="@id/webtoon_prefs" /> + + + + + app:constraint_referenced_ids="webtoon_prefs,crop_borders_webtoon,margin_ratio_text,margin_ratio_webtoon" /> @string/scale_type_smart_fit + + @string/webtoon_margin_ratio_0 + @string/webtoon_margin_ratio_10 + @string/webtoon_margin_ratio_25 + + 1 2 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f72686b4f..a42e9d4ed 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -196,6 +196,7 @@ Tapping Long tap dialog Background color + Margin ratio White Black Default viewer @@ -230,6 +231,9 @@ G B A + No margin + 10% + 25%