Commit c992b89b authored by d8ahazard's avatar d8ahazard

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...
parent fc5c9647
...@@ -29,13 +29,11 @@ public class AutoRootFragment extends ListFragment { ...@@ -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 { ...@@ -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();
} }
......
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; ...@@ -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 ...@@ -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,105 +44,72 @@ public class MonitorService extends Service ...@@ -60,105 +44,72 @@ 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 boolean getStats(Set<String> seti) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
boolean inStats = false;
UsageStatsManager lUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
if (seti != null) {
ArrayList<String> statList = new ArrayList<>(seti);
for (int i = 0; i < statList.size(); i++) {
if (isAppForeground(statList.get(i))) {
inStats = (isAppForeground(statList.get(i)));
} }
} private Runnable checkProcesses = new Runnable() {
@Override
return inStats; public void run() {
}
Log.d(TAG, "SDK check failed.");
}
return false;
}
protected boolean isAppForeground(String packageName) {
UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
long time = System.currentTimeMillis();
List<UsageStats> stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 10, time);
String topPackageName = new String();
if (stats != null) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<>();
for (UsageStats usageStats : stats) {
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
}
if (mySortedMap != null && !mySortedMap.isEmpty()) {
topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
}
return topPackageName.equals(packageName);
}
private void CheckProcesses() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
if (prefs.getBoolean("autoRootEnable", false)) { if (prefs.getBoolean("autoRootEnable", false)) {
Set<String> set = prefs.getStringSet("autoapps", null); Set<String> set = prefs.getStringSet("autoapps", null);
ArrayList<String> arrayList = null;
if (set != null) { if (set != null) {
disableroot = getStats(set); disableroot = getStats(set);
} }
if (disableroot != disablerootprev) { if (disableroot != disablerootprev) {
int counter = 0;
String rootstatus = (disableroot ? "disabled" : "enabled"); String rootstatus = (disableroot ? "disabled" : "enabled");
Shell.su((disableroot ? "setprop magisk.root 0" : "setprop magisk.root 1")); if (disableroot) {
mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 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; NotificationCompat.Builder mBuilder;
mNotifyMgr.cancelAll(); mNotifyMgr.cancelAll();
if (disableroot) { if (disableroot) {
timer.cancel();
this.stopSelf(); Intent intent = new Intent(getApplication(), WelcomeActivity.class);
Intent intent = new Intent(this, WelcomeActivity.class);
intent.putExtra("relaunch", "relaunch"); intent.putExtra("relaunch", "relaunch");
PendingIntent pendingIntent = PendingIntent.getActivity( PendingIntent pendingIntent = PendingIntent.getActivity(
this, getApplicationContext(),
0, 0,
intent, intent,
PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder = mBuilder =
new NotificationCompat.Builder(this) new NotificationCompat.Builder(getApplicationContext())
.setSmallIcon(disableroot ? R.drawable.ic_stat_notification_autoroot_off : R.drawable.ic_stat_notification_autoroot_on) .setSmallIcon(disableroot ? R.drawable.ic_stat_notification_autoroot_off : R.drawable.ic_stat_notification_autoroot_on)
.setContentIntent(pendingIntent) .setContentIntent(pendingIntent)
.setContentTitle("Auto-root status changed") .setContentTitle("Auto-root status changed")
...@@ -166,23 +117,60 @@ public class MonitorService extends Service ...@@ -166,23 +117,60 @@ public class MonitorService extends Service
} else { } else {
mBuilder = mBuilder =
new NotificationCompat.Builder(this) new NotificationCompat.Builder(getApplicationContext())
.setAutoCancel(true) .setAutoCancel(true)
.setSmallIcon(disableroot ? R.drawable.ic_stat_notification_autoroot_off : R.drawable.ic_stat_notification_autoroot_on) .setSmallIcon(disableroot ? R.drawable.ic_stat_notification_autoroot_off : R.drawable.ic_stat_notification_autoroot_on)
.setContentTitle("Auto-root status changed") .setContentTitle("Auto-root status changed")
.setContentText("Auto root has been " + rootstatus + "!"); .setContentText("Auto root has been " + rootstatus + "!");
} }
// Builds the notification and issues it. // Builds the notification and issues it.
int mNotificationId = 001; int mNotificationId = 1;
mNotifyMgr.notify(mNotificationId, mBuilder.build()); mNotifyMgr.notify(mNotificationId, mBuilder.build());
} }
disablerootprev = disableroot; disablerootprev = disableroot;
Log.d(TAG,"Root check completed, set to " + (disableroot ? "disabled" : "enabled"));
}
handler.postDelayed(checkProcesses, 1000);
}
};
private boolean getStats(Set<String> seti) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
boolean inStats = false;
if (seti != null) {
ArrayList<String> statList = new ArrayList<>(seti);
for (int i = 0; i < statList.size(); i++) {
if (isAppForeground(statList.get(i))) {
inStats = (isAppForeground(statList.get(i)));
}
}
return inStats;
}
Log.d(TAG, "SDK check failed.");
}
return false;
}
Log.d(TAG, "Check Processes finished, result is " + disableroot + " and settings say we should be " + prefs.getBoolean("autoRootEnable", false)); protected boolean isAppForeground(String packageName) {
timer.start(); UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
long time = System.currentTimeMillis();
List<UsageStats> stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 10, time);
String topPackageName = "";
if (stats != null) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<>();
for (UsageStats usageStats : stats) {
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
} }
if (!mySortedMap.isEmpty()) {
topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
}
return topPackageName.equals(packageName);
} }
private boolean hasUsagePermission() { private boolean hasUsagePermission() {
...@@ -193,6 +181,5 @@ public class MonitorService extends Service ...@@ -193,6 +181,5 @@ public class MonitorService extends Service
return mode == AppOpsManager.MODE_ALLOWED; return mode == AppOpsManager.MODE_ALLOWED;
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment