From 97624bd46a4e80b9742607a6635ef22a7b791101 Mon Sep 17 00:00:00 2001 From: Vladimir Tanakov Date: Tue, 2 Mar 2021 23:41:59 +0300 Subject: [PATCH] fix: don't replace fragment on another fragment if they are the same (#3835) --- .../scrachx/openfood/features/MainActivity.kt | 70 +++++-------------- .../openfood/features/PreferencesFragment.kt | 2 +- .../allergensalert/AllergensAlertFragment.kt | 2 +- .../listeners/CommonBottomListener.kt | 19 +++-- .../searchbycode/SearchByCodeFragment.kt | 4 +- 5 files changed, 34 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/MainActivity.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/MainActivity.kt index 41f0e8aa6135..b677a9ca760b 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/MainActivity.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/MainActivity.kt @@ -169,7 +169,7 @@ class MainActivity : BaseActivity(), NavigationDrawerListener { setLanguageInPrefs(this, getLanguage(this)) setSupportActionBar(binding.toolbarInclude.toolbar) supportActionBar?.setDisplayHomeAsUpEnabled(false) - swapToHomeFragment() + swapToFragment(HomeFragment.newInstance()) // chrome custom tab init customTabActivityHelper = CustomTabActivityHelper() @@ -270,7 +270,7 @@ class MainActivity : BaseActivity(), NavigationDrawerListener { when (drawerItem.identifier.toInt()) { ITEM_HOME -> newFragment = HomeFragment.newInstance() ITEM_SEARCH_BY_CODE -> { - newFragment = SearchByCodeFragment() + newFragment = SearchByCodeFragment.newInstance() binding.bottomNavigationInclude.bottomNavigation.selectNavigationItem(0) } ITEM_CATEGORIES -> CategoryActivity.start(this@MainActivity) @@ -333,12 +333,7 @@ class MainActivity : BaseActivity(), NavigationDrawerListener { } } - newFragment?.let { - supportFragmentManager.commit { - replace(R.id.fragment_container, it) - addToBackStack(null) - } - } + newFragment?.let(::swapToFragment) return false } }) @@ -427,9 +422,14 @@ class MainActivity : BaseActivity(), NavigationDrawerListener { } } - private fun swapToHomeFragment() { - supportFragmentManager.addOnBackStackChangedListener {} - supportFragmentManager.commit { replace(R.id.fragment_container, HomeFragment()) } + private fun swapToFragment(fragment: Fragment) { + val currentFragment = supportFragmentManager.fragments.lastOrNull() + if (currentFragment == null || currentFragment::class.java != fragment::class.java) { + supportFragmentManager.commit { + replace(R.id.fragment_container, fragment) + addToBackStack(null) + } + } binding.toolbarInclude.toolbar.title = BuildConfig.APP_NAME } @@ -711,8 +711,11 @@ class MainActivity : BaseActivity(), NavigationDrawerListener { /** * This moves the main activity to the barcode entry fragment. */ - private fun swapToSearchByCode() = - changeFragment(SearchByCodeFragment(), ITEM_SEARCH_BY_CODE.toLong(), resources.getString(R.string.search_by_barcode_drawer)) + private fun swapToSearchByCode() { + swapToFragment(SearchByCodeFragment.newInstance()) + drawerResult.setSelection(ITEM_SEARCH_BY_CODE.toLong()) + supportActionBar?.title = resources.getString(R.string.search_by_barcode_drawer) + } override fun setItemSelected(@NavigationDrawerType type: Int) = drawerResult.setSelection(type.toLong(), false) @@ -849,47 +852,6 @@ class MainActivity : BaseActivity(), NavigationDrawerListener { } - /** - * Used to navigate Fragments which are children of `MainActivity`. - * Use this method when the `Fragment` APPEARS in the `Drawer`. - * - * @param fragment The fragment class to display. - * @param title The title that should be displayed on the top toolbar. - * @param drawerName The fragment as it appears in the drawer. See [NavigationDrawerListener] for the value. - * @author ross-holloway94 - * @see [Related Stack Overflow article](https://stackoverflow.com/questions/45138446/calling-fragment-from-recyclerview-adapter) - * - * @since 06/16/18 - */ - private fun changeFragment(fragment: Fragment, drawerName: Long, title: String? = null) { - changeFragment(fragment, title) - drawerResult.setSelection(drawerName) - } - - /** - * Used to navigate Fragments which are children of `MainActivity`. - * Use this method when the `Fragment` DOES NOT APPEAR in the `Drawer`. - * - * @param fragment The fragment class to display. - * @param title The title that should be displayed on the top toolbar. - * @author ross-holloway94 - * @see [Related Stack Overflow article](https://stackoverflow.com/questions/45138446/calling-fragment-from-recyclerview-adapter) - * - * @since 06/16/18 - */ - @JvmOverloads - fun changeFragment(fragment: Fragment, title: String? = null) { - val backStateName = fragment::class.simpleName - val fragmentPopped = supportFragmentManager.popBackStackImmediate(backStateName, 0) - if (!fragmentPopped && supportFragmentManager.findFragmentByTag(backStateName) == null) { - supportFragmentManager.commit { - replace(R.id.fragment_container, fragment, backStateName) - addToBackStack(backStateName) - } - } - title?.let { supportActionBar?.title = it } - } - companion object { private const val USER_ID: Long = 500 private const val CONTRIBUTIONS_SHORTCUT = "CONTRIBUTIONS" diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/PreferencesFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/PreferencesFragment.kt index 28c219194351..168fe1274a32 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/PreferencesFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/PreferencesFragment.kt @@ -380,4 +380,4 @@ class PreferencesFragment : PreferenceFragmentCompat(), INavigationItem, OnShare const val LOGIN_PREF = "login" fun newInstance() = PreferencesFragment().apply { arguments = Bundle() } } -} \ No newline at end of file +} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAlertFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAlertFragment.kt index 7d5e287c0996..076c8d3e5a60 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAlertFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAlertFragment.kt @@ -221,4 +221,4 @@ class AllergensAlertFragment : NavigationBaseFragment() { @JvmStatic fun newInstance() = AllergensAlertFragment().apply { arguments = Bundle() } } -} \ No newline at end of file +} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/listeners/CommonBottomListener.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/listeners/CommonBottomListener.kt index 69fd3f8127bb..9c229b5430dc 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/listeners/CommonBottomListener.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/listeners/CommonBottomListener.kt @@ -34,10 +34,7 @@ class CommonBottomListener internal constructor(private val currentActivity: Act } R.id.home_page, R.id.home -> { if (isCurrentActivity(WelcomeActivity::class.java) || isCurrentActivity(MainActivity::class.java)) { - (currentActivity as FragmentActivity).supportFragmentManager.commit { - replace(R.id.fragment_container, HomeFragment()) - addToBackStack(null) - } + openHomeFragment() return true } currentActivity.startActivity(createIntent(MainActivity::class.java)) @@ -59,6 +56,18 @@ class CommonBottomListener internal constructor(private val currentActivity: Act return true } + private fun openHomeFragment() { + (currentActivity as FragmentActivity).supportFragmentManager.let { + val fragment = it.fragments.lastOrNull() + if (fragment == null || fragment !is HomeFragment) { + it.commit { + replace(R.id.fragment_container, HomeFragment.newInstance()) + addToBackStack(null) + } + } + } + } + private fun openScanActivity() { // If already on the continuous scan activity, just lower the bottom sheet if (isCurrentActivity(ContinuousScanActivity::class.java)) { @@ -107,4 +116,4 @@ class CommonBottomListener internal constructor(private val currentActivity: Act private fun createIntent(activityClass: Class) = Intent(currentActivity, activityClass).apply { addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION) } -} \ No newline at end of file +} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/searchbycode/SearchByCodeFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/searchbycode/SearchByCodeFragment.kt index 37444c46fc4a..28456d69682e 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/searchbycode/SearchByCodeFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/searchbycode/SearchByCodeFragment.kt @@ -76,10 +76,10 @@ class SearchByCodeFragment : NavigationBaseFragment() { companion object { const val INTENT_KEY_BARCODE = "barcode" - fun newInstance(barcode: String) = SearchByCodeFragment().apply { + fun newInstance(barcode: String? = null) = SearchByCodeFragment().apply { arguments = Bundle().apply { putString(INTENT_KEY_BARCODE, barcode) } } } -} \ No newline at end of file +}