From a189dec1c8350323bd4beb84a887fe9255f156cf Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Mon, 21 Jan 2019 15:49:03 -0500 Subject: [PATCH] Centralize configuration management --- .../com/topjohnwu/magisk/MainActivity.java | 8 +- .../com/topjohnwu/magisk/SplashActivity.java | 14 +- .../topjohnwu/magisk/SuRequestActivity.java | 15 +- .../magisk/components/BaseActivity.java | 4 +- .../components/InstallMethodDialog.java | 6 +- .../components/MagiskInstallDialog.java | 12 +- .../components/ManagerInstallDialog.java | 8 +- .../magisk/components/Notifications.java | 8 +- .../magisk/components/UninstallDialog.java | 6 +- .../magisk/fragments/MagiskFragment.java | 33 +- .../magisk/fragments/ReposFragment.java | 9 +- .../magisk/fragments/SettingsFragment.java | 159 ++++---- .../magisk/receivers/GeneralReceiver.java | 6 +- .../magisk/receivers/ShortcutReceiver.java | 6 +- .../magisk/services/UpdateCheckService.java | 6 +- .../com/topjohnwu/magisk/utils/AppUtils.java | 4 +- .../topjohnwu/magisk/utils/DownloadApp.java | 8 +- .../magisk/utils/FingerprintHelper.java | 5 +- .../com/topjohnwu/magisk/utils/PatchAPK.java | 6 +- .../topjohnwu/magisk/utils/SuConnector.java | 6 +- .../src/main/java/com/topjohnwu/core/App.java | 1 - .../main/java/com/topjohnwu/core/Config.java | 367 ++++++++++++++++++ .../main/java/com/topjohnwu/core/Const.java | 56 +-- .../main/java/com/topjohnwu/core/Data.java | 155 -------- .../com/topjohnwu/core/database/MagiskDB.java | 4 +- .../core/database/RepoDatabaseHelper.java | 12 +- .../topjohnwu/core/tasks/CheckUpdates.java | 33 +- .../topjohnwu/core/tasks/MagiskInstaller.java | 12 +- .../com/topjohnwu/core/tasks/UpdateRepos.java | 7 +- .../topjohnwu/core/utils/LocaleManager.java | 4 +- .../com/topjohnwu/core/utils/RootUtils.java | 11 +- .../java/com/topjohnwu/core/utils/Utils.java | 10 +- 32 files changed, 583 insertions(+), 418 deletions(-) create mode 100644 core/src/main/java/com/topjohnwu/core/Config.java delete mode 100644 core/src/main/java/com/topjohnwu/core/Data.java diff --git a/app/src/full/java/com/topjohnwu/magisk/MainActivity.java b/app/src/full/java/com/topjohnwu/magisk/MainActivity.java index 8e70c02e5..ac92cec97 100644 --- a/app/src/full/java/com/topjohnwu/magisk/MainActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/MainActivity.java @@ -9,8 +9,8 @@ import android.view.MenuItem; import android.view.View; import com.google.android.material.navigation.NavigationView; +import com.topjohnwu.core.Config; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; import com.topjohnwu.core.utils.Topic; import com.topjohnwu.core.utils.Utils; import com.topjohnwu.magisk.components.BaseActivity; @@ -125,10 +125,10 @@ public class MainActivity extends BaseActivity public void checkHideSection() { Menu menu = navigationView.getMenu(); menu.findItem(R.id.magiskhide).setVisible(Shell.rootAccess() && - app.prefs.getBoolean(Const.Key.MAGISKHIDE, false)); - menu.findItem(R.id.modules).setVisible(Shell.rootAccess() && Data.magiskVersionCode >= 0); + (boolean) Config.get(Config.Key.MAGISKHIDE)); + menu.findItem(R.id.modules).setVisible(Shell.rootAccess() && Config.magiskVersionCode >= 0); menu.findItem(R.id.downloads).setVisible(Networking.checkNetworkStatus(this) - && Shell.rootAccess() && Data.magiskVersionCode >= 0); + && Shell.rootAccess() && Config.magiskVersionCode >= 0); menu.findItem(R.id.log).setVisible(Shell.rootAccess()); menu.findItem(R.id.superuser).setVisible(Utils.showSuperUser()); } diff --git a/app/src/full/java/com/topjohnwu/magisk/SplashActivity.java b/app/src/full/java/com/topjohnwu/magisk/SplashActivity.java index 9e4b2978a..d04f00a37 100644 --- a/app/src/full/java/com/topjohnwu/magisk/SplashActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/SplashActivity.java @@ -5,8 +5,8 @@ import android.content.pm.PackageManager; import android.os.Bundle; import android.text.TextUtils; +import com.topjohnwu.core.Config; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; import com.topjohnwu.core.tasks.CheckUpdates; import com.topjohnwu.core.tasks.UpdateRepos; import com.topjohnwu.core.utils.LocaleManager; @@ -27,9 +27,9 @@ public class SplashActivity extends BaseActivity { // Dynamic detect all locales LocaleManager.loadAvailableLocales(R.string.app_changelog); - String pkg = app.mDB.getStrings(Const.Key.SU_MANAGER, null); + String pkg = Config.get(Config.Key.SU_MANAGER); if (pkg != null && getPackageName().equals(BuildConfig.APPLICATION_ID)) { - app.mDB.setStrings(Const.Key.SU_MANAGER, null); + Config.remove(Config.Key.SU_MANAGER); Shell.su("pm uninstall " + pkg).exec(); } if (TextUtils.equals(pkg, getPackageName())) { @@ -41,12 +41,13 @@ public class SplashActivity extends BaseActivity { } // Magisk working as expected - if (Shell.rootAccess() && Data.magiskVersionCode > 0) { + if (Shell.rootAccess() && Config.magiskVersionCode > 0) { // Load modules Utils.loadModules(); } - Data.importPrefs(); + // Set default configs + Config.initialize(); // Create notification channel on Android O Notifications.setup(this); @@ -64,9 +65,6 @@ public class SplashActivity extends BaseActivity { new UpdateRepos().exec(); } - // Write back default values - Data.writeConfig(); - app.init = true; Intent intent = new Intent(this, ClassMap.get(MainActivity.class)); diff --git a/app/src/full/java/com/topjohnwu/magisk/SuRequestActivity.java b/app/src/full/java/com/topjohnwu/magisk/SuRequestActivity.java index 8bf763e44..53b76a787 100644 --- a/app/src/full/java/com/topjohnwu/magisk/SuRequestActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/SuRequestActivity.java @@ -15,8 +15,7 @@ import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; -import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.container.Policy; import com.topjohnwu.magisk.components.BaseActivity; import com.topjohnwu.magisk.utils.FingerprintHelper; @@ -103,14 +102,14 @@ public class SuRequestActivity extends BaseActivity { return; } - switch (Data.suResponseType) { - case Const.Value.SU_AUTO_DENY: + switch ((int) Config.get(Config.Key.SU_AUTO_RESPONSE)) { + case Config.Value.SU_AUTO_DENY: handleAction(Policy.DENY, 0); return; - case Const.Value.SU_AUTO_ALLOW: + case Config.Value.SU_AUTO_ALLOW: handleAction(Policy.ALLOW, 0); return; - case Const.Value.SU_PROMPT: + case Config.Value.SU_PROMPT: default: } @@ -134,7 +133,7 @@ public class SuRequestActivity extends BaseActivity { adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); timeout.setAdapter(adapter); - timer = new CountDownTimer(Data.suRequestTimeout * 1000, 1000) { + timer = new CountDownTimer((int) Config.get(Config.Key.SU_REQUEST_TIMEOUT) * 1000, 1000) { @Override public void onTick(long millisUntilFinished) { deny_btn.setText(getString(R.string.deny_with_str, "(" + millisUntilFinished / 1000 + ")")); @@ -210,7 +209,7 @@ public class SuRequestActivity extends BaseActivity { } private void handleAction(int action) { - handleAction(action, Const.Value.timeoutList[timeout.getSelectedItemPosition()]); + handleAction(action, Config.Value.TIMEOUT_LIST[timeout.getSelectedItemPosition()]); } private void handleAction(int action, int time) { diff --git a/app/src/full/java/com/topjohnwu/magisk/components/BaseActivity.java b/app/src/full/java/com/topjohnwu/magisk/components/BaseActivity.java index c294c3eab..2b4ebcbdb 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/BaseActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/BaseActivity.java @@ -10,8 +10,8 @@ import android.view.WindowManager; import android.widget.Toast; import com.topjohnwu.core.App; +import com.topjohnwu.core.Config; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; import com.topjohnwu.core.utils.LocaleManager; import com.topjohnwu.core.utils.Topic; import com.topjohnwu.magisk.R; @@ -59,7 +59,7 @@ public abstract class BaseActivity extends AppCompatActivity implements Topic.Au @Override protected void onCreate(@Nullable Bundle savedInstanceState) { Topic.subscribe(this); - if (Data.isDarkTheme && getDarkTheme() != -1) { + if (getDarkTheme() != -1 && (boolean) Config.get(Config.Key.DARK_THEME)) { setTheme(getDarkTheme()); } super.onCreate(savedInstanceState); diff --git a/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java b/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java index 6ec735c4d..a8fcbf3f1 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java @@ -5,8 +5,8 @@ import android.content.Intent; import android.widget.Toast; import com.google.android.material.snackbar.Snackbar; +import com.topjohnwu.core.Config; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; import com.topjohnwu.core.utils.Utils; import com.topjohnwu.magisk.ClassMap; import com.topjohnwu.magisk.FlashActivity; @@ -65,10 +65,10 @@ class InstallMethodDialog extends AlertDialog.Builder { private void downloadOnly(BaseActivity a) { a.runWithExternalRW(() -> { String filename = Utils.fmt("Magisk-v%s(%d).zip", - Data.remoteMagiskVersionString, Data.remoteMagiskVersionCode); + Config.remoteMagiskVersionString, Config.remoteMagiskVersionCode); File zip = new File(Const.EXTERNAL_PATH, filename); ProgressNotification progress = new ProgressNotification(filename); - Networking.get(Data.magiskLink) + Networking.get(Config.magiskLink) .setDownloadProgressListener(progress) .setErrorHandler(((conn, e) -> progress.dlFail())) .getAsFile(zip, f -> { diff --git a/app/src/full/java/com/topjohnwu/magisk/components/MagiskInstallDialog.java b/app/src/full/java/com/topjohnwu/magisk/components/MagiskInstallDialog.java index 6132a3f00..2a42aebc3 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/MagiskInstallDialog.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/MagiskInstallDialog.java @@ -3,7 +3,7 @@ package com.topjohnwu.magisk.components; import android.net.Uri; import android.text.TextUtils; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.utils.Utils; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.utils.AppUtils; @@ -17,7 +17,7 @@ public class MagiskInstallDialog extends CustomAlertDialog { public MagiskInstallDialog(BaseActivity a) { super(a); String filename = Utils.fmt("Magisk-v%s(%d).zip", - Data.remoteMagiskVersionString, Data.remoteMagiskVersionCode); + Config.remoteMagiskVersionString, Config.remoteMagiskVersionCode); setTitle(a.getString(R.string.repo_install_title, a.getString(R.string.magisk))); setMessage(a.getString(R.string.repo_install_msg, filename)); setCancelable(true); @@ -35,13 +35,13 @@ public class MagiskInstallDialog extends CustomAlertDialog { new InstallMethodDialog(a, options).show(); }); setNegativeButton(R.string.no_thanks, null); - if (!TextUtils.isEmpty(Data.magiskNoteLink)) { + if (!TextUtils.isEmpty(Config.magiskNoteLink)) { setNeutralButton(R.string.release_notes, (d, i) -> { - if (Data.magiskNoteLink.contains("forum.xda-developers")) { + if (Config.magiskNoteLink.contains("forum.xda-developers")) { // Open forum links in browser - AppUtils.openLink(a, Uri.parse(Data.magiskNoteLink)); + AppUtils.openLink(a, Uri.parse(Config.magiskNoteLink)); } else { - MarkDownWindow.show(a, null, Data.magiskNoteLink); + MarkDownWindow.show(a, null, Config.magiskNoteLink); } }); } diff --git a/app/src/full/java/com/topjohnwu/magisk/components/ManagerInstallDialog.java b/app/src/full/java/com/topjohnwu/magisk/components/ManagerInstallDialog.java index 676a8333a..e44ffefe5 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/ManagerInstallDialog.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/ManagerInstallDialog.java @@ -2,7 +2,7 @@ package com.topjohnwu.magisk.components; import android.text.TextUtils; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.utils.Utils; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.utils.DownloadApp; @@ -14,14 +14,14 @@ public class ManagerInstallDialog extends CustomAlertDialog { public ManagerInstallDialog(@NonNull BaseActivity a) { super(a); String name = Utils.fmt("MagiskManager v%s(%d)", - Data.remoteManagerVersionString, Data.remoteManagerVersionCode); + Config.remoteManagerVersionString, Config.remoteManagerVersionCode); setTitle(a.getString(R.string.repo_install_title, a.getString(R.string.app_name))); setMessage(a.getString(R.string.repo_install_msg, name)); setCancelable(true); setPositiveButton(R.string.install, (d, i) -> DownloadApp.upgrade(name)); setNegativeButton(R.string.no_thanks, null); - if (!TextUtils.isEmpty(Data.managerNoteLink)) { - setNeutralButton(R.string.app_changelog, (d, i) -> MarkDownWindow.show(a, null, Data.managerNoteLink)); + if (!TextUtils.isEmpty(Config.managerNoteLink)) { + setNeutralButton(R.string.app_changelog, (d, i) -> MarkDownWindow.show(a, null, Config.managerNoteLink)); } } } diff --git a/app/src/full/java/com/topjohnwu/magisk/components/Notifications.java b/app/src/full/java/com/topjohnwu/magisk/components/Notifications.java index dee202316..af930c093 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/Notifications.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/Notifications.java @@ -8,8 +8,8 @@ import android.content.Intent; import android.os.Build; import com.topjohnwu.core.App; +import com.topjohnwu.core.Config; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; import com.topjohnwu.core.utils.Utils; import com.topjohnwu.magisk.ClassMap; import com.topjohnwu.magisk.R; @@ -52,7 +52,7 @@ public class Notifications { NotificationCompat.Builder builder = new NotificationCompat.Builder(app, Const.ID.UPDATE_NOTIFICATION_CHANNEL); builder.setSmallIcon(R.drawable.ic_magisk_outline) .setContentTitle(app.getString(R.string.magisk_update_title)) - .setContentText(app.getString(R.string.magisk_update_available, Data.remoteMagiskVersionString)) + .setContentText(app.getString(R.string.magisk_update_available, Config.remoteMagiskVersionString)) .setVibrate(new long[]{0, 100, 100, 100}) .setAutoCancel(true) .setContentIntent(pendingIntent); @@ -63,11 +63,11 @@ public class Notifications { public static void managerUpdate() { App app = App.self; String name = Utils.fmt("MagiskManager v%s(%d)", - Data.remoteManagerVersionString, Data.remoteManagerVersionCode); + Config.remoteManagerVersionString, Config.remoteManagerVersionCode); Intent intent = new Intent(app, ClassMap.get(GeneralReceiver.class)); intent.setAction(Const.Key.BROADCAST_MANAGER_UPDATE); - intent.putExtra(Const.Key.INTENT_SET_LINK, Data.managerLink); + intent.putExtra(Const.Key.INTENT_SET_LINK, Config.managerLink); intent.putExtra(Const.Key.INTENT_SET_NAME, name); PendingIntent pendingIntent = PendingIntent.getBroadcast(app, Const.ID.APK_UPDATE_NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT); diff --git a/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java b/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java index 8e16b1178..048cbd5ee 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java @@ -7,8 +7,8 @@ import android.net.Uri; import android.text.TextUtils; import android.widget.Toast; +import com.topjohnwu.core.Config; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; import com.topjohnwu.core.utils.Utils; import com.topjohnwu.magisk.ClassMap; import com.topjohnwu.magisk.FlashActivity; @@ -39,11 +39,11 @@ public class UninstallDialog extends CustomAlertDialog { } }); }); - if (!TextUtils.isEmpty(Data.uninstallerLink)) { + if (!TextUtils.isEmpty(Config.uninstallerLink)) { setPositiveButton(R.string.complete_uninstall, (d, i) -> { File zip = new File(activity.getFilesDir(), "uninstaller.zip"); ProgressNotification progress = new ProgressNotification(zip.getName()); - Networking.get(Data.uninstallerLink) + Networking.get(Config.uninstallerLink) .setDownloadProgressListener(progress) .setErrorHandler(((conn, e) -> progress.dlFail())) .getAsFile(zip, f -> { diff --git a/app/src/full/java/com/topjohnwu/magisk/fragments/MagiskFragment.java b/app/src/full/java/com/topjohnwu/magisk/fragments/MagiskFragment.java index d0e12110a..aee57aebb 100644 --- a/app/src/full/java/com/topjohnwu/magisk/fragments/MagiskFragment.java +++ b/app/src/full/java/com/topjohnwu/magisk/fragments/MagiskFragment.java @@ -15,8 +15,7 @@ import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; -import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.tasks.CheckUpdates; import com.topjohnwu.core.tasks.SafetyNet; import com.topjohnwu.core.utils.ISafetyNetHelper; @@ -112,7 +111,7 @@ public class MagiskFragment extends BaseFragment @OnClick(R.id.install_button) void install() { // Show Manager update first - if (Data.remoteManagerVersionCode > BuildConfig.VERSION_CODE) { + if (Config.remoteManagerVersionCode > BuildConfig.VERSION_CODE) { new ManagerInstallDialog((BaseActivity) requireActivity()).show(); return; } @@ -137,10 +136,10 @@ public class MagiskFragment extends BaseFragment expandableContainer.expandLayout = expandLayout; setupExpandable(); - keepVerityChkbox.setChecked(Data.keepVerity); - keepVerityChkbox.setOnCheckedChangeListener((view, checked) -> Data.keepVerity = checked); - keepEncChkbox.setChecked(Data.keepEnc); - keepEncChkbox.setOnCheckedChangeListener((view, checked) -> Data.keepEnc = checked); + keepVerityChkbox.setChecked(Config.keepVerity); + keepVerityChkbox.setOnCheckedChangeListener((view, checked) -> Config.keepVerity = checked); + keepEncChkbox.setChecked(Config.keepEnc); + keepEncChkbox.setOnCheckedChangeListener((view, checked) -> Config.keepEnc = checked); mSwipeRefreshLayout.setOnRefreshListener(this); updateUI(); @@ -150,7 +149,7 @@ public class MagiskFragment extends BaseFragment @Override public void onRefresh() { - Data.loadMagiskInfo(); + Config.loadMagiskInfo(); updateUI(); magiskUpdateText.setText(R.string.checking_for_updates); @@ -160,8 +159,8 @@ public class MagiskFragment extends BaseFragment safetyNetStatusText.setText(R.string.safetyNet_check_text); Topic.reset(getSubscribedTopics()); - Data.remoteMagiskVersionString = null; - Data.remoteMagiskVersionCode = -1; + Config.remoteMagiskVersionString = null; + Config.remoteMagiskVersionCode = -1; collapse(); shownDialog = false; @@ -216,18 +215,18 @@ public class MagiskFragment extends BaseFragment magiskUpdate.setVisibility(hasNetwork ? View.VISIBLE : View.GONE); installOptionCard.setVisibility(hasNetwork ? View.VISIBLE : View.GONE); uninstallButton.setVisibility(hasRoot ? View.VISIBLE : View.GONE); - coreOnlyNotice.setVisibility(app.prefs.getBoolean(Const.Key.COREONLY, false) ? View.VISIBLE : View.GONE); + coreOnlyNotice.setVisibility(Config.get(Config.Key.COREONLY) ? View.VISIBLE : View.GONE); int image, color; - if (Data.magiskVersionCode < 0) { + if (Config.magiskVersionCode < 0) { color = colorBad; image = R.drawable.ic_cancel; magiskVersionText.setText(R.string.magisk_version_error); } else { color = colorOK; image = R.drawable.ic_check_circle; - magiskVersionText.setText(getString(R.string.current_magisk_title, "v" + Data.magiskVersionString)); + magiskVersionText.setText(getString(R.string.current_magisk_title, "v" + Config.magiskVersionString)); } magiskStatusIcon.setImageResource(image); @@ -239,7 +238,7 @@ public class MagiskFragment extends BaseFragment safetyNetCard.setVisibility(hasGms() ? View.VISIBLE : View.GONE); - if (Data.remoteMagiskVersionCode < 0) { + if (Config.remoteMagiskVersionCode < 0) { color = colorNeutral; image = R.drawable.ic_help; magiskUpdateText.setText(R.string.invalid_update_channel); @@ -247,11 +246,11 @@ public class MagiskFragment extends BaseFragment } else { color = colorOK; image = R.drawable.ic_check_circle; - magiskUpdateText.setText(getString(R.string.install_magisk_title, "v" + Data.remoteMagiskVersionString)); + magiskUpdateText.setText(getString(R.string.install_magisk_title, "v" + Config.remoteMagiskVersionString)); installButton.setVisibility(View.VISIBLE); - if (Data.remoteManagerVersionCode > BuildConfig.VERSION_CODE) { + if (Config.remoteManagerVersionCode > BuildConfig.VERSION_CODE) { installText.setText(getString(R.string.update, getString(R.string.app_name))); - } else if (Data.magiskVersionCode > 0 && Data.remoteMagiskVersionCode > Data.magiskVersionCode) { + } else if (Config.magiskVersionCode > 0 && Config.remoteMagiskVersionCode > Config.magiskVersionCode) { installText.setText(getString(R.string.update, getString(R.string.magisk))); } else { installText.setText(R.string.install); diff --git a/app/src/full/java/com/topjohnwu/magisk/fragments/ReposFragment.java b/app/src/full/java/com/topjohnwu/magisk/fragments/ReposFragment.java index 447e3a976..491225eae 100644 --- a/app/src/full/java/com/topjohnwu/magisk/fragments/ReposFragment.java +++ b/app/src/full/java/com/topjohnwu/magisk/fragments/ReposFragment.java @@ -11,8 +11,7 @@ import android.view.ViewGroup; import android.widget.SearchView; import android.widget.TextView; -import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.container.Module; import com.topjohnwu.core.tasks.UpdateRepos; import com.topjohnwu.core.utils.Topic; @@ -106,9 +105,9 @@ public class ReposFragment extends BaseFragment implements Topic.Subscriber { if (item.getItemId() == R.id.repo_sort) { new AlertDialog.Builder(getActivity()) .setTitle(R.string.sorting_order) - .setSingleChoiceItems(R.array.sorting_orders, Data.repoOrder, (d, which) -> { - Data.repoOrder = which; - app.prefs.edit().putInt(Const.Key.REPO_ORDER, Data.repoOrder).apply(); + .setSingleChoiceItems(R.array.sorting_orders, + Config.get(Config.Key.REPO_ORDER), (d, which) -> { + Config.set(Config.Key.REPO_ORDER, which); adapter.notifyDBChanged(); d.dismiss(); }).show(); diff --git a/app/src/full/java/com/topjohnwu/magisk/fragments/SettingsFragment.java b/app/src/full/java/com/topjohnwu/magisk/fragments/SettingsFragment.java index ac8986e27..07bde0643 100644 --- a/app/src/full/java/com/topjohnwu/magisk/fragments/SettingsFragment.java +++ b/app/src/full/java/com/topjohnwu/magisk/fragments/SettingsFragment.java @@ -11,8 +11,8 @@ import android.widget.EditText; import android.widget.Toast; import com.topjohnwu.core.App; +import com.topjohnwu.core.Config; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; import com.topjohnwu.core.tasks.CheckUpdates; import com.topjohnwu.core.utils.LocaleManager; import com.topjohnwu.core.utils.Topic; @@ -49,27 +49,15 @@ public class SettingsFragment extends PreferenceFragmentCompat private ListPreference updateChannel, autoRes, suNotification, requestTimeout, rootConfig, multiuserConfig, nsConfig; - private int rootState, namespaceState; - private boolean showSuperuser; - - private void prefsSync() { - rootState = app.mDB.getSettings(Const.Key.ROOT_ACCESS, Const.Value.ROOT_ACCESS_APPS_AND_ADB); - namespaceState = app.mDB.getSettings(Const.Key.SU_MNT_NS, Const.Value.NAMESPACE_MODE_REQUESTER); - showSuperuser = Utils.showSuperUser(); - app.prefs.edit() - .putString(Const.Key.ROOT_ACCESS, String.valueOf(rootState)) - .putString(Const.Key.SU_MNT_NS, String.valueOf(namespaceState)) - .putString(Const.Key.SU_MULTIUSER_MODE, String.valueOf(Data.multiuserState)) - .putBoolean(Const.Key.SU_FINGERPRINT, FingerprintHelper.useFingerPrint()) - .apply(); - } - @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - prefsSync(); - setPreferencesFromResource(R.xml.app_settings, rootKey); + boolean showSuperuser = Utils.showSuperUser(); + app.prefs.edit() + .putBoolean(Config.Key.SU_FINGERPRINT, FingerprintHelper.useFingerPrint()) + .apply(); + PreferenceScreen prefScreen = getPreferenceScreen(); PreferenceCategory generalCatagory = (PreferenceCategory) findPreference("general"); @@ -86,7 +74,7 @@ public class SettingsFragment extends PreferenceFragmentCompat return true; }); findPreference("clear").setOnPreferenceClickListener(pref -> { - app.prefs.edit().remove(Const.Key.ETAG_KEY).apply(); + app.prefs.edit().remove(Config.Key.ETAG_KEY).apply(); app.repoDB.clearRepo(); Utils.toast(R.string.repo_cache_cleared, Toast.LENGTH_SHORT); return true; @@ -98,33 +86,32 @@ public class SettingsFragment extends PreferenceFragmentCompat return true; }); - updateChannel = (ListPreference) findPreference(Const.Key.UPDATE_CHANNEL); - rootConfig = (ListPreference) findPreference(Const.Key.ROOT_ACCESS); - autoRes = (ListPreference) findPreference(Const.Key.SU_AUTO_RESPONSE); - requestTimeout = (ListPreference) findPreference(Const.Key.SU_REQUEST_TIMEOUT); - suNotification = (ListPreference) findPreference(Const.Key.SU_NOTIFICATION); - multiuserConfig = (ListPreference) findPreference(Const.Key.SU_MULTIUSER_MODE); - nsConfig = (ListPreference) findPreference(Const.Key.SU_MNT_NS); - SwitchPreferenceCompat reauth = (SwitchPreferenceCompat) findPreference(Const.Key.SU_REAUTH); - SwitchPreferenceCompat fingerprint = (SwitchPreferenceCompat) findPreference(Const.Key.SU_FINGERPRINT); + updateChannel = (ListPreference) findPreference(Config.Key.UPDATE_CHANNEL); + rootConfig = (ListPreference) findPreference(Config.Key.ROOT_ACCESS); + autoRes = (ListPreference) findPreference(Config.Key.SU_AUTO_RESPONSE); + requestTimeout = (ListPreference) findPreference(Config.Key.SU_REQUEST_TIMEOUT); + suNotification = (ListPreference) findPreference(Config.Key.SU_NOTIFICATION); + multiuserConfig = (ListPreference) findPreference(Config.Key.SU_MULTIUSER_MODE); + nsConfig = (ListPreference) findPreference(Config.Key.SU_MNT_NS); + SwitchPreferenceCompat reauth = (SwitchPreferenceCompat) findPreference(Config.Key.SU_REAUTH); + SwitchPreferenceCompat fingerprint = (SwitchPreferenceCompat) findPreference(Config.Key.SU_FINGERPRINT); updateChannel.setOnPreferenceChangeListener((p, o) -> { - String prev =String.valueOf(Data.updateChannel); + int prev = Config.get(Config.Key.UPDATE_CHANNEL); int channel = Integer.parseInt((String) o); - if (channel == Const.Value.CUSTOM_CHANNEL) { + if (channel == Config.Value.CUSTOM_CHANNEL) { View v = LayoutInflater.from(requireActivity()).inflate(R.layout.custom_channel_dialog, null); EditText url = v.findViewById(R.id.custom_url); - url.setText(app.prefs.getString(Const.Key.CUSTOM_CHANNEL, "")); + url.setText(app.prefs.getString(Config.Key.CUSTOM_CHANNEL, "")); new AlertDialog.Builder(requireActivity()) .setTitle(R.string.settings_update_custom) .setView(v) .setPositiveButton(R.string.ok, (d, i) -> - app.prefs.edit().putString(Const.Key.CUSTOM_CHANNEL, - url.getText().toString()).apply()) + Config.set(Config.Key.CUSTOM_CHANNEL, url.getText().toString())) .setNegativeButton(R.string.close, (d, i) -> - app.prefs.edit().putString(Const.Key.UPDATE_CHANNEL, prev).apply()) + Config.set(Config.Key.UPDATE_CHANNEL, prev)) .setOnCancelListener(d -> - app.prefs.edit().putString(Const.Key.UPDATE_CHANNEL, prev).apply()) + Config.set(Config.Key.UPDATE_CHANNEL, prev)) .show(); } return true; @@ -207,26 +194,15 @@ public class SettingsFragment extends PreferenceFragmentCompat @Override public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { switch (key) { - case Const.Key.ROOT_ACCESS: - case Const.Key.SU_MULTIUSER_MODE: - case Const.Key.SU_MNT_NS: + case Config.Key.ROOT_ACCESS: + case Config.Key.SU_MULTIUSER_MODE: + case Config.Key.SU_MNT_NS: app.mDB.setSettings(key, Utils.getPrefsInt(prefs, key)); break; - } - switch (key) { - case Const.Key.ROOT_ACCESS: - rootState = Utils.getPrefsInt(prefs, key); - break; - case Const.Key.SU_MULTIUSER_MODE: - Data.multiuserState = Utils.getPrefsInt(prefs, key); - break; - case Const.Key.SU_MNT_NS: - namespaceState = Utils.getPrefsInt(prefs, key); - break; - case Const.Key.DARK_THEME: + case Config.Key.DARK_THEME: requireActivity().recreate(); break; - case Const.Key.COREONLY: + case Config.Key.COREONLY: if (prefs.getBoolean(key, false)) { try { Const.MAGISK_DISABLE_FILE.createNewFile(); @@ -236,66 +212,97 @@ public class SettingsFragment extends PreferenceFragmentCompat } Utils.toast(R.string.settings_reboot_toast, Toast.LENGTH_LONG); break; - case Const.Key.MAGISKHIDE: + case Config.Key.MAGISKHIDE: if (prefs.getBoolean(key, false)) { Shell.su("magiskhide --enable").submit(); } else { Shell.su("magiskhide --disable").submit(); } break; - case Const.Key.LOCALE: + case Config.Key.LOCALE: LocaleManager.setLocale(app); requireActivity().recreate(); break; - case Const.Key.UPDATE_CHANNEL: - case Const.Key.CUSTOM_CHANNEL: + case Config.Key.UPDATE_CHANNEL: + case Config.Key.CUSTOM_CHANNEL: CheckUpdates.check(); break; - case Const.Key.CHECK_UPDATES: + case Config.Key.CHECK_UPDATES: AppUtils.scheduleUpdateCheck(); break; } - Data.loadConfig(); - setSummary(); + setSummary(key); } @Override public boolean onPreferenceTreeClick(Preference preference) { String key = preference.getKey(); switch (key) { - case Const.Key.SU_FINGERPRINT: + case Config.Key.SU_FINGERPRINT: boolean checked = ((SwitchPreferenceCompat) preference).isChecked(); ((SwitchPreferenceCompat) preference).setChecked(!checked); FingerprintHelper.showAuthDialog(requireActivity(), () -> { ((SwitchPreferenceCompat) preference).setChecked(checked); - app.mDB.setSettings(key, checked ? 1 : 0); + Config.set(key, checked); }); break; } return true; } + private void setSummary(String key) { + switch (key) { + case Config.Key.UPDATE_CHANNEL: + updateChannel.setSummary(getResources() + .getStringArray(R.array.update_channel) + [(int) Config.get(Config.Key.UPDATE_CHANNEL)]); + break; + case Config.Key.ROOT_ACCESS: + rootConfig.setSummary(getResources() + .getStringArray(R.array.su_access) + [(int) Config.get(Config.Key.ROOT_ACCESS)]); + break; + case Config.Key.SU_AUTO_RESPONSE: + autoRes.setSummary(getResources() + .getStringArray(R.array.auto_response) + [(int) Config.get(Config.Key.SU_AUTO_RESPONSE)]); + break; + case Config.Key.SU_NOTIFICATION: + suNotification.setSummary(getResources() + .getStringArray(R.array.su_notification) + [(int) Config.get(Config.Key.SU_NOTIFICATION)]); + break; + case Config.Key.SU_REQUEST_TIMEOUT: + requestTimeout.setSummary( + getString(R.string.request_timeout_summary, + app.prefs.getString(Config.Key.SU_REQUEST_TIMEOUT, "10"))); + break; + case Config.Key.SU_MULTIUSER_MODE: + multiuserConfig.setSummary(getResources() + .getStringArray(R.array.multiuser_summary) + [(int) Config.get(Config.Key.SU_MULTIUSER_MODE)]); + break; + case Config.Key.SU_MNT_NS: + nsConfig.setSummary(getResources() + .getStringArray(R.array.namespace_summary) + [(int) Config.get(Config.Key.SU_MNT_NS)]); + break; + } + } + private void setSummary() { - updateChannel.setSummary(getResources() - .getStringArray(R.array.update_channel)[Data.updateChannel]); - rootConfig.setSummary(getResources() - .getStringArray(R.array.su_access)[rootState]); - autoRes.setSummary(getResources() - .getStringArray(R.array.auto_response)[Data.suResponseType]); - suNotification.setSummary(getResources() - .getStringArray(R.array.su_notification)[Data.suNotificationType]); - requestTimeout.setSummary( - getString(R.string.request_timeout_summary, - app.prefs.getString(Const.Key.SU_REQUEST_TIMEOUT, "10"))); - multiuserConfig.setSummary(getResources() - .getStringArray(R.array.multiuser_summary)[Data.multiuserState]); - nsConfig.setSummary(getResources() - .getStringArray(R.array.namespace_summary)[namespaceState]); + setSummary(Config.Key.UPDATE_CHANNEL); + setSummary(Config.Key.ROOT_ACCESS); + setSummary(Config.Key.SU_AUTO_RESPONSE); + setSummary(Config.Key.SU_NOTIFICATION); + setSummary(Config.Key.SU_REQUEST_TIMEOUT); + setSummary(Config.Key.SU_MULTIUSER_MODE); + setSummary(Config.Key.SU_MNT_NS); } @Override public void onPublish(int topic, Object[] result) { - setLocalePreference((ListPreference) findPreference(Const.Key.LOCALE)); + setLocalePreference((ListPreference) findPreference(Config.Key.LOCALE)); } @Override diff --git a/app/src/full/java/com/topjohnwu/magisk/receivers/GeneralReceiver.java b/app/src/full/java/com/topjohnwu/magisk/receivers/GeneralReceiver.java index f1a6e5e6f..27dec2c4b 100644 --- a/app/src/full/java/com/topjohnwu/magisk/receivers/GeneralReceiver.java +++ b/app/src/full/java/com/topjohnwu/magisk/receivers/GeneralReceiver.java @@ -6,8 +6,8 @@ import android.content.Intent; import android.os.AsyncTask; import com.topjohnwu.core.App; +import com.topjohnwu.core.Config; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; import com.topjohnwu.magisk.ClassMap; import com.topjohnwu.magisk.SuRequestActivity; import com.topjohnwu.magisk.components.Notifications; @@ -66,7 +66,7 @@ public class GeneralReceiver extends BroadcastReceiver { break; case Intent.ACTION_PACKAGE_REPLACED: // This will only work pre-O - if (app.prefs.getBoolean(Const.Key.SU_REAUTH, false)) { + if (Config.get(Config.Key.SU_REAUTH)) { app.mDB.deletePolicy(getPkg(intent)); } break; @@ -76,7 +76,7 @@ public class GeneralReceiver extends BroadcastReceiver { Shell.su("magiskhide --rm " + pkg).submit(); break; case Const.Key.BROADCAST_MANAGER_UPDATE: - Data.managerLink = intent.getStringExtra(Const.Key.INTENT_SET_LINK); + Config.managerLink = intent.getStringExtra(Const.Key.INTENT_SET_LINK); DownloadApp.upgrade(intent.getStringExtra(Const.Key.INTENT_SET_NAME)); break; case Const.Key.BROADCAST_REBOOT: diff --git a/app/src/full/java/com/topjohnwu/magisk/receivers/ShortcutReceiver.java b/app/src/full/java/com/topjohnwu/magisk/receivers/ShortcutReceiver.java index 1875a6bef..331905db4 100644 --- a/app/src/full/java/com/topjohnwu/magisk/receivers/ShortcutReceiver.java +++ b/app/src/full/java/com/topjohnwu/magisk/receivers/ShortcutReceiver.java @@ -9,8 +9,8 @@ import android.graphics.drawable.Icon; import android.os.Build; import com.topjohnwu.core.App; +import com.topjohnwu.core.Config; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; import com.topjohnwu.core.utils.Utils; import com.topjohnwu.magisk.ClassMap; import com.topjohnwu.magisk.R; @@ -45,7 +45,7 @@ public class ShortcutReceiver extends BroadcastReceiver { .setRank(0) .build()); } - if (root && app.prefs.getBoolean(Const.Key.MAGISKHIDE, false)) { + if (root && (boolean) Config.get(Config.Key.MAGISKHIDE)) { shortCuts.add(new ShortcutInfo.Builder(app, "magiskhide") .setShortLabel(app.getString(R.string.magiskhide)) .setIntent(new Intent(app, ClassMap.get(SplashActivity.class)) @@ -56,7 +56,7 @@ public class ShortcutReceiver extends BroadcastReceiver { .setRank(1) .build()); } - if (!app.prefs.getBoolean(Const.Key.COREONLY, false) && root && Data.magiskVersionCode >= 0) { + if (!(boolean) Config.get(Config.Key.COREONLY) && root && Config.magiskVersionCode >= 0) { shortCuts.add(new ShortcutInfo.Builder(app, "modules") .setShortLabel(app.getString(R.string.modules)) .setIntent(new Intent(app, ClassMap.get(SplashActivity.class)) diff --git a/app/src/full/java/com/topjohnwu/magisk/services/UpdateCheckService.java b/app/src/full/java/com/topjohnwu/magisk/services/UpdateCheckService.java index c23457fb3..73eb86bcc 100644 --- a/app/src/full/java/com/topjohnwu/magisk/services/UpdateCheckService.java +++ b/app/src/full/java/com/topjohnwu/magisk/services/UpdateCheckService.java @@ -1,6 +1,6 @@ package com.topjohnwu.magisk.services; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.tasks.CheckUpdates; import com.topjohnwu.magisk.BuildConfig; import com.topjohnwu.magisk.components.Notifications; @@ -20,9 +20,9 @@ public class UpdateCheckService extends DelegateWorker { } private void onCheckDone() { - if (BuildConfig.VERSION_CODE < Data.remoteManagerVersionCode) { + if (BuildConfig.VERSION_CODE < Config.remoteManagerVersionCode) { Notifications.managerUpdate(); - } else if (Data.magiskVersionCode < Data.remoteMagiskVersionCode) { + } else if (Config.magiskVersionCode < Config.remoteMagiskVersionCode) { Notifications.magiskUpdate(); } } diff --git a/app/src/full/java/com/topjohnwu/magisk/utils/AppUtils.java b/app/src/full/java/com/topjohnwu/magisk/utils/AppUtils.java index a38a550fe..d32a24f99 100644 --- a/app/src/full/java/com/topjohnwu/magisk/utils/AppUtils.java +++ b/app/src/full/java/com/topjohnwu/magisk/utils/AppUtils.java @@ -5,7 +5,7 @@ import android.content.Intent; import android.net.Uri; import android.widget.Toast; -import com.topjohnwu.core.App; +import com.topjohnwu.core.Config; import com.topjohnwu.core.Const; import com.topjohnwu.core.utils.Utils; import com.topjohnwu.magisk.ClassMap; @@ -23,7 +23,7 @@ import androidx.work.WorkManager; public class AppUtils { public static void scheduleUpdateCheck() { - if (App.self.prefs.getBoolean(Const.Key.CHECK_UPDATES, true)) { + if (Config.get(Config.Key.CHECK_UPDATES)) { Constraints constraints = new Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build(); diff --git a/app/src/full/java/com/topjohnwu/magisk/utils/DownloadApp.java b/app/src/full/java/com/topjohnwu/magisk/utils/DownloadApp.java index 646d1881a..f99ece29e 100644 --- a/app/src/full/java/com/topjohnwu/magisk/utils/DownloadApp.java +++ b/app/src/full/java/com/topjohnwu/magisk/utils/DownloadApp.java @@ -3,7 +3,7 @@ package com.topjohnwu.magisk.utils; import android.os.AsyncTask; import com.topjohnwu.core.App; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.utils.RootUtils; import com.topjohnwu.core.utils.Utils; import com.topjohnwu.magisk.BuildConfig; @@ -25,7 +25,7 @@ public class DownloadApp { public static void restore() { String name = Utils.fmt("MagiskManager v%s(%d)", - Data.remoteManagerVersionString, Data.remoteManagerVersionCode); + Config.remoteManagerVersionString, Config.remoteManagerVersionCode); dlInstall(name, new RestoreManager()); } @@ -33,7 +33,7 @@ public class DownloadApp { File apk = new File(App.self.getCacheDir(), "manager.apk"); ProgressNotification progress = new ProgressNotification(name); listener.progress = progress; - Networking.get(Data.managerLink) + Networking.get(Config.managerLink) .setExecutor(AsyncTask.THREAD_POOL_EXECUTOR) .setDownloadProgressListener(progress) .setErrorHandler((conn, e) -> progress.dlFail()) @@ -85,7 +85,7 @@ public class DownloadApp { .setContentTitle(app.getString(R.string.restore_img_msg)) .setContentText(""); progress.update(); - Data.exportPrefs(); + Config.export(); // Make it world readable apk.setReadable(true, false); if (ShellUtils.fastCmdResult("pm install " + apk)) diff --git a/app/src/full/java/com/topjohnwu/magisk/utils/FingerprintHelper.java b/app/src/full/java/com/topjohnwu/magisk/utils/FingerprintHelper.java index 2a9e7a64c..b334e6777 100644 --- a/app/src/full/java/com/topjohnwu/magisk/utils/FingerprintHelper.java +++ b/app/src/full/java/com/topjohnwu/magisk/utils/FingerprintHelper.java @@ -17,6 +17,7 @@ import android.view.Gravity; import android.widget.Toast; import com.topjohnwu.core.App; +import com.topjohnwu.core.Config; import com.topjohnwu.core.Const; import com.topjohnwu.core.utils.Utils; import com.topjohnwu.magisk.R; @@ -36,9 +37,9 @@ public abstract class FingerprintHelper { private CancellationSignal cancel; public static boolean useFingerPrint() { - boolean fp = App.self.mDB.getSettings(Const.Key.SU_FINGERPRINT, 0) != 0; + boolean fp = Config.get(Config.Key.SU_FINGERPRINT); if (fp && !canUseFingerprint()) { - App.self.mDB.setSettings(Const.Key.SU_FINGERPRINT, 0); + Config.set(Config.Key.SU_FINGERPRINT, false); fp = false; } return fp; diff --git a/app/src/full/java/com/topjohnwu/magisk/utils/PatchAPK.java b/app/src/full/java/com/topjohnwu/magisk/utils/PatchAPK.java index 17ca8d9b0..a8e8c5bfd 100644 --- a/app/src/full/java/com/topjohnwu/magisk/utils/PatchAPK.java +++ b/app/src/full/java/com/topjohnwu/magisk/utils/PatchAPK.java @@ -4,8 +4,8 @@ import android.os.AsyncTask; import android.widget.Toast; import com.topjohnwu.core.App; +import com.topjohnwu.core.Config; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; import com.topjohnwu.core.utils.RootUtils; import com.topjohnwu.core.utils.Utils; import com.topjohnwu.magisk.BuildConfig; @@ -110,8 +110,8 @@ public class PatchAPK { if (!ShellUtils.fastCmdResult("pm install " + repack)) return false; - app.mDB.setStrings(Const.Key.SU_MANAGER, pkg); - Data.exportPrefs(); + Config.set(Config.Key.SU_MANAGER, pkg); + Config.export(); RootUtils.rmAndLaunch(BuildConfig.APPLICATION_ID, pkg); return true; diff --git a/app/src/full/java/com/topjohnwu/magisk/utils/SuConnector.java b/app/src/full/java/com/topjohnwu/magisk/utils/SuConnector.java index 9133a5c6c..e38936211 100644 --- a/app/src/full/java/com/topjohnwu/magisk/utils/SuConnector.java +++ b/app/src/full/java/com/topjohnwu/magisk/utils/SuConnector.java @@ -10,8 +10,7 @@ import android.text.TextUtils; import android.widget.Toast; import com.topjohnwu.core.App; -import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.container.Policy; import com.topjohnwu.core.container.SuLogEntry; import com.topjohnwu.core.utils.Utils; @@ -123,7 +122,8 @@ public abstract class SuConnector { private static void handleNotify(Policy policy) { String message = App.self.getString(policy.policy == Policy.ALLOW ? R.string.su_allow_toast : R.string.su_deny_toast, policy.appName); - if (policy.notification && Data.suNotificationType == Const.Value.NOTIFICATION_TOAST) + if (policy.notification && + (int) Config.get(Config.Key.SU_NOTIFICATION) == Config.Value.NOTIFICATION_TOAST) Utils.toast(message, Toast.LENGTH_SHORT); } diff --git a/core/src/main/java/com/topjohnwu/core/App.java b/core/src/main/java/com/topjohnwu/core/App.java index 5943e5911..20691d6d2 100644 --- a/core/src/main/java/com/topjohnwu/core/App.java +++ b/core/src/main/java/com/topjohnwu/core/App.java @@ -48,7 +48,6 @@ public class App extends ContainerApp { Networking.init(this); LocaleManager.setLocale(this); - Data.loadConfig(); } @Override diff --git a/core/src/main/java/com/topjohnwu/core/Config.java b/core/src/main/java/com/topjohnwu/core/Config.java new file mode 100644 index 000000000..e9d44c210 --- /dev/null +++ b/core/src/main/java/com/topjohnwu/core/Config.java @@ -0,0 +1,367 @@ +package com.topjohnwu.core; + +import android.content.SharedPreferences; +import android.os.Bundle; +import android.util.Xml; + +import com.topjohnwu.core.utils.Utils; +import com.topjohnwu.superuser.Shell; +import com.topjohnwu.superuser.ShellUtils; +import com.topjohnwu.superuser.io.SuFile; +import com.topjohnwu.superuser.io.SuFileInputStream; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.File; +import java.io.IOException; + +public class Config { + + // Current status + public static String magiskVersionString; + public static int magiskVersionCode = -1; + public static boolean magiskHide; + + // Update Info + public static String remoteMagiskVersionString; + public static int remoteMagiskVersionCode = -1; + public static String magiskLink; + public static String magiskNoteLink; + public static String magiskMD5; + public static String remoteManagerVersionString; + public static int remoteManagerVersionCode = -1; + public static String managerLink; + public static String managerNoteLink; + public static String uninstallerLink; + + // Install flags + public static boolean keepVerity = false; + public static boolean keepEnc = false; + public static boolean recovery = false; + + public static int suLogTimeout = 14; + + public static class Key { + // su configs + public static final String ROOT_ACCESS = "root_access"; + public static final String SU_MULTIUSER_MODE = "multiuser_mode"; + public static final String SU_MNT_NS = "mnt_ns"; + public static final String SU_MANAGER = "requester"; + public static final String SU_REQUEST_TIMEOUT = "su_request_timeout"; + public static final String SU_AUTO_RESPONSE = "su_auto_response"; + public static final String SU_NOTIFICATION = "su_notification"; + public static final String SU_REAUTH = "su_reauth"; + public static final String SU_FINGERPRINT = "su_fingerprint"; + + // prefs + public static final String CHECK_UPDATES = "check_update"; + public static final String UPDATE_CHANNEL = "update_channel"; + public static final String CUSTOM_CHANNEL = "custom_channel"; + public static final String BOOT_FORMAT = "boot_format"; + public static final String UPDATE_SERVICE_VER = "update_service_version"; + public static final String MAGISKHIDE = "magiskhide"; + public static final String COREONLY = "disable"; + public static final String LOCALE = "locale"; + public static final String DARK_THEME = "dark_theme"; + public static final String ETAG_KEY = "ETag"; + public static final String REPO_ORDER = "repo_order"; + } + + public static class Value { + public static final int STABLE_CHANNEL = 0; + public static final int BETA_CHANNEL = 1; + public static final int CUSTOM_CHANNEL = 2; + public static final int ROOT_ACCESS_DISABLED = 0; + public static final int ROOT_ACCESS_APPS_ONLY = 1; + public static final int ROOT_ACCESS_ADB_ONLY = 2; + public static final int ROOT_ACCESS_APPS_AND_ADB = 3; + public static final int MULTIUSER_MODE_OWNER_ONLY = 0; + public static final int MULTIUSER_MODE_OWNER_MANAGED = 1; + public static final int MULTIUSER_MODE_USER = 2; + public static final int NAMESPACE_MODE_GLOBAL = 0; + public static final int NAMESPACE_MODE_REQUESTER = 1; + public static final int NAMESPACE_MODE_ISOLATE = 2; + public static final int NO_NOTIFICATION = 0; + public static final int NOTIFICATION_TOAST = 1; + public static final int SU_PROMPT = 0; + public static final int SU_AUTO_DENY = 1; + public static final int SU_AUTO_ALLOW = 2; + public static final int[] TIMEOUT_LIST = {0, -1, 10, 20, 30, 60}; + public static final int ORDER_NAME = 0; + public static final int ORDER_DATE = 1; + } + + private static Bundle defs = new Bundle(); + + static { + /* Set default configurations */ + + // prefs int + defs.putInt(Key.REPO_ORDER, Value.ORDER_DATE); + + // prefs string int + defs.putInt(Key.SU_REQUEST_TIMEOUT, 10); + defs.putInt(Key.SU_AUTO_RESPONSE, Value.SU_PROMPT); + defs.putInt(Key.SU_NOTIFICATION, Value.NOTIFICATION_TOAST); + defs.putInt(Key.UPDATE_CHANNEL, Value.STABLE_CHANNEL); + + // prefs bool + defs.putBoolean(Key.CHECK_UPDATES, true); + // defs.putBoolean(Const.Key.DARK_THEME, false); + // defs.putBoolean(Const.Key.SU_REAUTH, false); + // defs.putBoolean(Const.Key.MAGISKHIDE, false); + // defs.putBoolean(Const.Key.COREONLY, false); + + // prefs string + defs.putString(Key.CUSTOM_CHANNEL, ""); + defs.putString(Key.BOOT_FORMAT, ".img"); + defs.putString(Key.LOCALE, ""); + // defs.putString(Const.Key.ETAG_KEY, null); + + // db int + defs.putInt(Key.ROOT_ACCESS, Value.ROOT_ACCESS_APPS_AND_ADB); + defs.putInt(Key.SU_MNT_NS, Value.NAMESPACE_MODE_REQUESTER); + defs.putInt(Key.SU_MULTIUSER_MODE, Value.MULTIUSER_MODE_OWNER_ONLY); + + // db bool + // defs.putBoolean(Const.Key.SU_FINGERPRINT, false); + + // db strings + // defs.putString(Const.Key.SU_MANAGER, null); + } + + public static void loadMagiskInfo() { + try { + magiskVersionString = ShellUtils.fastCmd("magisk -v").split(":")[0]; + magiskVersionCode = Integer.parseInt(ShellUtils.fastCmd("magisk -V")); + magiskHide = Shell.su("magiskhide --status").exec().isSuccess(); + } catch (NumberFormatException ignored) {} + } + + public static void export() { + // Flush prefs to disk + App app = App.self; + app.prefs.edit().commit(); + File xml = new File(app.getFilesDir().getParent() + "/shared_prefs", + app.getPackageName() + "_preferences.xml"); + Shell.su(Utils.fmt("cat %s > /data/user/0/%s", xml, Const.MANAGER_CONFIGS)).exec(); + } + + public static void initialize() { + SharedPreferences pref = App.self.prefs; + SharedPreferences.Editor editor = pref.edit(); + SuFile config = new SuFile("/data/user/0/" + Const.MANAGER_CONFIGS); + if (config.exists()) { + try { + SuFileInputStream is = new SuFileInputStream(config); + XmlPullParser parser = Xml.newPullParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); + parser.setInput(is, "UTF-8"); + parser.nextTag(); + parser.require(XmlPullParser.START_TAG, null, "map"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) + continue; + String key = parser.getAttributeValue(null, "name"); + String value = parser.getAttributeValue(null, "value"); + switch (parser.getName()) { + case "string": + parser.require(XmlPullParser.START_TAG, null, "string"); + editor.putString(key, parser.nextText()); + parser.require(XmlPullParser.END_TAG, null, "string"); + break; + case "boolean": + parser.require(XmlPullParser.START_TAG, null, "boolean"); + editor.putBoolean(key, Boolean.parseBoolean(value)); + parser.nextTag(); + parser.require(XmlPullParser.END_TAG, null, "boolean"); + break; + case "int": + parser.require(XmlPullParser.START_TAG, null, "int"); + editor.putInt(key, Integer.parseInt(value)); + parser.nextTag(); + parser.require(XmlPullParser.END_TAG, null, "int"); + break; + case "long": + parser.require(XmlPullParser.START_TAG, null, "long"); + editor.putLong(key, Long.parseLong(value)); + parser.nextTag(); + parser.require(XmlPullParser.END_TAG, null, "long"); + break; + case "float": + parser.require(XmlPullParser.START_TAG, null, "int"); + editor.putFloat(key, Float.parseFloat(value)); + parser.nextTag(); + parser.require(XmlPullParser.END_TAG, null, "int"); + break; + default: + parser.next(); + } + } + } catch (IOException | XmlPullParserException e) { + e.printStackTrace(); + } + editor.remove(Key.ETAG_KEY); + config.delete(); + } + + // Set to defaults if not set + setDefs(pref, editor, + Key.SU_REQUEST_TIMEOUT, Key.SU_AUTO_RESPONSE, Key.ROOT_ACCESS, + Key.SU_MNT_NS, Key.SU_NOTIFICATION, Key.DARK_THEME, + Key.CHECK_UPDATES, Key.UPDATE_CHANNEL, Key.REPO_ORDER); + + // These settings are from actual device state + editor.putBoolean(Key.MAGISKHIDE, magiskHide) + .putBoolean(Key.COREONLY, Const.MAGISK_DISABLE_FILE.exists()) + .putInt(Key.UPDATE_SERVICE_VER, Const.UPDATE_SERVICE_VER) + .apply(); + } + + private static final int PREF_INT = 0; + private static final int PREF_STR_INT = 1; + private static final int PREF_BOOL = 2; + private static final int PREF_STR = 3; + private static final int DB_INT = 4; + private static final int DB_BOOL = 5; + private static final int DB_STR = 6; + + private static int getConfigType(String key) { + switch (key) { + case Key.REPO_ORDER: + return PREF_INT; + + case Key.SU_REQUEST_TIMEOUT: + case Key.SU_AUTO_RESPONSE: + case Key.SU_NOTIFICATION: + case Key.UPDATE_CHANNEL: + return PREF_STR_INT; + + case Key.DARK_THEME: + case Key.SU_REAUTH: + case Key.CHECK_UPDATES: + case Key.MAGISKHIDE: + case Key.COREONLY: + return PREF_BOOL; + + case Key.CUSTOM_CHANNEL: + case Key.BOOT_FORMAT: + case Key.LOCALE: + case Key.ETAG_KEY: + return PREF_STR; + + case Key.ROOT_ACCESS: + case Key.SU_MNT_NS: + case Key.SU_MULTIUSER_MODE: + return DB_INT; + + case Key.SU_FINGERPRINT: + return DB_BOOL; + + case Key.SU_MANAGER: + return DB_STR; + + default: + throw new IllegalArgumentException(); + } + } + + @SuppressWarnings("unchecked") + public static T get(String key) { + App app = App.self; + switch (getConfigType(key)) { + case PREF_INT: + return (T) (Integer) app.prefs.getInt(key, defs.getInt(key)); + case PREF_STR_INT: + return (T) (Integer) Utils.getPrefsInt(app.prefs, key, defs.getInt(key)); + case PREF_BOOL: + return (T) (Boolean) app.prefs.getBoolean(key, defs.getBoolean(key)); + case PREF_STR: + return (T) app.prefs.getString(key, defs.getString(key)); + case DB_INT: + return (T) (Integer) app.mDB.getSettings(key, defs.getInt(key)); + case DB_BOOL: + return (T) (Boolean) (app.mDB.getSettings(key, defs.getBoolean(key) ? 1 : 0) != 0); + case DB_STR: + return (T) app.mDB.getStrings(key, defs.getString(key)); + } + /* Will never get here (IllegalArgumentException in getConfigType) */ + return (T) new Object(); + } + + public static void set(String key, Object val) { + App app = App.self; + switch (getConfigType(key)) { + case PREF_INT: + app.prefs.edit().putInt(key, (int) val).apply(); + break; + case PREF_STR_INT: + app.prefs.edit().putString(key, String.valueOf(val)).apply(); + break; + case PREF_BOOL: + app.prefs.edit().putBoolean(key, (boolean) val).apply(); + break; + case PREF_STR: + app.prefs.edit().putString(key, (String) val).apply(); + break; + case DB_INT: + app.mDB.setSettings(key, (int) val); + break; + case DB_BOOL: + app.mDB.setSettings(key, (boolean) val ? 1 : 0); + break; + case DB_STR: + app.mDB.setStrings(key, (String) val); + break; + } + } + + public static void remove(String key) { + App app = App.self; + int def; + switch (getConfigType(key)) { + case PREF_INT: + case PREF_STR_INT: + case PREF_BOOL: + case PREF_STR: + app.prefs.edit().remove(key).apply(); + break; + case DB_INT: + def = defs.getInt(key); + app.mDB.setSettings(key, def); + break; + case DB_BOOL: + def = defs.getBoolean(key) ? 1 : 0; + app.mDB.setSettings(key, def); + break; + case DB_STR: + app.mDB.setStrings(key, null); + break; + } + } + + private static void setDefs(SharedPreferences pref, SharedPreferences.Editor editor, String... keys) { + for (String key : keys) { + if (pref.contains(key)) + continue; + switch (getConfigType(key)) { + case PREF_INT: + case DB_INT: + editor.putInt(key, defs.getInt(key)); + break; + case PREF_STR_INT: + editor.putString(key, String.valueOf(defs.getInt(key))); + break; + case PREF_STR: + case DB_STR: + editor.putString(key, defs.getString(key)); + break; + case PREF_BOOL: + case DB_BOOL: + editor.putBoolean(key, defs.getBoolean(key)); + break; + } + } + } +} diff --git a/core/src/main/java/com/topjohnwu/core/Const.java b/core/src/main/java/com/topjohnwu/core/Const.java index 492bebcc1..e47ec8c00 100644 --- a/core/src/main/java/com/topjohnwu/core/Const.java +++ b/core/src/main/java/com/topjohnwu/core/Const.java @@ -79,19 +79,10 @@ public class Const { public static final String SNET_URL = "https://raw.githubusercontent.com/topjohnwu/magisk_files/b66b1a914978e5f4c4bbfd74a59f4ad371bac107/snet.apk"; } - public static class Key { - // su - public static final String ROOT_ACCESS = "root_access"; - public static final String SU_MULTIUSER_MODE = "multiuser_mode"; - public static final String SU_MNT_NS = "mnt_ns"; - public static final String SU_MANAGER = "requester"; - public static final String SU_REQUEST_TIMEOUT = "su_request_timeout"; - public static final String SU_AUTO_RESPONSE = "su_auto_response"; - public static final String SU_NOTIFICATION = "su_notification"; - public static final String SU_REAUTH = "su_reauth"; - public static final String SU_FINGERPRINT = "su_fingerprint"; - + // others + public static final String LINK_KEY = "Link"; + public static final String IF_NONE_MATCH = "If-None-Match"; // intents public static final String OPEN_SECTION = "section"; public static final String INTENT_SET_NAME = "filename"; @@ -100,52 +91,15 @@ public class Const { public static final String FLASH_SET_BOOT = "boot"; public static final String BROADCAST_MANAGER_UPDATE = "manager_update"; public static final String BROADCAST_REBOOT = "reboot"; - - // others - public static final String CHECK_UPDATES = "check_update"; - public static final String UPDATE_CHANNEL = "update_channel"; - public static final String CUSTOM_CHANNEL = "custom_channel"; - public static final String BOOT_FORMAT = "boot_format"; - public static final String UPDATE_SERVICE_VER = "update_service_version"; - public static final String APP_VER = "app_version"; - public static final String MAGISKHIDE = "magiskhide"; - public static final String HOSTS = "hosts"; - public static final String COREONLY = "disable"; - public static final String LOCALE = "locale"; - public static final String DARK_THEME = "dark_theme"; - public static final String ETAG_KEY = "ETag"; - public static final String LINK_KEY = "Link"; - public static final String IF_NONE_MATCH = "If-None-Match"; - public static final String REPO_ORDER = "repo_order"; } - public static class Value { - public static final int STABLE_CHANNEL = 0; - public static final int BETA_CHANNEL = 1; - public static final int CUSTOM_CHANNEL = 2; - public static final int ROOT_ACCESS_DISABLED = 0; - public static final int ROOT_ACCESS_APPS_ONLY = 1; - public static final int ROOT_ACCESS_ADB_ONLY = 2; - public static final int ROOT_ACCESS_APPS_AND_ADB = 3; - public static final int MULTIUSER_MODE_OWNER_ONLY = 0; - public static final int MULTIUSER_MODE_OWNER_MANAGED = 1; - public static final int MULTIUSER_MODE_USER = 2; - public static final int NAMESPACE_MODE_GLOBAL = 0; - public static final int NAMESPACE_MODE_REQUESTER = 1; - public static final int NAMESPACE_MODE_ISOLATE = 2; - public static final int NO_NOTIFICATION = 0; - public static final int NOTIFICATION_TOAST = 1; - public static final int SU_PROMPT = 0; - public static final int SU_AUTO_DENY = 1; - public static final int SU_AUTO_ALLOW = 2; public static final String FLASH_ZIP = "flash"; public static final String PATCH_BOOT = "patch"; public static final String FLASH_MAGISK = "magisk"; public static final String FLASH_INACTIVE_SLOT = "slot"; public static final String UNINSTALL = "uninstall"; - public static final int[] timeoutList = {0, -1, 10, 20, 30, 60}; - public static final int ORDER_NAME = 0; - public static final int ORDER_DATE = 1; } + + } diff --git a/core/src/main/java/com/topjohnwu/core/Data.java b/core/src/main/java/com/topjohnwu/core/Data.java deleted file mode 100644 index bdcd03989..000000000 --- a/core/src/main/java/com/topjohnwu/core/Data.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.topjohnwu.core; - -import android.content.SharedPreferences; -import android.util.Xml; - -import com.topjohnwu.core.utils.Utils; -import com.topjohnwu.superuser.Shell; -import com.topjohnwu.superuser.ShellUtils; -import com.topjohnwu.superuser.io.SuFile; -import com.topjohnwu.superuser.io.SuFileInputStream; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.File; -import java.io.IOException; - -public class Data { - - // Current status - public static String magiskVersionString; - public static int magiskVersionCode = -1; - public static boolean magiskHide; - - // Update Info - public static String remoteMagiskVersionString; - public static int remoteMagiskVersionCode = -1; - public static String magiskLink; - public static String magiskNoteLink; - public static String magiskMD5; - public static String remoteManagerVersionString; - public static int remoteManagerVersionCode = -1; - public static String managerLink; - public static String managerNoteLink; - public static String uninstallerLink; - - // Install flags - public static boolean keepVerity = false; - public static boolean keepEnc = false; - public static boolean recovery = false; - - // Configs - public static boolean isDarkTheme; - public static int suRequestTimeout; - public static int multiuserState = -1; - public static int suResponseType; - public static int suNotificationType; - public static int updateChannel; - public static int repoOrder; - public static int suLogTimeout = 14; - - public static void loadMagiskInfo() { - try { - magiskVersionString = ShellUtils.fastCmd("magisk -v").split(":")[0]; - magiskVersionCode = Integer.parseInt(ShellUtils.fastCmd("magisk -V")); - magiskHide = Shell.su("magiskhide --status").exec().isSuccess(); - } catch (NumberFormatException ignored) {} - } - - public static void exportPrefs() { - // Flush prefs to disk - App app = App.self; - app.prefs.edit().commit(); - File xml = new File(app.getFilesDir().getParent() + "/shared_prefs", - app.getPackageName() + "_preferences.xml"); - Shell.su(Utils.fmt("cat %s > /data/user/0/%s", xml, Const.MANAGER_CONFIGS)).exec(); - } - - public static void importPrefs() { - SuFile config = new SuFile("/data/user/0/" + Const.MANAGER_CONFIGS); - if (config.exists()) { - SharedPreferences.Editor editor = App.self.prefs.edit(); - try { - SuFileInputStream is = new SuFileInputStream(config); - XmlPullParser parser = Xml.newPullParser(); - parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); - parser.setInput(is, "UTF-8"); - parser.nextTag(); - parser.require(XmlPullParser.START_TAG, null, "map"); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) - continue; - String key = parser.getAttributeValue(null, "name"); - String value = parser.getAttributeValue(null, "value"); - switch (parser.getName()) { - case "string": - parser.require(XmlPullParser.START_TAG, null, "string"); - editor.putString(key, parser.nextText()); - parser.require(XmlPullParser.END_TAG, null, "string"); - break; - case "boolean": - parser.require(XmlPullParser.START_TAG, null, "boolean"); - editor.putBoolean(key, Boolean.parseBoolean(value)); - parser.nextTag(); - parser.require(XmlPullParser.END_TAG, null, "boolean"); - break; - case "int": - parser.require(XmlPullParser.START_TAG, null, "int"); - editor.putInt(key, Integer.parseInt(value)); - parser.nextTag(); - parser.require(XmlPullParser.END_TAG, null, "int"); - break; - case "long": - parser.require(XmlPullParser.START_TAG, null, "long"); - editor.putLong(key, Long.parseLong(value)); - parser.nextTag(); - parser.require(XmlPullParser.END_TAG, null, "long"); - break; - case "float": - parser.require(XmlPullParser.START_TAG, null, "int"); - editor.putFloat(key, Float.parseFloat(value)); - parser.nextTag(); - parser.require(XmlPullParser.END_TAG, null, "int"); - break; - default: - parser.next(); - } - } - } catch (IOException | XmlPullParserException e) { - e.printStackTrace(); - } - editor.remove(Const.Key.ETAG_KEY); - editor.apply(); - loadConfig(); - config.delete(); - } - } - - public static void loadConfig() { - App app = App.self; - // su - suRequestTimeout = Utils.getPrefsInt(app.prefs, Const.Key.SU_REQUEST_TIMEOUT, Const.Value.timeoutList[2]); - suResponseType = Utils.getPrefsInt(app.prefs, Const.Key.SU_AUTO_RESPONSE, Const.Value.SU_PROMPT); - suNotificationType = Utils.getPrefsInt(app.prefs, Const.Key.SU_NOTIFICATION, Const.Value.NOTIFICATION_TOAST); - - // config - isDarkTheme = app.prefs.getBoolean(Const.Key.DARK_THEME, false); - updateChannel = Utils.getPrefsInt(app.prefs, Const.Key.UPDATE_CHANNEL, Const.Value.STABLE_CHANNEL); - repoOrder = app.prefs.getInt(Const.Key.REPO_ORDER, Const.Value.ORDER_DATE); - } - - public static void writeConfig() { - App.self.prefs.edit() - .putBoolean(Const.Key.DARK_THEME, isDarkTheme) - .putBoolean(Const.Key.MAGISKHIDE, magiskHide) - .putBoolean(Const.Key.COREONLY, Const.MAGISK_DISABLE_FILE.exists()) - .putString(Const.Key.SU_REQUEST_TIMEOUT, String.valueOf(suRequestTimeout)) - .putString(Const.Key.SU_AUTO_RESPONSE, String.valueOf(suResponseType)) - .putString(Const.Key.SU_NOTIFICATION, String.valueOf(suNotificationType)) - .putString(Const.Key.UPDATE_CHANNEL, String.valueOf(updateChannel)) - .putInt(Const.Key.UPDATE_SERVICE_VER, Const.UPDATE_SERVICE_VER) - .putInt(Const.Key.REPO_ORDER, repoOrder) - .apply(); - } -} diff --git a/core/src/main/java/com/topjohnwu/core/database/MagiskDB.java b/core/src/main/java/com/topjohnwu/core/database/MagiskDB.java index f14f93ed7..24f127719 100644 --- a/core/src/main/java/com/topjohnwu/core/database/MagiskDB.java +++ b/core/src/main/java/com/topjohnwu/core/database/MagiskDB.java @@ -6,7 +6,7 @@ import android.content.pm.PackageManager; import android.text.TextUtils; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.container.Policy; import com.topjohnwu.core.container.SuLogEntry; import com.topjohnwu.core.utils.LocaleManager; @@ -85,7 +85,7 @@ public class MagiskDB { "DELETE FROM %s WHERE until > 0 AND until < %d;" + "DELETE FROM %s WHERE time < %d", POLICY_TABLE, System.currentTimeMillis() / 1000, - LOG_TABLE, System.currentTimeMillis() - Data.suLogTimeout * 86400000 + LOG_TABLE, System.currentTimeMillis() - Config.suLogTimeout * 86400000 ); } diff --git a/core/src/main/java/com/topjohnwu/core/database/RepoDatabaseHelper.java b/core/src/main/java/com/topjohnwu/core/database/RepoDatabaseHelper.java index f29c285c7..673ad77da 100644 --- a/core/src/main/java/com/topjohnwu/core/database/RepoDatabaseHelper.java +++ b/core/src/main/java/com/topjohnwu/core/database/RepoDatabaseHelper.java @@ -7,7 +7,7 @@ import android.database.sqlite.SQLiteOpenHelper; import com.topjohnwu.core.App; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.container.Repo; import java.util.HashSet; @@ -43,7 +43,7 @@ public class RepoDatabaseHelper extends SQLiteOpenHelper { "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " " + "(id TEXT, name TEXT, version TEXT, versionCode INT, minMagisk INT, " + "author TEXT, description TEXT, last_update INT, PRIMARY KEY(id))"); - App.self.prefs.edit().remove(Const.Key.ETAG_KEY).apply(); + Config.remove(Config.Key.ETAG_KEY); } } @@ -95,15 +95,15 @@ public class RepoDatabaseHelper extends SQLiteOpenHelper { public Cursor getRepoCursor() { String orderBy = null; - switch (Data.repoOrder) { - case Const.Value.ORDER_NAME: + switch ((int) Config.get(Config.Key.REPO_ORDER)) { + case Config.Value.ORDER_NAME: orderBy = "name COLLATE NOCASE"; break; - case Const.Value.ORDER_DATE: + case Config.Value.ORDER_DATE: orderBy = "last_update DESC"; } return mDb.query(TABLE_NAME, null, "minMagisk<=? AND minMagisk>=?", - new String[] { String.valueOf(Data.magiskVersionCode), String.valueOf(Const.MIN_MODULE_VER) }, + new String[] { String.valueOf(Config.magiskVersionCode), String.valueOf(Const.MIN_MODULE_VER) }, null, null, orderBy); } diff --git a/core/src/main/java/com/topjohnwu/core/tasks/CheckUpdates.java b/core/src/main/java/com/topjohnwu/core/tasks/CheckUpdates.java index 4839e08e4..f6fcd08a9 100644 --- a/core/src/main/java/com/topjohnwu/core/tasks/CheckUpdates.java +++ b/core/src/main/java/com/topjohnwu/core/tasks/CheckUpdates.java @@ -1,8 +1,7 @@ package com.topjohnwu.core.tasks; -import com.topjohnwu.core.App; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.utils.Topic; import com.topjohnwu.net.Networking; import com.topjohnwu.net.Request; @@ -43,14 +42,14 @@ public class CheckUpdates { private static Request getRequest() { String url; - switch (Data.updateChannel) { - case Const.Value.BETA_CHANNEL: + switch ((int) Config.get(Config.Key.UPDATE_CHANNEL)) { + case Config.Value.BETA_CHANNEL: url = Const.Url.BETA_URL; break; - case Const.Value.CUSTOM_CHANNEL: - url = App.self.prefs.getString(Const.Key.CUSTOM_CHANNEL, ""); + case Config.Value.CUSTOM_CHANNEL: + url = Config.get(Config.Key.CUSTOM_CHANNEL); break; - case Const.Value.STABLE_CHANNEL: + case Config.Value.STABLE_CHANNEL: default: url = Const.Url.STABLE_URL; break; @@ -79,20 +78,20 @@ public class CheckUpdates { @Override public void onResponse(JSONObject json) { JSONObject magisk = getJson(json, "magisk"); - Data.remoteMagiskVersionString = getString(magisk, "version", null); - Data.remoteMagiskVersionCode = getInt(magisk, "versionCode", -1); - Data.magiskLink = getString(magisk, "link", null); - Data.magiskNoteLink = getString(magisk, "note", null); - Data.magiskMD5 = getString(magisk, "md5", null); + Config.remoteMagiskVersionString = getString(magisk, "version", null); + Config.remoteMagiskVersionCode = getInt(magisk, "versionCode", -1); + Config.magiskLink = getString(magisk, "link", null); + Config.magiskNoteLink = getString(magisk, "note", null); + Config.magiskMD5 = getString(magisk, "md5", null); JSONObject manager = getJson(json, "app"); - Data.remoteManagerVersionString = getString(manager, "version", null); - Data.remoteManagerVersionCode = getInt(manager, "versionCode", -1); - Data.managerLink = getString(manager, "link", null); - Data.managerNoteLink = getString(manager, "note", null); + Config.remoteManagerVersionString = getString(manager, "version", null); + Config.remoteManagerVersionCode = getInt(manager, "versionCode", -1); + Config.managerLink = getString(manager, "link", null); + Config.managerNoteLink = getString(manager, "note", null); JSONObject uninstaller = getJson(json, "uninstaller"); - Data.uninstallerLink = getString(uninstaller, "link", null); + Config.uninstallerLink = getString(uninstaller, "link", null); Topic.publish(Topic.UPDATE_CHECK_DONE); diff --git a/core/src/main/java/com/topjohnwu/core/tasks/MagiskInstaller.java b/core/src/main/java/com/topjohnwu/core/tasks/MagiskInstaller.java index 6cf777c16..d76969fa7 100644 --- a/core/src/main/java/com/topjohnwu/core/tasks/MagiskInstaller.java +++ b/core/src/main/java/com/topjohnwu/core/tasks/MagiskInstaller.java @@ -7,7 +7,7 @@ import android.text.TextUtils; import com.topjohnwu.core.App; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.R; import com.topjohnwu.core.container.TarEntry; import com.topjohnwu.core.utils.Utils; @@ -120,9 +120,9 @@ public abstract class MagiskInstaller { File zip = new File(App.self.getCacheDir(), "magisk.zip"); - if (!ShellUtils.checkSum("MD5", zip, Data.magiskMD5)) { + if (!ShellUtils.checkSum("MD5", zip, Config.magiskMD5)) { console.add("- Downloading zip"); - Networking.get(Data.magiskLink) + Networking.get(Config.magiskLink) .setDownloadProgressListener(new ProgressLog()) .execForFile(zip); } else { @@ -217,7 +217,7 @@ public abstract class MagiskInstaller { // Patch boot image if (!Shell.sh(Utils.fmt("cd %s; KEEPFORCEENCRYPT=%b KEEPVERITY=%b " + "sh update-binary indep boot_patch.sh %s", - installDir, Data.keepEnc, Data.keepVerity, srcBoot)) + installDir, Config.keepEnc, Config.keepVerity, srcBoot)) .to(console, logs).exec().isSuccess()) return false; @@ -245,14 +245,14 @@ public abstract class MagiskInstaller { if (!Shell.su(Utils.fmt("direct_install %s %s", installDir, srcBoot)) .to(console, logs).exec().isSuccess()) return false; - if (!Data.keepVerity) + if (!Config.keepVerity) Shell.su("find_dtbo_image", "patch_dtbo_image").to(console, logs).exec(); return true; } protected boolean storeBoot() { File patched = new File(installDir, "new-boot.img"); - String fmt = App.self.prefs.getString(Const.Key.BOOT_FORMAT, ".img"); + String fmt = Config.get(Config.Key.BOOT_FORMAT); File dest = new File(Const.EXTERNAL_PATH, "patched_boot" + fmt); dest.getParentFile().mkdirs(); OutputStream os; diff --git a/core/src/main/java/com/topjohnwu/core/tasks/UpdateRepos.java b/core/src/main/java/com/topjohnwu/core/tasks/UpdateRepos.java index 1eab8919f..2755514fe 100644 --- a/core/src/main/java/com/topjohnwu/core/tasks/UpdateRepos.java +++ b/core/src/main/java/com/topjohnwu/core/tasks/UpdateRepos.java @@ -5,6 +5,7 @@ import android.os.AsyncTask; import com.topjohnwu.core.App; import com.topjohnwu.core.Const; +import com.topjohnwu.core.Config; import com.topjohnwu.core.container.Repo; import com.topjohnwu.core.utils.Logger; import com.topjohnwu.core.utils.Topic; @@ -81,7 +82,7 @@ public class UpdateRepos { private boolean loadPage(int page) { Request req = Networking.get(Utils.fmt(Const.Url.REPO_URL, page + 1)); if (page == 0) { - String etag = app.prefs.getString(Const.Key.ETAG_KEY, null); + String etag = Config.get(Config.Key.ETAG_KEY); if (etag != null) req.addHeaders(Const.Key.IF_NONE_MATCH, etag); } @@ -107,10 +108,10 @@ public class UpdateRepos { // Update ETAG if (page == 0) { - String etag = res.getConnection().getHeaderField(Const.Key.ETAG_KEY); + String etag = res.getConnection().getHeaderField(Config.Key.ETAG_KEY); if (etag != null) { etag = etag.substring(etag.indexOf('\"'), etag.lastIndexOf('\"') + 1); - app.prefs.edit().putString(Const.Key.ETAG_KEY, etag).apply(); + Config.set(Config.Key.ETAG_KEY, etag); } } diff --git a/core/src/main/java/com/topjohnwu/core/utils/LocaleManager.java b/core/src/main/java/com/topjohnwu/core/utils/LocaleManager.java index 6a88b7d2f..6f0409dc0 100644 --- a/core/src/main/java/com/topjohnwu/core/utils/LocaleManager.java +++ b/core/src/main/java/com/topjohnwu/core/utils/LocaleManager.java @@ -6,7 +6,7 @@ import android.content.res.Resources; import android.os.Build; import com.topjohnwu.core.App; -import com.topjohnwu.core.Const; +import com.topjohnwu.core.Config; import com.topjohnwu.superuser.Shell; import java.util.ArrayList; @@ -87,7 +87,7 @@ public class LocaleManager { } public static void setLocale(App app) { - String localeConfig = app.prefs.getString(Const.Key.LOCALE, ""); + String localeConfig = Config.get(Config.Key.LOCALE); if (localeConfig.isEmpty()) { locale = defaultLocale; } else { diff --git a/core/src/main/java/com/topjohnwu/core/utils/RootUtils.java b/core/src/main/java/com/topjohnwu/core/utils/RootUtils.java index 155b29451..f4a31ddef 100644 --- a/core/src/main/java/com/topjohnwu/core/utils/RootUtils.java +++ b/core/src/main/java/com/topjohnwu/core/utils/RootUtils.java @@ -3,13 +3,12 @@ package com.topjohnwu.core.utils; import android.content.Context; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.R; import com.topjohnwu.superuser.Shell; import com.topjohnwu.superuser.ShellUtils; import com.topjohnwu.superuser.io.SuFile; -import java.io.File; import java.io.InputStream; import androidx.annotation.NonNull; @@ -27,7 +26,7 @@ public class RootUtils extends Shell.Initializer { job.add(context.getResources().openRawResource(R.raw.util_functions)) .add(context.getResources().openRawResource(R.raw.utils)); Const.MAGISK_DISABLE_FILE = new SuFile("/cache/.disable_magisk"); - Data.loadMagiskInfo(); + Config.loadMagiskInfo(); } else { InputStream nonroot = context.getResources().openRawResource(R.raw.nonroot_utils); job.add(nonroot); @@ -35,9 +34,9 @@ public class RootUtils extends Shell.Initializer { job.add("mount_partitions", "get_flags", "run_migrations", "export BOOTMODE=true").exec(); - Data.keepVerity = Boolean.parseBoolean(ShellUtils.fastCmd("echo $KEEPVERITY")); - Data.keepEnc = Boolean.parseBoolean(ShellUtils.fastCmd("echo $KEEPFORCEENCRYPT")); - Data.recovery = Boolean.parseBoolean(ShellUtils.fastCmd("echo $RECOVERYMODE")); + Config.keepVerity = Boolean.parseBoolean(ShellUtils.fastCmd("echo $KEEPVERITY")); + Config.keepEnc = Boolean.parseBoolean(ShellUtils.fastCmd("echo $KEEPFORCEENCRYPT")); + Config.recovery = Boolean.parseBoolean(ShellUtils.fastCmd("echo $RECOVERYMODE")); return true; } } diff --git a/core/src/main/java/com/topjohnwu/core/utils/Utils.java b/core/src/main/java/com/topjohnwu/core/utils/Utils.java index d6de6636a..763817604 100644 --- a/core/src/main/java/com/topjohnwu/core/utils/Utils.java +++ b/core/src/main/java/com/topjohnwu/core/utils/Utils.java @@ -15,7 +15,7 @@ import android.widget.Toast; import com.topjohnwu.core.App; import com.topjohnwu.core.Const; -import com.topjohnwu.core.Data; +import com.topjohnwu.core.Config; import com.topjohnwu.core.container.Module; import com.topjohnwu.core.container.ValueSortedMap; import com.topjohnwu.net.Networking; @@ -111,11 +111,9 @@ public class Utils { } public static boolean showSuperUser() { - if (Data.multiuserState < 0) - Data.multiuserState = App.self.mDB.getSettings(Const.Key.SU_MULTIUSER_MODE, - Const.Value.MULTIUSER_MODE_OWNER_ONLY); return Shell.rootAccess() && (Const.USER_ID == 0 || - Data.multiuserState != Const.Value.MULTIUSER_MODE_OWNER_MANAGED); + (int) Config.get(Config.Key.SU_MULTIUSER_MODE) != + Config.Value.MULTIUSER_MODE_OWNER_MANAGED); } public static Context getDEContext() { @@ -124,6 +122,6 @@ public class Utils { } public static void reboot() { - Shell.su("/system/bin/reboot" + (Data.recovery ? " recovery" : "")).submit(); + Shell.su("/system/bin/reboot" + (Config.recovery ? " recovery" : "")).submit(); } }