From 543f435b1e81099f7adf2f5d6398486463aa5f3c Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Tue, 19 Dec 2017 20:59:59 +0800 Subject: [PATCH] Massive improvement of Magisk Manager repackaging --- .../com/topjohnwu/magisk/MagiskManager.java | 2 +- .../topjohnwu/magisk/SettingsActivity.java | 2 +- .../topjohnwu/magisk/asyncs/HideManager.java | 14 ++++++- .../magisk/database/SuDatabaseHelper.java | 1 - .../magisk/receivers/DownloadReceiver.java | 16 ++++---- .../magisk/receivers/ManagerUpdate.java | 41 ++++++++++++------- .../com/topjohnwu/magisk/utils/ShowUI.java | 5 +-- .../com/topjohnwu/magisk/utils/Utils.java | 22 +++++----- 8 files changed, 61 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/topjohnwu/magisk/MagiskManager.java b/src/main/java/com/topjohnwu/magisk/MagiskManager.java index 35445f809..698c94101 100644 --- a/src/main/java/com/topjohnwu/magisk/MagiskManager.java +++ b/src/main/java/com/topjohnwu/magisk/MagiskManager.java @@ -111,8 +111,8 @@ public class MagiskManager extends Application { if (getPackageName().equals(Const.ORIG_PKG_NAME)) { String pkg = suDB.getStrings(Const.Key.SU_REQUESTER, null); if (pkg != null) { - suDB.setStrings(Const.Key.SU_REQUESTER, null); Utils.uninstallPkg(pkg); + suDB.setStrings(Const.Key.SU_REQUESTER, null); } } diff --git a/src/main/java/com/topjohnwu/magisk/SettingsActivity.java b/src/main/java/com/topjohnwu/magisk/SettingsActivity.java index 1919a2762..2c74eaba3 100644 --- a/src/main/java/com/topjohnwu/magisk/SettingsActivity.java +++ b/src/main/java/com/topjohnwu/magisk/SettingsActivity.java @@ -148,7 +148,7 @@ public class SettingsActivity extends Activity implements Topic.Subscriber { hideManager.setOnPreferenceClickListener((pref) -> { Utils.runWithPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE, - () -> new HideManager().exec()); + () -> new HideManager(getActivity()).exec()); return true; }); } else { diff --git a/src/main/java/com/topjohnwu/magisk/asyncs/HideManager.java b/src/main/java/com/topjohnwu/magisk/asyncs/HideManager.java index 0933621f8..7570cc13b 100644 --- a/src/main/java/com/topjohnwu/magisk/asyncs/HideManager.java +++ b/src/main/java/com/topjohnwu/magisk/asyncs/HideManager.java @@ -1,5 +1,7 @@ package com.topjohnwu.magisk.asyncs; +import android.app.Activity; +import android.app.ProgressDialog; import android.widget.Toast; import com.topjohnwu.crypto.JarMap; @@ -18,6 +20,12 @@ import java.util.jar.JarEntry; public class HideManager extends ParallelTask { + private ProgressDialog dialog; + + public HideManager(Activity activity) { + super(activity); + } + private String genPackageName(String prefix, int length) { StringBuilder builder = new StringBuilder(length); builder.append(prefix); @@ -86,8 +94,9 @@ public class HideManager extends ParallelTask { @Override protected void onPreExecute() { - MagiskManager.toast(R.string.hide_manager_toast, Toast.LENGTH_SHORT); - MagiskManager.toast(R.string.hide_manager_toast2, Toast.LENGTH_LONG); + dialog = ProgressDialog.show(getActivity(), + getActivity().getString(R.string.hide_manager_toast), + getActivity().getString(R.string.hide_manager_toast2)); } @Override @@ -136,6 +145,7 @@ public class HideManager extends ParallelTask { @Override protected void onPostExecute(Boolean b) { + dialog.dismiss(); if (!b) { MagiskManager.toast(R.string.hide_manager_fail_toast, Toast.LENGTH_LONG); } diff --git a/src/main/java/com/topjohnwu/magisk/database/SuDatabaseHelper.java b/src/main/java/com/topjohnwu/magisk/database/SuDatabaseHelper.java index ebb1a2500..ab3e618c5 100644 --- a/src/main/java/com/topjohnwu/magisk/database/SuDatabaseHelper.java +++ b/src/main/java/com/topjohnwu/magisk/database/SuDatabaseHelper.java @@ -4,7 +4,6 @@ import android.content.ContentValues; import android.content.Context; import android.content.pm.PackageManager; import android.database.Cursor; -import android.database.DatabaseUtils; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.os.Build; diff --git a/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java b/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java index 3500e02b4..5cdff9c87 100644 --- a/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java +++ b/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java @@ -12,11 +12,11 @@ import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.utils.Utils; -public abstract class DownloadReceiver extends BroadcastReceiver { - public String mFilename; - long downloadID; +import java.io.File; - public DownloadReceiver() {} +public abstract class DownloadReceiver extends BroadcastReceiver { + protected File mFile; + private long downloadID; @Override public void onReceive(Context context, Intent intent) { @@ -45,12 +45,14 @@ public abstract class DownloadReceiver extends BroadcastReceiver { Utils.isDownloading = false; } - public void setDownloadID(long id) { + public DownloadReceiver setDownloadID(long id) { downloadID = id; + return this; } - public void setFilename(String filename) { - mFilename = filename; + public DownloadReceiver setFile(File file) { + mFile = file; + return this; } public abstract void onDownloadDone(Uri uri); diff --git a/src/main/java/com/topjohnwu/magisk/receivers/ManagerUpdate.java b/src/main/java/com/topjohnwu/magisk/receivers/ManagerUpdate.java index 8a9656c77..955ea1a10 100644 --- a/src/main/java/com/topjohnwu/magisk/receivers/ManagerUpdate.java +++ b/src/main/java/com/topjohnwu/magisk/receivers/ManagerUpdate.java @@ -8,6 +8,7 @@ import android.os.Build; import android.support.v4.content.FileProvider; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Shell; import com.topjohnwu.magisk.utils.Utils; import java.io.File; @@ -20,25 +21,35 @@ public class ManagerUpdate extends BroadcastReceiver { new DownloadReceiver() { @Override public void onDownloadDone(Uri uri) { - Utils.dumpPrefs(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - Intent install = new Intent(Intent.ACTION_INSTALL_PACKAGE); - install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - Uri content = FileProvider.getUriForFile(context, - context.getPackageName() + ".provider", new File(uri.getPath())); - install.setData(content); - context.startActivity(install); + if (Shell.rootAccess()) { + Shell.su(Utils.fmt("pm install -r %s", mFile)); + if (!context.getPackageName().equals(Const.ORIG_PKG_NAME)) { + Utils.dumpPrefs(); + Shell.su(Utils.fmt("rm -rf /data/user*/*/%s/*", Const.ORIG_PKG_NAME)); + Intent intent = context.getPackageManager().getLaunchIntentForPackage(Const.ORIG_PKG_NAME); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } } else { - Intent install = new Intent(Intent.ACTION_VIEW); - install.setDataAndType(uri, "application/vnd.android.package-archive"); - install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(install); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + Intent install = new Intent(Intent.ACTION_INSTALL_PACKAGE); + install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + Uri content = FileProvider.getUriForFile(context, + context.getPackageName() + ".provider", new File(uri.getPath())); + install.setData(content); + context.startActivity(install); + } else { + Intent install = new Intent(Intent.ACTION_VIEW); + install.setDataAndType(uri, "application/vnd.android.package-archive"); + install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(install); + } } } }, intent.getStringExtra(Const.Key.INTENT_SET_LINK), - Utils.getLegalFilename("MagiskManager-v" + - intent.getStringExtra(Const.Key.INTENT_SET_VERSION) + ".apk")); + Utils.fmt("MagiskManager-v%s.apk", intent.getStringExtra(Const.Key.INTENT_SET_VERSION)) + ); } } diff --git a/src/main/java/com/topjohnwu/magisk/utils/ShowUI.java b/src/main/java/com/topjohnwu/magisk/utils/ShowUI.java index 0023eeff6..ec89fddb2 100644 --- a/src/main/java/com/topjohnwu/magisk/utils/ShowUI.java +++ b/src/main/java/com/topjohnwu/magisk/utils/ShowUI.java @@ -98,7 +98,7 @@ public class ShowUI { public static void magiskInstallDialog(Activity activity, boolean enc, boolean verity) { MagiskManager mm = Utils.getMagiskManager(activity); - String filename = Utils.getLegalFilename("Magisk-v" + mm.remoteMagiskVersionString + ".zip"); + String filename = Utils.fmt("Magisk-v%s.zip", mm.remoteMagiskVersionString); new AlertDialogBuilder(activity) .setTitle(mm.getString(R.string.repo_install_title, mm.getString(R.string.magisk))) .setMessage(mm.getString(R.string.repo_install_msg, filename)) @@ -236,8 +236,7 @@ public class ShowUI { new AlertDialogBuilder(activity) .setTitle(mm.getString(R.string.repo_install_title, mm.getString(R.string.app_name))) .setMessage(mm.getString(R.string.repo_install_msg, - Utils.getLegalFilename("MagiskManager-v" + - mm.remoteManagerVersionString + ".apk"))) + Utils.fmt("MagiskManager-v%s.apk", mm.remoteManagerVersionString))) .setCancelable(true) .setPositiveButton(R.string.install, (d, i) -> { Utils.dumpPrefs(); diff --git a/src/main/java/com/topjohnwu/magisk/utils/Utils.java b/src/main/java/com/topjohnwu/magisk/utils/Utils.java index bdf1eb7c7..6f6915080 100644 --- a/src/main/java/com/topjohnwu/magisk/utils/Utils.java +++ b/src/main/java/com/topjohnwu/magisk/utils/Utils.java @@ -68,7 +68,7 @@ public class Utils { } public static void uninstallPkg(String pkg) { - Shell.su_raw(fmt("find /data/user*/*/%s -exec umount -l {} 2>/dev/null \\;; pm uninstall %s", pkg, pkg)); + Shell.su(fmt("umount -l /data/user*/*/%s/*/*.db 2>/dev/null; pm uninstall %s", pkg, pkg)); } public static void dlAndReceive(Context context, DownloadReceiver receiver, String link, String filename) { @@ -76,7 +76,7 @@ public class Utils { return; runWithPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE, () -> { - File file = new File(Const.EXTERNAL_PATH, filename); + File file = new File(Const.EXTERNAL_PATH, getLegalFilename(filename)); if ((!file.getParentFile().exists() && !file.getParentFile().mkdirs()) || (file.exists() && !file.delete())) { @@ -87,14 +87,12 @@ public class Utils { Toast.makeText(context, context.getString(R.string.downloading_toast, filename), Toast.LENGTH_LONG).show(); isDownloading = true; - DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + DownloadManager.Request request = new DownloadManager + .Request(Uri.parse(link)) + .setDestinationUri(Uri.fromFile(file)); - if (link != null) { - DownloadManager.Request request = new DownloadManager.Request(Uri.parse(link)); - request.setDestinationUri(Uri.fromFile(file)); - receiver.setDownloadID(downloadManager.enqueue(request)); - } - receiver.setFilename(filename); + DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + receiver.setDownloadID(dm.enqueue(request)).setFile(file); context.getApplicationContext().registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); }); } @@ -273,7 +271,6 @@ public class Utils { String config = fmt("/data/user/%d/%s", Const.USER_ID, Const.MANAGER_CONFIGS); List ret = readFile(config); if (isValidShellResponse(ret)) { - removeItem(config); SharedPreferences.Editor editor = MagiskManager.get().prefs.edit(); String json = ret.get(0); Gson gson = new Gson(); @@ -285,13 +282,14 @@ public class Utils { editor.putString(entry.getKey(), (String) value); } else if (value instanceof Boolean) { editor.putBoolean(entry.getKey(), (boolean) value); - } else if (value instanceof Integer) { - editor.putInt(entry.getKey(), (int) value); + } else if (value instanceof Number) { + editor.putInt(entry.getKey(), ((Number) value).intValue()); } } editor.remove(Const.Key.ETAG_KEY); editor.apply(); MagiskManager.get().loadConfig(); + removeItem(config); } }