From bef59695805174020d3783c2e8b248f0a54c2eb2 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Tue, 7 Feb 2017 02:01:32 +0800 Subject: [PATCH] No more static crap :) --- app/src/main/AndroidManifest.xml | 1 + .../com/topjohnwu/magisk/AboutActivity.java | 6 +- .../java/com/topjohnwu/magisk/Global.java | 133 ----------------- .../com/topjohnwu/magisk/InstallFragment.java | 36 ++--- .../com/topjohnwu/magisk/LogFragment.java | 4 +- .../topjohnwu/magisk/MagiskHideFragment.java | 14 +- .../topjohnwu/magisk/MagiskLogFragment.java | 2 +- .../com/topjohnwu/magisk/MagiskManager.java | 139 ++++++++++++++++++ .../com/topjohnwu/magisk/MainActivity.java | 32 ++-- .../com/topjohnwu/magisk/ModulesFragment.java | 14 +- .../com/topjohnwu/magisk/ReposFragment.java | 27 +++- .../topjohnwu/magisk/SettingsActivity.java | 50 ++++--- .../com/topjohnwu/magisk/SplashActivity.java | 18 ++- .../com/topjohnwu/magisk/StatusFragment.java | 60 ++++---- .../com/topjohnwu/magisk/SuLogFragment.java | 2 +- .../topjohnwu/magisk/SuperuserFragment.java | 2 +- .../topjohnwu/magisk/components/Activity.java | 12 ++ .../topjohnwu/magisk/components/Fragment.java | 11 ++ .../topjohnwu/magisk/module/ModuleHelper.java | 58 +++----- .../magisk/receivers/BootReceiver.java | 9 +- .../magisk/receivers/MagiskDlReceiver.java | 4 +- .../magisk/superuser/RequestActivity.java | 7 +- .../magisk/superuser/SuLogDatabaseHelper.java | 7 +- .../magisk/superuser/SuReceiver.java | 8 +- .../magisk/superuser/SuRequestActivity.java | 18 ++- .../com/topjohnwu/magisk/utils/Async.java | 102 ++++++++----- .../com/topjohnwu/magisk/utils/Logger.java | 8 +- .../com/topjohnwu/magisk/utils/Utils.java | 4 +- 28 files changed, 421 insertions(+), 367 deletions(-) delete mode 100644 app/src/main/java/com/topjohnwu/magisk/Global.java create mode 100644 app/src/main/java/com/topjohnwu/magisk/MagiskManager.java create mode 100644 app/src/main/java/com/topjohnwu/magisk/components/Activity.java create mode 100644 app/src/main/java/com/topjohnwu/magisk/components/Fragment.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8786b884b..c86e264c0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ repoMap; - public static ValueSortedMap moduleMap; - public static List blockList; - public static List appList; - public static List magiskHideList; - } - 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(); - public static SparseArray uidMap = new SparseArray<>(); - } - public static class Configs { - public static boolean isDarkTheme; - public static boolean shellLogging; - public static boolean devLogging; - public static boolean magiskHide; - public static int suRequestTimeout; - public static int suLogTimeout = 14; - public static int suAccessState; - public static int suResponseType; - public static int suNotificationType; - } - - public static void init(Context context) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - Configs.isDarkTheme = prefs.getBoolean("dark_theme", false); - Configs.devLogging = prefs.getBoolean("developer_logging", false); - Configs.shellLogging = prefs.getBoolean("shell_logging", false); - Configs.magiskHide = prefs.getBoolean("magiskhide", false); - updateMagiskInfo(); - initSuAccess(); - initSuConfigs(context); - // Initialize prefs - prefs.edit() - .putBoolean("dark_theme", Configs.isDarkTheme) - .putBoolean("magiskhide", Configs.magiskHide) - .putBoolean("busybox", Utils.commandExists("busybox")) - .putBoolean("hosts", new File("/magisk/.core/hosts").exists()) - .putBoolean("disable", Utils.itemExist(MAGISK_DISABLE_FILE)) - .putString("su_request_timeout", String.valueOf(Configs.suRequestTimeout)) - .putString("su_auto_response", String.valueOf(Configs.suResponseType)) - .putString("su_notification", String.valueOf(Configs.suNotificationType)) - .putString("su_access", String.valueOf(Configs.suAccessState)) - .apply(); - } - - public static void initSuConfigs(Context context) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - Configs.suRequestTimeout = Utils.getPrefsInt(prefs, "su_request_timeout", 10); - Configs.suResponseType = Utils.getPrefsInt(prefs, "su_auto_response", 0); - Configs.suNotificationType = Utils.getPrefsInt(prefs, "su_notification", 1); - } - - public static void initSuAccess() { - List ret = Shell.sh("su -v"); - if (Utils.isValidShellResponse(ret)) { - Info.suVersion = ret.get(0); - Info.isSuClient = Info.suVersion.toUpperCase().contains("MAGISK"); - } - if (Info.isSuClient) { - ret = Shell.sh("getprop persist.sys.root_access"); - if (Utils.isValidShellResponse(ret)) - Configs.suAccessState = Integer.parseInt(ret.get(0)); - else { - Shell.su(true, "setprop persist.sys.root_access 3"); - Configs.suAccessState = 3; - } - } - } - - public static void updateMagiskInfo() { - List ret = Shell.sh("getprop magisk.version"); - if (!Utils.isValidShellResponse(ret)) { - Info.magiskVersion = -1; - } else { - try { - Info.magiskVersionString = ret.get(0); - Info.magiskVersion = Double.parseDouble(ret.get(0)); - } catch (NumberFormatException e) { - // Custom version don't need to receive updates - Info.magiskVersion = Double.POSITIVE_INFINITY; - } - } - ret = Shell.sh("getprop ro.magisk.disable"); - try { - Info.disabled = Utils.isValidShellResponse(ret) && Integer.parseInt(ret.get(0)) != 0; - } catch (NumberFormatException e) { - Info.disabled = false; - } - - } - -} diff --git a/app/src/main/java/com/topjohnwu/magisk/InstallFragment.java b/app/src/main/java/com/topjohnwu/magisk/InstallFragment.java index de908be9d..dc4b8a412 100644 --- a/app/src/main/java/com/topjohnwu/magisk/InstallFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/InstallFragment.java @@ -6,7 +6,6 @@ import android.net.Uri; import android.os.Bundle; import android.os.CountDownTimer; import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.support.v7.widget.CardView; import android.view.LayoutInflater; import android.view.View; @@ -17,6 +16,7 @@ import android.widget.CheckBox; import android.widget.Spinner; import android.widget.TextView; +import com.topjohnwu.magisk.components.Fragment; import com.topjohnwu.magisk.receivers.MagiskDlReceiver; import com.topjohnwu.magisk.utils.CallbackHandler; import com.topjohnwu.magisk.utils.Shell; @@ -54,19 +54,19 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi View v = inflater.inflate(R.layout.fragment_install, container, false); unbinder = ButterKnife.bind(this, v); detectButton.setOnClickListener(v1 -> toAutoDetect()); - currentVersionTitle.setText(getString(R.string.current_magisk_title, Global.Info.magiskVersionString)); - installTitle.setText(getString(R.string.install_magisk_title, Global.Info.remoteMagiskVersion)); + currentVersionTitle.setText(getString(R.string.current_magisk_title, getApplication().magiskVersionString)); + installTitle.setText(getString(R.string.install_magisk_title, getApplication().remoteMagiskVersion)); flashButton.setOnClickListener(v1 -> { String bootImage; - if (Global.Info.bootBlock != null) { + if (getApplication().bootBlock != null) { if (spinner.getSelectedItemPosition() > 0) - bootImage = Global.Data.blockList.get(spinner.getSelectedItemPosition() - 1); + bootImage = getApplication().blockList.get(spinner.getSelectedItemPosition() - 1); else - bootImage = Global.Info.bootBlock; + bootImage = getApplication().bootBlock; } else { - bootImage = Global.Data.blockList.get(spinner.getSelectedItemPosition()); + bootImage = getApplication().blockList.get(spinner.getSelectedItemPosition()); } - String filename = "Magisk-v" + Global.Info.remoteMagiskVersion + ".zip"; + String filename = "Magisk-v" + getApplication().remoteMagiskVersion + ".zip"; Utils.getAlertDialogBuilder(getActivity()) .setTitle(getString(R.string.repo_install_title, getString(R.string.magisk))) .setMessage(getString(R.string.repo_install_msg, filename)) @@ -74,15 +74,15 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi .setPositiveButton(R.string.download_install, (dialogInterface, i) -> Utils.dlAndReceive( getActivity(), new MagiskDlReceiver(bootImage, keepEncChkbox.isChecked(), keepVerityChkbox.isChecked()), - Global.Info.magiskLink, + getApplication().magiskLink, Utils.getLegalFilename(filename))) .setNeutralButton(R.string.check_release_notes, (dialog, which) -> { - getActivity().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Global.Info.releaseNoteLink))); + getActivity().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getApplication().releaseNoteLink))); }) .setNegativeButton(R.string.no_thanks, null) .show(); }); - if (Global.Info.magiskVersion < 10.3) { + if (getApplication().magiskVersion < 10.3) { uninstallButton.setVisibility(View.GONE); } else { uninstallButton.setOnClickListener(vi -> { @@ -125,7 +125,7 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi }); } - if (Global.Events.blockDetectionDone.isTriggered) { + if (getApplication().blockDetectionDone.isTriggered) { updateUI(); } return v; @@ -137,9 +137,9 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi } private void updateUI() { - List items = new ArrayList<>(Global.Data.blockList); - if (Global.Info.bootBlock != null) - items.add(0, getString(R.string.auto_detect, Global.Info.bootBlock)); + List items = new ArrayList<>(getApplication().blockList); + if (getApplication().bootBlock != null) + items.add(0, getString(R.string.auto_detect, getApplication().bootBlock)); ArrayAdapter adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_item, items); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); @@ -148,7 +148,7 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi } private void toAutoDetect() { - if (Global.Info.bootBlock != null) { + if (getApplication().bootBlock != null) { spinner.setSelection(0); } } @@ -157,12 +157,12 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi public void onStart() { super.onStart(); getActivity().setTitle(R.string.install); - CallbackHandler.register(Global.Events.blockDetectionDone, this); + CallbackHandler.register(getApplication().blockDetectionDone, this); } @Override public void onStop() { - CallbackHandler.unRegister(Global.Events.blockDetectionDone, this); + CallbackHandler.unRegister(getApplication().blockDetectionDone, this); super.onStop(); } diff --git a/app/src/main/java/com/topjohnwu/magisk/LogFragment.java b/app/src/main/java/com/topjohnwu/magisk/LogFragment.java index 020cb9a92..f9c325a4e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/LogFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/LogFragment.java @@ -3,13 +3,13 @@ package com.topjohnwu.magisk; import android.os.Bundle; import android.support.design.widget.TabLayout; -import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.topjohnwu.magisk.adapters.TabFragmentAdapter; +import com.topjohnwu.magisk.components.Fragment; import butterknife.BindView; import butterknife.ButterKnife; @@ -33,7 +33,7 @@ public class LogFragment extends Fragment { adapter.addTab(new MagiskLogFragment(), getString(R.string.magisk)); - if (Global.Info.isSuClient) { + if (getApplication().isSuClient) { adapter.addTab(new SuLogFragment(), getString(R.string.superuser)); tab.setupWithViewPager(viewPager); tab.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/com/topjohnwu/magisk/MagiskHideFragment.java b/app/src/main/java/com/topjohnwu/magisk/MagiskHideFragment.java index d508c5760..6c83f152f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MagiskHideFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskHideFragment.java @@ -3,7 +3,6 @@ package com.topjohnwu.magisk; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.support.v4.view.MenuItemCompat; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; @@ -16,6 +15,7 @@ import android.view.ViewGroup; import android.widget.SearchView; import com.topjohnwu.magisk.adapters.ApplicationAdapter; +import com.topjohnwu.magisk.components.Fragment; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.CallbackHandler; import com.topjohnwu.magisk.utils.Logger; @@ -50,7 +50,7 @@ public class MagiskHideFragment extends Fragment implements CallbackHandler.Even PackageManager packageManager = getActivity().getPackageManager(); mSwipeRefreshLayout.setRefreshing(true); - mSwipeRefreshLayout.setOnRefreshListener(() -> new Async.LoadApps(packageManager).exec()); + mSwipeRefreshLayout.setOnRefreshListener(() -> new Async.LoadApps(getApplication()).exec()); appAdapter = new ApplicationAdapter(packageManager); recyclerView.setAdapter(appAdapter); @@ -85,15 +85,15 @@ public class MagiskHideFragment extends Fragment implements CallbackHandler.Even public void onStart() { super.onStart(); getActivity().setTitle(R.string.magiskhide); - CallbackHandler.register(Global.Events.packageLoadDone, this); - if (Global.Events.packageLoadDone.isTriggered) { - onTrigger(Global.Events.packageLoadDone); + CallbackHandler.register(getApplication().packageLoadDone, this); + if (getApplication().packageLoadDone.isTriggered) { + onTrigger(getApplication().packageLoadDone); } } @Override public void onStop() { - CallbackHandler.unRegister(Global.Events.packageLoadDone, this); + CallbackHandler.unRegister(getApplication().packageLoadDone, this); super.onStop(); } @@ -106,7 +106,7 @@ public class MagiskHideFragment extends Fragment implements CallbackHandler.Even @Override public void onTrigger(CallbackHandler.Event event) { Logger.dev("MagiskHideFragment: UI refresh"); - appAdapter.setLists(Global.Data.appList, Global.Data.magiskHideList); + appAdapter.setLists(getApplication().appList, getApplication().magiskHideList); mSwipeRefreshLayout.setRefreshing(false); if (!TextUtils.isEmpty(lastFilter)) { appAdapter.filter(lastFilter); diff --git a/app/src/main/java/com/topjohnwu/magisk/MagiskLogFragment.java b/app/src/main/java/com/topjohnwu/magisk/MagiskLogFragment.java index de2f9ad71..8523926a9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MagiskLogFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskLogFragment.java @@ -11,7 +11,6 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; -import android.support.v4.app.Fragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; @@ -25,6 +24,7 @@ import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; +import com.topjohnwu.magisk.components.Fragment; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.Shell; import com.topjohnwu.magisk.utils.Utils; diff --git a/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java b/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java new file mode 100644 index 000000000..a5f5fbe00 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java @@ -0,0 +1,139 @@ +package com.topjohnwu.magisk; + +import android.app.Application; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.preference.PreferenceManager; +import android.util.SparseArray; + +import com.topjohnwu.magisk.module.Module; +import com.topjohnwu.magisk.module.Repo; +import com.topjohnwu.magisk.utils.CallbackHandler; +import com.topjohnwu.magisk.utils.Shell; +import com.topjohnwu.magisk.utils.Utils; +import com.topjohnwu.magisk.utils.ValueSortedMap; + +import java.io.File; +import java.util.List; + +public class MagiskManager extends Application { + + public static final String MAGISK_DISABLE_FILE = "/cache/.disable_magisk"; + + // Events + public final CallbackHandler.Event blockDetectionDone = new CallbackHandler.Event(); + public final CallbackHandler.Event packageLoadDone = new CallbackHandler.Event(); + public final CallbackHandler.Event reloadMainActivity = new CallbackHandler.Event(); + public final CallbackHandler.Event moduleLoadDone = new CallbackHandler.Event(); + public final CallbackHandler.Event repoLoadDone = new CallbackHandler.Event(); + public final CallbackHandler.Event updateCheckDone = new CallbackHandler.Event(); + public final CallbackHandler.Event safetyNetDone = new CallbackHandler.Event(); + + // Info + public double magiskVersion; + public String magiskVersionString = "(none)"; + public double remoteMagiskVersion = -1; + public String magiskLink; + public String releaseNoteLink; + public int SNCheckResult = -1; + public String bootBlock = null; + public boolean isSuClient = false; + public String suVersion = null; + public boolean disabled = false; + + // Data + public ValueSortedMap repoMap; + public ValueSortedMap moduleMap; + public List blockList; + public List appList; + public List magiskHideList; + public SparseArray uidMap = new SparseArray<>(); + + // Configurations + public static boolean shellLogging; + public static boolean devLogging; + public static boolean magiskHide; + + public boolean isDarkTheme; + public int suRequestTimeout; + public int suLogTimeout = 14; + public int suAccessState; + public int suResponseType; + public int suNotificationType; + + public SharedPreferences prefs; + + @Override + public void onCreate() { + super.onCreate(); + prefs = PreferenceManager.getDefaultSharedPreferences(this); + } + + public void init() { + isDarkTheme = prefs.getBoolean("dark_theme", false); + devLogging = prefs.getBoolean("developer_logging", false); + shellLogging = prefs.getBoolean("shell_logging", false); + magiskHide = prefs.getBoolean("magiskhide", false); + updateMagiskInfo(); + initSuAccess(); + initSuConfigs(); + // Initialize prefs + prefs.edit() + .putBoolean("dark_theme", isDarkTheme) + .putBoolean("magiskhide", magiskHide) + .putBoolean("busybox", Utils.commandExists("busybox")) + .putBoolean("hosts", new File("/magisk/.core/hosts").exists()) + .putBoolean("disable", Utils.itemExist(MAGISK_DISABLE_FILE)) + .putString("su_request_timeout", String.valueOf(suRequestTimeout)) + .putString("su_auto_response", String.valueOf(suResponseType)) + .putString("su_notification", String.valueOf(suNotificationType)) + .putString("su_access", String.valueOf(suAccessState)) + .apply(); + } + + public void initSuConfigs() { + suRequestTimeout = Utils.getPrefsInt(prefs, "su_request_timeout", 10); + suResponseType = Utils.getPrefsInt(prefs, "su_auto_response", 0); + suNotificationType = Utils.getPrefsInt(prefs, "su_notification", 1); + } + + public void initSuAccess() { + List ret = Shell.sh("su -v"); + if (Utils.isValidShellResponse(ret)) { + suVersion = ret.get(0); + isSuClient = suVersion.toUpperCase().contains("MAGISK"); + } + if (isSuClient) { + ret = Shell.sh("getprop persist.sys.root_access"); + if (Utils.isValidShellResponse(ret)) + suAccessState = Integer.parseInt(ret.get(0)); + else { + Shell.su(true, "setprop persist.sys.root_access 3"); + suAccessState = 3; + } + } + } + + public void updateMagiskInfo() { + List ret = Shell.sh("getprop magisk.version"); + if (!Utils.isValidShellResponse(ret)) { + magiskVersion = -1; + } else { + try { + magiskVersionString = ret.get(0); + magiskVersion = Double.parseDouble(ret.get(0)); + } catch (NumberFormatException e) { + // Custom version don't need to receive updates + magiskVersion = Double.POSITIVE_INFINITY; + } + } + ret = Shell.sh("getprop ro.magisk.disable"); + try { + disabled = Utils.isValidShellResponse(ret) && Integer.parseInt(ret.get(0)) != 0; + } catch (NumberFormatException e) { + disabled = false; + } + + } + +} diff --git a/app/src/main/java/com/topjohnwu/magisk/MainActivity.java b/app/src/main/java/com/topjohnwu/magisk/MainActivity.java index f36bd6e43..f41ca37cb 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MainActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/MainActivity.java @@ -15,19 +15,19 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.utils.CallbackHandler; import com.topjohnwu.magisk.utils.Shell; import butterknife.BindView; import butterknife.ButterKnife; -public class MainActivity extends AppCompatActivity +public class MainActivity extends Activity implements NavigationView.OnNavigationItemSelectedListener, CallbackHandler.EventListener { private final Handler mDrawerHandler = new Handler(); @@ -44,7 +44,7 @@ public class MainActivity extends AppCompatActivity prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); - if (Global.Configs.isDarkTheme) { + if (getTopApplication().isDarkTheme) { setTheme(R.style.AppTheme_dh); } super.onCreate(savedInstanceState); @@ -79,28 +79,28 @@ public class MainActivity extends AppCompatActivity navigate(R.id.status); navigationView.setNavigationItemSelectedListener(this); - CallbackHandler.register(Global.Events.reloadMainActivity, this); + CallbackHandler.register(getTopApplication().reloadMainActivity, this); } @Override protected void onResume() { super.onResume(); - CallbackHandler.register(Global.Events.updateCheckDone, this); - if (Global.Events.updateCheckDone.isTriggered) - onTrigger(Global.Events.updateCheckDone); + CallbackHandler.register(getTopApplication().updateCheckDone, this); + if (getTopApplication().updateCheckDone.isTriggered) + onTrigger(getTopApplication().updateCheckDone); checkHideSection(); } @Override protected void onPause() { - CallbackHandler.unRegister(Global.Events.updateCheckDone, this); + CallbackHandler.unRegister(getTopApplication().updateCheckDone, this); super.onPause(); } @Override protected void onDestroy() { - CallbackHandler.unRegister(Global.Events.reloadMainActivity, this); + CallbackHandler.unRegister(getTopApplication().reloadMainActivity, this); super.onDestroy(); } @@ -122,11 +122,11 @@ public class MainActivity extends AppCompatActivity @Override public void onTrigger(CallbackHandler.Event event) { - if (event == Global.Events.updateCheckDone) { + if (event == getTopApplication().updateCheckDone) { Menu menu = navigationView.getMenu(); - menu.findItem(R.id.install).setVisible(Global.Info.remoteMagiskVersion > 0 && + menu.findItem(R.id.install).setVisible(getTopApplication().remoteMagiskVersion > 0 && Shell.rootAccess()); - } else if (event == Global.Events.reloadMainActivity) { + } else if (event == getTopApplication().reloadMainActivity) { recreate(); } } @@ -135,11 +135,11 @@ public class MainActivity extends AppCompatActivity Menu menu = navigationView.getMenu(); if (Shell.rootAccess()) { menu.findItem(R.id.magiskhide).setVisible( - Global.Info.magiskVersion >= 8 && prefs.getBoolean("magiskhide", false)); - menu.findItem(R.id.modules).setVisible(Global.Info.magiskVersion >= 4); - menu.findItem(R.id.downloads).setVisible(Global.Info.magiskVersion >= 4); + getTopApplication().magiskVersion >= 8 && prefs.getBoolean("magiskhide", false)); + menu.findItem(R.id.modules).setVisible(getTopApplication().magiskVersion >= 4); + menu.findItem(R.id.downloads).setVisible(getTopApplication().magiskVersion >= 4); menu.findItem(R.id.log).setVisible(true); - menu.findItem(R.id.superuser).setVisible(Global.Info.isSuClient); + menu.findItem(R.id.superuser).setVisible(getTopApplication().isSuClient); } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java index bd9bf9c31..f296fbecc 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java @@ -5,7 +5,6 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -15,8 +14,8 @@ import android.widget.TextView; import com.github.clans.fab.FloatingActionButton; import com.topjohnwu.magisk.adapters.ModulesAdapter; +import com.topjohnwu.magisk.components.Fragment; import com.topjohnwu.magisk.module.Module; -import com.topjohnwu.magisk.module.ModuleHelper; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.CallbackHandler; import com.topjohnwu.magisk.utils.Logger; @@ -54,7 +53,7 @@ public class ModulesFragment extends Fragment implements CallbackHandler.EventLi mSwipeRefreshLayout.setOnRefreshListener(() -> { recyclerView.setVisibility(View.GONE); - new Async.LoadModules().exec(); + new Async.LoadModules(getApplication()).exec(); }); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @@ -69,7 +68,7 @@ public class ModulesFragment extends Fragment implements CallbackHandler.EventLi } }); - if (Global.Events.moduleLoadDone.isTriggered) { + if (getApplication().moduleLoadDone.isTriggered) { updateUI(); } @@ -95,13 +94,13 @@ public class ModulesFragment extends Fragment implements CallbackHandler.EventLi @Override public void onStart() { super.onStart(); - CallbackHandler.register(Global.Events.moduleLoadDone, this); + CallbackHandler.register(getApplication().moduleLoadDone, this); getActivity().setTitle(R.string.modules); } @Override public void onStop() { - CallbackHandler.unRegister(Global.Events.moduleLoadDone, this); + CallbackHandler.unRegister(getApplication().moduleLoadDone, this); super.onStop(); } @@ -112,7 +111,8 @@ public class ModulesFragment extends Fragment implements CallbackHandler.EventLi } private void updateUI() { - ModuleHelper.getModuleList(listModules); + listModules.clear(); + listModules.addAll(getApplication().moduleMap.values()); if (listModules.size() == 0) { emptyRv.setVisibility(View.VISIBLE); recyclerView.setVisibility(View.GONE); diff --git a/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java b/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java index d5739d01b..0863f04be 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ReposFragment.java @@ -2,7 +2,6 @@ package com.topjohnwu.magisk; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.support.v4.view.MenuItemCompat; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; @@ -16,7 +15,8 @@ import android.widget.TextView; import com.topjohnwu.magisk.adapters.ReposAdapter; import com.topjohnwu.magisk.adapters.SimpleSectionedRecyclerViewAdapter; -import com.topjohnwu.magisk.module.ModuleHelper; +import com.topjohnwu.magisk.components.Fragment; +import com.topjohnwu.magisk.module.Module; import com.topjohnwu.magisk.module.Repo; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.CallbackHandler; @@ -68,10 +68,10 @@ public class ReposFragment extends Fragment implements CallbackHandler.EventList mSwipeRefreshLayout.setOnRefreshListener(() -> { recyclerView.setVisibility(View.GONE); - new Async.LoadRepos(getActivity()).exec(); + new Async.LoadRepos(getApplication()).exec(); }); - if (Global.Events.repoLoadDone.isTriggered) { + if (getApplication().repoLoadDone.isTriggered) { reloadRepos(); updateUI(); } @@ -109,13 +109,13 @@ public class ReposFragment extends Fragment implements CallbackHandler.EventList @Override public void onStart() { super.onStart(); - CallbackHandler.register(Global.Events.repoLoadDone, this); + CallbackHandler.register(getApplication().repoLoadDone, this); getActivity().setTitle(R.string.downloads); } @Override public void onStop() { - CallbackHandler.unRegister(Global.Events.repoLoadDone, this); + CallbackHandler.unRegister(getApplication().repoLoadDone, this); super.onStop(); } @@ -126,7 +126,20 @@ public class ReposFragment extends Fragment implements CallbackHandler.EventList } private void reloadRepos() { - ModuleHelper.getRepoLists(mUpdateRepos, mInstalledRepos, mOthersRepos); + mUpdateRepos.clear(); + mInstalledRepos.clear(); + mOthersRepos.clear(); + for (Repo repo : getApplication().repoMap.values()) { + Module module = getApplication().moduleMap.get(repo.getId()); + if (module != null) { + if (repo.getVersionCode() > module.getVersionCode()) + mUpdateRepos.add(repo); + else + mInstalledRepos.add(repo); + } else { + mOthersRepos.add(repo); + } + } fUpdateRepos.clear(); fInstalledRepos.clear(); fOthersRepos.clear(); diff --git a/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java b/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java index ddb79b038..9c47fea90 100644 --- a/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/SettingsActivity.java @@ -9,11 +9,11 @@ import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.preference.SwitchPreference; import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.WindowManager; import android.widget.Toast; +import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.module.ModuleHelper; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.Logger; @@ -23,14 +23,14 @@ import com.topjohnwu.magisk.utils.Utils; import butterknife.BindView; import butterknife.ButterKnife; -public class SettingsActivity extends AppCompatActivity { +public class SettingsActivity extends Activity { @BindView(R.id.toolbar) Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (Global.Configs.isDarkTheme) { + if (getTopApplication().isDarkTheme) { setTheme(R.style.AppTheme_dh); } @@ -77,6 +77,10 @@ public class SettingsActivity extends AppCompatActivity { private ListPreference suAccess, autoRes, suNotification, requestTimeout; + private MagiskManager getApplication() { + return (MagiskManager) getActivity().getApplication(); + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -99,7 +103,7 @@ public class SettingsActivity extends AppCompatActivity { setSummary(); findPreference("clear").setOnPreferenceClickListener((pref) -> { - ModuleHelper.clearRepoCache(getActivity()); + ModuleHelper.clearRepoCache(getApplication()); return true; }); @@ -107,11 +111,11 @@ public class SettingsActivity extends AppCompatActivity { prefScreen.removePreference(magiskCategory); prefScreen.removePreference(suCategory); } else { - if (!Global.Info.isSuClient) + if (!getApplication().isSuClient) prefScreen.removePreference(suCategory); - if (Global.Info.magiskVersion < 11) + if (getApplication().magiskVersion < 11) prefScreen.removePreference(magiskCategory); - if (Global.Info.disabled) { + if (getApplication().disabled) { busybox.setEnabled(false); magiskHide.setEnabled(false); hosts.setEnabled(false); @@ -139,10 +143,10 @@ public class SettingsActivity extends AppCompatActivity { switch (key) { case "dark_theme": enabled = prefs.getBoolean("dark_theme", false); - if (Global.Configs.isDarkTheme != enabled) { - Global.Configs.isDarkTheme = enabled; + if (getApplication().isDarkTheme != enabled) { + getApplication().isDarkTheme = enabled; getActivity().recreate(); - Global.Events.reloadMainActivity.trigger(); + getApplication().reloadMainActivity.trigger(); } break; case "disable": @@ -152,9 +156,9 @@ public class SettingsActivity extends AppCompatActivity { @Override protected Void doInBackground(Void... voids) { if (enable) { - Utils.createFile(Global.MAGISK_DISABLE_FILE); + Utils.createFile(MagiskManager.MAGISK_DISABLE_FILE); } else { - Utils.removeItem(Global.MAGISK_DISABLE_FILE); + Utils.removeItem(MagiskManager.MAGISK_DISABLE_FILE); } return null; } @@ -183,7 +187,7 @@ public class SettingsActivity extends AppCompatActivity { case "magiskhide": enabled = prefs.getBoolean("magiskhide", false); if (enabled) { - if (!Global.Info.isSuClient) { + if (!getApplication().isSuClient) { Utils.getAlertDialogBuilder(getActivity()) .setTitle(R.string.no_magisksu_title) .setMessage(R.string.no_magisksu_msg) @@ -212,23 +216,23 @@ public class SettingsActivity extends AppCompatActivity { }.exec(); break; case "su_access": - Global.Configs.suAccessState = Utils.getPrefsInt(prefs, "su_access", 0); - Shell.su("setprop persist.sys.root_access " + Global.Configs.suAccessState); + getApplication().suAccessState = Utils.getPrefsInt(prefs, "su_access", 0); + Shell.su("setprop persist.sys.root_access " + getApplication().suAccessState); break; case "su_request_timeout": - Global.Configs.suRequestTimeout = Utils.getPrefsInt(prefs, "su_request_timeout", 10); + getApplication().suRequestTimeout = Utils.getPrefsInt(prefs, "su_request_timeout", 10); break; case "su_auto_response": - Global.Configs.suResponseType = Utils.getPrefsInt(prefs, "su_auto_response", 0); + getApplication().suResponseType = Utils.getPrefsInt(prefs, "su_auto_response", 0); break; case "su_notification": - Global.Configs.suNotificationType = Utils.getPrefsInt(prefs, "su_notification", 1); + getApplication().suNotificationType = Utils.getPrefsInt(prefs, "su_notification", 1); break; case "developer_logging": - Global.Configs.devLogging = prefs.getBoolean("developer_logging", false); + getApplication().devLogging = prefs.getBoolean("developer_logging", false); break; case "shell_logging": - Global.Configs.shellLogging = prefs.getBoolean("shell_logging", false); + getApplication().shellLogging = prefs.getBoolean("shell_logging", false); break; } setSummary(); @@ -236,11 +240,11 @@ public class SettingsActivity extends AppCompatActivity { private void setSummary() { suAccess.setSummary(getResources() - .getStringArray(R.array.su_access)[Global.Configs.suAccessState]); + .getStringArray(R.array.su_access)[getApplication().suAccessState]); autoRes.setSummary(getResources() - .getStringArray(R.array.auto_response)[Global.Configs.suResponseType]); + .getStringArray(R.array.auto_response)[getApplication().suResponseType]); suNotification.setSummary(getResources() - .getStringArray(R.array.su_notification)[Global.Configs.suNotificationType]); + .getStringArray(R.array.su_notification)[getApplication().suNotificationType]); requestTimeout.setSummary( getString(R.string.request_timeout_summary, prefs.getString("su_request_timeout", "10"))); } diff --git a/app/src/main/java/com/topjohnwu/magisk/SplashActivity.java b/app/src/main/java/com/topjohnwu/magisk/SplashActivity.java index 67f3b40f7..117ff4c24 100644 --- a/app/src/main/java/com/topjohnwu/magisk/SplashActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/SplashActivity.java @@ -2,31 +2,33 @@ package com.topjohnwu.magisk; import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; +import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.utils.Async; -public class SplashActivity extends AppCompatActivity { +public class SplashActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + MagiskManager magiskManager = getTopApplication(); + // Init the info and configs and root shell - Global.init(getApplicationContext()); + magiskManager.init(); // Now fire all async tasks - new Async.CheckUpdates().exec(); - new Async.GetBootBlocks().exec(); - new Async.LoadModules() { + new Async.CheckUpdates(magiskManager).exec(); + new Async.GetBootBlocks(magiskManager).exec(); + new Async.LoadModules(magiskManager) { @Override protected void onPostExecute(Void v) { super.onPostExecute(v); - new Async.LoadRepos(getApplicationContext()).exec(); + new Async.LoadRepos(magiskManager).exec(); } }.exec(); - new Async.LoadApps(getPackageManager()).exec(); + new Async.LoadApps(magiskManager).exec(); // Preparation done, now start main activity Intent intent = new Intent(getApplicationContext(), MainActivity.class); diff --git a/app/src/main/java/com/topjohnwu/magisk/StatusFragment.java b/app/src/main/java/com/topjohnwu/magisk/StatusFragment.java index bd704ae6f..ab83d00b7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/StatusFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/StatusFragment.java @@ -5,7 +5,6 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.SwipeRefreshLayout; import android.view.LayoutInflater; @@ -15,6 +14,7 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; +import com.topjohnwu.magisk.components.Fragment; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.CallbackHandler; import com.topjohnwu.magisk.utils.Logger; @@ -80,11 +80,11 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis safetyNetStatusText.setText(R.string.safetyNet_check_text); safetyNetStatusText.setTextColor(defaultColor); - Global.Events.safetyNetDone.isTriggered = false; + getApplication().safetyNetDone.isTriggered = false; noDialog = false; updateUI(); - new Async.CheckUpdates().exec(); + new Async.CheckUpdates(getApplication()).exec(); }); safetyNetContainer.setOnClickListener(view -> { @@ -92,10 +92,10 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis safetyNetContainer.setBackgroundColor(trans); safetyNetIcon.setImageResource(0); safetyNetStatusText.setText(R.string.checking_safetyNet_status); - Async.checkSafetyNet(getActivity()); + Async.checkSafetyNet(getApplication()); }); - if (Global.Info.magiskVersion < 0 && Shell.rootAccess() && !noDialog) { + if (getApplication().magiskVersion < 0 && Shell.rootAccess() && !noDialog) { noDialog = true; Utils.getAlertDialogBuilder(getActivity()) .setTitle(R.string.no_magisk_title) @@ -104,7 +104,7 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis .setPositiveButton(R.string.goto_install, (dialogInterface, i) -> { ((MainActivity) getActivity()).navigationView.setCheckedItem(R.id.install); FragmentTransaction transaction = getFragmentManager().beginTransaction(); - transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out); + transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); try { transaction.replace(R.id.content_frame, new InstallFragment(), "install").commit(); } catch (IllegalStateException ignored) {} @@ -120,10 +120,10 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis @Override public void onTrigger(CallbackHandler.Event event) { - if (event == Global.Events.updateCheckDone) { + if (event == getApplication().updateCheckDone) { Logger.dev("StatusFragment: Update Check UI refresh triggered"); updateCheckUI(); - } else if (event == Global.Events.safetyNetDone) { + } else if (event == getApplication().safetyNetDone) { Logger.dev("StatusFragment: SafetyNet UI refresh triggered"); updateSafetyNetUI(); } @@ -132,12 +132,12 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis @Override public void onStart() { super.onStart(); - CallbackHandler.register(Global.Events.updateCheckDone, this); - CallbackHandler.register(Global.Events.safetyNetDone, this); - if (Global.Events.updateCheckDone.isTriggered) { + CallbackHandler.register(getApplication().updateCheckDone, this); + CallbackHandler.register(getApplication().safetyNetDone, this); + if (getApplication().updateCheckDone.isTriggered) { updateCheckUI(); } - if (Global.Events.safetyNetDone.isTriggered) { + if (getApplication().safetyNetDone.isTriggered) { updateSafetyNetUI(); } getActivity().setTitle(R.string.status); @@ -145,8 +145,8 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis @Override public void onStop() { - CallbackHandler.unRegister(Global.Events.updateCheckDone, this); - CallbackHandler.unRegister(Global.Events.safetyNetDone, this); + CallbackHandler.unRegister(getApplication().updateCheckDone, this); + CallbackHandler.unRegister(getApplication().safetyNetDone, this); super.onStop(); } @@ -159,14 +159,14 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis private void updateUI() { int image, color; - Global.updateMagiskInfo(); + getApplication().updateMagiskInfo(); - if (Global.Info.magiskVersion < 0) { + if (getApplication().magiskVersion < 0) { magiskVersionText.setText(R.string.magisk_version_error); - } else if (Global.Info.disabled) { - magiskVersionText.setText(getString(R.string.magisk_version_disable, Global.Info.magiskVersionString)); + } else if (getApplication().disabled) { + magiskVersionText.setText(getString(R.string.magisk_version_disable, getApplication().magiskVersionString)); } else { - magiskVersionText.setText(getString(R.string.magisk_version, Global.Info.magiskVersionString)); + magiskVersionText.setText(getString(R.string.magisk_version, getApplication().magiskVersionString)); } switch (Shell.rootStatus) { @@ -177,11 +177,11 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis rootInfoText.setText(R.string.root_info_warning); break; case 1: - if (Global.Info.suVersion != null) { + if (getApplication().suVersion != null) { color = colorOK; image = R.drawable.ic_check_circle; rootStatusText.setText(R.string.proper_root); - rootInfoText.setText(Global.Info.suVersion); + rootInfoText.setText(getApplication().suVersion); break; } case -1: @@ -200,24 +200,24 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis private void updateCheckUI() { int image, color; - if (Global.Info.remoteMagiskVersion < 0) { + if (getApplication().remoteMagiskVersion < 0) { color = colorNeutral; image = R.drawable.ic_help; magiskUpdateText.setText(R.string.cannot_check_updates); - } else if (Global.Info.remoteMagiskVersion > Global.Info.magiskVersion) { + } else if (getApplication().remoteMagiskVersion > getApplication().magiskVersion) { color = colorInfo; image = R.drawable.ic_update; - magiskUpdateText.setText(getString(R.string.magisk_update_available, Global.Info.remoteMagiskVersion)); + magiskUpdateText.setText(getString(R.string.magisk_update_available, getApplication().remoteMagiskVersion)); } else { color = colorOK; image = R.drawable.ic_check_circle; magiskUpdateText.setText(getString(R.string.up_to_date, getString(R.string.magisk))); } - if (Global.Info.magiskVersion < 0) { + if (getApplication().magiskVersion < 0) { color = colorBad; image = R.drawable.ic_cancel; - } else if (Global.Info.disabled) { + } else if (getApplication().disabled) { color = colorNeutral; image = R.drawable.ic_cancel; } @@ -232,7 +232,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, Global.Info.remoteMagiskVersion)) + .setMessage(getString(R.string.magisk_update_message, getApplication().remoteMagiskVersion)) .setCancelable(true) .setPositiveButton(R.string.goto_install, (dialogInterface, i) -> { ((MainActivity) getActivity()).navigationView.setCheckedItem(R.id.install); @@ -243,12 +243,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(Global.Info.releaseNoteLink))); + getActivity().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getApplication().releaseNoteLink))); }) .setNegativeButton(R.string.no_thanks, null) .create(); - if (Global.Info.magiskVersion < Global.Info.remoteMagiskVersion && Shell.rootAccess()) { + if (getApplication().magiskVersion < getApplication().remoteMagiskVersion && Shell.rootAccess()) { magiskStatusContainer.setOnClickListener(view -> updateMagisk.show()); if (!noDialog) { noDialog = true; @@ -260,7 +260,7 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis private void updateSafetyNetUI() { int image, color; safetyNetProgress.setVisibility(View.GONE); - switch (Global.Info.SNCheckResult) { + switch (getApplication().SNCheckResult) { case -3: color = colorNeutral; image = R.drawable.ic_help; diff --git a/app/src/main/java/com/topjohnwu/magisk/SuLogFragment.java b/app/src/main/java/com/topjohnwu/magisk/SuLogFragment.java index f46bba638..b6b40b23a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/SuLogFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/SuLogFragment.java @@ -2,7 +2,6 @@ package com.topjohnwu.magisk; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.Menu; @@ -13,6 +12,7 @@ import android.view.ViewGroup; import android.widget.TextView; import com.topjohnwu.magisk.adapters.SuLogAdapter; +import com.topjohnwu.magisk.components.Fragment; import com.topjohnwu.magisk.superuser.SuLogDatabaseHelper; import com.topjohnwu.magisk.superuser.SuLogEntry; diff --git a/app/src/main/java/com/topjohnwu/magisk/SuperuserFragment.java b/app/src/main/java/com/topjohnwu/magisk/SuperuserFragment.java index 7f4d24dd3..7ca2b97d7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/SuperuserFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/SuperuserFragment.java @@ -3,7 +3,6 @@ package com.topjohnwu.magisk; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; @@ -11,6 +10,7 @@ import android.view.ViewGroup; import android.widget.TextView; import com.topjohnwu.magisk.adapters.PolicyAdapter; +import com.topjohnwu.magisk.components.Fragment; import com.topjohnwu.magisk.superuser.Policy; import com.topjohnwu.magisk.superuser.SuDatabaseHelper; diff --git a/app/src/main/java/com/topjohnwu/magisk/components/Activity.java b/app/src/main/java/com/topjohnwu/magisk/components/Activity.java new file mode 100644 index 000000000..207433082 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/components/Activity.java @@ -0,0 +1,12 @@ +package com.topjohnwu.magisk.components; + +import android.support.v7.app.AppCompatActivity; + +import com.topjohnwu.magisk.MagiskManager; + +public class Activity extends AppCompatActivity { + + public MagiskManager getTopApplication() { + return (MagiskManager) getApplication(); + } +} diff --git a/app/src/main/java/com/topjohnwu/magisk/components/Fragment.java b/app/src/main/java/com/topjohnwu/magisk/components/Fragment.java new file mode 100644 index 000000000..4052088e0 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/components/Fragment.java @@ -0,0 +1,11 @@ +package com.topjohnwu.magisk.components; + +import com.topjohnwu.magisk.MagiskManager; + +public class Fragment extends android.support.v4.app.Fragment { + + public MagiskManager getApplication() { + return (MagiskManager) getActivity().getApplicationContext(); + } + +} diff --git a/app/src/main/java/com/topjohnwu/magisk/module/ModuleHelper.java b/app/src/main/java/com/topjohnwu/magisk/module/ModuleHelper.java index e303da0dc..a68d1770d 100644 --- a/app/src/main/java/com/topjohnwu/magisk/module/ModuleHelper.java +++ b/app/src/main/java/com/topjohnwu/magisk/module/ModuleHelper.java @@ -6,7 +6,7 @@ import android.widget.Toast; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import com.topjohnwu.magisk.Global; +import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.Logger; @@ -22,7 +22,6 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; -import java.util.List; import java.util.Locale; import java.util.Map; @@ -36,29 +35,29 @@ public class ModuleHelper { private static final String REPO_KEY = "repomap"; private static final String FILE_KEY = "RepoMap"; - public static void createModuleMap() { + public static void createModuleMap(MagiskManager magiskManager) { Logger.dev("ModuleHelper: Loading modules"); - Global.Data.moduleMap = new ValueSortedMap<>(); + magiskManager.moduleMap = new ValueSortedMap<>(); for (String path : Utils.getModList(MAGISK_PATH)) { Logger.dev("ModuleHelper: Adding modules from " + path); Module module; try { module = new Module(path); - Global.Data.moduleMap.put(module.getId(), module); + magiskManager.moduleMap.put(module.getId(), module); } catch (BaseModule.CacheModException ignored) {} } Logger.dev("ModuleHelper: Data load done"); } - public static void createRepoMap(Context context) { + public static void createRepoMap(MagiskManager magiskManager) { Logger.dev("ModuleHelper: Loading repos"); - SharedPreferences prefs = context.getSharedPreferences(FILE_KEY, Context.MODE_PRIVATE); + SharedPreferences prefs = magiskManager.prefs; - Global.Data.repoMap = new ValueSortedMap<>(); + magiskManager.repoMap = new ValueSortedMap<>(); Gson gson = new Gson(); String jsonString; @@ -88,7 +87,7 @@ public class ModuleHelper { // Making a request to main URL for repo info jsonString = WebService.request( - context.getString(R.string.url_main), WebService.GET, null, header, false); + magiskManager.getString(R.string.url_main), WebService.GET, null, header, false); if (!jsonString.isEmpty()) { try { @@ -115,13 +114,13 @@ public class ModuleHelper { try { if (repo == null) { Logger.dev("ModuleHelper: Create new repo " + id); - repo = new Repo(context, name, updatedDate); + repo = new Repo(magiskManager, name, updatedDate); } else { Logger.dev("ModuleHelper: Update cached repo " + id); repo.update(updatedDate); } if (repo.getId() != null) { - Global.Data.repoMap.put(id, repo); + magiskManager.repoMap.put(id, repo); } } catch (BaseModule.CacheModException ignored) {} } @@ -131,50 +130,27 @@ public class ModuleHelper { } else { // Use cached if no internet or no updates Logger.dev("ModuleHelper: No updates, use cached"); - Global.Data.repoMap.putAll(cached); + magiskManager.repoMap.putAll(cached); } prefs.edit() .putInt(VERSION_KEY, GSON_DB_VER) - .putString(REPO_KEY, gson.toJson(Global.Data.repoMap)) + .putString(REPO_KEY, gson.toJson(magiskManager.repoMap)) .putString(ETAG_KEY, etag) .apply(); Logger.dev("ModuleHelper: Repo load done"); } - public static void getModuleList(List moduleList) { - moduleList.clear(); - 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 : Global.Data.repoMap.values()) { - Module module = Global.Data.moduleMap.get(repo.getId()); - if (module != null) { - if (repo.getVersionCode() > module.getVersionCode()) { - update.add(repo); - } else { - installed.add(repo); - } - } else { - others.add(repo); - } - } - } - - public static void clearRepoCache(Context context) { - SharedPreferences repoMap = context.getSharedPreferences(FILE_KEY, Context.MODE_PRIVATE); + public static void clearRepoCache(MagiskManager magiskManager) { + SharedPreferences repoMap = magiskManager.getSharedPreferences(FILE_KEY, Context.MODE_PRIVATE); repoMap.edit() .remove(ETAG_KEY) .remove(VERSION_KEY) .apply(); - Global.Events.repoLoadDone.isTriggered = false; - new Async.LoadRepos(context).exec(); - Toast.makeText(context, R.string.repo_cache_cleared, Toast.LENGTH_SHORT).show(); + magiskManager.repoLoadDone.isTriggered = false; + new Async.LoadRepos(magiskManager).exec(); + Toast.makeText(magiskManager, R.string.repo_cache_cleared, Toast.LENGTH_SHORT).show(); } } diff --git a/app/src/main/java/com/topjohnwu/magisk/receivers/BootReceiver.java b/app/src/main/java/com/topjohnwu/magisk/receivers/BootReceiver.java index b7eec6ce4..53a8fd4a9 100644 --- a/app/src/main/java/com/topjohnwu/magisk/receivers/BootReceiver.java +++ b/app/src/main/java/com/topjohnwu/magisk/receivers/BootReceiver.java @@ -7,7 +7,7 @@ import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.widget.Toast; -import com.topjohnwu.magisk.Global; +import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.utils.Async; @@ -15,10 +15,11 @@ public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - Global.initSuAccess(); - Global.updateMagiskInfo(); + MagiskManager magiskManager = (MagiskManager) context.getApplicationContext(); + magiskManager.initSuAccess(); + magiskManager.updateMagiskInfo(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - if (prefs.getBoolean("magiskhide", false) && !Global.Info.disabled && Global.Info.magiskVersion > 10.3) { + if (prefs.getBoolean("magiskhide", false) && !magiskManager.disabled && magiskManager.magiskVersion > 10.3) { Toast.makeText(context, R.string.start_magiskhide, Toast.LENGTH_SHORT).show(); new Async.MagiskHide(true).enable(); } 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 962d5d432..eed7ecf33 100644 --- a/app/src/main/java/com/topjohnwu/magisk/receivers/MagiskDlReceiver.java +++ b/app/src/main/java/com/topjohnwu/magisk/receivers/MagiskDlReceiver.java @@ -2,7 +2,7 @@ package com.topjohnwu.magisk.receivers; import android.net.Uri; -import com.topjohnwu.magisk.Global; +import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.Shell; @@ -56,7 +56,7 @@ public class MagiskDlReceiver extends DownloadReceiver { @Override protected Void doInBackground(Void... params) { Shell.su("setprop magisk.version " - + String.valueOf(Global.Info.remoteMagiskVersion)); + + String.valueOf(((MagiskManager) mContext.getApplicationContext()).remoteMagiskVersion)); return null; } }.exec(); diff --git a/app/src/main/java/com/topjohnwu/magisk/superuser/RequestActivity.java b/app/src/main/java/com/topjohnwu/magisk/superuser/RequestActivity.java index dd7d7bd8b..12b98177e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/superuser/RequestActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/superuser/RequestActivity.java @@ -2,11 +2,10 @@ package com.topjohnwu.magisk.superuser; import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import com.topjohnwu.magisk.Global; +import com.topjohnwu.magisk.components.Activity; -public class RequestActivity extends AppCompatActivity { +public class RequestActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { @@ -18,7 +17,7 @@ public class RequestActivity extends AppCompatActivity { return; } - Global.initSuConfigs(this); + getTopApplication().initSuConfigs(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setClass(this, SuRequestActivity.class); startActivity(intent); diff --git a/app/src/main/java/com/topjohnwu/magisk/superuser/SuLogDatabaseHelper.java b/app/src/main/java/com/topjohnwu/magisk/superuser/SuLogDatabaseHelper.java index e98f283f0..0201280aa 100644 --- a/app/src/main/java/com/topjohnwu/magisk/superuser/SuLogDatabaseHelper.java +++ b/app/src/main/java/com/topjohnwu/magisk/superuser/SuLogDatabaseHelper.java @@ -5,7 +5,7 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; -import com.topjohnwu.magisk.Global; +import com.topjohnwu.magisk.MagiskManager; import java.util.ArrayList; import java.util.List; @@ -15,8 +15,11 @@ public class SuLogDatabaseHelper extends SQLiteOpenHelper { private static final int DATABASE_VER = 1; private static final String TABLE_NAME = "logs"; + private MagiskManager magiskManager; + public SuLogDatabaseHelper(Context context) { super(context, "sulog.db", null, DATABASE_VER); + magiskManager = (MagiskManager) context.getApplicationContext(); } @Override @@ -57,7 +60,7 @@ public class SuLogDatabaseHelper extends SQLiteOpenHelper { SQLiteDatabase db = getWritableDatabase(); // Clear outdated logs db.delete(TABLE_NAME, "time < ?", new String[] { String.valueOf( - System.currentTimeMillis() / 1000 - Global.Configs.suLogTimeout * 86400) }); + System.currentTimeMillis() / 1000 - magiskManager.suLogTimeout * 86400) }); try (Cursor c = db.query(TABLE_NAME, null, selection, null, null, null, "time DESC")) { while (c.moveToNext()) ret.add(new SuLogEntry(c)); diff --git a/app/src/main/java/com/topjohnwu/magisk/superuser/SuReceiver.java b/app/src/main/java/com/topjohnwu/magisk/superuser/SuReceiver.java index a7f7a9a0f..5a43d023f 100644 --- a/app/src/main/java/com/topjohnwu/magisk/superuser/SuReceiver.java +++ b/app/src/main/java/com/topjohnwu/magisk/superuser/SuReceiver.java @@ -6,7 +6,7 @@ import android.content.Intent; import android.os.Process; import android.widget.Toast; -import com.topjohnwu.magisk.Global; +import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import java.util.Date; @@ -23,6 +23,8 @@ public class SuReceiver extends BroadcastReceiver { String command, action; Policy policy; + MagiskManager magiskManager = (MagiskManager) context.getApplicationContext(); + if (intent == null) return; fromUid = intent.getIntExtra("from.uid", -1); @@ -40,7 +42,7 @@ public class SuReceiver extends BroadcastReceiver { return; } - Global.initSuConfigs(context); + magiskManager.initSuConfigs(); SuLogEntry log = new SuLogEntry(policy); @@ -58,7 +60,7 @@ public class SuReceiver extends BroadcastReceiver { return; } - if (policy.notification && Global.Configs.suNotificationType == TOAST) + if (policy.notification && magiskManager.suNotificationType == TOAST) Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); if (policy.logging) { 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 61c36cbd7..4e2091dc2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/superuser/SuRequestActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/superuser/SuRequestActivity.java @@ -8,7 +8,6 @@ import android.net.LocalSocketAddress; import android.os.Bundle; import android.os.CountDownTimer; import android.os.FileObserver; -import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.Window; import android.widget.ArrayAdapter; @@ -18,8 +17,9 @@ import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; -import com.topjohnwu.magisk.Global; +import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.CallbackHandler; @@ -29,7 +29,7 @@ import java.io.IOException; import butterknife.BindView; import butterknife.ButterKnife; -public class SuRequestActivity extends AppCompatActivity implements CallbackHandler.EventListener { +public class SuRequestActivity extends Activity implements CallbackHandler.EventListener { private static final int[] timeoutList = {0, -1, 10, 20, 30, 60}; private static final int SU_PROTOCOL_PARAM_MAX = 20; @@ -51,6 +51,7 @@ public class SuRequestActivity extends AppCompatActivity implements CallbackHand private String socketPath; private LocalSocket socket; private PackageManager pm; + private MagiskManager magiskManager; private int uid; private Policy policy; @@ -64,6 +65,7 @@ public class SuRequestActivity extends AppCompatActivity implements CallbackHand supportRequestWindowFeature(Window.FEATURE_NO_TITLE); pm = getPackageManager(); + magiskManager = getTopApplication(); Intent intent = getIntent(); socketPath = intent.getStringExtra("socket"); @@ -85,7 +87,7 @@ public class SuRequestActivity extends AppCompatActivity implements CallbackHand void showRequest() { - switch (Global.Configs.suResponseType) { + switch (magiskManager.suResponseType) { case AUTO_DENY: handleAction(Policy.DENY, 0); return; @@ -108,7 +110,7 @@ public class SuRequestActivity extends AppCompatActivity implements CallbackHand adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); timeout.setAdapter(adapter); - timer = new CountDownTimer(Global.Configs.suRequestTimeout * 1000, 1000) { + timer = new CountDownTimer(magiskManager.suRequestTimeout * 1000, 1000) { @Override public void onTick(long millisUntilFinished) { deny_btn.setText(getString(R.string.deny_with_str, "(" + millisUntilFinished / 1000 + ")")); @@ -145,7 +147,7 @@ public class SuRequestActivity extends AppCompatActivity implements CallbackHand Policy policy = (Policy) event.getResult(); String response = "socket:DENY"; if (policy != null) { - Global.Events.uidMap.remove(policy.uid); + magiskManager.uidMap.remove(policy.uid); if (policy.policy == Policy.ALLOW) response = "socket:ALLOW"; } @@ -224,7 +226,7 @@ public class SuRequestActivity extends AppCompatActivity implements CallbackHand return; } boolean showRequest = false; - event = Global.Events.uidMap.get(uid); + event = magiskManager.uidMap.get(uid); if (event == null) { showRequest = true; event = new CallbackHandler.Event() { @@ -234,7 +236,7 @@ public class SuRequestActivity extends AppCompatActivity implements CallbackHand CallbackHandler.unRegister(this); } }; - Global.Events.uidMap.put(uid, event); + magiskManager.uidMap.put(uid, event); } CallbackHandler.register(event, self); try { 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 33f6507c8..b65535625 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Async.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Async.java @@ -10,7 +10,7 @@ import android.os.AsyncTask; import android.provider.OpenableColumns; import android.widget.Toast; -import com.topjohnwu.magisk.Global; +import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.adapters.ApplicationAdapter; import com.topjohnwu.magisk.module.ModuleHelper; @@ -51,94 +51,106 @@ public class Async { public static class CheckUpdates extends NormalTask { + MagiskManager magiskManager; + + public CheckUpdates(MagiskManager context) { + magiskManager = context; + } + @Override protected Void doInBackground(Void... voids) { String jsonStr = WebService.request(UPDATE_JSON, WebService.GET); try { JSONObject json = new JSONObject(jsonStr); JSONObject magisk = json.getJSONObject("magisk"); - Global.Info.remoteMagiskVersion = magisk.getDouble("versionCode"); - Global.Info.magiskLink = magisk.getString("link"); - Global.Info.releaseNoteLink = magisk.getString("note"); + magiskManager.remoteMagiskVersion = magisk.getDouble("versionCode"); + magiskManager.magiskLink = magisk.getString("link"); + magiskManager.releaseNoteLink = magisk.getString("note"); } catch (JSONException ignored) {} return null; } @Override protected void onPostExecute(Void v) { - Global.Events.updateCheckDone.trigger(); + magiskManager.updateCheckDone.trigger(); } } - public static void checkSafetyNet(Context context) { - new SafetyNetHelper(context) { + public static void checkSafetyNet(MagiskManager magiskManager) { + new SafetyNetHelper(magiskManager) { @Override public void handleResults(int i) { - Global.Info.SNCheckResult = i; - Global.Events.safetyNetDone.trigger(); + magiskManager.SNCheckResult = i; + magiskManager.safetyNetDone.trigger(); } }.requestTest(); } public static class LoadModules extends RootTask { + protected MagiskManager magiskManager; + + public LoadModules(MagiskManager context) { + magiskManager = context; + } @Override protected Void doInBackground(Void... voids) { - ModuleHelper.createModuleMap(); + ModuleHelper.createModuleMap(magiskManager); return null; } @Override protected void onPostExecute(Void v) { - Global.Events.moduleLoadDone.trigger(); + magiskManager.moduleLoadDone.trigger(); } } public static class LoadRepos extends NormalTask { - private Context mContext; + private MagiskManager magiskManager; - public LoadRepos(Context context) { - mContext = context; + public LoadRepos(MagiskManager context) { + magiskManager = context; } @Override protected Void doInBackground(Void... voids) { - ModuleHelper.createRepoMap(mContext); + ModuleHelper.createRepoMap(magiskManager); return null; } @Override protected void onPostExecute(Void v) { - Global.Events.repoLoadDone.trigger(); + magiskManager.repoLoadDone.trigger(); } } public static class LoadApps extends RootTask { - private PackageManager pm; + private MagiskManager magiskManager; - public LoadApps(PackageManager packageManager) { - pm = packageManager; + public LoadApps(MagiskManager context) { + magiskManager = context; } @Override protected Void doInBackground(Void... voids) { - Global.Data.appList = pm.getInstalledApplications(0); - for (Iterator i = Global.Data.appList.iterator(); i.hasNext(); ) { + PackageManager pm = magiskManager.getPackageManager(); + magiskManager.appList = pm.getInstalledApplications(0); + for (Iterator i = magiskManager.appList.iterator(); i.hasNext(); ) { ApplicationInfo info = i.next(); if (ApplicationAdapter.BLACKLIST.contains(info.packageName) || !info.enabled) i.remove(); } - Collections.sort(Global.Data.appList, (a, b) -> a.loadLabel(pm).toString().toLowerCase() + Collections.sort(magiskManager.appList, (a, b) -> a.loadLabel(pm).toString().toLowerCase() .compareTo(b.loadLabel(pm).toString().toLowerCase())); - Global.Data.magiskHideList = Shell.su(Async.MAGISK_HIDE_PATH + "list"); + magiskManager.magiskHideList = Shell.su(Async.MAGISK_HIDE_PATH + "list"); return null; } @Override protected void onPostExecute(Void v) { - Global.Events.packageLoadDone.trigger(); + magiskManager.packageLoadDone.trigger(); } } @@ -149,19 +161,22 @@ public class Async { private String mFilename; protected ProgressDialog progress; private Context mContext; + private MagiskManager magiskManager; public FlashZIP(Context context, Uri uri, String filename) { mContext = context; + magiskManager = (MagiskManager) context.getApplicationContext(); mUri = uri; mFilename = filename; } public FlashZIP(Context context, Uri uri) { mContext = context; + magiskManager = (MagiskManager) context.getApplicationContext(); mUri = uri; // Try to get the filename ourselves - Cursor c = mContext.getContentResolver().query(uri, null, null, null, null); + Cursor c = magiskManager.getContentResolver().query(uri, null, null, null, null); if (c != null) { int nameIndex = c.getColumnIndex(OpenableColumns.DISPLAY_NAME); c.moveToFirst(); @@ -179,14 +194,14 @@ public class Async { protected void preProcessing() throws Throwable {} protected void copyToCache() throws Throwable { - publishProgress(mContext.getString(R.string.copying_msg)); - mCachedFile = new File(mContext.getCacheDir().getAbsolutePath() + "/install.zip"); + publishProgress(magiskManager.getString(R.string.copying_msg)); + mCachedFile = new File(magiskManager.getCacheDir().getAbsolutePath() + "/install.zip"); if (mCachedFile.exists() && !mCachedFile.delete()) { Logger.error("FlashZip: Error while deleting already existing file"); throw new IOException(); } try ( - InputStream in = mContext.getContentResolver().openInputStream(mUri); + InputStream in = magiskManager.getContentResolver().openInputStream(mUri); OutputStream outputStream = new FileOutputStream(mCachedFile) ) { byte buffer[] = new byte[1024]; @@ -214,7 +229,7 @@ public class Async { @Override protected void onPreExecute() { - progress = new ProgressDialog(mContext); + progress = new ProgressDialog(magiskManager); progress.setTitle(R.string.zip_install_progress_title); progress.show(); } @@ -236,7 +251,7 @@ public class Async { return -1; } if (!unzipAndCheck()) return 0; - publishProgress(mContext.getString(R.string.zip_install_progress_msg, mFilename)); + publishProgress(magiskManager.getString(R.string.zip_install_progress_msg, mFilename)); ret = Shell.su( "BOOTMODE=true sh " + mCachedFile.getParent() + "/META-INF/com/google/android/update-binary dummy 1 " + mCachedFile.getPath(), @@ -264,12 +279,12 @@ public class Async { progress.dismiss(); switch (result) { case -1: - Toast.makeText(mContext, mContext.getString(R.string.install_error), Toast.LENGTH_LONG).show(); - Toast.makeText(mContext, mContext.getString(R.string.manual_install_1, mUri.getPath()), Toast.LENGTH_LONG).show(); - Toast.makeText(mContext, mContext.getString(R.string.manual_install_2), Toast.LENGTH_LONG).show(); + Toast.makeText(magiskManager, magiskManager.getString(R.string.install_error), Toast.LENGTH_LONG).show(); + Toast.makeText(magiskManager, magiskManager.getString(R.string.manual_install_1, mUri.getPath()), Toast.LENGTH_LONG).show(); + Toast.makeText(magiskManager, magiskManager.getString(R.string.manual_install_2), Toast.LENGTH_LONG).show(); break; case 0: - Toast.makeText(mContext, mContext.getString(R.string.invalid_zip), Toast.LENGTH_LONG).show(); + Toast.makeText(magiskManager, magiskManager.getString(R.string.invalid_zip), Toast.LENGTH_LONG).show(); break; case 1: onSuccess(); @@ -278,8 +293,8 @@ public class Async { } protected void onSuccess() { - Global.Events.updateCheckDone.trigger(); - new LoadModules().exec(); + magiskManager.updateCheckDone.trigger(); + new LoadModules(magiskManager).exec(); Utils.getAlertDialogBuilder(mContext) .setTitle(R.string.reboot_title) @@ -326,19 +341,26 @@ public class Async { } public static class GetBootBlocks extends RootTask { + + MagiskManager magiskManager; + + public GetBootBlocks(MagiskManager context) { + magiskManager = context; + } + @Override protected Void doInBackground(Void... params) { if (Shell.rootAccess()) { - Global.Data.blockList = Shell.su("ls /dev/block | grep mmc"); - if (Global.Info.bootBlock == null) - Global.Info.bootBlock = Utils.detectBootImage(); + magiskManager.blockList = Shell.su("ls /dev/block | grep mmc"); + if (magiskManager.bootBlock == null) + magiskManager.bootBlock = Utils.detectBootImage(); } return null; } @Override protected void onPostExecute(Void v) { - Global.Events.blockDetectionDone.trigger(); + magiskManager.blockDetectionDone.trigger(); } } } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Logger.java b/app/src/main/java/com/topjohnwu/magisk/utils/Logger.java index d287c79ac..d70edf888 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Logger.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Logger.java @@ -2,7 +2,7 @@ package com.topjohnwu.magisk.utils; import android.util.Log; -import com.topjohnwu.magisk.Global; +import com.topjohnwu.magisk.MagiskManager; public class Logger { @@ -17,7 +17,7 @@ public class Logger { } public static void dev(String msg, Object... args) { - if (Global.Configs.devLogging) { + if (MagiskManager.devLogging) { if (args.length == 1 && args[0] instanceof Throwable) { Log.d(TAG, "DEV: " + msg, (Throwable) args[0]); } else { @@ -27,13 +27,13 @@ public class Logger { } public static void dev(String msg) { - if (Global.Configs.devLogging) { + if (MagiskManager.devLogging) { Log.d(TAG, "DEBUG: " + msg); } } public static void shell(boolean root, String msg) { - if (Global.Configs.shellLogging) { + if (MagiskManager.shellLogging) { Log.d(root ? "SU" : "SH", msg); } } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java index 8070fa112..53d2d8776 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java @@ -13,7 +13,7 @@ import android.support.v4.app.ActivityCompat; import android.text.TextUtils; import android.widget.Toast; -import com.topjohnwu.magisk.Global; +import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.receivers.DownloadReceiver; @@ -115,7 +115,7 @@ public class Utils { } public static AlertDialog.Builder getAlertDialogBuilder(Context context) { - if (Global.Configs.isDarkTheme) { + if (((MagiskManager) context.getApplicationContext()).isDarkTheme) { return new AlertDialog.Builder(context, R.style.AlertDialog_dh); } else { return new AlertDialog.Builder(context);