From 7fc73ddcdcb35f616b7a0e421e3e86bcc47358be Mon Sep 17 00:00:00 2001 From: Ahmad Ansori Palembani Date: Sun, 18 Aug 2024 10:10:21 +0700 Subject: [PATCH] feat: Toggle for double tap to zoom Closes GH-161 --- CHANGELOG.md | 1 + .../ui/reader/settings/ReaderPagedView.kt | 7 ++--- .../ui/reader/viewer/webtoon/WebtoonConfig.kt | 10 +++++++ .../ui/reader/viewer/webtoon/WebtoonFrame.kt | 7 +++++ .../viewer/webtoon/WebtoonRecyclerView.kt | 3 ++- .../ui/reader/viewer/webtoon/WebtoonViewer.kt | 8 ++++-- .../controllers/SettingsReaderController.kt | 20 +++++++------- .../domain/ui/settings/ReaderPreferences.kt | 2 ++ .../main/res/layout/reader_paged_layout.xml | 26 ++++++++++++------- .../moko-resources/base/strings.xml | 1 + 10 files changed, 60 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b4658b361..7ecfa5d19b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ --> ## Additions - Add toggle to enable/disable chapter swipe action(s) +- Add toggle to enable/disable webtoon double tap to zoom ## Fixes - Fixed chapter number parsing (@Naputt1) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/settings/ReaderPagedView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/settings/ReaderPagedView.kt index cbeed00cc1..1bd6d2102d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/settings/ReaderPagedView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/settings/ReaderPagedView.kt @@ -7,15 +7,14 @@ import android.util.AttributeSet import androidx.core.view.isVisible import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import eu.kanade.tachiyomi.R -import yokai.i18n.MR -import yokai.util.lang.getString -import dev.icerock.moko.resources.compose.stringResource import eu.kanade.tachiyomi.databinding.ReaderPagedLayoutBinding import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.util.bindToPreference import eu.kanade.tachiyomi.util.lang.addBetaTag import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.widget.BaseReaderSettingsView +import yokai.i18n.MR +import yokai.util.lang.getString class ReaderPagedView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : BaseReaderSettingsView(context, attrs) { @@ -61,6 +60,7 @@ class ReaderPagedView @JvmOverloads constructor(context: Context, attrs: Attribu R.array.webtoon_side_padding_values, ) webtoonEnableZoomOut.bindToPreference(preferences.webtoonEnableZoomOut()) + webtoonEnableDoubleTapZoom.bindToPreference(readerPreferences.webtoonDoubleTapZoomEnabled()) webtoonNav.bindToPreference(preferences.navigationModeWebtoon()) webtoonInvert.bindToPreference(preferences.webtoonNavInverted()) webtoonPageLayout.bindToPreference(preferences.webtoonPageLayout()) @@ -94,6 +94,7 @@ class ReaderPagedView @JvmOverloads constructor(context: Context, attrs: Attribu binding.cropBordersWebtoon, binding.webtoonSidePadding, binding.webtoonEnableZoomOut, + binding.webtoonEnableDoubleTapZoom, binding.webtoonNav, binding.webtoonInvert, binding.webtoonPageLayout, 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 b0e498214e..2df276e271 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 @@ -16,6 +16,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import yokai.domain.ui.settings.ReaderPreferences /** * Configuration used by webtoon viewers. @@ -23,6 +24,7 @@ import uy.kohesive.injekt.api.get class WebtoonConfig( scope: CoroutineScope, preferences: PreferencesHelper = Injekt.get(), + readerPreferences: ReaderPreferences = Injekt.get(), ) : ViewerConfig(preferences, scope) { var webtoonCropBorders = false @@ -39,6 +41,11 @@ class WebtoonConfig( var zoomPropertyChangedListener: ((Boolean) -> Unit)? = null + var doubleTapZoom = true + private set + + var doubleTapZoomChangedListener: ((Boolean) -> Unit)? = null + var splitPages = preferences.webtoonPageLayout().get() == PageLayout.SPLIT_PAGES.webtoonValue var invertDoublePages = false @@ -79,6 +86,9 @@ class WebtoonConfig( preferences.webtoonEnableZoomOut() .register({ enableZoomOut = it }, { zoomPropertyChangedListener?.invoke(it) }) + readerPreferences.webtoonDoubleTapZoomEnabled() + .register({ doubleTapZoom = it }, { doubleTapZoomChangedListener?.invoke(it) }) + preferences.webtoonPageLayout() .register( { splitPages = it == PageLayout.SPLIT_PAGES.webtoonValue }, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonFrame.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonFrame.kt index e868c8ee58..05691c9066 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonFrame.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonFrame.kt @@ -31,6 +31,13 @@ class WebtoonFrame(context: Context) : FrameLayout(context) { recycler?.canZoomOut = value } + var doubleTapZoom = true + set(value) { + field = value + recycler?.doubleTapZoom = value + scaleDetector.isQuickScaleEnabled = value + } + /** * Recycler view added in this frame. */ diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt index 6c1fe20ad2..35011cbbd4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt @@ -40,6 +40,7 @@ open class WebtoonRecyclerView @JvmOverloads constructor( zoom(currentScale, DEFAULT_RATE, x, 0f, y, 0f) } } + var doubleTapZoom = true private val minRate get() = if (canZoomOut) MIN_RATE else DEFAULT_RATE @@ -231,7 +232,7 @@ open class WebtoonRecyclerView @JvmOverloads constructor( } fun onDoubleTapConfirmed(ev: MotionEvent) { - if (!isZooming) { + if (!isZooming && doubleTapZoom) { if (scaleX != DEFAULT_RATE) { zoom(currentScale, DEFAULT_RATE, x, 0f, y, 0f) } else { 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 7ce22f486f..5374755cc3 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 @@ -19,11 +19,11 @@ import eu.kanade.tachiyomi.ui.reader.model.ReaderPage import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters import eu.kanade.tachiyomi.ui.reader.viewer.BaseViewer import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation +import kotlin.math.max +import kotlin.math.min import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel import uy.kohesive.injekt.injectLazy -import kotlin.math.max -import kotlin.math.min /** * Implementation of a [BaseViewer] to display pages with a [RecyclerView]. @@ -139,6 +139,10 @@ class WebtoonViewer(val activity: ReaderActivity, val hasMargins: Boolean = fals frame.enableZoomOut = it } + config.doubleTapZoomChangedListener = { + frame.doubleTapZoom = it + } + config.navigationModeChangedListener = { val showOnStart = config.navigationOverlayForNewUser activity.binding.navigationOverlay.setNavigation(config.navigator, showOnStart) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/controllers/SettingsReaderController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/controllers/SettingsReaderController.kt index 3a1c4af87f..7839ef5027 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/controllers/SettingsReaderController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/controllers/SettingsReaderController.kt @@ -4,9 +4,6 @@ import android.content.ComponentName import android.content.Intent import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.R -import yokai.i18n.MR -import yokai.util.lang.getString -import dev.icerock.moko.resources.compose.stringResource import eu.kanade.tachiyomi.data.preference.PreferenceValues import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.ui.reader.settings.OrientationType @@ -25,9 +22,7 @@ import eu.kanade.tachiyomi.ui.setting.multiSelectListPreferenceMat import eu.kanade.tachiyomi.ui.setting.onClick import eu.kanade.tachiyomi.ui.setting.preference import eu.kanade.tachiyomi.ui.setting.preferenceCategory -import eu.kanade.tachiyomi.ui.setting.summaryMRes as summaryRes import eu.kanade.tachiyomi.ui.setting.switchPreference -import eu.kanade.tachiyomi.ui.setting.titleMRes as titleRes import eu.kanade.tachiyomi.util.lang.addBetaTag import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.isTablet @@ -36,7 +31,11 @@ import uy.kohesive.injekt.injectLazy import yokai.domain.ui.settings.ReaderPreferences import yokai.domain.ui.settings.ReaderPreferences.CutoutBehaviour import yokai.domain.ui.settings.ReaderPreferences.LandscapeCutoutBehaviour +import yokai.i18n.MR +import yokai.util.lang.getString import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys +import eu.kanade.tachiyomi.ui.setting.summaryMRes as summaryRes +import eu.kanade.tachiyomi.ui.setting.titleMRes as titleRes class SettingsReaderController : SettingsLegacyController() { @@ -375,15 +374,18 @@ class SettingsReaderController : SettingsLegacyController() { } switchPreference { - key = Keys.webtoonInvertDoublePages + bindTo(preferences.webtoonInvertDoublePages()) titleRes = MR.strings.invert_double_pages - defaultValue = false } switchPreference { - key = Keys.webtoonEnableZoomOut + bindTo(preferences.webtoonEnableZoomOut()) titleRes = MR.strings.enable_zoom_out - defaultValue = false + } + + switchPreference { + bindTo(readerPreferences.webtoonDoubleTapZoomEnabled()) + titleRes = MR.strings.pref_double_tap_zoom } } preferenceCategory { diff --git a/app/src/main/java/yokai/domain/ui/settings/ReaderPreferences.kt b/app/src/main/java/yokai/domain/ui/settings/ReaderPreferences.kt index bd1479c192..ad9370fd19 100644 --- a/app/src/main/java/yokai/domain/ui/settings/ReaderPreferences.kt +++ b/app/src/main/java/yokai/domain/ui/settings/ReaderPreferences.kt @@ -43,4 +43,6 @@ class ReaderPreferences(private val preferenceStore: PreferenceStore) { } } } + + fun webtoonDoubleTapZoomEnabled() = preferenceStore.getBoolean("pref_enable_double_tap_zoom_webtoon", true) } diff --git a/app/src/main/res/layout/reader_paged_layout.xml b/app/src/main/res/layout/reader_paged_layout.xml index 25728a8c3b..b04196c3e7 100644 --- a/app/src/main/res/layout/reader_paged_layout.xml +++ b/app/src/main/res/layout/reader_paged_layout.xml @@ -1,12 +1,11 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/filter_bottom_sheet" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/bottom_sheet_rounded_background" + android:clipToPadding="false"> + android:textColor="?attr/colorOnBackground" /> + + - \ No newline at end of file + diff --git a/i18n/src/commonMain/moko-resources/base/strings.xml b/i18n/src/commonMain/moko-resources/base/strings.xml index 65a3262b5b..92872c10e2 100644 --- a/i18n/src/commonMain/moko-resources/base/strings.xml +++ b/i18n/src/commonMain/moko-resources/base/strings.xml @@ -511,6 +511,7 @@ Low Lowest Custom display profile + Double tap to zoom About this %1$s