diff --git a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java index a94d67a9..6cd854a1 100644 --- a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java +++ b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java @@ -619,7 +619,7 @@ public class ScopeAdapter extends RecyclerView.Adapter }; } - public boolean onBackPressed() { + public void onBackPressed() { if (!refreshing && fragment.binding.masterSwitch.isChecked() && checkedList.isEmpty()) { AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setMessage(!recommendedList.isEmpty() ? R.string.no_scope_selected_has_recommended : R.string.no_scope_selected); @@ -634,12 +634,11 @@ public class ScopeAdapter extends RecyclerView.Adapter builder.setNegativeButton(!recommendedList.isEmpty() ? android.R.string.cancel : android.R.string.ok, (dialog, which) -> { moduleUtil.setModuleEnabled(module.packageName, false); Toast.makeText(activity, activity.getString(R.string.module_disabled_no_selection, module.getAppName()), Toast.LENGTH_LONG).show(); - activity.finish(); + fragment.getNavController().navigateUp(); }); builder.show(); - return false; } else { - return true; + fragment.getNavController().navigateUp(); } } 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 c5b22580..6d0810c7 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 @@ -28,6 +28,7 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import androidx.activity.OnBackPressedCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; @@ -85,7 +86,7 @@ public class AppListFragment extends BaseFragment { searchListener = scopeAdapter.getSearchListener(); - setupToolbar(binding.toolbar, title, R.menu.menu_app_list); + setupToolbar(binding.toolbar, title, R.menu.menu_app_list, view -> requireActivity().getOnBackPressedDispatcher().onBackPressed()); return binding.getRoot(); } @@ -155,6 +156,13 @@ public class AppListFragment extends BaseFragment { }); } }); + + requireActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + scopeAdapter.onBackPressed(); + } + }); } @Override @@ -163,6 +171,13 @@ public class AppListFragment extends BaseFragment { scopeAdapter.refresh(false); } + @Override + public void onDestroyView() { + super.onDestroyView(); + + binding = null; + } + @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (scopeAdapter.onOptionsItemSelected(item)) { 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 1de222bc..bc0b31d3 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 @@ -51,11 +51,15 @@ public class BaseFragment extends Fragment { } public void setupToolbar(Toolbar toolbar, int title, int menu) { - setupToolbar(toolbar, getString(title), menu); + setupToolbar(toolbar, getString(title), menu, null); } public void setupToolbar(Toolbar toolbar, String title, int menu) { - toolbar.setNavigationOnClickListener(v -> navigateUp()); + setupToolbar(toolbar, title, menu, null); + } + + public void setupToolbar(Toolbar toolbar, String title, int menu, View.OnClickListener navigationOnClickListener) { + toolbar.setNavigationOnClickListener(navigationOnClickListener == null ? (v -> navigateUp()) : navigationOnClickListener); toolbar.setNavigationIcon(R.drawable.ic_baseline_arrow_back_24); toolbar.setTitle(title); if (menu != -1) { diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/HomeFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/HomeFragment.java index afbb8804..d5347e00 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/HomeFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/HomeFragment.java @@ -167,6 +167,7 @@ public class HomeFragment extends BaseFragment { @Override public void onDestroyView() { super.onDestroyView(); + binding = null; } } diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java index 3f52630a..2ea89c9b 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java @@ -208,6 +208,13 @@ public class LogsFragment extends BaseFragment { return super.onOptionsItemSelected(item); } + @Override + public void onDestroyView() { + super.onDestroyView(); + + binding = null; + } + private void reloadErrorLog() { ParcelFileDescriptor parcelFileDescriptor = ConfigManager.getLogs(verbose); if (parcelFileDescriptor != null) { 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 6dcbe94e..60af149a 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 @@ -66,6 +66,7 @@ import com.google.android.material.snackbar.Snackbar; import com.google.android.material.tabs.TabLayoutMediator; import org.lsposed.lspd.models.UserInfo; +import org.lsposed.manager.App; import org.lsposed.manager.ConfigManager; import org.lsposed.manager.R; import org.lsposed.manager.adapters.AppHelper; @@ -93,28 +94,29 @@ import rikka.widget.borderview.BorderRecyclerView; public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleListener { + private static final Handler workHandler; + private static final PackageManager pm = App.getInstance().getPackageManager(); + private static final ModuleUtil moduleUtil = ModuleUtil.getInstance(); + protected FragmentPagerBinding binding; protected SearchView searchView; - private SearchView.OnQueryTextListener mSearchListener; + private SearchView.OnQueryTextListener searchListener; private final PagerAdapter pagerAdapter = new PagerAdapter(); private final ArrayList adapters = new ArrayList<>(); - private final ArrayList titles = new ArrayList<>(); - private Handler workHandler; - private PackageManager pm; - private ModuleUtil moduleUtil; private ModuleUtil.InstalledModule selectedModule; + static { + HandlerThread workThread = new HandlerThread("ModulesActivity WorkHandler"); + workThread.start(); + workHandler = new Handler(workThread.getLooper()); + } + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - HandlerThread workThread = new HandlerThread("ModulesActivity WorkHandler"); - workThread.start(); - workHandler = new Handler(workThread.getLooper()); - moduleUtil = ModuleUtil.getInstance(); - pm = requireContext().getPackageManager(); moduleUtil.addListener(this); - mSearchListener = new SearchView.OnQueryTextListener() { + searchListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { adapters.forEach(adapter -> adapter.getFilter().filter(query)); @@ -187,7 +189,7 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi @Override public void onPrepareOptionsMenu(Menu menu) { searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); - searchView.setOnQueryTextListener(mSearchListener); + searchView.setOnQueryTextListener(searchListener); } @Override @@ -198,27 +200,25 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi if (users.size() != adapters.size()) { adapters.clear(); if (users.size() != 1) { + ArrayList titles = new ArrayList<>(); for (var user : users) { var adapter = new ModuleAdapter(user); adapter.setHasStableIds(true); adapters.add(adapter); titles.add(user.name); } + binding.viewPager.setUserInputEnabled(true); + new TabLayoutMediator(binding.tabLayout, binding.viewPager, (tab, position) -> tab.setText(titles.get(position))).attach(); + binding.tabLayout.setVisibility(View.VISIBLE); } else { var adapter = new ModuleAdapter(null); adapter.setHasStableIds(true); adapters.add(adapter); + binding.viewPager.setUserInputEnabled(false); + binding.tabLayout.setVisibility(View.GONE); } pagerAdapter.notifyDataSetChanged(); } - if (users.size() != 1) { - binding.viewPager.setUserInputEnabled(true); - new TabLayoutMediator(binding.tabLayout, binding.viewPager, (tab, position) -> tab.setText(titles.get(position))).attach(); - binding.tabLayout.setVisibility(View.VISIBLE); - } else { - binding.viewPager.setUserInputEnabled(false); - binding.tabLayout.setVisibility(View.GONE); - } } adapters.forEach(ModuleAdapter::refresh); } @@ -320,6 +320,14 @@ public class ModulesFragment extends BaseFragment implements ModuleUtil.ModuleLi return super.onContextItemSelected(item); } + @Override + public void onDestroyView() { + super.onDestroyView(); + + binding = null; + adapters.clear(); + } + private class PagerAdapter extends RecyclerView.Adapter { @NonNull 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 e4c335ba..0700ab0a 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 @@ -177,6 +177,13 @@ public class RepoFragment extends BaseFragment implements RepoLoader.Listener { return super.onOptionsItemSelected(item); } + @Override + public void onDestroyView() { + super.onDestroyView(); + + binding = null; + } + private class RepoAdapter extends RecyclerView.Adapter implements Filterable { private List fullList, showList; private final LabelComparator labelComparator = new LabelComparator(); 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 812ed843..f6b6f93d 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 @@ -176,6 +176,13 @@ public class RepoItemFragment extends BaseFragment implements RepoLoader.Listene RepoLoader.getInstance().removeListener(this); } + @Override + public void onDestroyView() { + super.onDestroyView(); + + binding = null; + } + private class InformationAdapter extends RecyclerView.Adapter { private final OnlineModule module; diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java index 00fed6c5..c9b02bfd 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java @@ -85,6 +85,12 @@ public class SettingsFragment extends BaseFragment { } } + @Override + public void onDestroyView() { + super.onDestroyView(); + + binding = null; + } public static class PreferenceFragment extends PreferenceFragmentCompat { ActivityResultLauncher backupLauncher = registerForActivityResult(new ActivityResultContracts.CreateDocument(),