mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-12-18 05:58:30 +00:00
Micro optimizations
This commit is contained in:
parent
bf4a46d57c
commit
75ab1fa570
@ -34,10 +34,7 @@ public class Const {
|
|||||||
|
|
||||||
// Versions
|
// Versions
|
||||||
public static final int UPDATE_SERVICE_VER = 1;
|
public static final int UPDATE_SERVICE_VER = 1;
|
||||||
|
public static final int MIN_MODULE_VER = 1500;
|
||||||
public static int MIN_MODULE_VER() {
|
|
||||||
return Data.magiskVersionCode >= MAGISK_VER.REMOVE_LEGACY_LINK ? 1500 : 1400;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* A list of apps that should not be shown as hide-able */
|
/* A list of apps that should not be shown as hide-able */
|
||||||
public static final List<String> HIDE_BLACKLIST = Arrays.asList(
|
public static final List<String> HIDE_BLACKLIST = Arrays.asList(
|
||||||
|
@ -13,7 +13,6 @@ import com.topjohnwu.magisk.receivers.RebootReceiver;
|
|||||||
import com.topjohnwu.magisk.receivers.ShortcutReceiver;
|
import com.topjohnwu.magisk.receivers.ShortcutReceiver;
|
||||||
import com.topjohnwu.magisk.services.OnBootService;
|
import com.topjohnwu.magisk.services.OnBootService;
|
||||||
import com.topjohnwu.magisk.services.UpdateCheckService;
|
import com.topjohnwu.magisk.services.UpdateCheckService;
|
||||||
import com.topjohnwu.magisk.utils.FingerprintHelper;
|
|
||||||
import com.topjohnwu.magisk.utils.Utils;
|
import com.topjohnwu.magisk.utils.Utils;
|
||||||
import com.topjohnwu.superuser.Shell;
|
import com.topjohnwu.superuser.Shell;
|
||||||
import com.topjohnwu.superuser.ShellUtils;
|
import com.topjohnwu.superuser.ShellUtils;
|
||||||
@ -62,12 +61,9 @@ public class Data {
|
|||||||
public static boolean isDarkTheme;
|
public static boolean isDarkTheme;
|
||||||
public static int suRequestTimeout;
|
public static int suRequestTimeout;
|
||||||
public static int suLogTimeout = 14;
|
public static int suLogTimeout = 14;
|
||||||
public static int suAccessState;
|
public static int multiuserState = -1;
|
||||||
public static boolean suFingerprint;
|
|
||||||
public static int multiuserMode;
|
|
||||||
public static int suResponseType;
|
public static int suResponseType;
|
||||||
public static int suNotificationType;
|
public static int suNotificationType;
|
||||||
public static int suNamespaceMode;
|
|
||||||
public static int updateChannel;
|
public static int updateChannel;
|
||||||
public static int repoOrder;
|
public static int repoOrder;
|
||||||
|
|
||||||
@ -180,15 +176,6 @@ public class Data {
|
|||||||
suRequestTimeout = Utils.getPrefsInt(mm.prefs, Const.Key.SU_REQUEST_TIMEOUT, Const.Value.timeoutList[2]);
|
suRequestTimeout = Utils.getPrefsInt(mm.prefs, Const.Key.SU_REQUEST_TIMEOUT, Const.Value.timeoutList[2]);
|
||||||
suResponseType = Utils.getPrefsInt(mm.prefs, Const.Key.SU_AUTO_RESPONSE, Const.Value.SU_PROMPT);
|
suResponseType = Utils.getPrefsInt(mm.prefs, Const.Key.SU_AUTO_RESPONSE, Const.Value.SU_PROMPT);
|
||||||
suNotificationType = Utils.getPrefsInt(mm.prefs, Const.Key.SU_NOTIFICATION, Const.Value.NOTIFICATION_TOAST);
|
suNotificationType = Utils.getPrefsInt(mm.prefs, Const.Key.SU_NOTIFICATION, Const.Value.NOTIFICATION_TOAST);
|
||||||
suAccessState = mm.mDB.getSettings(Const.Key.ROOT_ACCESS, Const.Value.ROOT_ACCESS_APPS_AND_ADB);
|
|
||||||
multiuserMode = mm.mDB.getSettings(Const.Key.SU_MULTIUSER_MODE, Const.Value.MULTIUSER_MODE_OWNER_ONLY);
|
|
||||||
suNamespaceMode = mm.mDB.getSettings(Const.Key.SU_MNT_NS, Const.Value.NAMESPACE_MODE_REQUESTER);
|
|
||||||
suFingerprint = mm.mDB.getSettings(Const.Key.SU_FINGERPRINT, 0) != 0;
|
|
||||||
if (suFingerprint && !FingerprintHelper.canUseFingerprint()) {
|
|
||||||
// User revoked the fingerprint
|
|
||||||
mm.mDB.setSettings(Const.Key.SU_FINGERPRINT, 0);
|
|
||||||
suFingerprint = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// config
|
// config
|
||||||
isDarkTheme = mm.prefs.getBoolean(Const.Key.DARK_THEME, false);
|
isDarkTheme = mm.prefs.getBoolean(Const.Key.DARK_THEME, false);
|
||||||
@ -202,13 +189,9 @@ public class Data {
|
|||||||
.putBoolean(Const.Key.MAGISKHIDE, magiskHide)
|
.putBoolean(Const.Key.MAGISKHIDE, magiskHide)
|
||||||
.putBoolean(Const.Key.HOSTS, Const.MAGISK_HOST_FILE.exists())
|
.putBoolean(Const.Key.HOSTS, Const.MAGISK_HOST_FILE.exists())
|
||||||
.putBoolean(Const.Key.COREONLY, Const.MAGISK_DISABLE_FILE.exists())
|
.putBoolean(Const.Key.COREONLY, Const.MAGISK_DISABLE_FILE.exists())
|
||||||
.putBoolean(Const.Key.SU_FINGERPRINT, suFingerprint)
|
|
||||||
.putString(Const.Key.SU_REQUEST_TIMEOUT, String.valueOf(suRequestTimeout))
|
.putString(Const.Key.SU_REQUEST_TIMEOUT, String.valueOf(suRequestTimeout))
|
||||||
.putString(Const.Key.SU_AUTO_RESPONSE, String.valueOf(suResponseType))
|
.putString(Const.Key.SU_AUTO_RESPONSE, String.valueOf(suResponseType))
|
||||||
.putString(Const.Key.SU_NOTIFICATION, String.valueOf(suNotificationType))
|
.putString(Const.Key.SU_NOTIFICATION, String.valueOf(suNotificationType))
|
||||||
.putString(Const.Key.ROOT_ACCESS, String.valueOf(suAccessState))
|
|
||||||
.putString(Const.Key.SU_MULTIUSER_MODE, String.valueOf(multiuserMode))
|
|
||||||
.putString(Const.Key.SU_MNT_NS, String.valueOf(suNamespaceMode))
|
|
||||||
.putString(Const.Key.UPDATE_CHANNEL, String.valueOf(updateChannel))
|
.putString(Const.Key.UPDATE_CHANNEL, String.valueOf(updateChannel))
|
||||||
.putInt(Const.Key.UPDATE_SERVICE_VER, Const.UPDATE_SERVICE_VER)
|
.putInt(Const.Key.UPDATE_SERVICE_VER, Const.UPDATE_SERVICE_VER)
|
||||||
.putInt(Const.Key.REPO_ORDER, repoOrder)
|
.putInt(Const.Key.REPO_ORDER, repoOrder)
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
package com.topjohnwu.magisk;
|
package com.topjohnwu.magisk;
|
||||||
|
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import com.topjohnwu.magisk.database.MagiskDB;
|
import com.topjohnwu.magisk.database.MagiskDB;
|
||||||
import com.topjohnwu.magisk.database.RepoDatabaseHelper;
|
import com.topjohnwu.magisk.database.RepoDatabaseHelper;
|
||||||
@ -39,19 +37,7 @@ public class MagiskManager extends ContainerApp {
|
|||||||
|
|
||||||
prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
prefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
mDB = MagiskDB.getInstance();
|
mDB = MagiskDB.getInstance();
|
||||||
|
repoDB = new RepoDatabaseHelper(this);
|
||||||
String pkg = mDB.getStrings(Const.Key.SU_MANAGER, null);
|
|
||||||
if (pkg != null && getPackageName().equals(Const.ORIG_PKG_NAME)) {
|
|
||||||
mDB.setStrings(Const.Key.SU_MANAGER, null);
|
|
||||||
Shell.su("pm uninstall " + pkg).exec();
|
|
||||||
}
|
|
||||||
if (TextUtils.equals(pkg, getPackageName())) {
|
|
||||||
try {
|
|
||||||
// We are the manager, remove com.topjohnwu.magisk as it could be malware
|
|
||||||
getPackageManager().getApplicationInfo(Const.ORIG_PKG_NAME, 0);
|
|
||||||
RootUtils.uninstallPkg(Const.ORIG_PKG_NAME);
|
|
||||||
} catch (PackageManager.NameNotFoundException ignored) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
LocaleManager.setLocale(this);
|
LocaleManager.setLocale(this);
|
||||||
Data.loadConfig();
|
Data.loadConfig();
|
||||||
|
@ -18,6 +18,7 @@ import com.topjohnwu.magisk.fragments.SettingsFragment;
|
|||||||
import com.topjohnwu.magisk.fragments.SuperuserFragment;
|
import com.topjohnwu.magisk.fragments.SuperuserFragment;
|
||||||
import com.topjohnwu.magisk.utils.Download;
|
import com.topjohnwu.magisk.utils.Download;
|
||||||
import com.topjohnwu.magisk.utils.Topic;
|
import com.topjohnwu.magisk.utils.Topic;
|
||||||
|
import com.topjohnwu.magisk.utils.Utils;
|
||||||
import com.topjohnwu.superuser.Shell;
|
import com.topjohnwu.superuser.Shell;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
@ -124,8 +125,7 @@ public class MainActivity extends BaseActivity
|
|||||||
menu.findItem(R.id.downloads).setVisible(Download.checkNetworkStatus(this)
|
menu.findItem(R.id.downloads).setVisible(Download.checkNetworkStatus(this)
|
||||||
&& Shell.rootAccess() && Data.magiskVersionCode >= 0);
|
&& Shell.rootAccess() && Data.magiskVersionCode >= 0);
|
||||||
menu.findItem(R.id.log).setVisible(Shell.rootAccess());
|
menu.findItem(R.id.log).setVisible(Shell.rootAccess());
|
||||||
menu.findItem(R.id.superuser).setVisible(Shell.rootAccess() &&
|
menu.findItem(R.id.superuser).setVisible(Utils.showSuperUser());
|
||||||
!(Const.USER_ID > 0 && Data.multiuserMode == Const.Value.MULTIUSER_MODE_OWNER_MANAGED));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void navigate(String item) {
|
public void navigate(String item) {
|
||||||
|
@ -3,16 +3,18 @@ package com.topjohnwu.magisk;
|
|||||||
import android.app.NotificationChannel;
|
import android.app.NotificationChannel;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import com.topjohnwu.magisk.asyncs.CheckUpdates;
|
import com.topjohnwu.magisk.asyncs.CheckUpdates;
|
||||||
import com.topjohnwu.magisk.asyncs.UpdateRepos;
|
import com.topjohnwu.magisk.asyncs.UpdateRepos;
|
||||||
import com.topjohnwu.magisk.components.BaseActivity;
|
import com.topjohnwu.magisk.components.BaseActivity;
|
||||||
import com.topjohnwu.magisk.database.RepoDatabaseHelper;
|
|
||||||
import com.topjohnwu.magisk.receivers.ShortcutReceiver;
|
import com.topjohnwu.magisk.receivers.ShortcutReceiver;
|
||||||
import com.topjohnwu.magisk.utils.Download;
|
import com.topjohnwu.magisk.utils.Download;
|
||||||
import com.topjohnwu.magisk.utils.LocaleManager;
|
import com.topjohnwu.magisk.utils.LocaleManager;
|
||||||
|
import com.topjohnwu.magisk.utils.RootUtils;
|
||||||
import com.topjohnwu.magisk.utils.Utils;
|
import com.topjohnwu.magisk.utils.Utils;
|
||||||
import com.topjohnwu.superuser.Shell;
|
import com.topjohnwu.superuser.Shell;
|
||||||
|
|
||||||
@ -22,6 +24,19 @@ public class SplashActivity extends BaseActivity {
|
|||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
String pkg = mm.mDB.getStrings(Const.Key.SU_MANAGER, null);
|
||||||
|
if (pkg != null && getPackageName().equals(Const.ORIG_PKG_NAME)) {
|
||||||
|
mm.mDB.setStrings(Const.Key.SU_MANAGER, null);
|
||||||
|
Shell.su("pm uninstall " + pkg).exec();
|
||||||
|
}
|
||||||
|
if (TextUtils.equals(pkg, getPackageName())) {
|
||||||
|
try {
|
||||||
|
// We are the manager, remove com.topjohnwu.magisk as it could be malware
|
||||||
|
getPackageManager().getApplicationInfo(Const.ORIG_PKG_NAME, 0);
|
||||||
|
RootUtils.uninstallPkg(Const.ORIG_PKG_NAME);
|
||||||
|
} catch (PackageManager.NameNotFoundException ignored) {}
|
||||||
|
}
|
||||||
|
|
||||||
// Magisk working as expected
|
// Magisk working as expected
|
||||||
if (Shell.rootAccess() && Data.magiskVersionCode > 0) {
|
if (Shell.rootAccess() && Data.magiskVersionCode > 0) {
|
||||||
// Update check service
|
// Update check service
|
||||||
@ -30,7 +45,6 @@ public class SplashActivity extends BaseActivity {
|
|||||||
Utils.loadModules();
|
Utils.loadModules();
|
||||||
}
|
}
|
||||||
|
|
||||||
mm.repoDB = new RepoDatabaseHelper(this);
|
|
||||||
Data.importPrefs();
|
Data.importPrefs();
|
||||||
|
|
||||||
// Dynamic detect all locales
|
// Dynamic detect all locales
|
||||||
|
@ -181,9 +181,9 @@ public class SuRequestActivity extends BaseActivity {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
boolean useFingerprint = Data.suFingerprint && FingerprintHelper.canUseFingerprint();
|
boolean useFP = FingerprintHelper.useFingerPrint();
|
||||||
|
|
||||||
if (useFingerprint) {
|
if (useFP) {
|
||||||
try {
|
try {
|
||||||
fingerprintHelper = new FingerprintHelper() {
|
fingerprintHelper = new FingerprintHelper() {
|
||||||
@Override
|
@Override
|
||||||
@ -209,11 +209,11 @@ public class SuRequestActivity extends BaseActivity {
|
|||||||
fingerprintHelper.authenticate();
|
fingerprintHelper.authenticate();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
useFingerprint = false;
|
useFP = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!useFingerprint) {
|
if (!useFP) {
|
||||||
grant_btn.setOnClickListener(v -> {
|
grant_btn.setOnClickListener(v -> {
|
||||||
handleAction(Policy.ALLOW);
|
handleAction(Policy.ALLOW);
|
||||||
timer.cancel();
|
timer.cancel();
|
||||||
@ -221,8 +221,8 @@ public class SuRequestActivity extends BaseActivity {
|
|||||||
grant_btn.requestFocus();
|
grant_btn.requestFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
grant_btn.setVisibility(useFingerprint ? View.GONE : View.VISIBLE);
|
grant_btn.setVisibility(useFP ? View.GONE : View.VISIBLE);
|
||||||
fingerprintImg.setVisibility(useFingerprint ? View.VISIBLE : View.GONE);
|
fingerprintImg.setVisibility(useFP ? View.VISIBLE : View.GONE);
|
||||||
|
|
||||||
deny_btn.setOnClickListener(v -> {
|
deny_btn.setOnClickListener(v -> {
|
||||||
handleAction(Policy.DENY);
|
handleAction(Policy.DENY);
|
||||||
|
@ -10,7 +10,6 @@ import android.widget.Switch;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
import com.topjohnwu.magisk.Data;
|
|
||||||
import com.topjohnwu.magisk.R;
|
import com.topjohnwu.magisk.R;
|
||||||
import com.topjohnwu.magisk.components.CustomAlertDialog;
|
import com.topjohnwu.magisk.components.CustomAlertDialog;
|
||||||
import com.topjohnwu.magisk.components.ExpandableView;
|
import com.topjohnwu.magisk.components.ExpandableView;
|
||||||
@ -86,7 +85,7 @@ public class PolicyAdapter extends RecyclerView.Adapter<PolicyAdapter.ViewHolder
|
|||||||
dbHelper.updatePolicy(policy);
|
dbHelper.updatePolicy(policy);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (Data.suFingerprint) {
|
if (FingerprintHelper.useFingerPrint()) {
|
||||||
holder.masterSwitch.setChecked(!isChecked);
|
holder.masterSwitch.setChecked(!isChecked);
|
||||||
FingerprintHelper.showAuthDialog((Activity) v.getContext(), () -> {
|
FingerprintHelper.showAuthDialog((Activity) v.getContext(), () -> {
|
||||||
holder.masterSwitch.setChecked(isChecked);
|
holder.masterSwitch.setChecked(isChecked);
|
||||||
|
@ -36,7 +36,7 @@ public class Repo extends BaseModule {
|
|||||||
if (getVersionCode() < 0) {
|
if (getVersionCode() < 0) {
|
||||||
throw new IllegalRepoException("Repo [" + getId() + "] does not contain versionCode");
|
throw new IllegalRepoException("Repo [" + getId() + "] does not contain versionCode");
|
||||||
}
|
}
|
||||||
if (getMinMagiskVersion() < Const.MIN_MODULE_VER()) {
|
if (getMinMagiskVersion() < Const.MIN_MODULE_VER) {
|
||||||
Logger.debug("Repo [" + getId() + "] is outdated");
|
Logger.debug("Repo [" + getId() + "] is outdated");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,7 @@ public class RepoDatabaseHelper extends SQLiteOpenHelper {
|
|||||||
mDb = getWritableDatabase();
|
mDb = getWritableDatabase();
|
||||||
|
|
||||||
// Remove outdated repos
|
// Remove outdated repos
|
||||||
mDb.delete(TABLE_NAME, "minMagisk<?",
|
mDb.delete(TABLE_NAME, "minMagisk<?", new String[] { String.valueOf(Const.MIN_MODULE_VER) });
|
||||||
new String[] { String.valueOf(Const.MIN_MODULE_VER()) });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -107,7 +106,7 @@ public class RepoDatabaseHelper extends SQLiteOpenHelper {
|
|||||||
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(Data.magiskVersionCode), String.valueOf(Const.MIN_MODULE_VER) },
|
||||||
null, null, orderBy);
|
null, null, orderBy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,8 +7,6 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import com.google.android.material.tabs.TabLayout;
|
import com.google.android.material.tabs.TabLayout;
|
||||||
import com.topjohnwu.magisk.Const;
|
|
||||||
import com.topjohnwu.magisk.Data;
|
|
||||||
import com.topjohnwu.magisk.MainActivity;
|
import com.topjohnwu.magisk.MainActivity;
|
||||||
import com.topjohnwu.magisk.R;
|
import com.topjohnwu.magisk.R;
|
||||||
import com.topjohnwu.magisk.adapters.TabFragmentAdapter;
|
import com.topjohnwu.magisk.adapters.TabFragmentAdapter;
|
||||||
@ -33,9 +31,7 @@ public class LogFragment extends BaseFragment {
|
|||||||
|
|
||||||
TabFragmentAdapter adapter = new TabFragmentAdapter(getChildFragmentManager());
|
TabFragmentAdapter adapter = new TabFragmentAdapter(getChildFragmentManager());
|
||||||
|
|
||||||
if (!(Const.USER_ID > 0 && Data.multiuserMode == Const.Value.MULTIUSER_MODE_OWNER_MANAGED)) {
|
adapter.addTab(new SuLogFragment(), getString(R.string.superuser));
|
||||||
adapter.addTab(new SuLogFragment(), getString(R.string.superuser));
|
|
||||||
}
|
|
||||||
adapter.addTab(new MagiskLogFragment(), getString(R.string.magisk));
|
adapter.addTab(new MagiskLogFragment(), getString(R.string.magisk));
|
||||||
tab.setupWithViewPager(viewPager);
|
tab.setupWithViewPager(viewPager);
|
||||||
tab.setVisibility(View.VISIBLE);
|
tab.setVisibility(View.VISIBLE);
|
||||||
|
@ -46,20 +46,36 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
|||||||
implements SharedPreferences.OnSharedPreferenceChangeListener,
|
implements SharedPreferences.OnSharedPreferenceChangeListener,
|
||||||
Topic.Subscriber, Topic.AutoSubscriber {
|
Topic.Subscriber, Topic.AutoSubscriber {
|
||||||
|
|
||||||
private PreferenceScreen prefScreen;
|
|
||||||
|
|
||||||
private ListPreference updateChannel, suAccess, autoRes, suNotification,
|
|
||||||
requestTimeout, multiuserMode, namespaceMode;
|
|
||||||
private MagiskManager mm;
|
private MagiskManager mm;
|
||||||
private PreferenceCategory generalCatagory;
|
|
||||||
|
private ListPreference updateChannel, autoRes, suNotification,
|
||||||
|
requestTimeout, rootConfig, multiuserConfig, nsConfig;
|
||||||
|
|
||||||
|
private int rootState, namespaceState;
|
||||||
|
private boolean showSuperuser;
|
||||||
|
|
||||||
|
private void prefsSync() {
|
||||||
|
rootState = mm.mDB.getSettings(Const.Key.ROOT_ACCESS, Const.Value.ROOT_ACCESS_APPS_AND_ADB);
|
||||||
|
namespaceState = mm.mDB.getSettings(Const.Key.SU_MNT_NS, Const.Value.NAMESPACE_MODE_REQUESTER);
|
||||||
|
showSuperuser = Utils.showSuperUser();
|
||||||
|
mm.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) {
|
||||||
setPreferencesFromResource(R.xml.app_settings, rootKey);
|
|
||||||
mm = Data.MM();
|
mm = Data.MM();
|
||||||
prefScreen = getPreferenceScreen();
|
prefsSync();
|
||||||
|
|
||||||
generalCatagory = (PreferenceCategory) findPreference("general");
|
setPreferencesFromResource(R.xml.app_settings, rootKey);
|
||||||
|
|
||||||
|
PreferenceScreen prefScreen = getPreferenceScreen();
|
||||||
|
|
||||||
|
PreferenceCategory generalCatagory = (PreferenceCategory) findPreference("general");
|
||||||
PreferenceCategory magiskCategory = (PreferenceCategory) findPreference("magisk");
|
PreferenceCategory magiskCategory = (PreferenceCategory) findPreference("magisk");
|
||||||
PreferenceCategory suCategory = (PreferenceCategory) findPreference("superuser");
|
PreferenceCategory suCategory = (PreferenceCategory) findPreference("superuser");
|
||||||
Preference hideManager = findPreference("hide");
|
Preference hideManager = findPreference("hide");
|
||||||
@ -72,12 +88,12 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
|||||||
});
|
});
|
||||||
|
|
||||||
updateChannel = (ListPreference) findPreference(Const.Key.UPDATE_CHANNEL);
|
updateChannel = (ListPreference) findPreference(Const.Key.UPDATE_CHANNEL);
|
||||||
suAccess = (ListPreference) findPreference(Const.Key.ROOT_ACCESS);
|
rootConfig = (ListPreference) findPreference(Const.Key.ROOT_ACCESS);
|
||||||
autoRes = (ListPreference) findPreference(Const.Key.SU_AUTO_RESPONSE);
|
autoRes = (ListPreference) findPreference(Const.Key.SU_AUTO_RESPONSE);
|
||||||
requestTimeout = (ListPreference) findPreference(Const.Key.SU_REQUEST_TIMEOUT);
|
requestTimeout = (ListPreference) findPreference(Const.Key.SU_REQUEST_TIMEOUT);
|
||||||
suNotification = (ListPreference) findPreference(Const.Key.SU_NOTIFICATION);
|
suNotification = (ListPreference) findPreference(Const.Key.SU_NOTIFICATION);
|
||||||
multiuserMode = (ListPreference) findPreference(Const.Key.SU_MULTIUSER_MODE);
|
multiuserConfig = (ListPreference) findPreference(Const.Key.SU_MULTIUSER_MODE);
|
||||||
namespaceMode = (ListPreference) findPreference(Const.Key.SU_MNT_NS);
|
nsConfig = (ListPreference) findPreference(Const.Key.SU_MNT_NS);
|
||||||
SwitchPreference reauth = (SwitchPreference) findPreference(Const.Key.SU_REAUTH);
|
SwitchPreference reauth = (SwitchPreference) findPreference(Const.Key.SU_REAUTH);
|
||||||
SwitchPreference fingerprint = (SwitchPreference) findPreference(Const.Key.SU_FINGERPRINT);
|
SwitchPreference fingerprint = (SwitchPreference) findPreference(Const.Key.SU_FINGERPRINT);
|
||||||
|
|
||||||
@ -107,7 +123,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
|||||||
|
|
||||||
// Disable dangerous settings in secondary user
|
// Disable dangerous settings in secondary user
|
||||||
if (Const.USER_ID > 0) {
|
if (Const.USER_ID > 0) {
|
||||||
suCategory.removePreference(multiuserMode);
|
suCategory.removePreference(multiuserConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable re-authentication option on Android O, it will not work
|
// Disable re-authentication option on Android O, it will not work
|
||||||
@ -163,8 +179,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
|||||||
generalCatagory.removePreference(hideManager);
|
generalCatagory.removePreference(hideManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Shell.rootAccess() || (Const.USER_ID > 0 &&
|
if (!showSuperuser) {
|
||||||
Data.multiuserMode == Const.Value.MULTIUSER_MODE_OWNER_MANAGED)) {
|
|
||||||
prefScreen.removePreference(suCategory);
|
prefScreen.removePreference(suCategory);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,9 +228,16 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
|||||||
mm.mDB.setSettings(key, Utils.getPrefsInt(prefs, key));
|
mm.mDB.setSettings(key, Utils.getPrefsInt(prefs, key));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Data.loadConfig();
|
|
||||||
setSummary();
|
|
||||||
switch (key) {
|
switch (key) {
|
||||||
|
case Const.Key.ROOT_ACCESS:
|
||||||
|
rootState = Utils.getPrefsInt(prefs, key);
|
||||||
|
break;
|
||||||
|
case Const.Key.SU_MULTIUSER_MODE:
|
||||||
|
Data.multiuserState = Utils.getPrefsInt(prefs, key);
|
||||||
|
break;
|
||||||
|
case Const.Key.SU_MNT_NS:
|
||||||
|
namespaceState = Utils.getPrefsInt(prefs, key);
|
||||||
|
break;
|
||||||
case Const.Key.DARK_THEME:
|
case Const.Key.DARK_THEME:
|
||||||
requireActivity().recreate();
|
requireActivity().recreate();
|
||||||
break;
|
break;
|
||||||
@ -259,6 +281,8 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
|||||||
Utils.setupUpdateCheck();
|
Utils.setupUpdateCheck();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Data.loadConfig();
|
||||||
|
setSummary();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -270,7 +294,6 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
|||||||
((SwitchPreference) preference).setChecked(!checked);
|
((SwitchPreference) preference).setChecked(!checked);
|
||||||
FingerprintHelper.showAuthDialog(requireActivity(), () -> {
|
FingerprintHelper.showAuthDialog(requireActivity(), () -> {
|
||||||
((SwitchPreference) preference).setChecked(checked);
|
((SwitchPreference) preference).setChecked(checked);
|
||||||
Data.suFingerprint = checked;
|
|
||||||
mm.mDB.setSettings(key, checked ? 1 : 0);
|
mm.mDB.setSettings(key, checked ? 1 : 0);
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@ -281,8 +304,8 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
|||||||
private void setSummary() {
|
private void setSummary() {
|
||||||
updateChannel.setSummary(getResources()
|
updateChannel.setSummary(getResources()
|
||||||
.getStringArray(R.array.update_channel)[Data.updateChannel]);
|
.getStringArray(R.array.update_channel)[Data.updateChannel]);
|
||||||
suAccess.setSummary(getResources()
|
rootConfig.setSummary(getResources()
|
||||||
.getStringArray(R.array.su_access)[Data.suAccessState]);
|
.getStringArray(R.array.su_access)[rootState]);
|
||||||
autoRes.setSummary(getResources()
|
autoRes.setSummary(getResources()
|
||||||
.getStringArray(R.array.auto_response)[Data.suResponseType]);
|
.getStringArray(R.array.auto_response)[Data.suResponseType]);
|
||||||
suNotification.setSummary(getResources()
|
suNotification.setSummary(getResources()
|
||||||
@ -290,10 +313,10 @@ public class SettingsFragment extends PreferenceFragmentCompat
|
|||||||
requestTimeout.setSummary(
|
requestTimeout.setSummary(
|
||||||
getString(R.string.request_timeout_summary,
|
getString(R.string.request_timeout_summary,
|
||||||
mm.prefs.getString(Const.Key.SU_REQUEST_TIMEOUT, "10")));
|
mm.prefs.getString(Const.Key.SU_REQUEST_TIMEOUT, "10")));
|
||||||
multiuserMode.setSummary(getResources()
|
multiuserConfig.setSummary(getResources()
|
||||||
.getStringArray(R.array.multiuser_summary)[Data.multiuserMode]);
|
.getStringArray(R.array.multiuser_summary)[Data.multiuserState]);
|
||||||
namespaceMode.setSummary(getResources()
|
nsConfig.setSummary(getResources()
|
||||||
.getStringArray(R.array.namespace_summary)[Data.suNamespaceMode]);
|
.getStringArray(R.array.namespace_summary)[namespaceState]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -13,6 +13,7 @@ import com.topjohnwu.magisk.Data;
|
|||||||
import com.topjohnwu.magisk.MagiskManager;
|
import com.topjohnwu.magisk.MagiskManager;
|
||||||
import com.topjohnwu.magisk.R;
|
import com.topjohnwu.magisk.R;
|
||||||
import com.topjohnwu.magisk.SplashActivity;
|
import com.topjohnwu.magisk.SplashActivity;
|
||||||
|
import com.topjohnwu.magisk.utils.Utils;
|
||||||
import com.topjohnwu.superuser.Shell;
|
import com.topjohnwu.superuser.Shell;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -33,8 +34,7 @@ public class ShortcutReceiver extends BroadcastReceiver {
|
|||||||
private ArrayList<ShortcutInfo> getShortCuts(MagiskManager mm) {
|
private ArrayList<ShortcutInfo> getShortCuts(MagiskManager mm) {
|
||||||
ArrayList<ShortcutInfo> shortCuts = new ArrayList<>();
|
ArrayList<ShortcutInfo> shortCuts = new ArrayList<>();
|
||||||
boolean root = Shell.rootAccess();
|
boolean root = Shell.rootAccess();
|
||||||
if (root && !(Const.USER_ID > 0 &&
|
if (Utils.showSuperUser()) {
|
||||||
Data.multiuserMode == Const.Value.MULTIUSER_MODE_OWNER_MANAGED)) {
|
|
||||||
shortCuts.add(new ShortcutInfo.Builder(mm, "superuser")
|
shortCuts.add(new ShortcutInfo.Builder(mm, "superuser")
|
||||||
.setShortLabel(mm.getString(R.string.superuser))
|
.setShortLabel(mm.getString(R.string.superuser))
|
||||||
.setIntent(new Intent(mm, Data.classMap.get(SplashActivity.class))
|
.setIntent(new Intent(mm, Data.classMap.get(SplashActivity.class))
|
||||||
|
@ -35,6 +35,16 @@ public abstract class FingerprintHelper {
|
|||||||
private Cipher cipher;
|
private Cipher cipher;
|
||||||
private CancellationSignal cancel;
|
private CancellationSignal cancel;
|
||||||
|
|
||||||
|
public static boolean useFingerPrint() {
|
||||||
|
MagiskManager mm = Data.MM();
|
||||||
|
boolean fp = mm.mDB.getSettings(Const.Key.SU_FINGERPRINT, 0) != 0;
|
||||||
|
if (fp && !canUseFingerprint()) {
|
||||||
|
mm.mDB.setSettings(Const.Key.SU_FINGERPRINT, 0);
|
||||||
|
fp = false;
|
||||||
|
}
|
||||||
|
return fp;
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean canUseFingerprint() {
|
public static boolean canUseFingerprint() {
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
|
||||||
return false;
|
return false;
|
||||||
|
@ -22,6 +22,7 @@ import com.topjohnwu.magisk.MagiskManager;
|
|||||||
import com.topjohnwu.magisk.R;
|
import com.topjohnwu.magisk.R;
|
||||||
import com.topjohnwu.magisk.container.Module;
|
import com.topjohnwu.magisk.container.Module;
|
||||||
import com.topjohnwu.magisk.container.ValueSortedMap;
|
import com.topjohnwu.magisk.container.ValueSortedMap;
|
||||||
|
import com.topjohnwu.superuser.Shell;
|
||||||
import com.topjohnwu.superuser.io.SuFile;
|
import com.topjohnwu.superuser.io.SuFile;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@ -140,4 +141,12 @@ public class Utils {
|
|||||||
} catch (Exception ignored) {}
|
} catch (Exception ignored) {}
|
||||||
return info.loadLabel(pm).toString();
|
return info.loadLabel(pm).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean showSuperUser() {
|
||||||
|
if (Data.multiuserState < 0)
|
||||||
|
Data.multiuserState = Data.MM().mDB.getSettings(Const.Key.SU_MULTIUSER_MODE,
|
||||||
|
Const.Value.MULTIUSER_MODE_OWNER_ONLY);
|
||||||
|
return Shell.rootAccess() && (Const.USER_ID == 0 ||
|
||||||
|
Data.multiuserState != Const.Value.MULTIUSER_MODE_OWNER_MANAGED);
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user