diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java index a1cce574..66101fe1 100644 --- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java +++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java @@ -62,6 +62,8 @@ public class MainActivity extends AppCompatActivity { private static final long BACK_PRESS_INTERVAL = 2000; + private static final String STATE_NAV_GRAPH_INITIALIZED = "state_nav_graph_initialized"; + private static final String STATE_LAST_PREFERRED_DESTINATION = "state_last_preferred_destination"; private ActivityResultLauncher updateActivityResultLauncher; private final SparseIntArray navOrder = new SparseIntArray(); private ActivityMainBinding mBinding; @@ -84,6 +86,8 @@ public void onResume(@NonNull LifecycleOwner owner) { private MainViewModel mainViewModel; private NavController navController; private int currentNavIndex; + private boolean navGraphInitialized; + private int lastPreferredStartDestination; private AppUpdateManager appUpdateManager; private InstallStateUpdatedListener installStateUpdatedListener; private long backPressedTime; @@ -93,6 +97,11 @@ protected void onCreate(Bundle savedInstanceState) { SplashScreen.installSplashScreen(this); super.onCreate(savedInstanceState); + if (savedInstanceState != null) { + navGraphInitialized = savedInstanceState.getBoolean(STATE_NAV_GRAPH_INITIALIZED, true); + lastPreferredStartDestination = savedInstanceState.getInt(STATE_LAST_PREFERRED_DESTINATION, 0); + } + updateActivityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), result -> { @@ -222,16 +231,24 @@ private void observeViewModel() { getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_activity_main); if (navHostFragment != null) { navController = navHostFragment.getNavController(); - NavGraph navGraph = navController.getNavInflater().inflate(R.navigation.mobile_navigation); - navGraph.setStartDestination(uiState.defaultNavDestination()); - navController.setGraph(navGraph); navOrder.put(R.id.navigation_home, 0); navOrder.put(R.id.navigation_android_studio, 1); navOrder.put(R.id.navigation_about, 2); - androidx.navigation.NavDestination destination = navController.getCurrentDestination(); - if (destination != null) { - currentNavIndex = navOrder.get(destination.getId()); + + int preferredStartDestination = uiState.defaultNavDestination(); + if (!navGraphInitialized) { + NavGraph navGraph = navController.getNavInflater().inflate(R.navigation.mobile_navigation); + navGraph.setStartDestination(preferredStartDestination); + navController.setGraph(navGraph); + navGraphInitialized = true; + lastPreferredStartDestination = preferredStartDestination; + } else { + if (lastPreferredStartDestination == 0) { + lastPreferredStartDestination = preferredStartDestination; + } else if (preferredStartDestination != lastPreferredStartDestination) { + navigateToPreferredDestination(preferredStartDestination); + } } NavOptions forwardOptions = new NavOptions.Builder() @@ -248,11 +265,17 @@ private void observeViewModel() { .setPopExitAnim(R.anim.fragment_spring_exit) .build(); + androidx.navigation.NavDestination destination = navController.getCurrentDestination(); + if (destination != null) { + currentNavIndex = navOrder.get(destination.getId(), currentNavIndex); + } + if (useRail) { - if (mBinding.navRail != null) { - NavigationUI.setupWithNavController(mBinding.navRail, navController); - mBinding.navRail.setOnItemSelectedListener(item -> { - if (item.getItemId() == navController.getCurrentDestination().getId()) { + if (binding.navRail != null) { + NavigationUI.setupWithNavController(binding.navRail, navController); + binding.navRail.setOnItemSelectedListener(item -> { + androidx.navigation.NavDestination currentDestination = navController.getCurrentDestination(); + if (currentDestination != null && item.getItemId() == currentDestination.getId()) { return true; } int newIndex = navOrder.get(item.getItemId()); @@ -265,7 +288,8 @@ private void observeViewModel() { } else { NavigationUI.setupWithNavController(navBarView, navController); navBarView.setOnItemSelectedListener(item -> { - if (item.getItemId() == navController.getCurrentDestination().getId()) { + androidx.navigation.NavDestination currentDestination = navController.getCurrentDestination(); + if (currentDestination != null && item.getItemId() == currentDestination.getId()) { return true; } int newIndex = navOrder.get(item.getItemId()); @@ -276,9 +300,9 @@ private void observeViewModel() { }); } - setSupportActionBar(mBinding.toolbar); + setSupportActionBar(binding.toolbar); - mBinding.toolbar.setNavigationOnClickListener(v -> { + binding.toolbar.setNavigationOnClickListener(v -> { BottomSheetMenuFragment bottomSheet = new BottomSheetMenuFragment(); bottomSheet.show(getSupportFragmentManager(), bottomSheet.getTag()); }); @@ -297,6 +321,32 @@ private void observeViewModel() { } + private void navigateToPreferredDestination(int preferredDestination) { + if (navController == null) { + return; + } + NavGraph graph = navController.getGraph(); + if (graph != null) { + graph.setStartDestination(preferredDestination); + } + androidx.navigation.NavDestination currentDestination = navController.getCurrentDestination(); + if (currentDestination != null && currentDestination.getId() == preferredDestination) { + lastPreferredStartDestination = preferredDestination; + return; + } + if (graph == null) { + lastPreferredStartDestination = preferredDestination; + return; + } + NavOptions options = new NavOptions.Builder() + .setPopUpTo(graph.getStartDestinationId(), true) + .setLaunchSingleTop(true) + .build(); + navController.navigate(preferredDestination, null, options); + lastPreferredStartDestination = preferredDestination; + } + + @Override public boolean onCreateOptionsMenu(android.view.Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); @@ -390,6 +440,13 @@ private void popupSnackbarForCompleteUpdate() { .show(); } + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(STATE_NAV_GRAPH_INITIALIZED, navGraphInitialized); + outState.putInt(STATE_LAST_PREFERRED_DESTINATION, lastPreferredStartDestination); + } + @Override protected void onDestroy() { if (installStateUpdatedListener != null && appUpdateManager != null) {