From edb91c46d4ea86a2c80d0c2f1e4832588247d3e4 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 9 Aug 2023 14:50:52 +0300 Subject: [PATCH] Option to disable pages animation #406 --- app/src/main/AndroidManifest.xml | 3 --- .../koitharu/kotatsu/core/prefs/AppSettings.kt | 6 +++--- .../kotatsu/core/prefs/ReaderAnimation.kt | 7 +++++++ .../org/koitharu/kotatsu/core/prefs/ReaderMode.kt | 4 ++-- .../koitharu/kotatsu/reader/ui/ReaderViewModel.kt | 2 +- .../kotatsu/reader/ui/pager/BaseReaderFragment.kt | 6 ++++++ .../ui/pager/reversed/ReversedReaderFragment.kt | 15 ++++++++++----- .../ui/pager/standard/NoAnimPageTransformer.kt | 15 +++++++++++++++ .../ui/pager/standard/PagerReaderFragment.kt | 14 +++++++++----- .../ui/pager/webtoon/WebtoonReaderFragment.kt | 3 +-- .../kotatsu/settings/ReaderSettingsFragment.kt | 5 +++++ app/src/main/res/values/arrays.xml | 6 ++++++ app/src/main/res/xml/pref_reader.xml | 6 ++++++ 13 files changed, 71 insertions(+), 21 deletions(-) create mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/ReaderAnimation.kt create mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/NoAnimPageTransformer.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b8261310b..fb16c29d8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -166,9 +166,6 @@ - : BaseFragment() { "Adapter was not created or already destroyed" } + protected fun isAnimationEnabled(): Boolean { + return context?.isAnimationsEnabled == true && viewModel.pageAnimation.value != ReaderAnimation.NONE + } + override fun onWindowInsetsChanged(insets: Insets) = Unit abstract fun switchPageBy(delta: Int) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt index beed525cd..73a7f1107 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/reversed/ReversedReaderFragment.kt @@ -11,8 +11,8 @@ import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.yield import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.os.NetworkState +import org.koitharu.kotatsu.core.prefs.ReaderAnimation import org.koitharu.kotatsu.core.util.ext.doOnPageChanged -import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled import org.koitharu.kotatsu.core.util.ext.observe import org.koitharu.kotatsu.core.util.ext.recyclerView import org.koitharu.kotatsu.core.util.ext.resetTransformations @@ -22,6 +22,7 @@ import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.reader.ui.pager.BaseReaderAdapter import org.koitharu.kotatsu.reader.ui.pager.BaseReaderFragment import org.koitharu.kotatsu.reader.ui.pager.ReaderPage +import org.koitharu.kotatsu.reader.ui.pager.standard.NoAnimPageTransformer import org.koitharu.kotatsu.reader.ui.pager.standard.PagerReaderFragment import javax.inject.Inject import kotlin.math.absoluteValue @@ -48,8 +49,12 @@ class ReversedReaderFragment : BaseReaderFragment doOnPageChanged(::notifyPageChanged) } - viewModel.readerAnimation.observe(viewLifecycleOwner) { - val transformer = if (it) ReversedPageAnimTransformer() else null + viewModel.pageAnimation.observe(viewLifecycleOwner) { + val transformer = when (it) { + ReaderAnimation.NONE -> NoAnimPageTransformer() + ReaderAnimation.DEFAULT -> null + ReaderAnimation.ADVANCED -> ReversedPageAnimTransformer() + } binding.pager.setPageTransformer(transformer) if (transformer == null) { binding.pager.recyclerView?.children?.forEach { v -> @@ -74,7 +79,7 @@ class ReversedReaderFragment : BaseReaderFragment override fun switchPageBy(delta: Int) { with(requireViewBinding().pager) { - setCurrentItem(currentItem - delta, context.isAnimationsEnabled) + setCurrentItem(currentItem - delta, isAnimationEnabled()) } } @@ -82,7 +87,7 @@ class ReversedReaderFragment : BaseReaderFragment with(requireViewBinding().pager) { setCurrentItem( reversed(position), - smooth && context.isAnimationsEnabled && (currentItem - position).absoluteValue < PagerReaderFragment.SMOOTH_SCROLL_LIMIT, + smooth && isAnimationEnabled() && (currentItem - position).absoluteValue < PagerReaderFragment.SMOOTH_SCROLL_LIMIT, ) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/NoAnimPageTransformer.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/NoAnimPageTransformer.kt new file mode 100644 index 000000000..2ce4317a1 --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/NoAnimPageTransformer.kt @@ -0,0 +1,15 @@ +package org.koitharu.kotatsu.reader.ui.pager.standard + +import android.view.View +import androidx.viewpager2.widget.ViewPager2 + +class NoAnimPageTransformer : ViewPager2.PageTransformer { + + override fun transformPage(page: View, position: Float) { + page.translationX = when { + position in -0.5f..0.5f -> -position * page.width.toFloat() + position > 0 -> page.width.toFloat() + else -> -page.width.toFloat() + } + } +} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt index a9c656113..5d5c7f6a5 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/standard/PagerReaderFragment.kt @@ -11,8 +11,8 @@ import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.yield import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.os.NetworkState +import org.koitharu.kotatsu.core.prefs.ReaderAnimation import org.koitharu.kotatsu.core.util.ext.doOnPageChanged -import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled import org.koitharu.kotatsu.core.util.ext.observe import org.koitharu.kotatsu.core.util.ext.recyclerView import org.koitharu.kotatsu.core.util.ext.resetTransformations @@ -47,8 +47,12 @@ class PagerReaderFragment : BaseReaderFragment() doOnPageChanged(::notifyPageChanged) } - viewModel.readerAnimation.observe(viewLifecycleOwner) { - val transformer = if (it) PageAnimTransformer() else null + viewModel.pageAnimation.observe(viewLifecycleOwner) { + val transformer = when (it) { + ReaderAnimation.NONE -> NoAnimPageTransformer() + ReaderAnimation.DEFAULT -> null + ReaderAnimation.ADVANCED -> PageAnimTransformer() + } binding.pager.setPageTransformer(transformer) if (transformer == null) { binding.pager.recyclerView?.children?.forEach { view -> @@ -95,7 +99,7 @@ class PagerReaderFragment : BaseReaderFragment() override fun switchPageBy(delta: Int) { with(requireViewBinding().pager) { - setCurrentItem(currentItem + delta, context.isAnimationsEnabled) + setCurrentItem(currentItem + delta, isAnimationEnabled()) } } @@ -103,7 +107,7 @@ class PagerReaderFragment : BaseReaderFragment() with(requireViewBinding().pager) { setCurrentItem( position, - smooth && context.isAnimationsEnabled && (currentItem - position).absoluteValue < SMOOTH_SCROLL_LIMIT, + smooth && isAnimationEnabled() && (currentItem - position).absoluteValue < SMOOTH_SCROLL_LIMIT, ) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt index 78836411a..789f3cc02 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/webtoon/WebtoonReaderFragment.kt @@ -13,7 +13,6 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.os.NetworkState import org.koitharu.kotatsu.core.util.ext.findCenterViewPosition import org.koitharu.kotatsu.core.util.ext.firstVisibleItemPosition -import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled import org.koitharu.kotatsu.core.util.ext.observe import org.koitharu.kotatsu.databinding.FragmentReaderWebtoonBinding import org.koitharu.kotatsu.reader.domain.PageLoader @@ -111,7 +110,7 @@ class WebtoonReaderFragment : BaseReaderFragment() override fun switchPageBy(delta: Int) { with(requireViewBinding().recyclerView) { - if (context.isAnimationsEnabled) { + if (isAnimationEnabled()) { smoothScrollBy(0, (height * 0.9).toInt() * delta, scrollInterpolator) } else { nestedScrollBy(0, (height * 0.9).toInt() * delta) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt index fe59043eb..a605cb80f 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/ReaderSettingsFragment.kt @@ -10,6 +10,7 @@ import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.ZoomMode import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.prefs.ReaderAnimation import org.koitharu.kotatsu.core.prefs.ReaderBackground import org.koitharu.kotatsu.core.prefs.ReaderMode import org.koitharu.kotatsu.core.ui.BasePreferenceFragment @@ -32,6 +33,10 @@ class ReaderSettingsFragment : entryValues = ReaderBackground.entries.names() setDefaultValueCompat(ReaderBackground.DEFAULT.name) } + findPreference(AppSettings.KEY_READER_ANIMATION)?.run { + entryValues = ReaderAnimation.entries.names() + setDefaultValueCompat(ReaderAnimation.DEFAULT.name) + } findPreference(AppSettings.KEY_READER_SWITCHERS)?.run { summaryProvider = MultiSummaryProvider(R.string.gestures_only) } diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 0b8af4d99..9969d64b1 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -65,4 +65,10 @@ @string/color_white @string/color_black + + @string/disabled + @string/system_default + @string/advanced + + Advanced diff --git a/app/src/main/res/xml/pref_reader.xml b/app/src/main/res/xml/pref_reader.xml index 9cb6dc6c4..e8cddffa9 100644 --- a/app/src/main/res/xml/pref_reader.xml +++ b/app/src/main/res/xml/pref_reader.xml @@ -42,6 +42,12 @@ android:summary="@string/reader_control_ltr_summary" android:title="@string/reader_control_ltr" /> + +