diff --git a/app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java b/app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java index fcb2f03f..cc18ef3d 100644 --- a/app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java +++ b/app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java @@ -79,8 +79,11 @@ public class MainActivity extends BaseActivity { return; } NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment); + if (navHostFragment == null) { + return; + } NavController navController = navHostFragment.getNavController(); - if (intent.getAction().equals("android.intent.action.APPLICATION_PREFERENCES")) { + if (intent.getAction() != null && intent.getAction().equals("android.intent.action.APPLICATION_PREFERENCES")) { navController.navigate(R.id.settings_fragment); } else if (intent.hasExtra("modulePackageName")) { Bundle bundle = new Bundle(); diff --git a/app/src/main/java/org/lsposed/manager/ui/activity/SettingsActivity.java b/app/src/main/java/org/lsposed/manager/ui/activity/SettingsActivity.java deleted file mode 100644 index a42fd347..00000000 --- a/app/src/main/java/org/lsposed/manager/ui/activity/SettingsActivity.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * This file is part of LSPosed. - * - * LSPosed is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * LSPosed is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with LSPosed. If not, see . - * - * Copyright (C) 2020 EdXposed Contributors - * Copyright (C) 2021 LSPosed Contributors - */ - -package org.lsposed.manager.ui.activity; - -import android.Manifest; -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.AsyncTask; -import android.os.Build; -import android.os.Bundle; -import android.provider.Settings; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.ViewGroup; - -import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts; -import androidx.annotation.NonNull; -import androidx.annotation.StringRes; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.preference.Preference; -import androidx.preference.SwitchPreference; -import androidx.recyclerview.widget.RecyclerView; - -import com.google.android.material.snackbar.Snackbar; -import com.takisoft.preferencex.PreferenceCategory; -import com.takisoft.preferencex.PreferenceFragmentCompat; - -import org.lsposed.manager.BuildConfig; -import org.lsposed.manager.ConfigManager; -import org.lsposed.manager.R; -import org.lsposed.manager.databinding.FragmentSettingsBinding; -import org.lsposed.manager.ui.activity.base.BaseActivity; -import org.lsposed.manager.util.BackupUtils; -import org.lsposed.manager.util.theme.ThemeUtil; - -import java.util.Calendar; -import java.util.Locale; - -import rikka.core.util.ResourceUtils; -import rikka.material.app.DayNightDelegate; -import rikka.recyclerview.RecyclerViewKt; -import rikka.widget.borderview.BorderRecyclerView; - -public class SettingsActivity extends BaseActivity { - private static final String KEY_PREFIX = SettingsActivity.class.getName() + '.'; - private static final String EXTRA_SAVED_INSTANCE_STATE = KEY_PREFIX + "SAVED_INSTANCE_STATE"; - FragmentSettingsBinding binding; - private boolean restarting; - - @NonNull - public static Intent newIntent(@NonNull Context context) { - return new Intent(context, SettingsActivity.class); - } - - @NonNull - private static Intent newIntent(@NonNull Bundle savedInstanceState, @NonNull Context context) { - return newIntent(context) - .putExtra(EXTRA_SAVED_INSTANCE_STATE, savedInstanceState); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - if (savedInstanceState == null) { - savedInstanceState = getIntent().getBundleExtra(EXTRA_SAVED_INSTANCE_STATE); - } - super.onCreate(savedInstanceState); - binding = FragmentSettingsBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - setAppBar(binding.appBar, binding.toolbar); - binding.getRoot().bringChildToFront(binding.appBar); - binding.toolbar.setNavigationOnClickListener(view -> finish()); - ActionBar bar = getSupportActionBar(); - if (bar != null) { - bar.setDisplayHomeAsUpEnabled(true); - } - if (savedInstanceState == null) { - getSupportFragmentManager().beginTransaction() - .add(R.id.container, new SettingsFragment()).commit(); - } - if (ConfigManager.getXposedVersionName() == null) { - Snackbar.make(binding.snackbar, R.string.lsposed_not_active, Snackbar.LENGTH_LONG).show(); - } - } - - private void restart() { - Bundle savedInstanceState = new Bundle(); - onSaveInstanceState(savedInstanceState); - finish(); - startActivity(newIntent(savedInstanceState, this)); - overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); - restarting = true; - } - - @Override - public boolean dispatchKeyEvent(@NonNull KeyEvent event) { - return restarting || super.dispatchKeyEvent(event); - } - - @SuppressLint("RestrictedApi") - @Override - public boolean dispatchKeyShortcutEvent(@NonNull KeyEvent event) { - return restarting || super.dispatchKeyShortcutEvent(event); - } - - @Override - public boolean dispatchTouchEvent(@NonNull MotionEvent event) { - return restarting || super.dispatchTouchEvent(event); - } - - @Override - public boolean dispatchTrackballEvent(@NonNull MotionEvent event) { - return restarting || super.dispatchTrackballEvent(event); - } - - @Override - public boolean dispatchGenericMotionEvent(@NonNull MotionEvent event) { - return restarting || super.dispatchGenericMotionEvent(event); - } - - public static class SettingsFragment extends PreferenceFragmentCompat { - ActivityResultLauncher backupLauncher = registerForActivityResult(new ActivityResultContracts.CreateDocument(), - uri -> { - if (uri != null) { - try { - // grantUriPermission might throw RemoteException on MIUI - requireActivity().grantUriPermission(BuildConfig.APPLICATION_ID, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - } catch (Exception e) { - e.printStackTrace(); - } - AlertDialog alertDialog = new AlertDialog.Builder(requireActivity()) - .setCancelable(false) - .setMessage(R.string.settings_backuping) - .show(); - AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> { - boolean success = BackupUtils.backup(requireContext(), uri); - try { - SettingsActivity activity = (SettingsActivity) requireActivity(); - activity.runOnUiThread(() -> { - alertDialog.dismiss(); - activity.makeSnackBar(success ? R.string.settings_backup_success : R.string.settings_backup_failed, Snackbar.LENGTH_SHORT); - }); - } catch (Exception e) { - e.printStackTrace(); - } - }); - } - }); - ActivityResultLauncher restoreLauncher = registerForActivityResult(new ActivityResultContracts.OpenDocument(), - uri -> { - if (uri != null) { - try { - // grantUriPermission might throw RemoteException on MIUI - requireActivity().grantUriPermission(BuildConfig.APPLICATION_ID, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); - } catch (Exception e) { - e.printStackTrace(); - } - AlertDialog alertDialog = new AlertDialog.Builder(requireActivity()) - .setCancelable(false) - .setMessage(R.string.settings_restoring) - .show(); - AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> { - boolean success = BackupUtils.restore(requireContext(), uri); - try { - SettingsActivity activity = (SettingsActivity) requireActivity(); - activity.runOnUiThread(() -> { - alertDialog.dismiss(); - activity.makeSnackBar(success ? R.string.settings_restore_success : R.string.settings_restore_failed, Snackbar.LENGTH_SHORT); - }); - } catch (Exception e) { - e.printStackTrace(); - } - }); - } - }); - - @Override - public void onCreatePreferencesFix(Bundle savedInstanceState, String rootKey) { - addPreferencesFromResource(R.xml.prefs); - - boolean installed = ConfigManager.getXposedVersionName() != null; - SwitchPreference prefVerboseLogs = findPreference("disable_verbose_log"); - if (prefVerboseLogs != null) { - if (requireActivity().getApplicationInfo().uid / 100000 != 0) { - prefVerboseLogs.setVisible(false); - } else { - prefVerboseLogs.setEnabled(installed); - prefVerboseLogs.setChecked(!ConfigManager.isVerboseLogEnabled()); - prefVerboseLogs.setOnPreferenceChangeListener((preference, newValue) -> { - boolean result = ConfigManager.setVerboseLogEnabled(!(boolean) newValue); - SettingsActivity activity = (SettingsActivity) getActivity(); - if (result && activity != null) { - Snackbar.make(activity.binding.snackbar, R.string.reboot_required, Snackbar.LENGTH_SHORT) - .setAction(R.string.reboot, v -> ConfigManager.reboot(false, null, false)) - .show(); - } - return result; - }); - } - } - - SwitchPreference prefEnableResources = findPreference("enable_resources"); - if (prefEnableResources != null) { - prefEnableResources.setEnabled(installed); - prefEnableResources.setChecked(ConfigManager.isResourceHookEnabled()); - prefEnableResources.setOnPreferenceChangeListener((preference, newValue) -> ConfigManager.setResourceHookEnabled((boolean) newValue)); - } - - Preference backup = findPreference("backup"); - if (backup != null) { - backup.setEnabled(installed); - backup.setOnPreferenceClickListener(preference -> { - Calendar now = Calendar.getInstance(); - backupLauncher.launch(String.format(Locale.US, - "LSPosed_%04d%02d%02d_%02d%02d%02d.lsp", - now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1, - now.get(Calendar.DAY_OF_MONTH), now.get(Calendar.HOUR_OF_DAY), - now.get(Calendar.MINUTE), now.get(Calendar.SECOND))); - return true; - }); - } - - Preference restore = findPreference("restore"); - if (restore != null) { - restore.setEnabled(installed); - restore.setOnPreferenceClickListener(preference -> { - restoreLauncher.launch(new String[]{"*/*"}); - return true; - }); - } - - Preference theme = findPreference("dark_theme"); - if (theme != null) { - theme.setOnPreferenceChangeListener((preference, newValue) -> { - if (!preferences.getString("dark_theme", ThemeUtil.MODE_NIGHT_FOLLOW_SYSTEM).equals(newValue)) { - DayNightDelegate.setDefaultNightMode(ThemeUtil.getDarkTheme((String) newValue)); - SettingsActivity activity = (SettingsActivity) getActivity(); - if (activity != null) { - activity.restart(); - } - } - return true; - }); - } - - Preference black_dark_theme = findPreference("black_dark_theme"); - if (black_dark_theme != null) { - black_dark_theme.setOnPreferenceChangeListener((preference, newValue) -> { - SettingsActivity activity = (SettingsActivity) getActivity(); - if (activity != null && ResourceUtils.isNightMode(getResources().getConfiguration())) { - activity.restart(); - } - return true; - }); - } - - Preference primary_color = findPreference("theme_color"); - if (primary_color != null) { - primary_color.setOnPreferenceChangeListener((preference, newValue) -> { - SettingsActivity activity = (SettingsActivity) getActivity(); - if (activity != null) { - activity.restart(); - } - return true; - }); - } - - PreferenceCategory prefGroupSystem = findPreference("settings_group_system"); - SwitchPreference prefShowHiddenIcons = findPreference("show_hidden_icon_apps_enabled"); - if (prefGroupSystem != null && prefShowHiddenIcons != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q - && requireActivity().checkSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS) == PackageManager.PERMISSION_GRANTED) { - prefGroupSystem.setVisible(true); - prefShowHiddenIcons.setVisible(true); - prefShowHiddenIcons.setChecked(Settings.Global.getInt( - requireActivity().getContentResolver(), "show_hidden_icon_apps_enabled", 1) != 0); - prefShowHiddenIcons.setOnPreferenceChangeListener((preference, newValue) -> Settings.Global.putInt(requireActivity().getContentResolver(), - "show_hidden_icon_apps_enabled", (boolean) newValue ? 1 : 0)); - } - - SwitchPreference prefFollowSystemAccent = findPreference("follow_system_accent"); - if (prefFollowSystemAccent != null && (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S || Build.VERSION.SDK_INT == Build.VERSION_CODES.R && Build.VERSION.PREVIEW_SDK_INT != 0)) { - if (primary_color != null) { - primary_color.setVisible(!prefFollowSystemAccent.isChecked()); - } - prefFollowSystemAccent.setVisible(true); - prefFollowSystemAccent.setOnPreferenceChangeListener((preference, newValue) -> { - SettingsActivity activity = (SettingsActivity) getActivity(); - if (activity != null) { - activity.restart(); - } - return true; - }); - } - } - - @Override - public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { - BorderRecyclerView recyclerView = (BorderRecyclerView) super.onCreateRecyclerView(inflater, parent, savedInstanceState); - RecyclerViewKt.fixEdgeEffect(recyclerView, false, true); - recyclerView.getBorderViewDelegate().setBorderVisibilityChangedListener((top, oldTop, bottom, oldBottom) -> { - SettingsActivity activity = (SettingsActivity) getActivity(); - if (activity != null) { - activity.binding.appBar.setRaised(!top); - } - }); - return recyclerView; - } - } - - public void makeSnackBar(@StringRes int text, @Snackbar.Duration int duration) { - Snackbar.make(binding.snackbar, text, duration).show(); - } -}