Status Update
Comments
jb...@google.com <jb...@google.com>
be...@google.com <be...@google.com> #2
Great
ap...@google.com <ap...@google.com> #3
Branch: androidx-main
commit a735aaa4d06c90454de772fae5a02f6cbde210b3
Author: Jeremy Woods <jbwoods@google.com>
Date: Tue Feb 28 22:58:23 2023
Ensure FragmentNavigator destroys intermediate entries on popUpTo
We need to make sure that when Fragment are destroyed their entries are
also always destroyed.
RelNote: "Fixes a regressions in previous release that caused the wrong
BottomNav menu item to be highlighted when using system back to go
between tabs."
Test: Added FragmentNavigatorTest
Bug: 270447657
Change-Id: I634f6047b7016bcb8b690047605a6f66b2dc1438
M navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt
M navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.kt
il...@google.com <il...@google.com> #4
This has been fixed internally and will be available in the Navigation 2.6.0-alpha07
release.
b9...@gmail.com <b9...@gmail.com> #5
Branch: androidx-main
commit 96cee05bdb8f61a92e4be00a52b991cfc1ed2f4e
Author: Clara Fok <clarafok@google.com>
Date: Wed Mar 01 12:28:09 2023
Add FragmentNavigator test to assert entry destroyed
Add test to assert that NavBackStackEntry is destroyed after being restored upon recreation/configuration change.
Asserts that the fix on this bug also fixes
Test: ./gradlew navigation:navigation-fragment
Bug: 270447657
Change-Id: I8874d2dfaa17e560dd2f6d9da54e435494c187d2
M navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/FragmentNavigatorTest.kt
be...@google.com <be...@google.com> #6
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.navigation:navigation-fragment:2.6.0-alpha07
b9...@gmail.com <b9...@gmail.com> #7
Branch: androidx-main
commit 7cf55857f0db6bd1a1e1f95be7374ed5cf3eca58
Author: Jeremy Woods <jbwoods@google.com>
Date: Wed Mar 15 16:59:50 2023
Fix system back after popUpTo
After you do a popUpTo inclusive while using Navigation with Fragments,
if you attempt to do a system back call, the Navigation back stack is
never updated.
The reason for this is that when fragment views are DESTROYED, we need
for the observer in the FragmentNavigator to update the state so we know
that the entry was already popped.
RelNote: "When using system back after doing a navigate with popUpTo,
the state of the NavController will pop to the correct entry."
Test: Added OnBackPressedTest
Bug: 270447657
Change-Id: I3a8ec072ba6d1655ab054cc081961825909088e6
M navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/OnBackPressedTest.kt
M navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/FragmentNavigator.kt
b9...@gmail.com <b9...@gmail.com> #8
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.navigation:navigation-fragment:2.6.0-alpha08
ap...@google.com <ap...@google.com> #9
Branch: androidx-master-dev
commit 524a4f074b688975041f6ddd9db9eb31a88410e8
Author: Ben Weiss <benweiss@google.com>
Date: Tue Dec 15 12:26:06 2020
Add missing onViewCreated call
DefaultProgressFragment did not call super.onViewCreated which
could lead to installation progress not completing.
Bug: 169636207
Test: N/A
RelNote: Fix stuck installation progress
Change-Id: Ib27a77bc4572fc69cea38d738255c987449d6137
M navigation/navigation-dynamic-features-fragment/src/main/java/androidx/navigation/dynamicfeatures/fragment/ui/DefaultProgressFragment.kt
b9...@gmail.com <b9...@gmail.com> #10
Why this fix doesn't included in 2.3.3?
il...@google.com <il...@google.com> #11
Re #10, yes, you're right this didn't make it into Navigation 2.3.3. Sorry about that. We'll look at doing a Navigation 2.3.4 with this fix.
b9...@gmail.com <b9...@gmail.com> #12
za...@gmail.com <za...@gmail.com> #13
I believe I'm facing another issue because of this fix:
When navigating to an activity that belongs to a dynamic module, the AbstractProgressFragment
is not removed from the back stack. The line that's supposed to do it was moved from onResume
to onViewCreated
:
if (navigated) {
findNavController().popBackStack()
return
}
And onViewCreated
is not called since we're coming back from another activity.
Moving that block back to the onResume
method should solve the problem. In the meantime (as a workaround), I guess we can do as follows:
class CustomProgressFragment : AbstractProgressFragment() {
private var navigated = false
override fun onResume() {
super.onResume()
// Workaround:
// AbstractProgressFragment is not being removed from the back stack when returning from another activity
if (navigated) findNavController().popBackStack()
}
override fun onInstalled() {
testing = true
}
...
...
}
za...@gmail.com <za...@gmail.com> #14
Update:
Regarding the workaround I mentioned, this is the correct implementation of the onInstalled
method
override fun onInstalled() {
navigated = true
}
il...@google.com <il...@google.com> #15
Re onViewCreated()
is indeed called when you return to the AbstractProgressFragment
from another fragment, which is the only thing your newly loaded graph should have as its start destination. You...don't happen to have a start destination that is an activity destination? You shouldn't be using Dynamic Navigation at all in that case (as the system will auto-download the module your activity is in upon request).
Description
Component used: androidx.navigation:navigation-dynamic-features-fragment
Version used:2.3.0 Devices/Android versions reproduced on: all devices/android versions
override fun onResume() { super.onResume() if (navigated) { findNavController().popBackStack() return } var monitor = installViewModel.installMonitor if (monitor == null) { Log.i(TAG, "onResume: monitor is null, navigating") navigate() monitor = installViewModel.installMonitor } if (monitor != null) { Log.i(TAG, "onResume: monitor is now not null, observing") monitor.status.observe(this, StateObserver(monitor)) } }
Any time onResume() is called, monitor.status observed. When dynamic feature module is installed, each StateObserver will call navigate() and destination activity/fragment will be navigated multiple time