From 11d18e1e705dd9be9a2ca271adb3f3888dee90cd Mon Sep 17 00:00:00 2001 From: Christophe Beyls Date: Fri, 10 May 2024 17:14:26 +0200 Subject: [PATCH] Upgrade DrawerLayout to 1.2.0 and simplify code (#4412) The main benefit of upgrading to version 1.2.0 of `DrawerLayout` is ~~to properly support **predictive back animations**: when initiating a back gesture on API 33+, the DrawerLayout will animate automatically~~ to handle back navigation automatically. The predictive back animation of the menu however depends on `NavigationView` which is not used in the project. In addition to the upgrade, simplify DrawerLayout integration: - Forward key events to the DrawerLayout so it can intercept them and close itself when needed. - Don't handle the DrawerLayout closing manually using the `OnBackPressedCallback` anymore. This is not necessary since the back event will now be intercepted by the DrawerLayout when needed before reaching the `OnBackPressedDispatcher`. - Remove legacy fix for DrawerLayout staying open after Activity recreation. --- .../com/keylesspalace/tusky/MainActivity.kt | 38 +++++-------------- gradle/libs.versions.toml | 4 +- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt index cde6a5deb..36b37967b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt @@ -46,11 +46,9 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.core.content.pm.ShortcutManagerCompat -import androidx.core.view.GravityCompat import androidx.core.view.MenuProvider import androidx.core.view.forEach import androidx.core.view.isVisible -import androidx.drawerlayout.widget.DrawerLayout import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager import androidx.viewpager2.widget.MarginPageTransformer @@ -199,14 +197,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider { private val onBackPressedCallback = object : OnBackPressedCallback(false) { override fun handleOnBackPressed() { - when { - binding.mainDrawerLayout.isOpen -> { - binding.mainDrawerLayout.close() - } - binding.viewPager.currentItem != 0 -> { - binding.viewPager.currentItem = 0 - } - } + binding.viewPager.currentItem = 0 } } @@ -487,12 +478,14 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider { } } - override fun onStart() { - super.onStart() - // For some reason the navigation drawer is opened when the activity is recreated - if (binding.mainDrawerLayout.isOpen) { - binding.mainDrawerLayout.closeDrawer(GravityCompat.START, false) + override fun dispatchKeyEvent(event: KeyEvent): Boolean { + // Allow software back press to be properly dispatched to drawer layout + val handled = when (event.action) { + KeyEvent.ACTION_DOWN -> binding.mainDrawerLayout.onKeyDown(event.keyCode, event) + KeyEvent.ACTION_UP -> binding.mainDrawerLayout.onKeyUp(event.keyCode, event) + else -> false } + return handled || super.dispatchKeyEvent(event) } override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { @@ -629,19 +622,6 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider { ) setSavedInstance(savedInstanceState) } - binding.mainDrawerLayout.addDrawerListener(object : DrawerLayout.DrawerListener { - override fun onDrawerSlide(drawerView: View, slideOffset: Float) { } - - override fun onDrawerOpened(drawerView: View) { - onBackPressedCallback.isEnabled = true - } - - override fun onDrawerClosed(drawerView: View) { - onBackPressedCallback.isEnabled = binding.tabLayout.selectedTabPosition > 0 - } - - override fun onDrawerStateChanged(newState: Int) { } - }) } private fun refreshMainDrawerItems( @@ -902,7 +882,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider { onTabSelectedListener = object : OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { - onBackPressedCallback.isEnabled = tab.position > 0 || binding.mainDrawerLayout.isOpen + onBackPressedCallback.isEnabled = tab.position > 0 binding.mainToolbar.title = tab.contentDescription diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0839f12e1..e39a94f6c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,6 +6,7 @@ androidx-browser = "1.8.0" androidx-cardview = "1.0.0" androidx-constraintlayout = "2.1.4" androidx-core = "1.13.1" +androidx-drawerlayout = "1.2.0" androidx-exifinterface = "1.3.7" androidx-fragment = "1.7.0" androidx-hilt = "1.2.0" @@ -71,6 +72,7 @@ androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayo androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core" } androidx-core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "androidx-splashscreen" } androidx-core-testing = { module = "androidx.arch.core:core-testing", version.ref = "androidx-testing" } +androidx-drawerlayout = { group = "androidx.drawerlayout", name = "drawerlayout", version.ref = "androidx-drawerlayout" } androidx-emoji2-core = { module = "androidx.emoji2:emoji2", version.ref = "emoji2" } androidx-emoji2-views-core = { module = "androidx.emoji2:emoji2-views", version.ref = "emoji2" } androidx-emoji2-view-helper = { module = "androidx.emoji2:emoji2-views-helper", version.ref = "emoji2" } @@ -140,7 +142,7 @@ androidx = ["androidx-core-ktx", "androidx-appcompat", "androidx-fragment-ktx", "androidx-emoji2-core", "androidx-emoji2-views-core", "androidx-emoji2-view-helper", "androidx-lifecycle-viewmodel-ktx", "androidx-constraintlayout", "androidx-paging-runtime-ktx", "androidx-viewpager2", "androidx-work-runtime-ktx", "androidx-core-splashscreen", "androidx-activity", "androidx-media3-exoplayer", "androidx-media3-datasource-okhttp", - "androidx-media3-ui"] + "androidx-media3-ui", "androidx-drawerlayout"] filemojicompat = ["filemojicompat-core", "filemojicompat-ui", "filemojicompat-defaults"] glide = ["glide-core", "glide-okhttp3-integration", "glide-animation-plugin"] material-drawer = ["material-drawer-core", "material-drawer-iconics"]