From f9baa4a8adffa27b3f926738a18a61a045009c44 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 20 Jul 2022 15:03:17 +0300 Subject: [PATCH] Reader options bs --- .../kotatsu/reader/ui/ReaderActivity.kt | 19 +-- .../kotatsu/reader/ui/ReaderConfigDialog.kt | 3 +- .../ui/config/ReaderConfigBottomSheet.kt | 130 ++++++++++++++++++ .../main/res/drawable/ic_read_reversed.xml | 11 -- app/src/main/res/drawable/ic_reader_ltr.xml | 12 ++ app/src/main/res/drawable/ic_reader_rtl.xml | 12 ++ .../res/layout-w600dp/activity_reader.xml | 96 +++++++++++++ app/src/main/res/layout/activity_reader.xml | 1 - .../main/res/layout/dialog_reader_config.xml | 8 +- .../main/res/layout/sheet_reader_config.xml | 129 +++++++++++++++++ app/src/main/res/menu/opt_reader_bottom.xml | 2 +- app/src/main/res/values/styles.xml | 12 ++ 12 files changed, 405 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderConfigBottomSheet.kt delete mode 100644 app/src/main/res/drawable/ic_read_reversed.xml create mode 100644 app/src/main/res/drawable/ic_reader_ltr.xml create mode 100644 app/src/main/res/drawable/ic_reader_rtl.xml create mode 100644 app/src/main/res/layout-w600dp/activity_reader.xml create mode 100644 app/src/main/res/layout/sheet_reader_config.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index 0e8fa4056..ce5cfc885 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -6,7 +6,6 @@ import android.content.Intent import android.net.Uri import android.os.Bundle import android.view.* -import androidx.activity.result.ActivityResultCallback import androidx.core.graphics.Insets import androidx.core.view.OnApplyWindowInsetsListener import androidx.core.view.WindowInsetsCompat @@ -36,6 +35,7 @@ import org.koitharu.kotatsu.databinding.ActivityReaderBinding import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.model.MangaPage +import org.koitharu.kotatsu.reader.ui.config.ReaderConfigBottomSheet import org.koitharu.kotatsu.reader.ui.pager.ReaderUiState import org.koitharu.kotatsu.reader.ui.thumbnails.OnPageSelectListener import org.koitharu.kotatsu.reader.ui.thumbnails.PagesThumbnailsSheet @@ -50,8 +50,7 @@ class ReaderActivity : ChaptersBottomSheet.OnChapterChangeListener, GridTouchHelper.OnGridTouchListener, OnPageSelectListener, - ReaderConfigDialog.Callback, - ActivityResultCallback, + ReaderConfigBottomSheet.Callback, ReaderControlDelegate.OnInteractionListener, OnApplyWindowInsetsListener { @@ -65,7 +64,6 @@ class ReaderActivity : private lateinit var touchHelper: GridTouchHelper private lateinit var controlDelegate: ReaderControlDelegate - private val savePageRequest = registerForActivityResult(PageSaveContract(), this) private var gestureInsets: Insets = Insets.NONE private lateinit var readerManager: ReaderManager private val hideUiRunnable = Runnable { setUiIsVisible(false) } @@ -116,10 +114,6 @@ class ReaderActivity : override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.action_menu -> { - val currentMode = readerManager.currentMode ?: return false - ReaderConfigDialog.show(supportFragmentManager, currentMode) - } R.id.action_settings -> { startActivity(SettingsActivity.newReaderSettingsIntent(this)) } @@ -150,15 +144,16 @@ class ReaderActivity : viewModel.addBookmark() } } + R.id.action_options -> { + viewModel.saveCurrentState(readerManager.currentReader?.getCurrentState()) + val currentMode = readerManager.currentMode ?: return false + ReaderConfigBottomSheet.show(supportFragmentManager, currentMode) + } else -> return super.onOptionsItemSelected(item) } return true } - override fun onActivityResult(uri: Uri?) { - viewModel.onActivityResult(uri) - } - private fun onLoadingStateChanged(isLoading: Boolean) { val hasPages = !viewModel.content.value?.pages.isNullOrEmpty() binding.layoutLoading.isVisible = isLoading && !hasPages diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderConfigDialog.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderConfigDialog.kt index 85f326c68..916b0ee5f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderConfigDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderConfigDialog.kt @@ -14,6 +14,7 @@ import org.koitharu.kotatsu.core.prefs.ReaderMode import org.koitharu.kotatsu.databinding.DialogReaderConfigBinding import org.koitharu.kotatsu.utils.ext.withArgs +@Deprecated("Not in use") class ReaderConfigDialog : AlertDialogFragment(), CheckableButtonGroup.OnCheckedChangeListener { @@ -75,4 +76,4 @@ class ReaderConfigDialog : AlertDialogFragment(), putInt(ARG_MODE, mode.id) }.show(fm, TAG) } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderConfigBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderConfigBottomSheet.kt new file mode 100644 index 000000000..8fe07c578 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/config/ReaderConfigBottomSheet.kt @@ -0,0 +1,130 @@ +package org.koitharu.kotatsu.reader.ui.config + +import android.net.Uri +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.result.ActivityResultCallback +import androidx.core.view.isGone +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.flowWithLifecycle +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import org.koin.androidx.viewmodel.ext.android.sharedViewModel +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.base.ui.BaseBottomSheet +import org.koitharu.kotatsu.base.ui.widgets.CheckableButtonGroup +import org.koitharu.kotatsu.core.prefs.ReaderMode +import org.koitharu.kotatsu.databinding.SheetReaderConfigBinding +import org.koitharu.kotatsu.reader.ui.PageSaveContract +import org.koitharu.kotatsu.reader.ui.ReaderViewModel +import org.koitharu.kotatsu.settings.SettingsActivity +import org.koitharu.kotatsu.utils.BottomSheetToolbarController +import org.koitharu.kotatsu.utils.ScreenOrientationHelper +import org.koitharu.kotatsu.utils.ext.viewLifecycleScope +import org.koitharu.kotatsu.utils.ext.withArgs + +class ReaderConfigBottomSheet : BaseBottomSheet(), + CheckableButtonGroup.OnCheckedChangeListener, + ActivityResultCallback, View.OnClickListener { + + private val viewModel by sharedViewModel() + private val savePageRequest = registerForActivityResult(PageSaveContract(), this) + private var orientationHelper: ScreenOrientationHelper? = null + private lateinit var mode: ReaderMode + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mode = arguments?.getInt(ARG_MODE) + ?.let { ReaderMode.valueOf(it) } + ?: ReaderMode.STANDARD + } + + override fun onInflateView(inflater: LayoutInflater, container: ViewGroup?): SheetReaderConfigBinding { + return SheetReaderConfigBinding.inflate(inflater, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + observeScreenOrientation() + binding.toolbar.setNavigationOnClickListener { dismiss() } + behavior?.addBottomSheetCallback(BottomSheetToolbarController(binding.toolbar)) + if (!resources.getBoolean(R.bool.is_tablet)) { + binding.toolbar.navigationIcon = null + } + binding.buttonStandard.isChecked = mode == ReaderMode.STANDARD + binding.buttonReversed.isChecked = mode == ReaderMode.REVERSED + binding.buttonWebtoon.isChecked = mode == ReaderMode.WEBTOON + + binding.checkableGroup.onCheckedChangeListener = this + binding.buttonSavePage.setOnClickListener(this) + binding.buttonScreenRotate.setOnClickListener(this) + binding.buttonSettings.setOnClickListener(this) + + } + + override fun onClick(v: View) { + when (v.id) { + R.id.button_settings -> { + startActivity(SettingsActivity.newReaderSettingsIntent(v.context)) + dismissAllowingStateLoss() + } + R.id.button_save_page -> { + val page = viewModel.getCurrentPage() ?: return + viewModel.saveCurrentPage(page, savePageRequest) + dismissAllowingStateLoss() + } + R.id.button_screen_rotate -> { + orientationHelper?.toggleOrientation() + } + } + } + + override fun onCheckedChanged(group: CheckableButtonGroup, checkedId: Int) { + val newMode = when (checkedId) { + R.id.button_standard -> ReaderMode.STANDARD + R.id.button_webtoon -> ReaderMode.WEBTOON + R.id.button_reversed -> ReaderMode.REVERSED + else -> return + } + if (newMode == mode) { + return + } + findCallback()?.onReaderModeChanged(newMode) ?: return + mode = newMode + } + + override fun onActivityResult(uri: Uri?) { + viewModel.onActivityResult(uri) + } + + private fun observeScreenOrientation() { + val helper = ScreenOrientationHelper(requireActivity()) + orientationHelper = helper + helper.observeAutoOrientation() + .flowWithLifecycle(lifecycle) + .onEach { + binding.buttonScreenRotate.isGone = it + }.launchIn(viewLifecycleScope) + } + + private fun findCallback(): Callback? { + return (parentFragment as? Callback) ?: (activity as? Callback) + } + + interface Callback { + + fun onReaderModeChanged(mode: ReaderMode) + } + + companion object { + + private const val TAG = "ReaderConfigBottomSheet" + private const val ARG_MODE = "mode" + + fun show(fm: FragmentManager, mode: ReaderMode) = ReaderConfigBottomSheet().withArgs(1) { + putInt(ARG_MODE, mode.id) + }.show(fm, TAG) + } +} diff --git a/app/src/main/res/drawable/ic_read_reversed.xml b/app/src/main/res/drawable/ic_read_reversed.xml deleted file mode 100644 index 61833df96..000000000 --- a/app/src/main/res/drawable/ic_read_reversed.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_reader_ltr.xml b/app/src/main/res/drawable/ic_reader_ltr.xml new file mode 100644 index 000000000..12b736427 --- /dev/null +++ b/app/src/main/res/drawable/ic_reader_ltr.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_reader_rtl.xml b/app/src/main/res/drawable/ic_reader_rtl.xml new file mode 100644 index 000000000..cae026996 --- /dev/null +++ b/app/src/main/res/drawable/ic_reader_rtl.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout-w600dp/activity_reader.xml b/app/src/main/res/layout-w600dp/activity_reader.xml new file mode 100644 index 000000000..48807b155 --- /dev/null +++ b/app/src/main/res/layout-w600dp/activity_reader.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_reader.xml b/app/src/main/res/layout/activity_reader.xml index 4491710c1..2072ba0a7 100644 --- a/app/src/main/res/layout/activity_reader.xml +++ b/app/src/main/res/layout/activity_reader.xml @@ -57,7 +57,6 @@ android:id="@+id/toolbar_bottom" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="top" app:menu="@menu/opt_reader_bottom" app:popupTheme="@style/ThemeOverlay.Kotatsu"> diff --git a/app/src/main/res/layout/dialog_reader_config.xml b/app/src/main/res/layout/dialog_reader_config.xml index ab4e84e67..1374dc940 100644 --- a/app/src/main/res/layout/dialog_reader_config.xml +++ b/app/src/main/res/layout/dialog_reader_config.xml @@ -4,8 +4,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingHorizontal="16dp" - android:orientation="vertical"> + android:orientation="vertical" + android:paddingHorizontal="16dp"> + app:icon="@drawable/ic_reader_rtl" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/sheet_reader_config.xml b/app/src/main/res/layout/sheet_reader_config.xml new file mode 100644 index 000000000..128e31bb2 --- /dev/null +++ b/app/src/main/res/layout/sheet_reader_config.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/opt_reader_bottom.xml b/app/src/main/res/menu/opt_reader_bottom.xml index c9dbdcba5..d900b0c37 100644 --- a/app/src/main/res/menu/opt_reader_bottom.xml +++ b/app/src/main/res/menu/opt_reader_bottom.xml @@ -20,7 +20,7 @@ app:showAsAction="always" /> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 3d3944375..ac32429e6 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -107,6 +107,18 @@ 16dp + +