Merge "NavController: disallow setting ViewmodelStore after setGraph" into androidx-master-dev
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntry.java b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntry.java
index 8a071ab..fe52979 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntry.java
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntry.java
@@ -106,10 +106,6 @@
         return mArgs;
     }
 
-    void setNavControllerViewModel(@NonNull NavControllerViewModel navControllerViewModel) {
-        mNavControllerViewModel = navControllerViewModel;
-    }
-
     /**
      * {@inheritDoc}
      * <p>
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
index 228cc354..8a5ba6a 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
@@ -1114,12 +1114,10 @@
     }
 
     void setViewModelStore(@NonNull ViewModelStore viewModelStore) {
-        mViewModel = NavControllerViewModel.getInstance(viewModelStore);
-        // Ensure that all of the NavBackStackEntry instances are using the
-        // newly set NavControllerViewModel as their backing store.
-        for (NavBackStackEntry entry : mBackStack) {
-            entry.setNavControllerViewModel(mViewModel);
+        if (!mBackStack.isEmpty()) {
+            throw new IllegalStateException("ViewModelStore should be set before setGraph call");
         }
+        mViewModel = NavControllerViewModel.getInstance(viewModelStore);
     }
 
     /**
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHostController.java b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHostController.java
index eb879bb..d04da83 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHostController.java
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHostController.java
@@ -100,8 +100,13 @@
      * Sets the host's ViewModelStore used by the NavController to store ViewModels at the
      * navigation graph level. This is required to call {@link #getViewModelStoreOwner} and
      * should generally be called for you by your {@link NavHost}.
+     * <p>
+     * You must call this method before {@link #setGraph(int)} or similar methods, because the
+     * {@link ViewModelStore} set here will be used by the created {@link NavBackStackEntry} items.
      *
      * @param viewModelStore ViewModelStore used to store ViewModels at the navigation graph level
+     * @throws IllegalStateException if this method is called when graph was already set via
+     * {@link #setGraph(int)} or similar methods.
      */
     @Override
     public void setViewModelStore(@NonNull ViewModelStore viewModelStore) {