From 3f538d9b788bca5e533b67e3913325cc23b8296a Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 27 Jan 2023 08:39:26 +0200 Subject: [PATCH] Move some OnBackPressed logics to OnBackPressedCallbacks --- .../categories/FavouriteCategoriesActivity.kt | 28 +++++++++++-------- .../koitharu/kotatsu/main/ui/MainActivity.kt | 5 ++-- .../kotatsu/main/ui/MainNavigationDelegate.kt | 8 +++++- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesActivity.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesActivity.kt index 470876014..ea61ed226 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/FavouriteCategoriesActivity.kt @@ -9,6 +9,7 @@ import android.view.Menu import android.view.MenuItem import android.view.View import android.view.ViewGroup +import androidx.activity.OnBackPressedCallback import androidx.activity.viewModels import androidx.core.graphics.Insets import androidx.core.view.isVisible @@ -19,7 +20,6 @@ import androidx.recyclerview.widget.RecyclerView import coil.ImageLoader import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BaseActivity import org.koitharu.kotatsu.base.ui.list.ListSelectionController @@ -32,8 +32,8 @@ import org.koitharu.kotatsu.list.ui.adapter.ListStateHolderListener import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.utils.ext.getDisplayMessage -import org.koitharu.kotatsu.utils.ext.measureHeight import org.koitharu.kotatsu.utils.ext.scaleUpActivityOptionsOf +import javax.inject.Inject @AndroidEntryPoint class FavouriteCategoriesActivity : @@ -47,6 +47,7 @@ class FavouriteCategoriesActivity : private val viewModel by viewModels() + private lateinit var exitReorderModeCallback: ExitReorderModeCallback private lateinit var adapter: CategoriesAdapter private lateinit var selectionController: ListSelectionController private var reorderHelper: ItemTouchHelper? = null @@ -55,6 +56,7 @@ class FavouriteCategoriesActivity : super.onCreate(savedInstanceState) setContentView(ActivityCategoriesBinding.inflate(layoutInflater)) supportActionBar?.setDisplayHomeAsUpEnabled(true) + exitReorderModeCallback = ExitReorderModeCallback(viewModel) adapter = CategoriesAdapter(coil, this, this, this) selectionController = ListSelectionController( activity = this, @@ -67,6 +69,7 @@ class FavouriteCategoriesActivity : binding.recyclerView.setHasFixedSize(true) binding.recyclerView.adapter = adapter binding.fabAdd.setOnClickListener(this) + onBackPressedDispatcher.addCallback(exitReorderModeCallback) viewModel.detalizedCategories.observe(this, ::onCategoriesChanged) viewModel.onError.observe(this, ::onError) @@ -90,15 +93,8 @@ class FavouriteCategoriesActivity : viewModel.setReorderMode(true) true } - else -> super.onOptionsItemSelected(item) - } - } - override fun onBackPressed() { - if (viewModel.isInReorderMode()) { - viewModel.setReorderMode(false) - } else { - super.onBackPressed() + else -> super.onOptionsItemSelected(item) } } @@ -138,7 +134,7 @@ class FavouriteCategoriesActivity : } binding.root.updatePadding( left = insets.left, - right = insets.right + right = insets.right, ) binding.recyclerView.updatePadding( bottom = insets.bottom, @@ -174,6 +170,7 @@ class FavouriteCategoriesActivity : binding.recyclerView.isNestedScrollingEnabled = !isReorderMode invalidateOptionsMenu() binding.buttonDone.isVisible = isReorderMode + exitReorderModeCallback.isEnabled = isReorderMode } private inner class ReorderHelperCallback : ItemTouchHelper.SimpleCallback( @@ -211,6 +208,15 @@ class FavouriteCategoriesActivity : override fun isLongPressDragEnabled(): Boolean = false } + private class ExitReorderModeCallback( + private val viewModel: FavouritesCategoriesViewModel, + ) : OnBackPressedCallback(viewModel.isInReorderMode()) { + + override fun handleOnBackPressed() { + viewModel.setReorderMode(false) + } + } + companion object { val SORT_ORDERS = arrayOf( diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt index 984f1ee83..b3552e6f5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -117,6 +117,7 @@ class MainActivity : binding.navRail?.headerView?.setOnClickListener(this) binding.searchView.isVoiceSearchEnabled = voiceInputLauncher.resolve(this, null) != null + onBackPressedDispatcher.addCallback(navigationDelegate) onBackPressedDispatcher.addCallback(ExitCallback(this, binding.container)) navigationDelegate = MainNavigationDelegate(checkNotNull(bottomNav ?: binding.navRail), supportFragmentManager) navigationDelegate.addOnFragmentChangedListener(this) @@ -150,9 +151,7 @@ class MainActivity : setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) runOnCommit { onSearchClosed() } } - navigationDelegate.primaryFragment !is ShelfFragment -> { - bottomNav?.selectedItemId = R.id.nav_shelf - } + else -> super.onBackPressed() } } diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt index dc3393a90..5573fbfd4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt @@ -2,6 +2,7 @@ package org.koitharu.kotatsu.main.ui import android.os.Bundle import android.view.MenuItem +import androidx.activity.OnBackPressedCallback import androidx.annotation.IdRes import androidx.core.view.iterator import androidx.fragment.app.Fragment @@ -21,7 +22,7 @@ private const val TAG_PRIMARY = "primary" class MainNavigationDelegate( private val navBar: NavigationBarView, private val fragmentManager: FragmentManager, -) : NavigationBarView.OnItemSelectedListener, NavigationBarView.OnItemReselectedListener { +) : OnBackPressedCallback(false), NavigationBarView.OnItemSelectedListener, NavigationBarView.OnItemReselectedListener { private val listeners = LinkedList() @@ -46,6 +47,10 @@ class MainNavigationDelegate( recyclerView.smoothScrollToPosition(0) } + override fun handleOnBackPressed() { + navBar.selectedItemId = R.id.nav_shelf + } + fun onCreate(savedInstanceState: Bundle?) { primaryFragment?.let { onFragmentChanged(it, fromUser = false) @@ -117,6 +122,7 @@ class MainNavigationDelegate( } private fun onFragmentChanged(fragment: Fragment, fromUser: Boolean) { + isEnabled = fragment !is ShelfFragment listeners.forEach { it.onFragmentChanged(fragment, fromUser) } }