From fc2ab3f79539d985c8aa6155cda5e67468551efb Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 23 Apr 2024 09:23:19 +0300 Subject: [PATCH] Bring back reader slider --- .../kotatsu/reader/ui/ReaderActivity.kt | 40 ++++++---- .../reader/ui/ReaderBottomMenuProvider.kt | 77 +------------------ .../kotatsu/reader/ui/ReaderInfoBarView.kt | 8 +- .../kotatsu/reader/ui/pager/ReaderUiState.kt | 28 ------- app/src/main/res/drawable/ic_slider.xml | 11 --- .../layout-w600dp-land/activity_reader.xml | 9 +++ app/src/main/res/layout/activity_reader.xml | 25 +++++- app/src/main/res/menu/opt_reader_bottom.xml | 12 +-- 8 files changed, 63 insertions(+), 147 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_slider.xml diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index 98d231a81..67407a1ff 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -45,9 +45,11 @@ import org.koitharu.kotatsu.core.util.IdlingDetector import org.koitharu.kotatsu.core.util.ShareHelper import org.koitharu.kotatsu.core.util.ext.hasGlobalPoint import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled +import org.koitharu.kotatsu.core.util.ext.isRtl import org.koitharu.kotatsu.core.util.ext.observe import org.koitharu.kotatsu.core.util.ext.observeEvent import org.koitharu.kotatsu.core.util.ext.postDelayed +import org.koitharu.kotatsu.core.util.ext.setValueRounded import org.koitharu.kotatsu.core.util.ext.zipWithPrevious import org.koitharu.kotatsu.databinding.ActivityReaderBinding import org.koitharu.kotatsu.details.ui.DetailsActivity @@ -103,7 +105,6 @@ class ReaderActivity : private var gestureInsets: Insets = Insets.NONE private lateinit var readerManager: ReaderManager private val hideUiRunnable = Runnable { setUiIsVisible(false) } - private lateinit var bottomMenuProvider: ReaderBottomMenuProvider override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -113,8 +114,9 @@ class ReaderActivity : touchHelper = TapGridDispatcher(this, this) scrollTimer = scrollTimerFactory.create(this, this) controlDelegate = ReaderControlDelegate(resources, settings, tapGridSettings, this) - bottomMenuProvider = ReaderBottomMenuProvider(this, readerManager, viewModel, this) + viewBinding.slider.setLabelFormatter(PageLabelFormatter()) viewBinding.zoomControl.listener = this + ReaderSliderListener(viewModel, this).attachToSlider(viewBinding.slider) insetsDelegate.interceptingWindowInsetsListener = this idlingDetector.bindToLifecycle(this) @@ -153,8 +155,7 @@ class ReaderActivity : viewBinding.zoomControl.isVisible = it } addMenuProvider(ReaderTopMenuProvider(this, viewModel)) - viewBinding.toolbarBottom.addMenuProvider(bottomMenuProvider) - onBackPressedDispatcher.addCallback(bottomMenuProvider) + viewBinding.toolbarBottom.addMenuProvider(ReaderBottomMenuProvider(this, readerManager, viewModel)) } override fun onActivityResult(result: Uri?) { @@ -196,9 +197,10 @@ class ReaderActivity : if (readerManager.currentMode != mode) { readerManager.replace(mode) } - if (viewBinding.appbarTop.isVisible && !bottomMenuProvider.isSliderExpanded()) { + if (viewBinding.appbarTop.isVisible) { lifecycle.postDelayed(TimeUnit.SECONDS.toMillis(1), hideUiRunnable) } + viewBinding.slider.isRtl = mode == ReaderMode.REVERSED } private fun onLoadingStateChanged(isLoading: Boolean) { @@ -210,7 +212,6 @@ class ReaderActivity : viewBinding.toastView.hide() } viewBinding.toolbarBottom.invalidateMenu() - invalidateMenu() } override fun onGridTouch(area: TapGridArea): Boolean { @@ -328,9 +329,6 @@ class ReaderActivity : viewBinding.infoBar.isGone = isUiVisible || (!viewModel.isInfoBarEnabled.value) viewBinding.infoBar.isTimeVisible = isFullscreen systemUiController.setSystemUiVisible(isUiVisible || !isFullscreen) - if (!isUiVisible) { - bottomMenuProvider.collapseSlider() - } } } @@ -396,20 +394,28 @@ class ReaderActivity : private fun onUiStateChanged(pair: Pair) { val (previous: ReaderUiState?, uiState: ReaderUiState?) = pair title = uiState?.mangaName ?: getString(R.string.loading_) - supportActionBar?.subtitle = uiState?.chapterName - with(viewBinding.toolbarBottom) { - title = uiState?.resolveSummary(context) - subtitle = uiState?.resolveSubtitle(context) - } viewBinding.infoBar.update(uiState) - if (!bottomMenuProvider.updateState(uiState)) { - viewBinding.toolbarBottom.invalidateMenu() + if (uiState == null) { + supportActionBar?.subtitle = null + viewBinding.slider.isVisible = false + return } - if (uiState != null && previous?.chapterName != null && uiState.chapterName != previous.chapterName) { + supportActionBar?.subtitle = when { + uiState.incognito -> getString(R.string.incognito_mode) + else -> uiState.chapterName + } + if (previous?.chapterName != null && uiState.chapterName != previous.chapterName) { if (!uiState.chapterName.isNullOrEmpty()) { viewBinding.toastView.showTemporary(uiState.chapterName, TOAST_DURATION) } } + if (uiState.isSliderAvailable()) { + viewBinding.slider.valueTo = uiState.totalPages.toFloat() - 1 + viewBinding.slider.setValueRounded(uiState.currentPage.toFloat()) + viewBinding.slider.isVisible = true + } else { + viewBinding.slider.isVisible = false + } } class IntentBuilder(context: Context) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderBottomMenuProvider.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderBottomMenuProvider.kt index 5cdee3e18..e2101196e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderBottomMenuProvider.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderBottomMenuProvider.kt @@ -3,29 +3,17 @@ package org.koitharu.kotatsu.reader.ui import android.view.Menu import android.view.MenuInflater import android.view.MenuItem -import androidx.activity.OnBackPressedCallback import androidx.core.view.MenuProvider import androidx.fragment.app.FragmentActivity -import com.google.android.material.slider.LabelFormatter -import com.google.android.material.slider.Slider import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.prefs.ReaderMode -import org.koitharu.kotatsu.core.util.ext.isRtl -import org.koitharu.kotatsu.core.util.ext.setValueRounded import org.koitharu.kotatsu.details.ui.pager.ChaptersPagesSheet import org.koitharu.kotatsu.reader.ui.config.ReaderConfigSheet -import org.koitharu.kotatsu.reader.ui.pager.ReaderUiState -import org.koitharu.kotatsu.settings.SettingsActivity -import java.lang.ref.WeakReference class ReaderBottomMenuProvider( private val activity: FragmentActivity, private val readerManager: ReaderManager, private val viewModel: ReaderViewModel, - private val callback: ReaderNavigationCallback, -) : OnBackPressedCallback(false), MenuProvider, MenuItem.OnActionExpandListener { - - private var expandedItemRef: WeakReference? = null +) : MenuProvider { override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.opt_reader_bottom, menu) @@ -33,31 +21,12 @@ class ReaderBottomMenuProvider( } override fun onPrepareMenu(menu: Menu) { - val shouldExpandSlider = expandedItemRef != null - val hasPages = viewModel.content.value.pages.isNotEmpty() menu.findItem(R.id.action_pages_thumbs).isVisible = hasPages - - menu.findItem(R.id.action_slider)?.run { - val state = viewModel.uiState.value?.takeIf { it.isSliderAvailable() } - isVisible = state != null - setOnActionExpandListener(this@ReaderBottomMenuProvider) - if (state != null) { - (actionView as? Slider)?.setupPagesSlider(state) - } - if (shouldExpandSlider) { - expandActionView() - } - } } override fun onMenuItemSelected(menuItem: MenuItem): Boolean { return when (menuItem.itemId) { - R.id.action_settings -> { - activity.startActivity(SettingsActivity.newReaderSettingsIntent(activity)) - true - } - R.id.action_pages_thumbs -> { ChaptersPagesSheet.show(activity.supportFragmentManager, ChaptersPagesSheet.TAB_PAGES) true @@ -73,48 +42,4 @@ class ReaderBottomMenuProvider( else -> false } } - - override fun handleOnBackPressed() { - expandedItemRef?.get()?.collapseActionView() - } - - override fun onMenuItemActionExpand(item: MenuItem): Boolean { - expandedItemRef = WeakReference(item) - isEnabled = true - return true - } - - override fun onMenuItemActionCollapse(item: MenuItem): Boolean { - expandedItemRef = null - isEnabled = false - return true - } - - fun collapseSlider() { - expandedItemRef?.get()?.collapseActionView() - } - - fun isSliderExpanded(): Boolean { - return expandedItemRef?.get()?.isActionViewExpanded == true - } - - fun updateState(state: ReaderUiState?): Boolean { - if (state == null || !state.isSliderAvailable()) { - return false - } - val slider = (expandedItemRef?.get()?.actionView as? Slider) ?: return false - slider.valueTo = state.totalPages.toFloat() - 1 - slider.setValueRounded(state.currentPage.toFloat()) - return true - } - - private fun Slider.setupPagesSlider(state: ReaderUiState) { - isRtl = viewModel.readerMode.value == ReaderMode.REVERSED - valueTo = state.totalPages.toFloat() - 1 - setValueRounded(state.currentPage.toFloat()) - labelBehavior = LabelFormatter.LABEL_FLOATING - isTickVisible = true - setLabelFormatter(PageLabelFormatter()) - ReaderSliderListener(viewModel, callback).attachToSlider(this) - } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderInfoBarView.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderInfoBarView.kt index 01f6488a6..7d590311d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderInfoBarView.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderInfoBarView.kt @@ -169,7 +169,13 @@ class ReaderInfoBarView @JvmOverloads constructor( fun update(state: ReaderUiState?) { text = if (state != null) { - state.resolveSummary(context) + if (state.percent in 0f..1f) { + context.getString( + R.string.reader_info_pattern, + state.chapterNumber, + state.chaptersTotal, + state.currentPage + 1, + state.totalPages, + ) + if (state.percent in 0f..1f) { " " + context.getString(R.string.percent_string_pattern, (state.percent * 100).format()) } else { "" diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/ReaderUiState.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/ReaderUiState.kt index 3c5766dcb..f4de7734b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/ReaderUiState.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/pager/ReaderUiState.kt @@ -1,9 +1,5 @@ package org.koitharu.kotatsu.reader.ui.pager -import android.content.Context -import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.parsers.util.format - data class ReaderUiState( val mangaName: String?, val branch: String?, @@ -20,28 +16,4 @@ data class ReaderUiState( fun isSliderAvailable(): Boolean { return isSliderEnabled && totalPages > 1 && currentPage < totalPages } - - fun resolveSubtitle(context: Context): String? { - val firstPart = branch - val secondPart = if (incognito) { - context.getString(R.string.incognito_mode) - } else if (percent in 0f..1f) { - context.getString(R.string.percent_string_pattern, (percent * 100).format()) - } else { - null - } - return if (firstPart != null && secondPart != null) { - context.getString(R.string.download_summary_pattern, firstPart, secondPart) - } else { - firstPart ?: secondPart - } - } - - fun resolveSummary(context: Context) = context.getString( - R.string.reader_info_pattern, - chapterNumber, - chaptersTotal, - currentPage + 1, - totalPages, - ) } diff --git a/app/src/main/res/drawable/ic_slider.xml b/app/src/main/res/drawable/ic_slider.xml deleted file mode 100644 index cfef5e738..000000000 --- a/app/src/main/res/drawable/ic_slider.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/app/src/main/res/layout-w600dp-land/activity_reader.xml b/app/src/main/res/layout-w600dp-land/activity_reader.xml index 939771332..e6c8c5317 100644 --- a/app/src/main/res/layout-w600dp-land/activity_reader.xml +++ b/app/src/main/res/layout-w600dp-land/activity_reader.xml @@ -60,6 +60,15 @@ android:layout_weight="1" tools:menu="@menu/opt_reader_bottom"> + + diff --git a/app/src/main/res/layout/activity_reader.xml b/app/src/main/res/layout/activity_reader.xml index a6fcad57f..0a5900531 100644 --- a/app/src/main/res/layout/activity_reader.xml +++ b/app/src/main/res/layout/activity_reader.xml @@ -65,7 +65,20 @@ android:id="@+id/toolbar_bottom" android:layout_width="match_parent" android:layout_height="wrap_content" - tools:menu="@menu/opt_reader_bottom" /> + tools:menu="@menu/opt_reader_bottom"> + + + + @@ -88,8 +101,12 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" + android:background="@drawable/bg_card" + android:backgroundTint="?colorBackgroundFloating" android:gravity="center_horizontal" - android:orientation="vertical"> + android:orientation="vertical" + android:outlineProvider="background" + android:padding="@dimen/screen_padding"> + android:textAppearance="?attr/textAppearanceTitleMedium" /> diff --git a/app/src/main/res/menu/opt_reader_bottom.xml b/app/src/main/res/menu/opt_reader_bottom.xml index 6d93bbe85..21b800716 100644 --- a/app/src/main/res/menu/opt_reader_bottom.xml +++ b/app/src/main/res/menu/opt_reader_bottom.xml @@ -5,15 +5,6 @@ xmlns:tools="http://schemas.android.com/tools" tools:ignore="AlwaysShowAction"> - - + app:showAsAction="always" + tools:visible="true" />