From ad16a6fc1b260541b1fca64e1767847e089d7614 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Wed, 25 Jan 2017 04:27:05 +0800 Subject: [PATCH] Project restructure --- app/proguard-rules.pro | 2 +- .../com/topjohnwu/magisk/AboutActivity.java | 5 +- .../java/com/topjohnwu/magisk/Global.java | 37 ++++++++ .../com/topjohnwu/magisk/InstallFragment.java | 31 +++---- .../topjohnwu/magisk/MagiskHideFragment.java | 19 ++--- .../com/topjohnwu/magisk/MainActivity.java | 26 +++--- .../com/topjohnwu/magisk/ModulesFragment.java | 10 +-- .../com/topjohnwu/magisk/ReposFragment.java | 10 +-- .../topjohnwu/magisk/SettingsActivity.java | 8 +- .../com/topjohnwu/magisk/StatusFragment.java | 55 ++++++------ .../com/topjohnwu/magisk/module/Module.java | 2 +- .../{utils => module}/ModuleHelper.java | 85 ++++++------------- .../magisk/receivers/MagiskDlReceiver.java | 4 +- .../magisk/superuser/SuRequestActivity.java | 3 +- .../com/topjohnwu/magisk/utils/Async.java | 36 ++++---- .../magisk/{ => utils}/FABBehavior.java | 2 +- .../magisk/utils/ValueSortedMap.java | 43 ++++++++++ app/src/main/res/layout/modules_fragment.xml | 2 +- 18 files changed, 200 insertions(+), 180 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/Global.java rename app/src/main/java/com/topjohnwu/magisk/{utils => module}/ModuleHelper.java (70%) rename app/src/main/java/com/topjohnwu/magisk/{ => utils}/FABBehavior.java (99%) create mode 100644 app/src/main/java/com/topjohnwu/magisk/utils/ValueSortedMap.java diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 8e6197c37..e317e56cd 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -29,7 +29,7 @@ # Application classes that will be serialized/deserialized over Gson -keep class com.topjohnwu.magisk.module.** { *; } --keep class com.topjohnwu.magisk.utils.ModuleHelper$ValueSortedMap { *; } +-keep class com.topjohnwu.magisk.module.ModuleHelper$ValueSortedMap { *; } # Prevent proguard from stripping interface information from TypeAdapterFactory, # JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter) diff --git a/app/src/main/java/com/topjohnwu/magisk/AboutActivity.java b/app/src/main/java/com/topjohnwu/magisk/AboutActivity.java index 3c68cfe07..f287eeb91 100644 --- a/app/src/main/java/com/topjohnwu/magisk/AboutActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/AboutActivity.java @@ -28,9 +28,10 @@ import butterknife.ButterKnife; public class AboutActivity extends AppCompatActivity { - private static final String SOURCE_CODE_URL = "https://github.com/topjohnwu/MagiskManager"; - private static final String XDA_THREAD = "http://forum.xda-developers.com/showthread.php?t=3432382"; private static final String DONATION_URL = "http://topjohnwu.github.io/donate"; + private static final String XDA_THREAD = "http://forum.xda-developers.com/showthread.php?t=3432382"; + private static final String SOURCE_CODE_URL = "https://github.com/topjohnwu/MagiskManager"; + @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.app_version_info) AboutCardRow appVersionInfo; @BindView(R.id.app_changelog) AboutCardRow appChangelog; diff --git a/app/src/main/java/com/topjohnwu/magisk/Global.java b/app/src/main/java/com/topjohnwu/magisk/Global.java new file mode 100644 index 000000000..f42ef39a9 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/Global.java @@ -0,0 +1,37 @@ +package com.topjohnwu.magisk; + +import com.topjohnwu.magisk.module.Repo; +import com.topjohnwu.magisk.utils.CallbackHandler; +import com.topjohnwu.magisk.utils.ValueSortedMap; + +import java.util.List; + +public class Global { + public static class Constant { + // No global constants now + } + public static class Info { + public static double magiskVersion; + public static double remoteMagiskVersion = -1; + public static String magiskVersionString = "(none)"; + public static String magiskLink; + public static String releaseNoteLink; + public static int SNCheckResult = -1; + public static String bootBlock = null; + } + public static class Data { + public static ValueSortedMap repoMap = new ValueSortedMap<>(); + public static ValueSortedMap moduleMap = new ValueSortedMap<>(); + public static List blockList; + } + public static class Events { + public static final CallbackHandler.Event blockDetectionDone = new CallbackHandler.Event(); + public static final CallbackHandler.Event packageLoadDone = new CallbackHandler.Event(); + public static final CallbackHandler.Event reloadMainActivity = new CallbackHandler.Event(); + public static final CallbackHandler.Event moduleLoadDone = new CallbackHandler.Event(); + public static final CallbackHandler.Event repoLoadDone = new CallbackHandler.Event(); + public static final CallbackHandler.Event updateCheckDone = new CallbackHandler.Event(); + public static final CallbackHandler.Event safetyNetDone = new CallbackHandler.Event(); + } + +} diff --git a/app/src/main/java/com/topjohnwu/magisk/InstallFragment.java b/app/src/main/java/com/topjohnwu/magisk/InstallFragment.java index 2ac23fe7f..d6bfbae68 100644 --- a/app/src/main/java/com/topjohnwu/magisk/InstallFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/InstallFragment.java @@ -28,11 +28,6 @@ import butterknife.Unbinder; public class InstallFragment extends Fragment implements CallbackHandler.EventListener { - public static final CallbackHandler.Event blockDetectionDone = new CallbackHandler.Event(); - - public static List blockList; - public static String bootBlock = null; - private Unbinder unbinder; @BindView(R.id.current_version_title) TextView currentVersionTitle; @BindView(R.id.install_title) TextView installTitle; @@ -48,14 +43,14 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi View v = inflater.inflate(R.layout.install_fragment, container, false); unbinder = ButterKnife.bind(this, v); detectButton.setOnClickListener(v1 -> toAutoDetect()); - currentVersionTitle.setText(getString(R.string.current_magisk_title, StatusFragment.magiskVersionString)); - installTitle.setText(getString(R.string.install_magisk_title, StatusFragment.remoteMagiskVersion)); + currentVersionTitle.setText(getString(R.string.current_magisk_title, Global.Info.magiskVersionString)); + installTitle.setText(getString(R.string.install_magisk_title, Global.Info.remoteMagiskVersion)); flashButton.setOnClickListener(v1 -> { - String bootImage = bootBlock; + String bootImage = Global.Info.bootBlock; if (bootImage == null) { - bootImage = blockList.get(spinner.getSelectedItemPosition() - 1); + bootImage = Global.Data.blockList.get(spinner.getSelectedItemPosition() - 1); } - String filename = "Magisk-v" + StatusFragment.remoteMagiskVersion + ".zip"; + String filename = "Magisk-v" + Global.Info.remoteMagiskVersion + ".zip"; String finalBootImage = bootImage; Utils.getAlertDialogBuilder(getActivity()) .setTitle(getString(R.string.repo_install_title, getString(R.string.magisk))) @@ -64,15 +59,15 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi .setPositiveButton(R.string.download_install, (dialogInterface, i) -> Utils.dlAndReceive( getActivity(), new MagiskDlReceiver(finalBootImage, keepEncChkbox.isChecked(), keepVerityChkbox.isChecked()), - StatusFragment.magiskLink, + Global.Info.magiskLink, Utils.getLegalFilename(filename))) .setNeutralButton(R.string.check_release_notes, (dialog, which) -> { - getActivity().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(StatusFragment.releaseNoteLink))); + getActivity().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Global.Info.releaseNoteLink))); }) .setNegativeButton(R.string.no_thanks, null) .show(); }); - if (blockDetectionDone.isTriggered) { + if (Global.Events.blockDetectionDone.isTriggered) { updateUI(); } return v; @@ -84,8 +79,8 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi } private void updateUI() { - List items = new ArrayList<>(blockList); - items.add(0, getString(R.string.auto_detect, bootBlock)); + List items = new ArrayList<>(Global.Data.blockList); + items.add(0, getString(R.string.auto_detect, Global.Info.bootBlock)); ArrayAdapter adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_item, items); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); @@ -94,7 +89,7 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi } private void toAutoDetect() { - if (bootBlock != null) { + if (Global.Info.bootBlock != null) { spinner.setSelection(0); } } @@ -103,12 +98,12 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi public void onStart() { super.onStart(); getActivity().setTitle(R.string.install); - CallbackHandler.register(blockDetectionDone, this); + CallbackHandler.register(Global.Events.blockDetectionDone, this); } @Override public void onStop() { - CallbackHandler.unRegister(blockDetectionDone, this); + CallbackHandler.unRegister(Global.Events.blockDetectionDone, this); super.onStop(); } diff --git a/app/src/main/java/com/topjohnwu/magisk/MagiskHideFragment.java b/app/src/main/java/com/topjohnwu/magisk/MagiskHideFragment.java index 7d32f4283..4678380db 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MagiskHideFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskHideFragment.java @@ -29,19 +29,16 @@ import butterknife.Unbinder; public class MagiskHideFragment extends Fragment implements CallbackHandler.EventListener { - private Unbinder unbinder; - @BindView(R.id.swipeRefreshLayout) SwipeRefreshLayout mSwipeRefreshLayout; - @BindView(R.id.recyclerView) RecyclerView recyclerView; - - // Don't show in list... - public static final List BLACKLIST = Arrays.asList( + public static final List HIDEBLACKLIST = Arrays.asList( "android", "com.topjohnwu.magisk", "com.google.android.gms", "com.google.android.apps.walletnfcrel", "com.nianticlabs.pokemongo" ); - public static final CallbackHandler.Event packageLoadDone = new CallbackHandler.Event(); + private Unbinder unbinder; + @BindView(R.id.swipeRefreshLayout) SwipeRefreshLayout mSwipeRefreshLayout; + @BindView(R.id.recyclerView) RecyclerView recyclerView; private ApplicationAdapter appAdapter; @@ -98,15 +95,15 @@ public class MagiskHideFragment extends Fragment implements CallbackHandler.Even public void onStart() { super.onStart(); getActivity().setTitle(R.string.magiskhide); - CallbackHandler.register(packageLoadDone, this); - if (packageLoadDone.isTriggered) { - onTrigger(packageLoadDone); + CallbackHandler.register(Global.Events.packageLoadDone, this); + if (Global.Events.packageLoadDone.isTriggered) { + onTrigger(Global.Events.packageLoadDone); } } @Override public void onStop() { - CallbackHandler.unRegister(packageLoadDone, this); + CallbackHandler.unRegister(Global.Events.packageLoadDone, this); super.onStop(); } diff --git a/app/src/main/java/com/topjohnwu/magisk/MainActivity.java b/app/src/main/java/com/topjohnwu/magisk/MainActivity.java index e2d758d11..3ce7e49db 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MainActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/MainActivity.java @@ -34,8 +34,6 @@ public class MainActivity extends AppCompatActivity private static final String SELECTED_ITEM_ID = "SELECTED_ITEM_ID"; - public static final CallbackHandler.Event recreate = new CallbackHandler.Event(); - private final Handler mDrawerHandler = new Handler(); private SharedPreferences prefs; @@ -88,28 +86,28 @@ public class MainActivity extends AppCompatActivity } navigationView.setNavigationItemSelectedListener(this); - CallbackHandler.register(recreate, this); + CallbackHandler.register(Global.Events.reloadMainActivity, this); } @Override protected void onResume() { super.onResume(); - CallbackHandler.register(StatusFragment.updateCheckDone, this); - if (StatusFragment.updateCheckDone.isTriggered) { - onTrigger(StatusFragment.updateCheckDone); + CallbackHandler.register(Global.Events.updateCheckDone, this); + if (Global.Events.updateCheckDone.isTriggered) { + onTrigger(Global.Events.updateCheckDone); } checkHideSection(); } @Override protected void onPause() { - CallbackHandler.unRegister(StatusFragment.updateCheckDone, this); + CallbackHandler.unRegister(Global.Events.updateCheckDone, this); super.onPause(); } @Override protected void onDestroy() { - CallbackHandler.unRegister(recreate, this); + CallbackHandler.unRegister(Global.Events.reloadMainActivity, this); super.onDestroy(); } @@ -139,22 +137,22 @@ public class MainActivity extends AppCompatActivity @Override public void onTrigger(CallbackHandler.Event event) { - if (event == StatusFragment.updateCheckDone) { + if (event == Global.Events.updateCheckDone) { Menu menu = navigationView.getMenu(); - menu.findItem(R.id.install).setVisible(StatusFragment.remoteMagiskVersion > 0 && + menu.findItem(R.id.install).setVisible(Global.Info.remoteMagiskVersion > 0 && Shell.rootAccess()); - } else if (event == recreate) { + } else if (event == Global.Events.reloadMainActivity) { recreate(); } } private void checkHideSection() { Menu menu = navigationView.getMenu(); - menu.findItem(R.id.magiskhide).setVisible(StatusFragment.magiskVersion >= 8 && + menu.findItem(R.id.magiskhide).setVisible(Global.Info.magiskVersion >= 8 && prefs.getBoolean("magiskhide", false) && Shell.rootAccess()); - menu.findItem(R.id.modules).setVisible(StatusFragment.magiskVersion >= 4 && + menu.findItem(R.id.modules).setVisible(Global.Info.magiskVersion >= 4 && Shell.rootAccess()); - menu.findItem(R.id.downloads).setVisible(StatusFragment.magiskVersion >= 4 && + menu.findItem(R.id.downloads).setVisible(Global.Info.magiskVersion >= 4 && Shell.rootAccess()); menu.findItem(R.id.log).setVisible(Shell.rootAccess()); menu.findItem(R.id.install).setVisible(Shell.rootAccess()); diff --git a/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java index f62786146..3439cdfec 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java @@ -19,7 +19,7 @@ import com.topjohnwu.magisk.module.Module; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.CallbackHandler; import com.topjohnwu.magisk.utils.Logger; -import com.topjohnwu.magisk.utils.ModuleHelper; +import com.topjohnwu.magisk.module.ModuleHelper; import java.util.ArrayList; import java.util.List; @@ -30,8 +30,6 @@ import butterknife.Unbinder; public class ModulesFragment extends Fragment implements CallbackHandler.EventListener { - public static final CallbackHandler.Event moduleLoadDone = new CallbackHandler.Event(); - private static final int FETCH_ZIP_CODE = 2; private Unbinder unbinder; @@ -71,7 +69,7 @@ public class ModulesFragment extends Fragment implements CallbackHandler.EventLi } }); - if (moduleLoadDone.isTriggered) { + if (Global.Events.moduleLoadDone.isTriggered) { updateUI(); } @@ -97,13 +95,13 @@ public class ModulesFragment extends Fragment implements CallbackHandler.EventLi @Override public void onStart() { super.onStart(); - CallbackHandler.register(moduleLoadDone, this); + CallbackHandler.register(Global.Events.moduleLoadDone, this); getActivity().setTitle(R.string.modules); } @Override public void onStop() { - CallbackHandler.unRegister(moduleLoadDone, this); + CallbackHandler.unRegister(Global.Events.moduleLoadDone, this); super.onStop(); } diff --git a/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java b/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java index 87e219010..d22fa91f7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java @@ -20,7 +20,7 @@ import com.topjohnwu.magisk.module.Repo; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.CallbackHandler; import com.topjohnwu.magisk.utils.Logger; -import com.topjohnwu.magisk.utils.ModuleHelper; +import com.topjohnwu.magisk.module.ModuleHelper; import java.util.ArrayList; import java.util.List; @@ -31,8 +31,6 @@ import butterknife.Unbinder; public class ReposFragment extends Fragment implements CallbackHandler.EventListener { - public static final CallbackHandler.Event repoLoadDone = new CallbackHandler.Event(); - private Unbinder unbinder; @BindView(R.id.recyclerView) RecyclerView recyclerView; @BindView(R.id.empty_rv) TextView emptyTv; @@ -74,7 +72,7 @@ public class ReposFragment extends Fragment implements CallbackHandler.EventList new Async.LoadRepos(getActivity()).exec(); }); - if (repoLoadDone.isTriggered) { + if (Global.Events.repoLoadDone.isTriggered) { reloadRepos(); updateUI(); } @@ -112,13 +110,13 @@ public class ReposFragment extends Fragment implements CallbackHandler.EventList @Override public void onStart() { super.onStart(); - CallbackHandler.register(repoLoadDone, this); + CallbackHandler.register(Global.Events.repoLoadDone, this); getActivity().setTitle(R.string.downloads); } @Override public void onStop() { - CallbackHandler.unRegister(repoLoadDone, this); + CallbackHandler.unRegister(Global.Events.repoLoadDone, this); super.onStop(); } diff --git a/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java b/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java index 0fdd3ad48..0de2640dc 100644 --- a/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java @@ -14,9 +14,9 @@ import android.support.v7.widget.Toolbar; import android.view.WindowManager; import android.widget.Toast; +import com.topjohnwu.magisk.module.ModuleHelper; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.Logger; -import com.topjohnwu.magisk.utils.ModuleHelper; import com.topjohnwu.magisk.utils.Shell; import com.topjohnwu.magisk.utils.Utils; @@ -107,10 +107,10 @@ public class SettingsActivity extends AppCompatActivity { themePreference.setSummary(R.string.theme_default); } - if (StatusFragment.magiskVersion < 9) { + if (Global.Info.magiskVersion < 9) { hostsPreference.setEnabled(false); busyboxPreference.setEnabled(false); - } else if (StatusFragment.magiskVersion < 8) { + } else if (Global.Info.magiskVersion < 8) { magiskhidePreference.setEnabled(false); } else if (! Shell.rootAccess()) { busyboxPreference.setEnabled(false); @@ -146,7 +146,7 @@ public class SettingsActivity extends AppCompatActivity { if (Utils.isDarkTheme != theme.equalsIgnoreCase(getString(R.string.theme_dark_value))) { Utils.isDarkTheme = !Utils.isDarkTheme; getActivity().recreate(); - MainActivity.recreate.trigger(); + Global.Events.reloadMainActivity.trigger(); } break; case "magiskhide": diff --git a/app/src/main/java/com/topjohnwu/magisk/StatusFragment.java b/app/src/main/java/com/topjohnwu/magisk/StatusFragment.java index 4aa571020..c5f76abda 100644 --- a/app/src/main/java/com/topjohnwu/magisk/StatusFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/StatusFragment.java @@ -30,15 +30,8 @@ import butterknife.Unbinder; public class StatusFragment extends Fragment implements CallbackHandler.EventListener { - public static double magiskVersion, remoteMagiskVersion = -1; - public static String magiskVersionString = "(none)", magiskLink, releaseNoteLink; - public static int SNCheckResult = -1; - private static boolean noDialog = false; - public static final CallbackHandler.Event updateCheckDone = new CallbackHandler.Event(); - public static final CallbackHandler.Event safetyNetDone = new CallbackHandler.Event(); - private Unbinder unbinder; @BindView(R.id.swipeRefreshLayout) SwipeRefreshLayout mSwipeRefreshLayout; @@ -93,7 +86,7 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis safetyNetStatusText.setText(R.string.safetyNet_check_text); safetyNetStatusText.setTextColor(defaultColor); - safetyNetDone.isTriggered = false; + Global.Events.safetyNetDone.isTriggered = false; noDialog = false; updateUI(); @@ -108,7 +101,7 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis Async.checkSafetyNet(getActivity()); }); - if (magiskVersion < 0 && Shell.rootAccess() && !noDialog) { + if (Global.Info.magiskVersion < 0 && Shell.rootAccess() && !noDialog) { noDialog = true; Utils.getAlertDialogBuilder(getActivity()) .setTitle(R.string.no_magisk_title) @@ -133,10 +126,10 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis @Override public void onTrigger(CallbackHandler.Event event) { - if (event == updateCheckDone) { + if (event == Global.Events.updateCheckDone) { Logger.dev("StatusFragment: Update Check UI refresh triggered"); updateCheckUI(); - } else if (event == safetyNetDone) { + } else if (event == Global.Events.safetyNetDone) { Logger.dev("StatusFragment: SafetyNet UI refresh triggered"); updateSafetyNetUI(); } @@ -145,12 +138,12 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis @Override public void onStart() { super.onStart(); - CallbackHandler.register(updateCheckDone, this); - CallbackHandler.register(safetyNetDone, this); - if (updateCheckDone.isTriggered) { + CallbackHandler.register(Global.Events.updateCheckDone, this); + CallbackHandler.register(Global.Events.safetyNetDone, this); + if (Global.Events.updateCheckDone.isTriggered) { updateCheckUI(); } - if (safetyNetDone.isTriggered) { + if (Global.Events.safetyNetDone.isTriggered) { updateSafetyNetUI(); } getActivity().setTitle(R.string.status); @@ -158,8 +151,8 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis @Override public void onStop() { - CallbackHandler.unRegister(updateCheckDone, this); - CallbackHandler.unRegister(safetyNetDone, this); + CallbackHandler.unRegister(Global.Events.updateCheckDone, this); + CallbackHandler.unRegister(Global.Events.safetyNetDone, this); super.onStop(); } @@ -172,14 +165,14 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis private static void checkMagiskInfo() { List ret = Shell.sh("getprop magisk.version"); if (ret.get(0).length() == 0) { - magiskVersion = -1; + Global.Info.magiskVersion = -1; } else { try { - magiskVersionString = ret.get(0); - magiskVersion = Double.parseDouble(ret.get(0)); + Global.Info.magiskVersionString = ret.get(0); + Global.Info.magiskVersion = Double.parseDouble(ret.get(0)); } catch (NumberFormatException e) { // Custom version don't need to receive updates - magiskVersion = Double.POSITIVE_INFINITY; + Global.Info.magiskVersion = Double.POSITIVE_INFINITY; } } } @@ -189,10 +182,10 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis checkMagiskInfo(); - if (magiskVersion < 0) { + if (Global.Info.magiskVersion < 0) { magiskVersionText.setText(R.string.magisk_version_error); } else { - magiskVersionText.setText(getString(R.string.magisk_version, magiskVersionString)); + magiskVersionText.setText(getString(R.string.magisk_version, Global.Info.magiskVersionString)); } if (Shell.rootStatus == 1) { @@ -222,21 +215,21 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis private void updateCheckUI() { int image, color; - if (remoteMagiskVersion < 0) { + if (Global.Info.remoteMagiskVersion < 0) { color = colorNeutral; image = R.drawable.ic_help; magiskUpdateText.setText(R.string.cannot_check_updates); - } else if (remoteMagiskVersion > magiskVersion) { + } else if (Global.Info.remoteMagiskVersion > Global.Info.magiskVersion) { color = colorInfo; image = R.drawable.ic_update; - magiskUpdateText.setText(getString(R.string.magisk_update_available, remoteMagiskVersion)); + magiskUpdateText.setText(getString(R.string.magisk_update_available, Global.Info.remoteMagiskVersion)); } else { color = colorOK; image = R.drawable.ic_check_circle; magiskUpdateText.setText(getString(R.string.up_to_date, getString(R.string.magisk))); } - if (magiskVersion < 0) { + if (Global.Info.magiskVersion < 0) { color = colorBad; image = R.drawable.ic_cancel; } @@ -250,7 +243,7 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis updateMagisk = Utils.getAlertDialogBuilder(getActivity()) .setTitle(R.string.magisk_update_title) - .setMessage(getString(R.string.magisk_update_message, remoteMagiskVersion)) + .setMessage(getString(R.string.magisk_update_message, Global.Info.remoteMagiskVersion)) .setCancelable(true) .setPositiveButton(R.string.goto_install, (dialogInterface, i) -> { ((MainActivity) getActivity()).navigationView.setCheckedItem(R.id.install); @@ -261,12 +254,12 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis } catch (IllegalStateException ignored) {} }) .setNeutralButton(R.string.check_release_notes, (dialog, which) -> { - getActivity().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(releaseNoteLink))); + getActivity().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Global.Info.releaseNoteLink))); }) .setNegativeButton(R.string.no_thanks, null) .create(); - if (magiskVersion < remoteMagiskVersion && Shell.rootAccess()) { + if (Global.Info.magiskVersion < Global.Info.remoteMagiskVersion && Shell.rootAccess()) { magiskStatusContainer.setOnClickListener(view -> updateMagisk.show()); if (!noDialog) { noDialog = true; @@ -278,7 +271,7 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis private void updateSafetyNetUI() { int image, color; safetyNetProgress.setVisibility(View.GONE); - switch (SNCheckResult) { + switch (Global.Info.SNCheckResult) { case -3: color = colorNeutral; image = R.drawable.ic_help; diff --git a/app/src/main/java/com/topjohnwu/magisk/module/Module.java b/app/src/main/java/com/topjohnwu/magisk/module/Module.java index faf2438a4..bd7f62f9a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/module/Module.java +++ b/app/src/main/java/com/topjohnwu/magisk/module/Module.java @@ -24,7 +24,7 @@ public class Module extends BaseModule { if (mName == null) mName = mId; - Logger.dev("Creating Module, id: " + mId); + Logger.dev("Creating Data, id: " + mId); mEnable = !Utils.itemExist(mDisableFile); mRemove = Utils.itemExist(mRemoveFile); diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/ModuleHelper.java b/app/src/main/java/com/topjohnwu/magisk/module/ModuleHelper.java similarity index 70% rename from app/src/main/java/com/topjohnwu/magisk/utils/ModuleHelper.java rename to app/src/main/java/com/topjohnwu/magisk/module/ModuleHelper.java index 19ff88ff5..827e2029d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/ModuleHelper.java +++ b/app/src/main/java/com/topjohnwu/magisk/module/ModuleHelper.java @@ -1,15 +1,16 @@ -package com.topjohnwu.magisk.utils; +package com.topjohnwu.magisk.module; import android.content.Context; import android.content.SharedPreferences; -import android.support.annotation.NonNull; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.module.BaseModule; -import com.topjohnwu.magisk.module.Module; -import com.topjohnwu.magisk.module.Repo; +import com.topjohnwu.magisk.Global; +import com.topjohnwu.magisk.utils.Logger; +import com.topjohnwu.magisk.utils.Utils; +import com.topjohnwu.magisk.utils.ValueSortedMap; +import com.topjohnwu.magisk.utils.WebService; import org.json.JSONArray; import org.json.JSONException; @@ -17,42 +18,36 @@ import org.json.JSONObject; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; -import java.util.Map; public class ModuleHelper { + private static final String MAGISK_PATH = "/magisk"; - public static final String FILE_KEY = "RepoMap"; + + private static final int GSON_DB_VER = 1; + private static final String ETAG_KEY = "ETag"; + private static final String VERSION_KEY = "version"; private static final String REPO_KEY = "repomap"; - public static final String VERSION_KEY = "version"; - public static final String ETAG_KEY = "ETag"; - private static final int DATABASE_VER = 1; - - private static ValueSortedMap repoMap = new ValueSortedMap<>(); - private static ValueSortedMap moduleMap = new ValueSortedMap<>(); - + private static final String FILE_KEY = "RepoMap"; public static void createModuleMap() { Logger.dev("ModuleHelper: Loading modules"); - moduleMap.clear(); + Global.Data.moduleMap.clear(); for (String path : Utils.getModList(MAGISK_PATH)) { Logger.dev("ModuleHelper: Adding modules from " + path); Module module; try { module = new Module(path); - moduleMap.put(module.getId(), module); + Global.Data.moduleMap.put(module.getId(), module); } catch (BaseModule.CacheModException ignored) {} } - Logger.dev("ModuleHelper: Module load done"); + Logger.dev("ModuleHelper: Data load done"); } public static void createRepoMap(Context context) { @@ -60,13 +55,13 @@ public class ModuleHelper { SharedPreferences prefs = context.getSharedPreferences(FILE_KEY, Context.MODE_PRIVATE); - repoMap.clear(); + Global.Data.repoMap.clear(); Gson gson = new Gson(); String jsonString; int cachedVersion = prefs.getInt(VERSION_KEY, 0); - if (cachedVersion != DATABASE_VER) { + if (cachedVersion != GSON_DB_VER) { // Ignore incompatible cached database jsonString = null; } else { @@ -123,7 +118,7 @@ public class ModuleHelper { repo.update(updatedDate); } if (repo.getId() != null) { - repoMap.put(id, repo); + Global.Data.repoMap.put(id, repo); } } catch (BaseModule.CacheModException ignored) {} } @@ -133,12 +128,12 @@ public class ModuleHelper { } else { // Use cached if no internet or no updates Logger.dev("ModuleHelper: No updates, use cached"); - repoMap.putAll(cached); + Global.Data.repoMap.putAll(cached); } prefs.edit() - .putInt(VERSION_KEY, DATABASE_VER) - .putString(REPO_KEY, gson.toJson(repoMap)) + .putInt(VERSION_KEY, GSON_DB_VER) + .putString(REPO_KEY, gson.toJson(Global.Data.repoMap)) .putString(ETAG_KEY, etag) .apply(); @@ -147,15 +142,15 @@ public class ModuleHelper { public static void getModuleList(List moduleList) { moduleList.clear(); - moduleList.addAll(moduleMap.values()); + moduleList.addAll(Global.Data.moduleMap.values()); } public static void getRepoLists(List update, List installed, List others) { update.clear(); installed.clear(); others.clear(); - for (Repo repo : repoMap.values()) { - Module module = moduleMap.get(repo.getId()); + for (Repo repo : Global.Data.repoMap.values()) { + Module module = Global.Data.moduleMap.get(repo.getId()); if (module != null) { if (repo.getVersionCode() > module.getVersionCode()) { update.add(repo); @@ -168,36 +163,4 @@ public class ModuleHelper { } } - private static class ValueSortedMap> extends HashMap { - - private List sorted = new ArrayList<>(); - - @NonNull - @Override - public Collection values() { - if (sorted.isEmpty()) { - sorted.addAll(super.values()); - Collections.sort(sorted); - } - return sorted; - } - - @Override - public V put(K key, V value) { - sorted.clear(); - return super.put(key, value); - } - - @Override - public void putAll(Map m) { - sorted.clear(); - super.putAll(m); - } - - @Override - public V remove(Object key) { - sorted.clear(); - return super.remove(key); - } - } } diff --git a/app/src/main/java/com/topjohnwu/magisk/receivers/MagiskDlReceiver.java b/app/src/main/java/com/topjohnwu/magisk/receivers/MagiskDlReceiver.java index 41313c7c5..21275b462 100644 --- a/app/src/main/java/com/topjohnwu/magisk/receivers/MagiskDlReceiver.java +++ b/app/src/main/java/com/topjohnwu/magisk/receivers/MagiskDlReceiver.java @@ -3,7 +3,7 @@ package com.topjohnwu.magisk.receivers; import android.net.Uri; import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.StatusFragment; +import com.topjohnwu.magisk.Global; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.Shell; import com.topjohnwu.magisk.utils.ZipUtils; @@ -56,7 +56,7 @@ public class MagiskDlReceiver extends DownloadReceiver { @Override protected Void doInBackground(Void... params) { Shell.su("setprop magisk.version " - + String.valueOf(StatusFragment.remoteMagiskVersion)); + + String.valueOf(Global.Info.remoteMagiskVersion)); return null; } }.exec(); diff --git a/app/src/main/java/com/topjohnwu/magisk/superuser/SuRequestActivity.java b/app/src/main/java/com/topjohnwu/magisk/superuser/SuRequestActivity.java index 1049b2da3..b98172b4b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/superuser/SuRequestActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/superuser/SuRequestActivity.java @@ -28,6 +28,7 @@ import butterknife.ButterKnife; public class SuRequestActivity extends AppCompatActivity { + private static final int[] timeoutList = {0, -1, 10, 20, 30, 60}; private final static int SU_PROTOCOL_PARAM_MAX = 20; private final static int SU_PROTOCOL_NAME_MAX = 20; private final static int SU_PROTOCOL_VALUE_MAX = 256; @@ -49,8 +50,6 @@ public class SuRequestActivity extends AppCompatActivity { private String appName, packageName; private CountDownTimer timer; - private int[] timeoutList = {0, -1, 10, 20, 30, 60}; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Async.java b/app/src/main/java/com/topjohnwu/magisk/utils/Async.java index 04a9d50a1..7290a6ff4 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Async.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Async.java @@ -11,12 +11,10 @@ import android.provider.OpenableColumns; import android.util.Log; import android.widget.Toast; -import com.topjohnwu.magisk.InstallFragment; +import com.topjohnwu.magisk.Global; import com.topjohnwu.magisk.MagiskHideFragment; -import com.topjohnwu.magisk.ModulesFragment; import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.ReposFragment; -import com.topjohnwu.magisk.StatusFragment; +import com.topjohnwu.magisk.module.ModuleHelper; import org.json.JSONException; import org.json.JSONObject; @@ -60,16 +58,16 @@ public class Async { try { JSONObject json = new JSONObject(jsonStr); JSONObject magisk = json.getJSONObject("magisk"); - StatusFragment.remoteMagiskVersion = magisk.getDouble("versionCode"); - StatusFragment.magiskLink = magisk.getString("link"); - StatusFragment.releaseNoteLink = magisk.getString("note"); + Global.Info.remoteMagiskVersion = magisk.getDouble("versionCode"); + Global.Info.magiskLink = magisk.getString("link"); + Global.Info.releaseNoteLink = magisk.getString("note"); } catch (JSONException ignored) {} return null; } @Override protected void onPostExecute(Void v) { - StatusFragment.updateCheckDone.trigger(); + Global.Events.updateCheckDone.trigger(); } } @@ -77,8 +75,8 @@ public class Async { new SafetyNetHelper(context) { @Override public void handleResults(int i) { - StatusFragment.SNCheckResult = i; - StatusFragment.safetyNetDone.trigger(); + Global.Info.SNCheckResult = i; + Global.Events.safetyNetDone.trigger(); } }.requestTest(); } @@ -93,7 +91,7 @@ public class Async { @Override protected void onPostExecute(Void v) { - ModulesFragment.moduleLoadDone.trigger(); + Global.Events.moduleLoadDone.trigger(); } } @@ -113,7 +111,7 @@ public class Async { @Override protected void onPostExecute(Void v) { - ReposFragment.repoLoadDone.trigger(); + Global.Events.repoLoadDone.trigger(); } } @@ -130,7 +128,7 @@ public class Async { List listApps = pm.getInstalledApplications(PackageManager.GET_META_DATA); for (Iterator i = listApps.iterator(); i.hasNext(); ) { ApplicationInfo info = i.next(); - if (MagiskHideFragment.BLACKLIST.contains(info.packageName) || !info.enabled) + if (MagiskHideFragment.HIDEBLACKLIST.contains(info.packageName) || !info.enabled) i.remove(); } Collections.sort(listApps, (a, b) -> a.loadLabel(pm).toString().toLowerCase() @@ -141,7 +139,7 @@ public class Async { @Override protected void onPostExecute(Result result) { - MagiskHideFragment.packageLoadDone.trigger(result); + Global.Events.packageLoadDone.trigger(result); } public static class Result { @@ -289,7 +287,7 @@ public class Async { } protected void onSuccess() { - StatusFragment.updateCheckDone.trigger(); + Global.Events.updateCheckDone.trigger(); new LoadModules().exec(); Utils.getAlertDialogBuilder(mContext) @@ -324,9 +322,9 @@ public class Async { @Override protected Void doInBackground(Void... params) { if (Shell.rootAccess()) { - InstallFragment.blockList = Shell.su("ls /dev/block | grep mmc"); - if (InstallFragment.bootBlock == null) { - InstallFragment.bootBlock = Utils.detectBootImage(); + Global.Data.blockList = Shell.su("ls /dev/block | grep mmc"); + if (Global.Info.bootBlock == null) { + Global.Info.bootBlock = Utils.detectBootImage(); } } return null; @@ -334,7 +332,7 @@ public class Async { @Override protected void onPostExecute(Void aVoid) { - InstallFragment.blockDetectionDone.trigger(); + Global.Events.blockDetectionDone.trigger(); } } } diff --git a/app/src/main/java/com/topjohnwu/magisk/FABBehavior.java b/app/src/main/java/com/topjohnwu/magisk/utils/FABBehavior.java similarity index 99% rename from app/src/main/java/com/topjohnwu/magisk/FABBehavior.java rename to app/src/main/java/com/topjohnwu/magisk/utils/FABBehavior.java index 3c2542725..14628cd6d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/FABBehavior.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/FABBehavior.java @@ -1,4 +1,4 @@ -package com.topjohnwu.magisk; +package com.topjohnwu.magisk.utils; import android.content.Context; diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/ValueSortedMap.java b/app/src/main/java/com/topjohnwu/magisk/utils/ValueSortedMap.java new file mode 100644 index 000000000..5313df3b8 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/utils/ValueSortedMap.java @@ -0,0 +1,43 @@ +package com.topjohnwu.magisk.utils; + +import android.support.annotation.NonNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ValueSortedMap> extends HashMap { + + private List sorted = new ArrayList<>(); + + @NonNull + @Override + public Collection values() { + if (sorted.isEmpty()) { + sorted.addAll(super.values()); + Collections.sort(sorted); + } + return sorted; + } + + @Override + public V put(K key, V value) { + sorted.clear(); + return super.put(key, value); + } + + @Override + public void putAll(Map m) { + sorted.clear(); + super.putAll(m); + } + + @Override + public V remove(Object key) { + sorted.clear(); + return super.remove(key); + } +} diff --git a/app/src/main/res/layout/modules_fragment.xml b/app/src/main/res/layout/modules_fragment.xml index a5aa9577f..877e47329 100644 --- a/app/src/main/res/layout/modules_fragment.xml +++ b/app/src/main/res/layout/modules_fragment.xml @@ -47,7 +47,7 @@ android:layout_gravity="bottom|center_horizontal" android:layout_marginEnd="113dp" android:layout_marginBottom="10dp" - app:layout_behavior=".FABBehavior" + app:layout_behavior=".utils.FABBehavior" fab:menu_fab_size="normal" fab:menu_showShadow="true" fab:menu_shadowColor="#66000000"