From fc5c9647d829cad1b73338e42164decc4ab08a54 Mon Sep 17 00:00:00 2001 From: d8ahazard Date: Wed, 31 Aug 2016 16:52:42 -0500 Subject: [PATCH] Initial implementation of auto-mount, WIP Will manually merge working product into /master --- app/src/main/AndroidManifest.xml | 37 +++- .../topjohnwu/magisk/AutoRootFragment.java | 154 ++++++++++++++ .../java/com/topjohnwu/magisk/AutoStart.java | 16 ++ .../com/topjohnwu/magisk/MonitorService.java | 198 ++++++++++++++++++ .../com/topjohnwu/magisk/RootFragment.java | 101 ++++++--- .../com/topjohnwu/magisk/WelcomeActivity.java | 56 ++++- .../magisk/utils/ApplicationAdapter.java | 107 ++++++++++ .../ic_stat_notification_autoroot_off.png | Bin 0 -> 1029 bytes .../ic_stat_notification_autoroot_on.png | Bin 0 -> 1063 bytes .../ic_stat_notification_autoroot_off.png | Bin 0 -> 1215 bytes .../ic_stat_notification_autoroot_on.png | Bin 0 -> 1052 bytes .../ic_stat_notification_autoroot_off.png | Bin 0 -> 720 bytes .../ic_stat_notification_autoroot_on.png | Bin 0 -> 749 bytes .../ic_stat_notification_autoroot_off.png | Bin 0 -> 749 bytes .../ic_stat_notification_autoroot_on.png | Bin 0 -> 723 bytes .../ic_stat_notification_autoroot_off.png | Bin 0 -> 1620 bytes .../ic_stat_notification_autoroot_on.png | Bin 0 -> 1640 bytes .../ic_stat_notification_autoroot_off.png | Bin 0 -> 1458 bytes .../ic_stat_notification_autoroot_on.png | Bin 0 -> 1512 bytes .../ic_stat_notification_autoroot_off.png | Bin 0 -> 2788 bytes .../ic_stat_notification_autoroot_on.png | Bin 0 -> 2920 bytes .../ic_stat_notification_autoroot_off.png | Bin 0 -> 2599 bytes .../ic_stat_notification_autoroot_on.png | Bin 0 -> 2697 bytes .../ic_stat_notification_autoroot_off.png | Bin 0 -> 4409 bytes .../ic_stat_notification_autoroot_on.png | Bin 0 -> 4512 bytes .../ic_stat_notification_autoroot_off.png | Bin 0 -> 3875 bytes .../ic_stat_notification_autoroot_on.png | Bin 0 -> 4098 bytes app/src/main/res/drawable/ic_autoroot.xml | 4 + app/src/main/res/layout/app_list_row.xml | 56 +++++ .../main/res/layout/auto_root_fragment.xml | 10 + app/src/main/res/layout/modules_fragment.xml | 10 + app/src/main/res/layout/root_fragment.xml | 18 ++ app/src/main/res/menu/drawer.xml | 5 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/defaultpref.xml | 7 + 35 files changed, 735 insertions(+), 45 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/AutoRootFragment.java create mode 100644 app/src/main/java/com/topjohnwu/magisk/AutoStart.java create mode 100644 app/src/main/java/com/topjohnwu/magisk/MonitorService.java create mode 100644 app/src/main/java/com/topjohnwu/magisk/utils/ApplicationAdapter.java create mode 100644 app/src/main/res/drawable-hdpi-v11/ic_stat_notification_autoroot_off.png create mode 100644 app/src/main/res/drawable-hdpi-v11/ic_stat_notification_autoroot_on.png create mode 100644 app/src/main/res/drawable-hdpi/ic_stat_notification_autoroot_off.png create mode 100644 app/src/main/res/drawable-hdpi/ic_stat_notification_autoroot_on.png create mode 100644 app/src/main/res/drawable-mdpi-v11/ic_stat_notification_autoroot_off.png create mode 100644 app/src/main/res/drawable-mdpi-v11/ic_stat_notification_autoroot_on.png create mode 100644 app/src/main/res/drawable-mdpi/ic_stat_notification_autoroot_off.png create mode 100644 app/src/main/res/drawable-mdpi/ic_stat_notification_autoroot_on.png create mode 100644 app/src/main/res/drawable-xhdpi-v11/ic_stat_notification_autoroot_off.png create mode 100644 app/src/main/res/drawable-xhdpi-v11/ic_stat_notification_autoroot_on.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_stat_notification_autoroot_off.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_stat_notification_autoroot_on.png create mode 100644 app/src/main/res/drawable-xxhdpi-v11/ic_stat_notification_autoroot_off.png create mode 100644 app/src/main/res/drawable-xxhdpi-v11/ic_stat_notification_autoroot_on.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_stat_notification_autoroot_off.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_stat_notification_autoroot_on.png create mode 100644 app/src/main/res/drawable-xxxhdpi-v11/ic_stat_notification_autoroot_off.png create mode 100644 app/src/main/res/drawable-xxxhdpi-v11/ic_stat_notification_autoroot_on.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_stat_notification_autoroot_off.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_stat_notification_autoroot_on.png create mode 100644 app/src/main/res/drawable/ic_autoroot.xml create mode 100644 app/src/main/res/layout/app_list_row.xml create mode 100644 app/src/main/res/layout/auto_root_fragment.xml create mode 100644 app/src/main/res/xml/defaultpref.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b4e518ad8..8c4b20faf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,11 +1,16 @@ - + + + + + + + - - - - + - + + android:theme="@style/AppTheme.Transparent" /> + + android:exported="false" + android:grantUriPermissions="true"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/AutoRootFragment.java b/app/src/main/java/com/topjohnwu/magisk/AutoRootFragment.java new file mode 100644 index 000000000..0ac4e2ca3 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/AutoRootFragment.java @@ -0,0 +1,154 @@ +package com.topjohnwu.magisk; + +import android.app.ProgressDialog; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.os.AsyncTask; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.annotation.Nullable; +import android.support.v4.app.ListFragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ListView; + +import com.topjohnwu.magisk.utils.ApplicationAdapter; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class AutoRootFragment extends ListFragment { + private PackageManager packageManager = null; + private List applist = null; + private ApplicationAdapter listadaptor = null; + public ListView listView; + public SharedPreferences prefs; + private View view; + List arrayList; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + view = inflater.inflate(R.layout.auto_root_fragment, container, false); + return view; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + listView = getListView(); + packageManager = getActivity().getPackageManager(); + prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + if (!prefs.contains("autoapps")) { + SharedPreferences.Editor editor = prefs.edit(); + Set set = new HashSet(); + set.add("com.google.android.apps.walletnfcrel"); + editor.putStringSet("autoapps", set); + editor.commit(); + } + new LoadApplications().execute(); + } + + @Override + public void onResume() { + super.onResume(); + new LoadApplications().execute(); + + } + + + @Override + public void onListItemClick(ListView l, View v, int position, long id) { + super.onListItemClick(l, v, position, id); + ApplicationInfo app = applist.get(position); + ToggleApp(app.packageName, position, v); + + } + + private void ToggleApp(String appToCheck, int position, View v) { + + Set set = prefs.getStringSet("autoapps", null); + + arrayList = new ArrayList<>(set); + Log.d("Magisk", "Trying to toggle for " + appToCheck + " stringset is " + arrayList.toString()); + SharedPreferences.Editor editor = prefs.edit(); + + if (arrayList.contains(appToCheck)) { + Log.d("Magisk", "App is in array, removing"); + + for (int i = 0; i < arrayList.size(); i++) { + if (appToCheck.equals(arrayList.get(i))) { + arrayList.remove(i); + } + } + + } else { + arrayList.add(appToCheck); + + } + Set set2 = new HashSet(arrayList); + Log.d("Magisk", "Committing set, value is: " + set2); + editor.putStringSet("autoapps", set2); + editor.apply(); + listadaptor.UpdateRootStatusView(position,v); + + + } + + private List checkForLaunchIntent(List list) { + ArrayList applist = new ArrayList(); + for (ApplicationInfo info : list) { + try { + if (null != packageManager.getLaunchIntentForPackage(info.packageName)) { + applist.add(info); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + return applist; + } + + private class LoadApplications extends AsyncTask { + private ProgressDialog progress = null; + + @Override + protected Void doInBackground(Void... params) { + applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA)); + listadaptor = new ApplicationAdapter(getActivity(), + R.layout.app_list_row, applist); + + return null; + } + + @Override + protected void onCancelled() { + super.onCancelled(); + } + + @Override + protected void onPostExecute(Void result) { + setListAdapter(listadaptor); + progress.dismiss(); + super.onPostExecute(result); + } + + @Override + protected void onPreExecute() { + progress = ProgressDialog.show(getActivity(), null, + "Loading application info..."); + super.onPreExecute(); + } + + @Override + protected void onProgressUpdate(Void... values) { + super.onProgressUpdate(values); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/AutoStart.java b/app/src/main/java/com/topjohnwu/magisk/AutoStart.java new file mode 100644 index 000000000..5cd7f141e --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/AutoStart.java @@ -0,0 +1,16 @@ +package com.topjohnwu.magisk; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +public class AutoStart extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + Log.d("Magisk", "Received Boot call, attempting to start service"); + Intent myIntent = new Intent(context, MonitorService.class); + context.startService(myIntent); + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/MonitorService.java b/app/src/main/java/com/topjohnwu/magisk/MonitorService.java new file mode 100644 index 000000000..35290c1e4 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/MonitorService.java @@ -0,0 +1,198 @@ +package com.topjohnwu.magisk; + +import android.app.AppOpsManager; +import android.app.Fragment; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.Service; +import android.app.usage.UsageStats; +import android.app.usage.UsageStatsManager; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Build; +import android.os.CountDownTimer; +import android.os.IBinder; +import android.os.Process; +import android.preference.PreferenceManager; +import android.support.annotation.Nullable; +import android.support.v4.app.NotificationCompat; +import android.util.Log; + +import com.topjohnwu.magisk.utils.Shell; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; + +public class MonitorService extends Service + +{ + + private static final String TAG = "Magisk"; + private UsageStatsManager mUsageStatsManager; + private SharedPreferences prefs; + private Boolean disableroot; + private Boolean disablerootprev; + public static boolean isRecursionEnable = false; + private NotificationManager mNotifyMgr; + private CountDownTimer timer = new CountDownTimer(1000, 1000) { + + @Override + public void onTick(long millisUntilFinished) { + + } + + @Override + public void onFinish() { + CheckProcesses(); + + } + }.start(); + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (!intent.hasExtra("disable")) { + + + new Thread(new Runnable() { + @Override + public void run() { + // DO your work here + // get the data + timer.start(); + } + }).start(); + + + return START_STICKY; + } else return STOP_FOREGROUND_REMOVE; + } + + + @Override + public void onDestroy() { + Log.d(TAG, "Destroyah!"); + android.os.Process.killProcess(android.os.Process.myPid()); + super.onDestroy(); + } + + private boolean getStats(Set 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 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; + } + + protected boolean isAppForeground(String packageName) { + UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); + long time = System.currentTimeMillis(); + + List stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 10, time); + + String topPackageName = new String(); + + if (stats != null) { + SortedMap 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() { + prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + if (prefs.getBoolean("autoRootEnable", false)) { + + Set set = prefs.getStringSet("autoapps", null); + + ArrayList 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() { + AppOpsManager appOps = (AppOpsManager) + getSystemService(Context.APP_OPS_SERVICE); + int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, + Process.myUid(), getPackageName()); + return mode == AppOpsManager.MODE_ALLOWED; + } + + +} + diff --git a/app/src/main/java/com/topjohnwu/magisk/RootFragment.java b/app/src/main/java/com/topjohnwu/magisk/RootFragment.java index 19ca32189..72e7b5853 100644 --- a/app/src/main/java/com/topjohnwu/magisk/RootFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/RootFragment.java @@ -1,8 +1,11 @@ package com.topjohnwu.magisk; +import android.content.Intent; +import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; +import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; @@ -25,33 +28,51 @@ import butterknife.ButterKnife; public class RootFragment extends Fragment { - @BindView(R.id.progressBar) ProgressBar progressBar; - - @BindView(R.id.rootSwitchView) View rootToggleView; - @BindView(R.id.selinuxSwitchView) View selinuxToggleView; - @BindView(R.id.rootStatusView) View rootStatusView; - @BindView(R.id.safetynetStatusView) View safetynetStatusView; - @BindView(R.id.selinuxStatusView) View selinuxStatusView; - - @BindView(R.id.root_toggle) Switch rootToggle; - @BindView(R.id.selinux_toggle) Switch selinuxToggle; - - @BindView(R.id.root_status_container) View rootStatusContainer; - @BindView(R.id.root_status_icon) ImageView rootStatusIcon; - @BindView(R.id.root_status) TextView rootStatus; - - @BindView(R.id.selinux_status_container) View selinuxStatusContainer; - @BindView(R.id.selinux_status_icon) ImageView selinuxStatusIcon; - @BindView(R.id.selinux_status) TextView selinuxStatus; - - @BindView(R.id.safety_net_status) TextView safetyNetStatus; - @BindView(R.id.safety_net_icon) ImageView safetyNetStatusIcon; - - @BindColor(R.color.red500) int red500; - @BindColor(R.color.green500) int green500; - @BindColor(R.color.grey500) int grey500; - @BindColor(R.color.accent) int accent; - + public SharedPreferences prefs; + @BindView(R.id.progressBar) + ProgressBar progressBar; + @BindView(R.id.rootSwitchView) + View rootToggleView; + @BindView(R.id.autoRootSwitchView) + View autoRootToggleView; + @BindView(R.id.selinuxSwitchView) + View selinuxToggleView; + @BindView(R.id.rootStatusView) + View rootStatusView; + @BindView(R.id.safetynetStatusView) + View safetynetStatusView; + @BindView(R.id.selinuxStatusView) + View selinuxStatusView; + @BindView(R.id.root_toggle) + Switch rootToggle; + @BindView(R.id.auto_root_toggle) + Switch autoRootToggle; + @BindView(R.id.selinux_toggle) + Switch selinuxToggle; + @BindView(R.id.root_status_container) + View rootStatusContainer; + @BindView(R.id.root_status_icon) + ImageView rootStatusIcon; + @BindView(R.id.root_status) + TextView rootStatus; + @BindView(R.id.selinux_status_container) + View selinuxStatusContainer; + @BindView(R.id.selinux_status_icon) + ImageView selinuxStatusIcon; + @BindView(R.id.selinux_status) + TextView selinuxStatus; + @BindView(R.id.safety_net_status) + TextView safetyNetStatus; + @BindView(R.id.safety_net_icon) + ImageView safetyNetStatusIcon; + @BindColor(R.color.red500) + int red500; + @BindColor(R.color.green500) + int green500; + @BindColor(R.color.grey500) + int grey500; + @BindColor(R.color.accent) + int accent; int statusOK = R.drawable.ic_check_circle; int statusError = R.drawable.ic_error; int statusUnknown = R.drawable.ic_help; @@ -63,10 +84,25 @@ public class RootFragment extends Fragment { ButterKnife.bind(this, view); new updateUI().execute(); + prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); rootToggle.setOnClickListener(toggle -> { Shell.su(((CompoundButton) toggle).isChecked() ? "setprop magisk.root 1" : "setprop magisk.root 0"); new Handler().postDelayed(() -> new updateUI().execute(), 1000); + if (!((CompoundButton) toggle).isChecked()) { + autoRootToggle.setChecked(false); + } + }); + + autoRootToggle.setOnClickListener(toggle -> { + SharedPreferences.Editor editor = prefs.edit(); + editor.putBoolean("autoRootEnable", ((CompoundButton) toggle).isChecked()); + editor.commit(); + if (((CompoundButton) toggle).isChecked()) { + Intent myIntent = new Intent(getActivity(), MonitorService.class); + getActivity().startService(myIntent); + } + }); selinuxToggle.setOnClickListener(toggle -> { @@ -77,7 +113,13 @@ public class RootFragment extends Fragment { return view; } - private class updateUI extends AsyncTask { + @Override + public void onResume() { + super.onResume(); + new updateUI().execute(); + } + + public class updateUI extends AsyncTask { @Override protected Void doInBackground(Void... voids) { @@ -98,6 +140,7 @@ public class RootFragment extends Fragment { if (Shell.rootAccess()) { rootToggleView.setVisibility(View.VISIBLE); + autoRootToggleView.setVisibility(View.VISIBLE); selinuxToggleView.setVisibility(View.VISIBLE); } @@ -183,7 +226,7 @@ public class RootFragment extends Fragment { rootToggle.setChecked(true); safetyNetStatusIcon.setImageResource(statusError); safetyNetStatus.setText(R.string.root_system_info); - + autoRootToggleView.setVisibility(View.GONE); rootToggleView.setVisibility(View.GONE); selinuxToggleView.setVisibility(View.GONE); break; diff --git a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java index a7b1a9377..8125977da 100644 --- a/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/WelcomeActivity.java @@ -1,11 +1,16 @@ package com.topjohnwu.magisk; import android.Manifest; +import android.app.ActivityManager; +import android.app.AppOpsManager; +import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.preference.PreferenceManager; +import android.provider.Settings; import android.support.annotation.IdRes; import android.support.annotation.NonNull; import android.support.design.widget.NavigationView; @@ -31,9 +36,12 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView private final Handler mDrawerHandler = new Handler(); - @BindView(R.id.toolbar) Toolbar toolbar; - @BindView(R.id.drawer_layout) DrawerLayout drawer; - @BindView(R.id.nav_view) NavigationView navigationView; + @BindView(R.id.toolbar) + Toolbar toolbar; + @BindView(R.id.drawer_layout) + DrawerLayout drawer; + @BindView(R.id.nav_view) + NavigationView navigationView; @IdRes private int mSelectedId = R.id.magisk; @@ -43,16 +51,25 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); ButterKnife.bind(this); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } + // Startups + PreferenceManager.setDefaultValues(this, R.xml.defaultpref, false); + if (!isMyServiceRunning(MonitorService.class)) { + Intent myIntent = new Intent(getApplication(), MonitorService.class); + getApplication().startService(myIntent); + } if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); } + if (!hasPermission()) { + startActivityForResult(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS), 100); + } + new Utils.Initialize(this).execute(); new Utils.CheckUpdates(this).execute(); new Utils.LoadModules(this).execute(); @@ -85,9 +102,12 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView } navigationView.setNavigationItemSelectedListener(this); - + if (getIntent().hasExtra("relaunch")) { + navigate(R.id.root); } + } + @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); @@ -114,6 +134,25 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView return true; } + private boolean hasPermission() { + AppOpsManager appOps = (AppOpsManager) + getSystemService(Context.APP_OPS_SERVICE); + int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, + android.os.Process.myUid(), getPackageName()); + return mode == AppOpsManager.MODE_ALLOWED; + + } + + private boolean isMyServiceRunning(Class serviceClass) { + ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); + for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { + if (serviceClass.getName().equals(service.service.getClassName())) { + return true; + } + } + return false; + } + private void navigate(final int itemId) { Fragment navFragment = null; String tag = ""; @@ -128,6 +167,11 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView tag = "root"; navFragment = new RootFragment(); break; + case R.id.autoroot: + setTitle(R.string.auto_root); + tag = "ic_autoroot"; + navFragment = new AutoRootFragment(); + break; case R.id.modules: setTitle(R.string.modules); tag = "modules"; @@ -154,4 +198,6 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView } } } + + } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/ApplicationAdapter.java b/app/src/main/java/com/topjohnwu/magisk/utils/ApplicationAdapter.java new file mode 100644 index 000000000..e2a777691 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/utils/ApplicationAdapter.java @@ -0,0 +1,107 @@ +package com.topjohnwu.magisk.utils; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.preference.PreferenceManager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.topjohnwu.magisk.R; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class ApplicationAdapter extends ArrayAdapter { + private List appsList = null; + private Context context; + private PackageManager packageManager; + public ArrayList arrayList; + public SharedPreferences prefs; + + public ApplicationAdapter(Context context, int textViewResourceId, + List appsList) { + super(context, textViewResourceId, appsList); + this.context = context; + this.appsList = appsList; + packageManager = context.getPackageManager(); + } + + @Override + public int getCount() { + return ((null != appsList) ? appsList.size() : 0); + } + + @Override + public ApplicationInfo getItem(int position) { + return ((null != appsList) ? appsList.get(position) : null); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View view = convertView; + + prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + if (null == view) { + LayoutInflater layoutInflater = (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = layoutInflater.inflate(R.layout.app_list_row, null); + } + + ApplicationInfo applicationInfo = appsList.get(position); + if (null != applicationInfo) { + TextView appName = (TextView) view.findViewById(R.id.app_name); + TextView packageName = (TextView) view.findViewById(R.id.app_paackage); + ImageView iconview = (ImageView) view.findViewById(R.id.app_icon); + ImageView statusview = (ImageView) view.findViewById(R.id.app_status); + appName.setText(applicationInfo.loadLabel(packageManager)); + packageName.setText(applicationInfo.packageName); + iconview.setImageDrawable(applicationInfo.loadIcon(packageManager)); + if (CheckApp(applicationInfo.packageName)) { + statusview.setImageDrawable(this.context.getDrawable(R.drawable.root)); + } else { + statusview.setImageDrawable(null); + } + } + return view; + } + + public void UpdateRootStatusView(int position, View convertView) { + View view = convertView; + if (null == view) { + LayoutInflater layoutInflater = (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = layoutInflater.inflate(R.layout.app_list_row, null); + } + ApplicationInfo applicationInfo = appsList.get(position); + if (null != applicationInfo) { + ImageView statusview = (ImageView) view.findViewById(R.id.app_status); + if (CheckApp(applicationInfo.packageName)) { + statusview.setImageDrawable(this.context.getDrawable(R.drawable.root)); + } else { + statusview.setImageDrawable(null); + } + } + + } + + private boolean CheckApp(String appToCheck) { + Set set = prefs.getStringSet("autoapps", null); + arrayList = new ArrayList<>(set); + return arrayList.toString().contains(appToCheck); + + } + + +}; \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi-v11/ic_stat_notification_autoroot_off.png b/app/src/main/res/drawable-hdpi-v11/ic_stat_notification_autoroot_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b036d552ab589e46dc6c111cc491ecb59183907 GIT binary patch literal 1029 zcmV+g1p51lP)SP!iIHtQ0R;+FFx0L|I6Vo170t z2uZRWrpTc%=dnxIzw2I?XV3Hh-M`=ed9nN5eR!_xdwuWgbU$JT8`{C}FcKg$I|Fzc z*fk9L378^j^F$3C70|iBW5CV{z#QO0U`DL1leDtzo7v&O+L-?ZESB_p(|}O{%>>>C z_Dllr0}%}app2QG>E7GRd7clrV}3HTD&Ckgx>I56ga12ZLk=5sSU3V09L zBle$_w6N`ZM`9?Hd;lEV;WHZ~ElBL#1l%6;e}Ic6J=iy(+kl%p048apBz@C2pxMByEkfN}AD6XSK<@*`chNk-_4Sg@92Su0l~N`qsDHc9S4g_C8jzVy20jJ$ z>KjSOn=Q$saBS3GnP=pDc5lG%J!k47(|zPx;L&8joxmL(25pwKbtphhL1s1=cs|vw z<`K`r7sa9%(uI;HMxww*zEmZvDTb>8kqbYDxDD1L$DjqZCC|T822ZK+=Y4Ky3%jY-%`j33ad9b0v9= z^Pc%qz&pg^TfXeMXg^6_<*P?k9x}5FBD8l2$;%}zD_YFVv-Y+gI%%IK>5FPKHMPvl z9Q1QZp|dhWk|#%J=jf?*mnU`{?6!WUf$B0zYkFfS zB5ob9D1`pz{jsD^f*o(#9BgS#++VVhcT2jiPe4ZkF9C;!P>+uDBzf=b*L6LxB02MS zz(EPXGm_5k6Ocbw?n?r%kTf1VIAms?<^8Fg$3v1z_c%~ouYd+>t2po<5F#ivBnFL<00000NkvXXu0mjfN^#~* literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi-v11/ic_stat_notification_autoroot_on.png b/app/src/main/res/drawable-hdpi-v11/ic_stat_notification_autoroot_on.png new file mode 100644 index 0000000000000000000000000000000000000000..0fdf86afdc1cf27d5f7fc9a6a7f632a6ac50f258 GIT binary patch literal 1063 zcmV+?1laqDP)b+cklo93YM?hoKNNuSLWpiRJnr2Gm= zk0wBN?p4W|ACh!UTm0)}C?XC8{2L_)1COVHugdNEGQE4i*E^Zh{I4)K`;-$6 zv~R1Lm6Ggdlbb9eY>p3sLuMG!d`Yi#0%`*h5oZFgrg7gi2RdJA$DaKG=dw9v&d-k0 zl78qqSf^8uQVjCIOb3`K-bd^h0CUF9)gS;|{Wfc0tI;1|_6(}ieUKo0-U11BWKCrWy! zu;W_jnMUNk1Guf4b7(+k19sqAgl&?vux=6&Cjn0Zv&uU=`CLi9sl8+yhKflp1deD~ zZFAJD?kUdlE>)`-(9-10P9cu;O(-8gDl6VTqkr$Ej> z<8Rl!Vud7^v;UJOpkqp8?p8Uy8RtuSp${NOSeFY;hK>bX8CLlO_&Pn$1`bQ9$dP$# zJ>4S9r&XXu#2dgVN%=fUTl^dm_PhH5*EyAON9`3;A+a+KMTAeD%gttqdN}Z6>L`q3 zmZZ#JZ)}qSiin+nXMyvIM(3@YB)J3KDiLu#a9`T-VM$l_M$nkp1<2i~<4jGGZhIF< za?w@+eUVDs-%7{v^5B3l5)2;OC*^ovvYaL>UD}sl8Z<6TYUkxG87RG|4svr zzEvg)sfgI4^jq`O_^oal`{u1tASVNKK}nQ#-4;pnlBrHFS$*H6c($b6ar7l-V%}tc z+*@5%X8r}Z-+Cee@@Exa_v&BkBwaZ+g1$~25oV~iKQ292OZqMWvcq4SI@a5ppH`*< ht}_lzMd@_b{0CxCN;J5q;S~S?002ovPDHLkV1f`(@>c)= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_stat_notification_autoroot_off.png b/app/src/main/res/drawable-hdpi/ic_stat_notification_autoroot_off.png new file mode 100644 index 0000000000000000000000000000000000000000..0b2a38c88685e64cb492cf4c82b19c75d981e9b2 GIT binary patch literal 1215 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_stat_notification_autoroot_off.png b/app/src/main/res/drawable-mdpi/ic_stat_notification_autoroot_off.png new file mode 100644 index 0000000000000000000000000000000000000000..8e96789af39fb4d76b6873ff91919b2a39bda940 GIT binary patch literal 749 zcmVX1^@s6IQ*`u0008CNkle^6whu>JlhH$QAFa4Ew=o z5k{^m%*aJ;TDWKLh?fCiiimCjzy=~3Hcj(80Gw7z#q;y?!;a%bB{lFouOW(}F(Jf)l#-cw#x%_X zM6`>U?=kbZWmzX$T3X_g0Ius+6VW6yZ$vC?aXLFYFXnQ&;V6ol48v$@Z*RY=7fJ#Q z4i2WmFnofDdjVh$5f7G^m#Z)g$CD)a6h+aYo}QksD*!ytJ0gVGsuzMF$Pm#^!!X`T zDQ_5tQIpT-kC~?VTuS*602W$XTdx%vjE;^Pb8~YOL{z6~$8ikIT=1D?S)i0Ee0ohv zsnZ|Z+S)c30UXCMD=I2Z644d_s7A!hl1m8y-T;7RrgeFt^FoNv-QC^SOKQ;H-+w7d zl5_erW=6v>z9^;EnWov;)z$U*Py4R`@I0?3j^jsh98Uv40s!?(1tY%iH#?4_85N@d zkjv#R0KgtSR!VL1eSe1#Vnzrdk|as%yp(b}l}dfk;xY62Y&QF@*ag>hpCw6BrxRK@ zA}WaWYhKuhsPC=+x^SOu+Zybr4|;ohw+kWGGjk&%o&kV60B{=-v&?){<04`YGr!dC z^nL%8<2d?yzm25L69mD1rBp2dG!W5i(=?wF(KgM>vaGYVZF|e#kD`bJ0|WJ87(Pgn zWU{id@;CrA=kxh1%&bq6mStVFZCkVZD~bTF>kcd~E@q{ar_$;4$n5OwSP%rYh&aW} zb(UpKR8>_S&SWyGWE=bX`gRjhS_m;7MbS4YWj!LMn0W&L+|*quD=XXI(b4h#pFUVl f@qhC*@FxBMaCJQ?2DG*R00000NkvXXu0mjfRNYlA literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_stat_notification_autoroot_on.png b/app/src/main/res/drawable-mdpi/ic_stat_notification_autoroot_on.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a0e20f814811cea857a839426008c5f80b4540 GIT binary patch literal 723 zcmV;^0xbQBP)X1^@s6IQ*`u0007-Nkl;=^=7fQ8nuWZ+SF2#kPkN@IV@Bv?S`~Tnk79{ zNK3s4f}hyC2SK!mco4*k2r5VrCEc0X*^yl|h_OZJtpmej-Y`FA{{J@*VUq(lc^5b>6j^6}{C=o#C#M^sgv2LLM?jb8WlTUUdrsi_^IP^dvE9Uz2cn$2b@91bs0 zN{2K}J0FY1?rsRE)oMeW^Ccm~Cql>xUDtO}N*{Wj_l9%cZy3h+bpfVnD&cT=(Q%w% z0H~(Z>Db)d+@#|;IRHqe)9IPt_P3v4+jc)9MiCJ_&m)YnBb@V{x~{*{b^Rk_>;Pk| zx4XOh86l)8rTjcLHg>rUs8lKwuIm=0l;A^L*A1dS6-DV-1HfuBnLOAA6pO{ZQp$Y* z&?}{!LBt=P=NWzkfSUlY9{^H__|Ct+5aMe#n|6~@?U(=>f>#|T6;O_TKW^ej7$)32&(WNmHj zX($wW!Z|;rs_M9581{ONCjgYosn6lIWez958Hl~N8C3WX0F0!pRQ zK&#cdfrxfKpRZY#HBKqLrmAW+m&?^RYI|F~rTtIK{|W!$Hz`aHzwH13002ovPDHLk FV1j?_P@4b% literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi-v11/ic_stat_notification_autoroot_off.png b/app/src/main/res/drawable-xhdpi-v11/ic_stat_notification_autoroot_off.png new file mode 100644 index 0000000000000000000000000000000000000000..9436172df604bf6df2cfa31659b279a5623531fb GIT binary patch literal 1620 zcmV-a2CMmrP)AVbp=bx60S?@}~0Ol-c02=_e1N&qf+4z5em6CD0&HzbomtzsJB`^cnJkfj0 z?kDN7b}`he8?f)+1snz}mie*&O!t`%43+eE0$?043Rpgwds_kE`vnfb8$^Ty`AlG$ znyj=lDV8_k1lE&5QY|=u> zZqrYa4J-jT=qCX?mP5dMzz|8VHZiDYE>xW8lfZs0Hui~5kmUUC(_a>FDs}LdapPN> zF3C62NO}$6VxWpTd=6kbIP0s{8q8XEs{RW$2$e!D?cmC*Xf#m1D31U+>e=!^1r3{?Z{KE zU8u@<&zVu>TAc#82{;B=y3zgiR>=VVce{-NM1*zin*(}lSL4;jN%DI!pL7CX9cKt& z&x{&0wxExS10_At7Xaq-CuYpDT+c3LDzIJ~BY!Caz%~WxGyN{bMwy1pl#~W}qYG>7LNx$R0mc`VS36Z#XXf~2b!OcM zO#-V@WD^8^1`rXh!X^MmBt=WBz0L8{ve8A0LES9L|L<6O0bsC8M8FSIDZjRO>|6ts zm6>&2Zu<0J?%48TLZ1Lc#0tRqz?jSc7dLe`Vt+T0yQp2wTL-MK08F881a?g}GTS@| z@S~TyOKyuH6m-J?Tw+#+{5r1#R@8&|UN&2+O&9uCMh;UjwzRe;gW2*sfNTuS9 zy{-%NR^_FG`3Jzko{Qg$DUw{N)k-@6j{*nQuF!i0$IxU+d19#CsT}~HPF;tg_vXWw zMQ}ToYNZlDL~IQFuXw0ktv3oEyA>(PZOK|`1;7Dn=D9`13NBdI%*I^`x|(u9Qi=(l z_0osSznQT84t&wVI+MDSCB0i~eK)i?BFuYk$QF02WK5Y7Bf^#00l+;#S~8XZTpPQ+ zXdr!(j^2TylkhOGZ?dbii8~9^%64Hy_y*mnGuSG5A2=lKk9LcqQvl9N?)k5tY-nF~ z6V|zZo7Q?=QRcp5q@p`x*nO(Vf+5Iz{QgOE5;*YByd$5 z1a_qf^W;-#GTW*GX(Gng}3EAc}%RZ=S#YYeIr0B%^FoAml^ zg!#G80$B^7Xs4KUUY-=~&gCx@?Ludv5~zut`=hD2SaHXC!))An-gMfeu4`!m zz+V_`{D@>1=kM{7JYE{_6ZZ4(0=*Q|5!b-|fc>+tHxA^nlCJOC`X&!qM7Ry&k}-7) zGtT~!{A!i}%slNDX%XWZ_*CHV;sA1PHL=J>RjjlTt|m9&FDJu+J(3k?;51N=*P*$KSEiFO72~eV4Bn5!Oqo!(2C`BEs!R zf3({uoAZpTx4r~&Er4!MCY@KbUfdSkDqHUZ(+x?Fce~F*0nn{+P3A4~0R9Er4Aej( SF{Nt&0000oAxeX&6-1jDkw~<$ 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 SbjmCM0000^ycCsh5_= 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 JPDHLkV1n%{;KKj_ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_stat_notification_autoroot_on.png b/app/src/main/res/drawable-xxhdpi/ic_stat_notification_autoroot_on.png new file mode 100644 index 0000000000000000000000000000000000000000..49c77b52309d74d45410098ea88a94b291941826 GIT binary patch literal 2697 zcmV;43U>90P)*;iUnXr(?{8G$kgKA=`$P!Q>$){&Q@&`>~a=wt7>=jEJEHgj^>WRq++3^Td^ z?CibY`M&S>ecw6X<3R8sf8d8)e=rH)gZAL02PQpGrUfQLs7wQvy?oLGWt*@}29q8r z(|~0!pY%Z4CM=Ud#XYcn`}Qj!gc|?=mutEn7DD9Ku3fv?uYYfE@3{z}rvU(GYTr&k z2#lCJ2~ewAcR0l2_S@d(=?xGY;3&F4Fw>ko)B_3=X@pr zLwc3nrfJ?83WW~&0aq-9cI?>=E0oD(9wLNX z4FIt8_ZZ`qQ>ILLu)e zhdAd!pY@*&1OjUt8X8`J5XuPw;5d#|TU#5Ul*WV*N}%#La9{hA}M7XW9)0%MpUQI-wea(XliQOrCUFj z%hhqte@iJ{;G=&NA+&n#+`0Sxo42sOA^--C&M;$azIGJ45W-&o075M-EpHYSa2%(q zwzl>f&+~pNgs?Pvbz1GTEUP^f3cWg9zB}yzy1Kf~wk&It=XoonlmSifKMljkH8(eR z`c9rRIOlh{uDjHyq^mY>e}DgDj^n&<^H$6Q*=+Xfl+p-e>=IoegwSt<5b;PP^1Nn! zqo$_jQpVUm&iV8q=R1T?nx^@!k*u%iPpbzU$Elt*Yt|i{^HrSl*;+XK7h`-kW9;^5 zGU1!jtW3BnVg9+ zz6CNzfj7$6Q%sXUVAVSiF~yrfPoEs86o6hDP@&!qp3|> zsP8BA7h~Mp+S$({T;T-=_H}Kz(QqF@APW64yODW%i5cd1tt2+No z2;s~k{0>0~y?}x+TY)Js435%^;w|)!&@M8eLki-Q5ct!}ZDISmiQs=X6 z+qUzC5Iq2ZCE9xlAv__3SP+ZF`ifPZ!|76XB1@%GA$gkgs44Jh-ogRe9g9Pz3m(|jo>(k)<5*4}UEa6>B$LTMc%JuZ-vr@R%d#T<{r&s& zi9>gHx2jv(2qC8mFztBx2;m*k zX!I|-Lg{pR86hOeIX_oBeJDccpp^0o+qRFD4Iq=roWmIVieVUwgb)BBr0VXXzl^bk zsz;Dg4(VYH!}ybBSuaT`m2#)nLkJDd`FzjwE)qf*+UesVgkGzzu6~wt4vWc?Qtnq} z%y1KlAs$F15~>M_aL%tPWep)jwGcwZ@(>Rqgia!ah7MmLM4WR=2vOzZD~!s z@yo>+|591}PLVE*&z^%>A&3_*afM(ZqlOI%xTud&6umb>)v2FW}k^s88y6Qd8 zQx^_36BQz*&cKrD9r}WI*)6;XcnoLtl^?Nau6Q08u$D`5c6QfnI6kSOGYT6bI2A8|8d#_@q zw|f}lZYgCl9*_U4AV>{sgTY{2U2F&;>NNUe7~}f^08Qm&-Z6(zM@Pq5rfJ?w2)R;M z9wDScX0_|Ozt)GZi9}+d5aKpU=`vq$`=aU*Y}>xClvT&_eMAooOeHSQ=kpJ6&h-{h z$#~2(&2`ae^dGvwWHPyy5E2qXoUgrS5W)vc(~L$Uk=MtfU@6)W0XU8`GZ+lskUrMkO`A5oU0^hjE557RM%A?Fn^#>@KnOS5wtaZQ0I2zm5Tea>-5Y&E z1wv>=AQ0Hs($bRG!e`plsZ)1RO0QE*j<)7i!!Q!IZRaYXyy98Z1BpapKBZJ$lYYY| zSY6aD@+YFrn>W`PhS9?qQ?<|FutU4B+ zlO7n0wJJe7>48dEbu2t5Junt)Rf2ZX1C_AqSa|*)ary6;%VLKc00000NkvXXu0mjf D8D0Q} literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_notification_autoroot_off.png b/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_notification_autoroot_off.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec7c01d8eeeb16b592055fe415a3e79758e621d GIT binary patch literal 4409 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_notification_autoroot_on.png b/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_notification_autoroot_on.png new file mode 100644 index 0000000000000000000000000000000000000000..3d296475d7b79307aac368aaa18def78779beba4 GIT binary patch literal 4512 zcmV;R5nt|!P)DN9y*A#Hho8X!P zt|?$Y3AEPUDaofL`PhEF@!*aRN^*}Rcd4qo%s#cX_9{u)y*~(@PPF zsH!Kdz4nOn}~;bm3;^z-#e*l5Cky@3EYNxPDn zxIvQVRn_wb3SiPWbqf8OB=5O#s{S^~UnlwVs`{HNp@7yJ8*f)KIp5YHD8Y@K?=zBc zz_;#D@g-HoZeM4$)|i`5Nb>RhbiM6{P;Z~)_me!RsvdJy6u=xXKOfu`Kv)~X|6!7awo>^7@F;IY01@ALwpSQ!Q;(Y%w$$gVNpsG0f6Rk_5fYzGt$|SsFM>C(f z@x)IPnI-`bf2XP_WOcRHm>Yus?5>Crq+Q-`=d=Cb?9-|W%stV%ObU3VB%tT}cItr- zn5{=7`MV^4+6lPP?swm}O7e9{z95McHgdj*HW2ntx&rut=U3Ixv2SVRGAV$QWcNR& zV}BTZ)uJRJ5X>h*iFzNp20i{M+De)<0|lL83p z8@uq|d&1AK$9B7&fAb^{Px5b7g*5v=tF^|_!ur@wffxAczq!`d-iboOt9T+>q$NE5~bq)MZ)V+ZS6Iad|8LJ@3z4wiJrw2KbJ&s_l&hu zbsXVeiWAUx|NC^z|CQYb%%1aMN$!^9u1W4wRZhfpR%?v{C2!zv z|72CkD;#89coWoGV`?y-f+G(2-8Y{6o?vHpzJjk+dbsmGvR>cZxqps#bgGy!yPi^S zUR6xoLDq#|4k5No%vkF=&d!U$|aY8QJpQ2_U=hAo_DLN z=N?4*7u^ZB|FO}cU92Z1PzE%#wm?MOJcNSz^l!}PDn@UuIaM-VlKFW5*}8X6JBlkF zbKJ!H?8XN@0UcKh>j}!=5mMQ81L64JqB}}a>TGegSkL=)j$R}@TXsDKh^(2SwMBX0 zE9!w#AK87uE|IU-_)hW2l=D*c_u8qUB|a0wAep^~~C?&qD#6_Cu=bkIqT~>@!m9^E+DE$|!9; z%o3H(qSNIbOvRG_^>=HRs-SSq)?$L(k3zTZdGuah4-!AAs=(*fb?6gdm&z!8MK>Aj z_f=gKAWbP-rg-2?6u@M_)nD7~Kl^=E7X{#<)Cvs&#Gy|B^rM_ZT5mx@S5*Og07UlK zs``erIsr(sA5Ze#8?540P>S4vm;@F6qo=NbBSF&-_7iXwggkpjQTZQBTUM2v^y&J5 zUa9u>Nxr>Dtyf(E67|0=D6A@qICTZ6R)DS129VG$Fz@=TBr(aaB)M}{p)yWg0cZ!P zhXQ1mM6poORb7I&pJIk)CF=)6L7iV0h<#8`oGTUF3Un6bcpU{w4a!i7s7Fi0i*oqq zP7yzKL&JC;w1~v}i1S%)fo6U=;nvfdCn~n;H-mz(r;nU9Z5&Ji`)u>pnv){sDCY~t zg0Q27Y5?yX>)Tb80;%C@tzkQ*8$Y}=pR<>vowXY&V}I5mS#SZyjYAR?{!l00Mitajjw&9Mu-tM~L%Nrw2XDS8 zCP=#RJ34`9m#)?2AlpDY)o4GfCchU&jZ%*K#Z6ygb{V@o_DV*y#JZ3 zb5%f3ITH34_L39nMuJ-F^I{G-U;N4qtLm>dY`>g@Ocx%84_M2jEvHJ+F0-bR;t{h_ zmP2dhycK}DfKJ$c^o1$~h-mG5EvSO?RTL%rHFLgl5)`Z3Q6bkFBBKEIAEMG`s^FIM zJ#n@3aTRpl3Xm^=PM9Fc@!2kgepEX^DEO6C_}Oj0Q$?v_5+#g+#ILHVOxL+6peOI`NEjXN*YCv?tvN}~R~ZQV&-p62eetLxrL`u_D1WTd86~2sVzdxu z(3FBJq}iD{-{lLPmjdi`!58QFBORZMgx9{$l38LVeyd~jmrcq|IA67%3T?sKQTHSn z;A`Adr@O?-!3wT+Jx1rH08uZ9NC8R%N5xj21Fx>s+;yj_QgF3~`#lTv#HWCs`Ug-D zqtX~Yg}@bY>7r5RzuH5vt1wUUy7N*1!Kj|l67)Hfh6v9@P+CDzx(^@KWp+pl>Dc*{ zD!6mXMy2NZycBQQ{qFtJvxt2Ezmm>N0m{Ik9!dZaN7MrwtqbKhdaDtLxLWVi6GDmr zR8MohYKdmciBfQdE{MYsDFBrrw{V=L{fSw`Lp|_Jdc^urJcQO_TSvo-c6ks1 znD;L`bY%ONd)aBLeE*RTa}SDSa*%slN`>`Z5Z18<>~%!OVH;6%HeHgfH8cUT47$MA z%+iIsDBhjiA#gFW@ruMQYHzYQGqE{{K^0c3*UOx^V@*h0d;Tp2EK#cf z2L!$9OY&wJ0CJCg<^(N*+)@C_82Z63O6|?2NL>Zxs2ei$bs5yO)rYnzlPv`Z>1D0H zC5iMQoPCvjfU-r*EJdKk_ogtm6ae!tFw~$V5$rDYp6=^)B2+=wtk%;mVM{qQe_gX? zIHwR85O|3xM#0%H`=+Tq{tue1?EKWT{*X<08!x|L}BJ9{%Ye>Cz*PSrnj+Tix*k?-9_ zcn4QN?-RhFn!$s@n2nZPhTy44`{_Pfa&-h`AFM4Jce3OXR8!BEbfd9lF#BGkC3g|z zNndkN1soaHp%mP7D+*vDMhvBVuQ@yf1zi|yu}YG4^P|+9S(8g1m6|WIkZ%0VKDI{5 z$=(k0q(VM36Vxjcm>VfUlg*_bXG^|UExx479Y+lj{ZxU#DyW$?!XKp^7es}zRC2-; z?KN8RGz5PtPPnxOktmAgcoj#DetTv4d;tw7$@v;;aUJy2PZejYcIbzD!R_o+$?uw$ zB4QOZJ>{bAenL2y3F^ENL9x$FkFt*sq};Ap1*G6IJKW`5+7XG=Vx+Ci<)qc1A@ zIk*Wr(x?snsCb?Y!IM>zS5<0qi;dBeB59{etqU88}ohpfT4qenLalSWSbDGEJ zkSBm}T+9zMF-weN7480)*L;qCQpAJzpw6^(iWQBIGIE43Wq9Xq*39ZrZg>a^;?#6- zNCgPIIA3{V#NFCjhAN4C{rCYV{P@XeNu}lxk48HMx3j=&nHh(AxXp2Y&+F7Aym8}0 zD!?u^8OpeVQB6Mf&`!1cIbV?~h&aOjC=3c!>yLVv0S8eu&WG*4_vptO&P&jv&)r)A z-9#*Ng6vYxcT_us#A5#;6s)2+U^ZG(&}F)zzzg{{J5?&@1YS2Z! zZsdG9UZ;xVU7YVosK`8YHr7)W^;Rk4g;LHw3J@T1xPJ7~HCxOC(?Cdm%~TvPT&*V01*;+5!!5t-{s5nZX60QbI$Jt@G~Rs zN3(>;S3(EtdE91;3!$5R6aXd)kQT%;veRg1rsA$urL=qId~rQ|fDU&jOi9cLS!r3q zrYe#eo~jEW#&I-AvfNKgkX9=A1$Nx9Wk=u`5>q0000u3XT&R7@EWnB(JqENuY6h zalnk?e{8UWm~a^=b$)5(QX z20(Xr_dgqBR%xyOB#b}+7?e`pxOVN@+fPaWa=F|Ft@ZVYcnSb8L}bCg(P;F0obz2; z>m^dk^8r9;t(g#l`fIKAtBkRy8yg$n3WDS~j%;XXSY%n&m7MeWN5+l*^_5aj95`^` z*N)?;;{iNn9FWW9Rx72x1puE2Bc8yJQf?JOyaWK38)L3OM7szi4*(t&LUgWPz52g` zM09j?EL^y7;YEme4{=#BxQwyGobyg&Om9)Ex^?UB56+R#=a)$-uNxT|`8H#$KKR|TtQ|s#Esc$hPfiN} zU0q$D1c0lx*6T`f0O$NA&bjOR{$CLLBO(-?WWgA-BN~lvX=-YEE=WXwfB)aQuDe+& zbpawq0^&6wrM#t3C~RqMZ9OzC0OWGHC5*8ZN~z9L8vuX-05Haw#eqJWF-Anhgb-+dvd$ol&FF86(ZmGAq@!w3{Y&<%8NB9VA)+5n)1^ZEQ2 zJ=_}%w~R5bCK8E}Vj}wb`cCtGzeOpv z))-TKYtYsCN6z`9ob&HBH#hGYk9hh%WgcnZu%oboIHtQZ;^I#3S#PdNwV^Z8Q|@e1GfZ)J>q zu#6KSnZ3`p?K@(z*i*&*9mla78XC?t#@wZ~zJ!dXzbz;T?p z_4W0iFvjdO#(b!ZjlDybU-0y4Tqcugux0COB}fV>8ja40L?Uy?TTn{5kcdY_x(&`LaTSv1 zw=WWjd{-&;tKghc%FiI;^{(sw6#&>pAd>Td#5n*!4$~h??MEp!^xk{#`N7+vDh}xF z?Y)pO_Qm5wdyejd^ng;TUMckvL|jy2g9ZQ&+qV6(5aQinA7cy|KNo1NgC;fE2*Z|T zy=Ga~f#V&9G3IV^z8V`FpD*rL6#zXwJzvpUe@AQmsqr{~z9XU>by}@?4H8riCFaWt+?%P`HX07!F_dc>MDd2B52}iyV=(F(x$LHxmdB?tydu3&z;*lgZ@O69T|-9KLALq7AO=wwGz! zkBJ3N$2b7E4*-6fOeSxd5C9bDK*Uzx_bK2xBZwcWRcB8b`RT=Wm#!N{COggcxFNXgKlzF*I+rP-r3nnal5Y> zV>Xx5f3(j4V~oPt4+$Y|L`2fq4T13#@#*qBZ_^Do+%U#ws9>%4yG|JZy}i9xc%Db* z>(?vTl(8(U8vvd##@tQ@REXXGqGeh6=H}*Y!C*-R>m2PmWdP)Ixs=v=rSJQt%->M4 z5JEgAgxKf0?sXxda@zQvob#QjRBBAJWX1rH&1RP}#@a_ue_jPTfU-relTEL+{&--V zK}658tR|(@?v|F8G3l}y13-6o_cwgsr_|V`Aw-Y^LrIWO4q%KGgb+$8H9uf4P`c|? z0QgQSm3q1wV#CHvx(JY=R9|1;tCXU2*XaQwC~)B;;(|(zA;#F7Fx~;$@W*z&U?~b55c17t-nUdzFqa)qhesfPx=&b#*I7 zMn))Re_n_^{ty5>NuK0rkTe+BEVa*rob$&Jaoy6TOAjnxzMN8LlhP&?fJ`Ry5yn`* zQtCouOhbUp4@xPi8suSPOp7t*Qvk4_Oa-||2(fi|czBEBIE6`}d~}jY1Ar_<#@HpU z>pp0VnG?ePPg$0=6%l`Fj7b<{{(&(TOp1olM*jZ8LWm7RLqpGvSMX3NIFklICX@M? z5aOzlk&*Rb3Jw6eg%J0WOUf9#%J+TB7@biD2mFD|*mOFbtdzKN`iBBA8iW5EVpGm} zSq={(eo!fOzUO&=7Dkk9+fPU-|A%vKeBVFAbzO=kjhimxoD%@QjYJ~H&GjMT{{p~M zO-)S|8Azc3Y~H;2EGgwmtu@8{%3)Iqdqt_rBP3(<{y}igNs*EK0wP*kYl;sB)8b)= zMz%lM0LPVm0C+=6`FJcAYcJ>IkMs!zAe+t7DN=-%yuP3_Qpx-$tS{&MZ6UV_TyLji0%eOd?`ziiuf$Du=q?hV@Rx88c|*|u%3qB2@z4CVTd+ics; zGsbo#lgVF?*SDJQRRKWxdad=fp6A^VX7&mpwlT)Gwzjq&Q|CkR0@rmv^7ywFl=W@BPDy7zVp7+^+>{FUsS(X(y#{63_ZZ}#i z@%N)QOj);wl=5d%%DWSZ#P-P`c)|c|+O%mN=RB>HqH2wW!BRCuq+I=~R4VmUFl?RA z=P&U*k0Qm_jd$`#z5~Es%d+lCCX@d%BLE;GT-R+>O0A&0e}DttqPU$9;;wW$P0`(B zS~i>grc!EsC82U5#39c4J?V7%`WXR0Hk+j~)#bkLQ?*ucQvmP^BChm2?>CO)98;}D z%1;Qf+Vi|vDUY!ffl|sJa?Y<$CX)vzBN4Cc9~3OIVn!x_rDMzl&(AaNBSsKCkY`aRknV~k|obiW;~GgQMMAKQng4V zLhQd;YyIaTGW?8`a%XF6>lkN*Lgn-3&7+(jDbEiF#D+M>L&Q1sS|Ut0NGYGRZ96+S zIQZ}7mcW)PE@cCd$z;v|fSBibU)Nfn8M46rmSx?NPN!cA7(TMDu5PK;I;WKSEY2c!&<#I?_ zB0x%T@7}!&ZQG{0oui>_dh&*d2Za!Cw6(PjhAm2BFfcGcMbh+m;u!XpQoh>S+Pa^v zSk5^aS51gWWw>J+0Q{e2S=#|%%Z$wqmy3F^pW`^uXf%2;BHp64rh@1(juO2iv~ByR z#+VJQt*tLtyH;>qSsXA~iS@GfxeGYEV0w#?(0AWID}iXsK~PHK?6TV`?05GM#2MwA47D8q`jvF*Oc2nNG7B lT523n4QeOTm|4#O{}0BMt?XTPf+_$2002ovPDHLkV1n?4VW|KB literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_stat_notification_autoroot_on.png b/app/src/main/res/drawable-xxxhdpi/ic_stat_notification_autoroot_on.png new file mode 100644 index 0000000000000000000000000000000000000000..53cf319fa2e0c060b5acb9ebe3a273a357b8ee4c GIT binary patch literal 4098 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 C)zA|F literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_autoroot.xml b/app/src/main/res/drawable/ic_autoroot.xml new file mode 100644 index 000000000..a8f96a803 --- /dev/null +++ b/app/src/main/res/drawable/ic_autoroot.xml @@ -0,0 +1,4 @@ + + + diff --git a/app/src/main/res/layout/app_list_row.xml b/app/src/main/res/layout/app_list_row.xml new file mode 100644 index 000000000..b69170f44 --- /dev/null +++ b/app/src/main/res/layout/app_list_row.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/auto_root_fragment.xml b/app/src/main/res/layout/auto_root_fragment.xml new file mode 100644 index 000000000..07aed4038 --- /dev/null +++ b/app/src/main/res/layout/auto_root_fragment.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/modules_fragment.xml b/app/src/main/res/layout/modules_fragment.xml index 0f9714854..6be729765 100644 --- a/app/src/main/res/layout/modules_fragment.xml +++ b/app/src/main/res/layout/modules_fragment.xml @@ -30,4 +30,14 @@ android:layout_height="0dp" android:layout_weight="1"/> + + \ No newline at end of file diff --git a/app/src/main/res/layout/root_fragment.xml b/app/src/main/res/layout/root_fragment.xml index c143bdcfa..6a68aa78c 100644 --- a/app/src/main/res/layout/root_fragment.xml +++ b/app/src/main/res/layout/root_fragment.xml @@ -34,6 +34,24 @@ android:text="@string/root_toggle" android:textSize="16sp"/> + + + + + + + Root Toggle + Auto Root SELinux Toggle Root Error diff --git a/app/src/main/res/xml/defaultpref.xml b/app/src/main/res/xml/defaultpref.xml new file mode 100644 index 000000000..f653c2e85 --- /dev/null +++ b/app/src/main/res/xml/defaultpref.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file