mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-01-05 07:37:38 +00:00
Well, the disable part works...
Auto enable is still a bit trigger happy. But, bugs worked out, might try a method of detection that uses root...
This commit is contained in:
parent
fc5c9647d8
commit
c992b89b2f
@ -29,13 +29,11 @@ public class AutoRootFragment extends ListFragment {
|
|||||||
private ApplicationAdapter listadaptor = null;
|
private ApplicationAdapter listadaptor = null;
|
||||||
public ListView listView;
|
public ListView listView;
|
||||||
public SharedPreferences prefs;
|
public SharedPreferences prefs;
|
||||||
private View view;
|
|
||||||
List<String> arrayList;
|
List<String> arrayList;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
view = inflater.inflate(R.layout.auto_root_fragment, container, false);
|
return inflater.inflate(R.layout.auto_root_fragment, container, false);
|
||||||
return view;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -49,7 +47,7 @@ public class AutoRootFragment extends ListFragment {
|
|||||||
Set<String> set = new HashSet<String>();
|
Set<String> set = new HashSet<String>();
|
||||||
set.add("com.google.android.apps.walletnfcrel");
|
set.add("com.google.android.apps.walletnfcrel");
|
||||||
editor.putStringSet("autoapps", set);
|
editor.putStringSet("autoapps", set);
|
||||||
editor.commit();
|
editor.apply();
|
||||||
}
|
}
|
||||||
new LoadApplications().execute();
|
new LoadApplications().execute();
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.topjohnwu.magisk;
|
package com.topjohnwu.magisk;
|
||||||
|
|
||||||
import android.app.AppOpsManager;
|
import android.app.AppOpsManager;
|
||||||
import android.app.Fragment;
|
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
@ -11,7 +10,7 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.CountDownTimer;
|
import android.os.Handler;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
@ -32,25 +31,10 @@ public class MonitorService extends Service
|
|||||||
{
|
{
|
||||||
|
|
||||||
private static final String TAG = "Magisk";
|
private static final String TAG = "Magisk";
|
||||||
private UsageStatsManager mUsageStatsManager;
|
Handler handler = new Handler();
|
||||||
private SharedPreferences prefs;
|
|
||||||
private Boolean disableroot;
|
private Boolean disableroot;
|
||||||
private Boolean disablerootprev;
|
private Boolean disablerootprev;
|
||||||
public static boolean isRecursionEnable = false;
|
private Boolean stopauto;
|
||||||
private NotificationManager mNotifyMgr;
|
|
||||||
private CountDownTimer timer = new CountDownTimer(1000, 1000) {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTick(long millisUntilFinished) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onFinish() {
|
|
||||||
CheckProcesses();
|
|
||||||
|
|
||||||
}
|
|
||||||
}.start();
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
@ -60,46 +44,111 @@ public class MonitorService extends Service
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
if (!intent.hasExtra("disable")) {
|
new Thread(() -> {
|
||||||
|
checkProcesses.run();
|
||||||
|
|
||||||
new Thread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
// DO your work here
|
|
||||||
// get the data
|
|
||||||
timer.start();
|
|
||||||
}
|
|
||||||
}).start();
|
}).start();
|
||||||
|
|
||||||
|
|
||||||
return START_STICKY;
|
return START_STICKY;
|
||||||
} else return STOP_FOREGROUND_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
Log.d(TAG, "Destroyah!");
|
Log.d(TAG, "Destroyah!");
|
||||||
android.os.Process.killProcess(android.os.Process.myPid());
|
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Runnable checkProcesses = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||||
|
if (prefs.getBoolean("autoRootEnable", false)) {
|
||||||
|
|
||||||
|
Set<String> set = prefs.getStringSet("autoapps", null);
|
||||||
|
|
||||||
|
if (set != null) {
|
||||||
|
disableroot = getStats(set);
|
||||||
|
|
||||||
|
}
|
||||||
|
if (disableroot != disablerootprev) {
|
||||||
|
int counter = 0;
|
||||||
|
String rootstatus = (disableroot ? "disabled" : "enabled");
|
||||||
|
if (disableroot) {
|
||||||
|
Shell.su("setprop magisk.root 0");
|
||||||
|
if (Shell.sh("which su").contains("su")) {
|
||||||
|
Shell.su(("setprop magisk.root 0"));
|
||||||
|
}
|
||||||
|
if (Shell.sh("which su").contains("su")) {
|
||||||
|
Shell.su(("setprop magisk.root 0"));
|
||||||
|
}
|
||||||
|
if (Shell.sh("which su").contains("su")) {
|
||||||
|
Shell.su(("setprop magisk.root 0"));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
counter +=1;
|
||||||
|
if (counter >=3) {
|
||||||
|
Shell.su("setprop magisk.root 1");
|
||||||
|
counter = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Shell.su((disableroot ? "setprop magisk.root 0" : "setprop magisk.root 1"));
|
||||||
|
|
||||||
|
NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
||||||
|
NotificationCompat.Builder mBuilder;
|
||||||
|
mNotifyMgr.cancelAll();
|
||||||
|
if (disableroot) {
|
||||||
|
|
||||||
|
Intent intent = new Intent(getApplication(), WelcomeActivity.class);
|
||||||
|
intent.putExtra("relaunch", "relaunch");
|
||||||
|
PendingIntent pendingIntent = PendingIntent.getActivity(
|
||||||
|
getApplicationContext(),
|
||||||
|
0,
|
||||||
|
intent,
|
||||||
|
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||||
|
|
||||||
|
mBuilder =
|
||||||
|
new NotificationCompat.Builder(getApplicationContext())
|
||||||
|
.setSmallIcon(disableroot ? R.drawable.ic_stat_notification_autoroot_off : R.drawable.ic_stat_notification_autoroot_on)
|
||||||
|
.setContentIntent(pendingIntent)
|
||||||
|
.setContentTitle("Auto-root status changed")
|
||||||
|
.setContentText("Auto root has been " + rootstatus + "! Tap to re-enable when done.");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
mBuilder =
|
||||||
|
new NotificationCompat.Builder(getApplicationContext())
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setSmallIcon(disableroot ? R.drawable.ic_stat_notification_autoroot_off : R.drawable.ic_stat_notification_autoroot_on)
|
||||||
|
.setContentTitle("Auto-root status changed")
|
||||||
|
.setContentText("Auto root has been " + rootstatus + "!");
|
||||||
|
}
|
||||||
|
// Builds the notification and issues it.
|
||||||
|
int mNotificationId = 1;
|
||||||
|
mNotifyMgr.notify(mNotificationId, mBuilder.build());
|
||||||
|
|
||||||
|
}
|
||||||
|
disablerootprev = disableroot;
|
||||||
|
Log.d(TAG,"Root check completed, set to " + (disableroot ? "disabled" : "enabled"));
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
handler.postDelayed(checkProcesses, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
private boolean getStats(Set<String> seti) {
|
private boolean getStats(Set<String> seti) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
boolean inStats = false;
|
boolean inStats = false;
|
||||||
UsageStatsManager lUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
|
|
||||||
if (seti != null) {
|
if (seti != null) {
|
||||||
ArrayList<String> statList = new ArrayList<>(seti);
|
ArrayList<String> statList = new ArrayList<>(seti);
|
||||||
for (int i = 0; i < statList.size(); i++) {
|
for (int i = 0; i < statList.size(); i++) {
|
||||||
if (isAppForeground(statList.get(i))) {
|
if (isAppForeground(statList.get(i))) {
|
||||||
inStats = (isAppForeground(statList.get(i)));
|
inStats = (isAppForeground(statList.get(i)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return inStats;
|
return inStats;
|
||||||
|
|
||||||
}
|
}
|
||||||
Log.d(TAG, "SDK check failed.");
|
Log.d(TAG, "SDK check failed.");
|
||||||
}
|
}
|
||||||
@ -109,19 +158,14 @@ public class MonitorService extends Service
|
|||||||
protected boolean isAppForeground(String packageName) {
|
protected boolean isAppForeground(String packageName) {
|
||||||
UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
|
UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
|
||||||
long time = System.currentTimeMillis();
|
long time = System.currentTimeMillis();
|
||||||
|
|
||||||
List<UsageStats> stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 10, time);
|
List<UsageStats> stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 10, time);
|
||||||
|
String topPackageName = "";
|
||||||
String topPackageName = new String();
|
|
||||||
|
|
||||||
if (stats != null) {
|
if (stats != null) {
|
||||||
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<>();
|
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<>();
|
||||||
|
|
||||||
for (UsageStats usageStats : stats) {
|
for (UsageStats usageStats : stats) {
|
||||||
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
|
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
|
||||||
}
|
}
|
||||||
|
if (!mySortedMap.isEmpty()) {
|
||||||
if (mySortedMap != null && !mySortedMap.isEmpty()) {
|
|
||||||
topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
|
topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,62 +173,6 @@ public class MonitorService extends Service
|
|||||||
return topPackageName.equals(packageName);
|
return topPackageName.equals(packageName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CheckProcesses() {
|
|
||||||
prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
|
||||||
if (prefs.getBoolean("autoRootEnable", false)) {
|
|
||||||
|
|
||||||
Set<String> set = prefs.getStringSet("autoapps", null);
|
|
||||||
|
|
||||||
ArrayList<String> arrayList = null;
|
|
||||||
if (set != null) {
|
|
||||||
disableroot = getStats(set);
|
|
||||||
|
|
||||||
}
|
|
||||||
if (disableroot != disablerootprev) {
|
|
||||||
String rootstatus = (disableroot ? "disabled" : "enabled");
|
|
||||||
Shell.su((disableroot ? "setprop magisk.root 0" : "setprop magisk.root 1"));
|
|
||||||
mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
|
||||||
NotificationCompat.Builder mBuilder;
|
|
||||||
mNotifyMgr.cancelAll();
|
|
||||||
if (disableroot) {
|
|
||||||
timer.cancel();
|
|
||||||
this.stopSelf();
|
|
||||||
Intent intent = new Intent(this, WelcomeActivity.class);
|
|
||||||
intent.putExtra("relaunch", "relaunch");
|
|
||||||
PendingIntent pendingIntent = PendingIntent.getActivity(
|
|
||||||
this,
|
|
||||||
0,
|
|
||||||
intent,
|
|
||||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
|
||||||
|
|
||||||
mBuilder =
|
|
||||||
new NotificationCompat.Builder(this)
|
|
||||||
.setSmallIcon(disableroot ? R.drawable.ic_stat_notification_autoroot_off : R.drawable.ic_stat_notification_autoroot_on)
|
|
||||||
.setContentIntent(pendingIntent)
|
|
||||||
.setContentTitle("Auto-root status changed")
|
|
||||||
.setContentText("Auto root has been " + rootstatus + "! Tap to re-enable when done.");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
mBuilder =
|
|
||||||
new NotificationCompat.Builder(this)
|
|
||||||
.setAutoCancel(true)
|
|
||||||
.setSmallIcon(disableroot ? R.drawable.ic_stat_notification_autoroot_off : R.drawable.ic_stat_notification_autoroot_on)
|
|
||||||
.setContentTitle("Auto-root status changed")
|
|
||||||
.setContentText("Auto root has been " + rootstatus + "!");
|
|
||||||
}
|
|
||||||
// Builds the notification and issues it.
|
|
||||||
int mNotificationId = 001;
|
|
||||||
mNotifyMgr.notify(mNotificationId, mBuilder.build());
|
|
||||||
|
|
||||||
}
|
|
||||||
disablerootprev = disableroot;
|
|
||||||
|
|
||||||
|
|
||||||
Log.d(TAG, "Check Processes finished, result is " + disableroot + " and settings say we should be " + prefs.getBoolean("autoRootEnable", false));
|
|
||||||
timer.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasUsagePermission() {
|
private boolean hasUsagePermission() {
|
||||||
AppOpsManager appOps = (AppOpsManager)
|
AppOpsManager appOps = (AppOpsManager)
|
||||||
getSystemService(Context.APP_OPS_SERVICE);
|
getSystemService(Context.APP_OPS_SERVICE);
|
||||||
@ -193,6 +181,5 @@ public class MonitorService extends Service
|
|||||||
return mode == AppOpsManager.MODE_ALLOWED;
|
return mode == AppOpsManager.MODE_ALLOWED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user