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