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);