diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/AppListFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/AppListFragment.java index 3b2d7730..445c0907 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/AppListFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/AppListFragment.java @@ -120,7 +120,9 @@ public class AppListFragment extends BaseFragment { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (module == null) { - getNavController().navigate(AppListFragmentDirections.actionAppListFragmentToModulesFragment()); + if (!safeNavigate(AppListFragmentDirections.actionAppListFragmentToModulesFragment())) { + safeNavigate(R.id.modules_nav); + } } } @@ -132,10 +134,13 @@ public class AppListFragment extends BaseFragment { int moduleUserId = args.getModuleUserId(); module = ModuleUtil.getInstance().getModule(modulePackageName, moduleUserId); - if (module == null) - getNavController().navigate(R.id.action_app_list_fragment_to_modules_fragment); + if (module == null) { + if (!safeNavigate(R.id.action_app_list_fragment_to_modules_fragment)) { + safeNavigate(R.id.modules_nav); + } + } - backupLauncher = registerForActivityResult(new ActivityResultContracts.CreateDocument(), + backupLauncher = registerForActivityResult(new ActivityResultContracts.CreateDocument("application/gzip"), uri -> { if (uri == null) return; runAsync(() -> { diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java index 4f13cb45..d436c909 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java @@ -24,10 +24,12 @@ import android.os.Looper; import android.view.View; import android.widget.Toast; +import androidx.annotation.IdRes; import androidx.annotation.StringRes; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.navigation.NavController; +import androidx.navigation.NavDirections; import androidx.navigation.fragment.NavHostFragment; import com.google.android.material.bottomnavigation.BottomNavigationView; @@ -52,6 +54,24 @@ public class BaseFragment extends Fragment { return NavHostFragment.findNavController(this); } + public boolean safeNavigate(@IdRes int resId) { + try { + getNavController().navigate(resId); + return true; + } catch (IllegalArgumentException ignored) { + return false; + } + } + + public boolean safeNavigate(NavDirections direction) { + try { + getNavController().navigate(direction); + return true; + } catch (IllegalArgumentException ignored) { + return false; + } + } + public void setupToolbar(Toolbar toolbar, View tipsView, int title) { setupToolbar(toolbar, tipsView, getString(title), -1); } diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java index 1fd1f0bf..f0bfa37c 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java @@ -593,7 +593,7 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi holder.root.setAlpha(moduleUtil.isModuleEnabled(item.packageName) ? 1.0f : .5f); holder.itemView.setOnClickListener(v -> { searchView.clearFocus(); - getNavController().navigate(ModulesFragmentDirections.actionModulesFragmentToAppListFragment(item.packageName, item.userId)); + safeNavigate(ModulesFragmentDirections.actionModulesFragmentToAppListFragment(item.packageName, item.userId)); }); holder.itemView.setOnLongClickListener(v -> { searchView.clearFocus(); diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java index 450a55f3..24d1a94a 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java @@ -316,7 +316,7 @@ public class RepoFragment extends BaseFragment implements RepoLoader.RepoListene holder.itemView.setOnClickListener(v -> { searchView.clearFocus(); - getNavController().navigate(RepoFragmentDirections.actionRepoFragmentToRepoItemFragment(module.getName())); + safeNavigate(RepoFragmentDirections.actionRepoFragmentToRepoItemFragment(module.getName())); }); holder.itemView.setTooltipText(module.getDescription()); } diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java index feea9b41..ec99f0ac 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java @@ -134,8 +134,11 @@ public class RepoItemFragment extends BaseFragment implements RepoLoader.RepoLis String modulePackageName = getArguments() == null ? null : getArguments().getString("modulePackageName"); module = RepoLoader.getInstance().getOnlineModule(modulePackageName); - if (module == null) - getNavController().navigate(R.id.action_repo_item_fragment_to_repo_fragment); + if (module == null) { + if (!safeNavigate(R.id.action_repo_item_fragment_to_repo_fragment)) { + safeNavigate(R.id.repo_nav); + } + } } private void renderGithubMarkdown(WebView view, String text) { @@ -561,7 +564,9 @@ public class RepoItemFragment extends BaseFragment implements RepoLoader.RepoLis public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { var parent = getParentFragment(); if (!(parent instanceof RepoItemFragment)) { - getNavController().navigate(R.id.action_repo_item_fragment_to_repo_fragment); + if (!safeNavigate(R.id.action_repo_item_fragment_to_repo_fragment)) { + safeNavigate(R.id.repo_nav); + } return null; } var repoItemFragment = (RepoItemFragment) parent; @@ -590,7 +595,9 @@ public class RepoItemFragment extends BaseFragment implements RepoLoader.RepoLis var arguments = getArguments(); var parent = getParentFragment(); if (arguments == null || !(parent instanceof RepoItemFragment)) { - getNavController().navigate(R.id.action_repo_item_fragment_to_repo_fragment); + if (!safeNavigate(R.id.action_repo_item_fragment_to_repo_fragment)) { + safeNavigate(R.id.repo_nav); + } return null; } var repoItemFragment = (RepoItemFragment) parent;