Fixed
Status Update
Comments
su...@google.com <su...@google.com> #2
If you need to add a custom Navigator but don't want to subclass NavHost (which we expect will be needed in most cases), the correct approach is to add it before you set your graph:
1) Don't use app:navGraph in your XML
2) Get a reference to your NavController
3) Add your Navigator to the NavController
4) Call setGraph on the NavController
This relies on the fact that NavController waits until the graph is set before restoring state / doing anything at all.
Technically, the createFragmentNavigator() call in NavHostFragment is already called at the same time as your proposed onNavControllerCreated() method so as a workaround, you could override that method, add your Navigator, then return super.createFragmentNavigator().
1) Don't use app:navGraph in your XML
2) Get a reference to your NavController
3) Add your Navigator to the NavController
4) Call setGraph on the NavController
This relies on the fact that NavController waits until the graph is set before restoring state / doing anything at all.
Technically, the createFragmentNavigator() call in NavHostFragment is already called at the same time as your proposed onNavControllerCreated() method so as a workaround, you could override that method, add your Navigator, then return super.createFragmentNavigator().
su...@yahooinc.com <su...@yahooinc.com> #3
The first solution does not work, because after screen rotation, the graph (probably a restored graph) is set when Activity.setContentView() is called.
The workaround with createFragmentNavigator() works, though it's not very elegant. Maybe the method could be renamed to createNavigators() and return a list or an array of Navigators?
Anyway, it is a good enough solution for now, so it is not very urgent.
In conclusion:
* I think that a better support for custom destinations should be provided before final release.
* I would suggest describing the "Add support for new destination types" section in the documentation in more details.
Thank you
The workaround with createFragmentNavigator() works, though it's not very elegant. Maybe the method could be renamed to createNavigators() and return a list or an array of Navigators?
Anyway, it is a good enough solution for now, so it is not very urgent.
In conclusion:
* I think that a better support for custom destinations should be provided before final release.
* I would suggest describing the "Add support for new destination types" section in the documentation in more details.
Thank you
su...@google.com <su...@google.com> #4
I suspect the issue you're running into for the first solution is that you're using the setGraph(R.navigation.graph) method, which does indeed cause it to automatically inflate the graph by id on rotation. Using setGraph(navGraph) where navGraph is a navGraph object you've inflated with navController.getNavInflater().inflate(R.navigation.graph) will never automatically be recreated.
Definitely something we can do better on though :)
Definitely something we can do better on though :)
su...@yahooinc.com <su...@yahooinc.com> #5
Project: platform/frameworks/support
Branch: androidx-master-dev
commit a2e68921841727237528c4ac7076d50af64663c8
Author: Ian Lake <ilake@google.com>
Date: Wed Oct 17 16:46:28 2018
Make setGraph(int) and setGraph(NavGraph) act identically
Remove the auto restore functionality from NavController's
setGraph(int) method so that it functions identically to
setGraph(NavGraph).
This ensures that developers that manually are calling
setGraph() after adding custom navigators don't get
recreated too early.
Test: updated NavController test
BUG: 110763345
Change-Id: I51ae7c74451669d6bfed0fe84df445c2ff272e6e
M navigation/runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
M navigation/runtime/src/main/java/androidx/navigation/NavController.java
https://android-review.googlesource.com/792819
https://goto.google.com/android-sha1/a2e68921841727237528c4ac7076d50af64663c8
Branch: androidx-master-dev
commit a2e68921841727237528c4ac7076d50af64663c8
Author: Ian Lake <ilake@google.com>
Date: Wed Oct 17 16:46:28 2018
Make setGraph(int) and setGraph(NavGraph) act identically
Remove the auto restore functionality from NavController's
setGraph(int) method so that it functions identically to
setGraph(NavGraph).
This ensures that developers that manually are calling
setGraph() after adding custom navigators don't get
recreated too early.
Test: updated NavController test
BUG: 110763345
Change-Id: I51ae7c74451669d6bfed0fe84df445c2ff272e6e
M navigation/runtime/src/androidTest/java/androidx/navigation/NavControllerTest.kt
M navigation/runtime/src/main/java/androidx/navigation/NavController.java
su...@google.com <su...@google.com> #6
We've decided to remove the automatic recreation that was unique to setGraph(int) - it now acts identically to setGraph(NavGraph), so the flow in #2 can be used to ensure that you have custom Navigators added before calling setGraph.
This fix will be available in 1.0.0-alpha07
This fix will be available in 1.0.0-alpha07
su...@yahooinc.com <su...@yahooinc.com> #7
Project: platform/frameworks/support
Branch: androidx-master-dev
commit f40bad0faef05bded2d226711338e489309885ba
Author: Ian Lake <ilake@google.com>
Date: Tue Oct 23 21:03:24 2018
Ensure NavHostFragment calls setGraph on restore
If a graph is set on NavHostFragment via
NavHostFragment.create() or through
app:navGraph, it should be restored immediately
after the call to restoreState.
Test: testapp now works
BUG: 110763345
Change-Id: I7a0c656480e27a66637667519eabe61820b09a6c
M navigation/fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
https://android-review.googlesource.com/799721
https://goto.google.com/android-sha1/f40bad0faef05bded2d226711338e489309885ba
Branch: androidx-master-dev
commit f40bad0faef05bded2d226711338e489309885ba
Author: Ian Lake <ilake@google.com>
Date: Tue Oct 23 21:03:24 2018
Ensure NavHostFragment calls setGraph on restore
If a graph is set on NavHostFragment via
NavHostFragment.create() or through
app:navGraph, it should be restored immediately
after the call to restoreState.
Test: testapp now works
BUG: 110763345
Change-Id: I7a0c656480e27a66637667519eabe61820b09a6c
M navigation/fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
ap...@google.com <ap...@google.com> #8
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 56776a6d2eddef14d8275828f665df1177d52ac6
Author: Sumir Kataria <sumir@google.com>
Date: Thu Nov 15 14:53:31 2018
Speculative fix for IAE on NVIDIA Shield tablets.
We can't reproduce this on other devices, but Shield Tablets on
API 24 can return an IllegalArgumentException for some reason.
Since this isn't something that is fatal to WorkManager, we
will catch the exception and move on safely.
Bug: 119484416
Test: Ran existing tests.
Change-Id: If42c1c9257ebf7d36ddab11a3f24401ead731636
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/NetworkStateTracker.java
https://android-review.googlesource.com/828360
https://goto.google.com/android-sha1/56776a6d2eddef14d8275828f665df1177d52ac6
Branch: androidx-master-dev
commit 56776a6d2eddef14d8275828f665df1177d52ac6
Author: Sumir Kataria <sumir@google.com>
Date: Thu Nov 15 14:53:31 2018
Speculative fix for IAE on NVIDIA Shield tablets.
We can't reproduce this on other devices, but Shield Tablets on
API 24 can return an IllegalArgumentException for some reason.
Since this isn't something that is fatal to WorkManager, we
will catch the exception and move on safely.
Bug: 119484416
Test: Ran existing tests.
Change-Id: If42c1c9257ebf7d36ddab11a3f24401ead731636
M work/workmanager/src/main/java/androidx/work/impl/constraints/trackers/NetworkStateTracker.java
Description
Version used: Alpha 10
Devices/Android versions reproduced on: Nvidia (100%)
stacktrace:
ConnectivityManager.java in android.net.ConnectivityManager.unregisterNetworkCallback at line 3106
NetworkStateTracker.java in androidx.work.impl.constraints.trackers.NetworkStateTracker.stopTracking at line 94
ConstraintTracker.java in androidx.work.impl.constraints.trackers.ConstraintTracker.removeListener at line 79
ConstraintController.java in androidx.work.impl.constraints.controllers.ConstraintController.replace at line 98
GreedyScheduler.java in androidx.work.impl.background.greedy.GreedyScheduler.removeConstraintTrackingFor at line 150
Processor.java in androidx.work.impl.Processor.onExecuted at line 228
Processor.java in androidx.work.impl.Processor$FutureListener.run at line 258
Handler.java in android.os.Handler.handleCallback at line 751
Handler.java in android.os.Handler.dispatchMessage at line 95
Looper.java in android.os.Looper.loop at line 154
ActivityThread.java in android.app.ActivityThread.main at line 6120
java.lang.reflect.Method in invoke
ZygoteInit.java in com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run at line 865
ZygoteInit.java in com.android.internal.os.ZygoteInit.main at line 755