diff --git a/app/build.gradle b/app/build.gradle index c544d2828..89d2503ae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,5 +61,5 @@ dependencies { fullImplementation 'com.atlassian.commonmark:commonmark:0.11.0' fullImplementation 'org.kamranzafar:jtar:2.3' fullImplementation 'com.jakewharton:butterknife:8.8.1' - annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' + fullAnnotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' } diff --git a/app/src/full/java/com/topjohnwu/magisk/FlashActivity.java b/app/src/full/java/com/topjohnwu/magisk/FlashActivity.java index 70b3916b1..b967e54d1 100644 --- a/app/src/full/java/com/topjohnwu/magisk/FlashActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/FlashActivity.java @@ -18,6 +18,7 @@ import com.topjohnwu.magisk.asyncs.FlashZip; import com.topjohnwu.magisk.asyncs.InstallMagisk; import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Download; import com.topjohnwu.magisk.utils.RootUtils; import com.topjohnwu.superuser.CallbackList; import com.topjohnwu.superuser.Shell; @@ -63,7 +64,7 @@ public class FlashActivity extends Activity { now.get(Calendar.DAY_OF_MONTH), now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND)); - File logFile = new File(Const.EXTERNAL_PATH + "/logs", filename); + File logFile = new File(Download.EXTERNAL_PATH + "/logs", filename); logFile.getParentFile().mkdirs(); try (FileWriter writer = new FileWriter(logFile)) { for (String s : logs) { diff --git a/app/src/full/java/com/topjohnwu/magisk/MagiskFragment.java b/app/src/full/java/com/topjohnwu/magisk/MagiskFragment.java index b50e01b8a..ec416291e 100644 --- a/app/src/full/java/com/topjohnwu/magisk/MagiskFragment.java +++ b/app/src/full/java/com/topjohnwu/magisk/MagiskFragment.java @@ -30,9 +30,9 @@ import com.topjohnwu.magisk.components.MagiskInstallDialog; import com.topjohnwu.magisk.components.ManagerInstallDialog; import com.topjohnwu.magisk.components.UninstallDialog; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Download; import com.topjohnwu.magisk.utils.ISafetyNetHelper; import com.topjohnwu.magisk.utils.Topic; -import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.superuser.Shell; import com.topjohnwu.superuser.ShellUtils; @@ -177,7 +177,7 @@ public class MagiskFragment extends Fragment shownDialog = false; // Trigger state check - if (Utils.checkNetworkStatus()) { + if (Download.checkNetworkStatus(mm)) { new CheckUpdates().exec(); } else { mSwipeRefreshLayout.setRefreshing(false); @@ -212,7 +212,7 @@ public class MagiskFragment extends Fragment private void updateUI() { ((MainActivity) requireActivity()).checkHideSection(); - boolean hasNetwork = Utils.checkNetworkStatus(); + boolean hasNetwork = Download.checkNetworkStatus(mm); boolean hasRoot = Shell.rootAccess(); boolean isUpToDate = mm.magiskVersionCode > Const.MAGISK_VER.UNIFIED; diff --git a/app/src/full/java/com/topjohnwu/magisk/MagiskLogFragment.java b/app/src/full/java/com/topjohnwu/magisk/MagiskLogFragment.java index 0428a151f..a7c9ff266 100644 --- a/app/src/full/java/com/topjohnwu/magisk/MagiskLogFragment.java +++ b/app/src/full/java/com/topjohnwu/magisk/MagiskLogFragment.java @@ -19,6 +19,7 @@ import android.widget.TextView; import com.topjohnwu.magisk.components.Fragment; import com.topjohnwu.magisk.components.SnackbarMaker; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Download; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.superuser.Shell; @@ -108,7 +109,7 @@ public class MagiskLogFragment extends Fragment { now.get(Calendar.DAY_OF_MONTH), now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND)); - File targetFile = new File(Const.EXTERNAL_PATH + "/logs", filename); + File targetFile = new File(Download.EXTERNAL_PATH + "/logs", filename); targetFile.getParentFile().mkdirs(); try { targetFile.createNewFile(); diff --git a/app/src/full/java/com/topjohnwu/magisk/MagiskManager.java b/app/src/full/java/com/topjohnwu/magisk/MagiskManager.java index 931121035..5eadd6363 100644 --- a/app/src/full/java/com/topjohnwu/magisk/MagiskManager.java +++ b/app/src/full/java/com/topjohnwu/magisk/MagiskManager.java @@ -7,11 +7,12 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; +import android.os.Handler; import android.preference.PreferenceManager; import android.text.TextUtils; import android.util.Xml; +import android.widget.Toast; -import com.topjohnwu.magisk.components.Application; import com.topjohnwu.magisk.container.Module; import com.topjohnwu.magisk.database.MagiskDatabaseHelper; import com.topjohnwu.magisk.database.RepoDatabaseHelper; @@ -20,6 +21,7 @@ import com.topjohnwu.magisk.utils.Const; import com.topjohnwu.magisk.utils.RootUtils; import com.topjohnwu.magisk.utils.Topic; import com.topjohnwu.magisk.utils.Utils; +import com.topjohnwu.superuser.ContainerApp; import com.topjohnwu.superuser.Shell; import com.topjohnwu.superuser.ShellUtils; import com.topjohnwu.superuser.io.SuFile; @@ -35,7 +37,12 @@ import java.util.List; import java.util.Locale; import java.util.Map; -public class MagiskManager extends Application { +public class MagiskManager extends ContainerApp { + + public static WeakReference weakSelf; + public static Handler mHandler = new Handler(); + public static Locale locale; + public static Locale defaultLocale; // Topics public final Topic magiskHideDone = new Topic(); @@ -87,11 +94,16 @@ public class MagiskManager extends Application { public MagiskDatabaseHelper mDB; public RepoDatabaseHelper repoDB; - private Shell.Container container; - public MagiskManager() { weakSelf = new WeakReference<>(this); - container = Shell.Config.newContainer(); + } + + public static void toast(CharSequence msg, int duration) { + mHandler.post(() -> Toast.makeText(weakSelf.get(), msg, duration).show()); + } + + public static void toast(int resId, int duration) { + mHandler.post(() -> Toast.makeText(weakSelf.get(), resId, duration).show()); } @Override @@ -104,6 +116,7 @@ public class MagiskManager extends Application { prefs = PreferenceManager.getDefaultSharedPreferences(this); mDB = MagiskDatabaseHelper.getInstance(this); + locale = defaultLocale = Locale.getDefault(); String pkg = mDB.getStrings(Const.Key.SU_MANAGER, null); if (pkg != null && getPackageName().equals(Const.ORIG_PKG_NAME)) { @@ -123,7 +136,7 @@ public class MagiskManager extends Application { } public static MagiskManager get() { - return (MagiskManager) weakSelf.get(); + return weakSelf.get(); } public void setLocale() { diff --git a/app/src/full/java/com/topjohnwu/magisk/MainActivity.java b/app/src/full/java/com/topjohnwu/magisk/MainActivity.java index 75fa63866..3a3e5024e 100644 --- a/app/src/full/java/com/topjohnwu/magisk/MainActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/MainActivity.java @@ -5,7 +5,6 @@ import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; import android.support.design.widget.NavigationView; -import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; @@ -17,8 +16,8 @@ import android.view.View; import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Download; import com.topjohnwu.magisk.utils.Topic; -import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.superuser.Shell; import butterknife.BindView; @@ -57,11 +56,6 @@ public class MainActivity extends Activity finish(); } - String perm = getIntent().getStringExtra(Const.Key.INTENT_PERM); - if (perm != null) { - ActivityCompat.requestPermissions(this, new String[] { perm }, 0); - } - super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); @@ -136,7 +130,7 @@ public class MainActivity extends Activity menu.findItem(R.id.modules).setVisible(!mm.prefs.getBoolean(Const.Key.COREONLY, false) && Shell.rootAccess() && mm.magiskVersionCode >= 0); menu.findItem(R.id.downloads).setVisible(!mm.prefs.getBoolean(Const.Key.COREONLY, false) - && Utils.checkNetworkStatus() && Shell.rootAccess() && mm.magiskVersionCode >= 0); + && Download.checkNetworkStatus(this) && Shell.rootAccess() && mm.magiskVersionCode >= 0); menu.findItem(R.id.log).setVisible(Shell.rootAccess()); menu.findItem(R.id.superuser).setVisible(Shell.rootAccess() && !(Const.USER_ID > 0 && mm.multiuserMode == Const.Value.MULTIUSER_MODE_OWNER_MANAGED)); diff --git a/app/src/full/java/com/topjohnwu/magisk/NoUIActivity.java b/app/src/full/java/com/topjohnwu/magisk/NoUIActivity.java index 00f5714b8..6a9685cbc 100644 --- a/app/src/full/java/com/topjohnwu/magisk/NoUIActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/NoUIActivity.java @@ -1,23 +1,10 @@ package com.topjohnwu.magisk; -import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.ActivityCompat; import com.topjohnwu.magisk.components.Activity; -import com.topjohnwu.magisk.utils.Const; public class NoUIActivity extends Activity { - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - String[] perms = getIntent().getStringArrayExtra(Const.Key.INTENT_PERM); - if (perms != null) { - ActivityCompat.requestPermissions(this, perms, 0); - } - } - @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); diff --git a/app/src/full/java/com/topjohnwu/magisk/SettingsActivity.java b/app/src/full/java/com/topjohnwu/magisk/SettingsActivity.java index ee633e38a..673570733 100644 --- a/app/src/full/java/com/topjohnwu/magisk/SettingsActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/SettingsActivity.java @@ -25,6 +25,7 @@ import com.topjohnwu.magisk.asyncs.HideManager; import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.receivers.DownloadReceiver; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Download; import com.topjohnwu.magisk.utils.FingerprintHelper; import com.topjohnwu.magisk.utils.RootUtils; import com.topjohnwu.magisk.utils.Topic; @@ -166,9 +167,9 @@ public class SettingsActivity extends Activity implements Topic.Subscriber { }); generalCatagory.removePreference(restoreManager); } else { - if (Utils.checkNetworkStatus()) { + if (Download.checkNetworkStatus(mm)) { restoreManager.setOnPreferenceClickListener((pref) -> { - Utils.dlAndReceive( + Download.receive( getActivity(), new DownloadReceiver() { @Override public void onDownloadDone(Context context, Uri uri) { diff --git a/app/src/full/java/com/topjohnwu/magisk/SplashActivity.java b/app/src/full/java/com/topjohnwu/magisk/SplashActivity.java index 8dbd826aa..9d4423507 100644 --- a/app/src/full/java/com/topjohnwu/magisk/SplashActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/SplashActivity.java @@ -14,6 +14,7 @@ import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.database.RepoDatabaseHelper; import com.topjohnwu.magisk.receivers.ShortcutReceiver; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Download; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.superuser.Shell; @@ -45,7 +46,7 @@ public class SplashActivity extends Activity { LoadModules loadModuleTask = new LoadModules(); - if (Utils.checkNetworkStatus()) { + if (Download.checkNetworkStatus(this)) { // Fire update check new CheckUpdates().exec(); // Add repo update check @@ -67,7 +68,7 @@ public class SplashActivity extends Activity { Intent intent = new Intent(this, MainActivity.class); intent.putExtra(Const.Key.OPEN_SECTION, getIntent().getStringExtra(Const.Key.OPEN_SECTION)); - intent.putExtra(Const.Key.INTENT_PERM, getIntent().getStringExtra(Const.Key.INTENT_PERM)); + intent.putExtra(Activity.INTENT_PERM, getIntent().getStringExtra(Activity.INTENT_PERM)); startActivity(intent); finish(); } diff --git a/app/src/full/java/com/topjohnwu/magisk/adapters/ReposAdapter.java b/app/src/full/java/com/topjohnwu/magisk/adapters/ReposAdapter.java index 2b1224137..fe11e80e2 100644 --- a/app/src/full/java/com/topjohnwu/magisk/adapters/ReposAdapter.java +++ b/app/src/full/java/com/topjohnwu/magisk/adapters/ReposAdapter.java @@ -1,6 +1,5 @@ package com.topjohnwu.magisk.adapters; -import android.app.Activity; import android.content.Context; import android.database.Cursor; import android.support.v7.widget.RecyclerView; @@ -16,11 +15,11 @@ import android.widget.TextView; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.asyncs.MarkDownWindow; import com.topjohnwu.magisk.asyncs.ProcessRepoZip; +import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.components.CustomAlertDialog; import com.topjohnwu.magisk.container.Module; import com.topjohnwu.magisk.container.Repo; import com.topjohnwu.magisk.database.RepoDatabaseHelper; -import com.topjohnwu.magisk.utils.Utils; import java.util.ArrayList; import java.util.List; @@ -107,12 +106,10 @@ public class ReposAdapter extends SectionedAdapter - new ProcessRepoZip((Activity) context, repo.getZipUrl(), - Utils.getLegalFilename(filename), true).exec() + new ProcessRepoZip((Activity) context, repo.getZipUrl(), filename, true).exec() ) .setNeutralButton(R.string.download, (d, i) -> - new ProcessRepoZip((Activity) context, repo.getZipUrl(), - Utils.getLegalFilename(filename), false).exec()) + new ProcessRepoZip((Activity) context, repo.getZipUrl(), filename, false).exec()) .setNegativeButton(R.string.no_thanks, null) .show(); }); diff --git a/app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java b/app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java index d1c89c84e..06b743b25 100644 --- a/app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java +++ b/app/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java @@ -14,6 +14,7 @@ import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.container.TarEntry; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Download; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.magisk.utils.WebService; import com.topjohnwu.magisk.utils.ZipUtils; @@ -132,7 +133,7 @@ public class InstallMagisk extends ParallelTask { HttpURLConnection conn = WebService.mustRequest(mm.magiskLink, null); BufferedInputStream buf = new BufferedInputStream(new ProgressStream(conn)); buf.mark(Integer.MAX_VALUE); - try (OutputStream out = new FileOutputStream(new File(Const.EXTERNAL_PATH, filename))) { + try (OutputStream out = new FileOutputStream(new File(Download.EXTERNAL_PATH, filename))) { ShellUtils.pump(buf, out); buf.reset(); } @@ -229,7 +230,7 @@ public class InstallMagisk extends ParallelTask { private void outputBoot(File patched) throws IOException { switch (mode) { case PATCH_MODE: - File dest = new File(Const.EXTERNAL_PATH, "patched_boot" + mm.bootFormat); + File dest = new File(Download.EXTERNAL_PATH, "patched_boot" + mm.bootFormat); dest.getParentFile().mkdirs(); OutputStream out; switch (mm.bootFormat) { diff --git a/app/src/full/java/com/topjohnwu/magisk/asyncs/ProcessRepoZip.java b/app/src/full/java/com/topjohnwu/magisk/asyncs/ProcessRepoZip.java index 683030fee..c76c948a9 100644 --- a/app/src/full/java/com/topjohnwu/magisk/asyncs/ProcessRepoZip.java +++ b/app/src/full/java/com/topjohnwu/magisk/asyncs/ProcessRepoZip.java @@ -1,7 +1,6 @@ package com.topjohnwu.magisk.asyncs; import android.Manifest; -import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.net.Uri; @@ -12,8 +11,10 @@ import android.widget.Toast; import com.topjohnwu.magisk.FlashActivity; import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.components.SnackbarMaker; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Download; import com.topjohnwu.magisk.utils.WebService; import com.topjohnwu.magisk.utils.ZipUtils; import com.topjohnwu.superuser.Shell; @@ -45,7 +46,7 @@ public class ProcessRepoZip extends ParallelTask { public ProcessRepoZip(Activity context, String link, String filename, boolean install) { super(context); mLink = link; - mFile = new File(Const.EXTERNAL_PATH, filename); + mFile = new File(Download.EXTERNAL_PATH, Download.getLegalFilename(filename)); mInstall = install; mHandler = new Handler(); } @@ -74,6 +75,11 @@ public class ProcessRepoZip extends ParallelTask { } } + @Override + protected Activity getActivity() { + return (Activity) super.getActivity(); + } + @Override protected void onPreExecute() { Activity activity = getActivity(); @@ -149,8 +155,8 @@ public class ProcessRepoZip extends ParallelTask { @Override public ParallelTask exec(Void... voids) { - com.topjohnwu.magisk.components.Activity.runWithPermission( - getActivity(), new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, + getActivity().runWithPermission( + new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, () -> super.exec(voids)); return this; } diff --git a/app/src/full/java/com/topjohnwu/magisk/components/FlavorActivity.java b/app/src/full/java/com/topjohnwu/magisk/components/FlavorActivity.java index 837dca094..55f9b450c 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/FlavorActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/FlavorActivity.java @@ -1,6 +1,7 @@ package com.topjohnwu.magisk.components; import android.content.Intent; +import android.content.res.Configuration; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.annotation.StyleRes; @@ -15,6 +16,13 @@ public abstract class FlavorActivity extends AppCompatActivity { private ActivityResultListener activityResultListener; + public FlavorActivity() { + super(); + Configuration configuration = new Configuration(); + configuration.setLocale(MagiskManager.locale); + applyOverrideConfiguration(configuration); + } + @StyleRes public int getDarkTheme() { return -1; diff --git a/app/src/full/java/com/topjohnwu/magisk/components/Fragment.java b/app/src/full/java/com/topjohnwu/magisk/components/Fragment.java index 3ca503821..59174d33a 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/Fragment.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/Fragment.java @@ -34,10 +34,10 @@ public class Fragment extends android.support.v4.app.Fragment { } public void startActivityForResult(Intent intent, int requestCode, Activity.ActivityResultListener listener) { - ((Activity) getActivity()).startActivityForResult(intent, requestCode, listener); + ((Activity) requireActivity()).startActivityForResult(intent, requestCode, listener); } public void runWithPermission(String[] permissions, Runnable callback) { - Activity.runWithPermission(getActivity(), permissions, callback); + ((Activity) requireActivity()).runWithPermission(permissions,callback); } } diff --git a/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java b/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java index b609fa53e..53408da89 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java @@ -12,6 +12,7 @@ import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.receivers.DownloadReceiver; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Download; import com.topjohnwu.magisk.utils.Utils; import java.util.List; @@ -45,7 +46,7 @@ class InstallMethodDialog extends AlertDialog.Builder { }); break; case 0: - Utils.dlAndReceive(activity, new DownloadReceiver() { + Download.receive(activity, new DownloadReceiver() { @Override public void onDownloadDone(Context context, Uri uri) { SnackbarMaker.showUri(activity, uri); diff --git a/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java b/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java index e5ca5e7e8..7e0206a44 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java @@ -13,6 +13,7 @@ import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.asyncs.RestoreImages; import com.topjohnwu.magisk.receivers.DownloadReceiver; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Download; import com.topjohnwu.magisk.utils.Utils; public class UninstallDialog extends CustomAlertDialog { @@ -25,7 +26,7 @@ public class UninstallDialog extends CustomAlertDialog { setNeutralButton(R.string.restore_img, (d, i) -> new RestoreImages(activity).exec()); if (!TextUtils.isEmpty(mm.uninstallerLink)) { setPositiveButton(R.string.complete_uninstall, (d, i) -> - Utils.dlAndReceive(activity, new DownloadReceiver() { + Download.receive(activity, new DownloadReceiver() { @Override public void onDownloadDone(Context context, Uri uri) { Intent intent = new Intent(context, FlashActivity.class) diff --git a/app/src/full/java/com/topjohnwu/magisk/receivers/ManagerUpdate.java b/app/src/full/java/com/topjohnwu/magisk/receivers/ManagerUpdate.java index 5dd8e520f..c6c4fc6f1 100644 --- a/app/src/full/java/com/topjohnwu/magisk/receivers/ManagerUpdate.java +++ b/app/src/full/java/com/topjohnwu/magisk/receivers/ManagerUpdate.java @@ -7,8 +7,8 @@ import android.net.Uri; import android.os.AsyncTask; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Download; import com.topjohnwu.magisk.utils.PatchAPK; -import com.topjohnwu.magisk.utils.Utils; import java.io.BufferedOutputStream; import java.io.File; @@ -19,7 +19,7 @@ public class ManagerUpdate extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - Utils.dlAndReceive( + Download.receive( context, new PatchedInstall(), intent.getStringExtra(Const.Key.INTENT_SET_LINK), intent.getStringExtra(Const.Key.INTENT_SET_FILENAME) diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Const.java b/app/src/full/java/com/topjohnwu/magisk/utils/Const.java similarity index 97% rename from app/src/main/java/com/topjohnwu/magisk/utils/Const.java rename to app/src/full/java/com/topjohnwu/magisk/utils/Const.java index 84260febb..609232e94 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Const.java +++ b/app/src/full/java/com/topjohnwu/magisk/utils/Const.java @@ -1,6 +1,5 @@ package com.topjohnwu.magisk.utils; -import android.os.Environment; import android.os.Process; import com.topjohnwu.magisk.BuildConfig; @@ -34,7 +33,6 @@ public class Const { public static final String BUSYBOX_PATH = "/sbin/.core/busybox"; public static final String TMP_FOLDER_PATH = "/dev/tmp"; public static final String MAGISK_LOG = "/cache/magisk.log"; - public static final File EXTERNAL_PATH = new File(Environment.getExternalStorageDirectory(), "MagiskManager"); public static final String MANAGER_CONFIGS = ".tmp.magisk.config"; // Versions @@ -107,7 +105,6 @@ public class Const { public static final String OPEN_SECTION = "section"; public static final String INTENT_SET_FILENAME = "filename"; public static final String INTENT_SET_LINK = "link"; - public static final String INTENT_PERM = "perm_dialog"; public static final String FLASH_ACTION = "action"; public static final String FLASH_SET_BOOT = "boot"; diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java b/app/src/full/java/com/topjohnwu/magisk/utils/Utils.java similarity index 61% rename from app/src/main/java/com/topjohnwu/magisk/utils/Utils.java rename to app/src/full/java/com/topjohnwu/magisk/utils/Utils.java index 9f2fd6677..6dbe0e421 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java +++ b/app/src/full/java/com/topjohnwu/magisk/utils/Utils.java @@ -1,25 +1,16 @@ package com.topjohnwu.magisk.utils; -import android.Manifest; -import android.app.DownloadManager; import android.content.Context; -import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.res.Configuration; import android.database.Cursor; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; import android.net.Uri; import android.provider.OpenableColumns; import android.support.annotation.StringRes; -import android.widget.Toast; import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.components.Activity; -import com.topjohnwu.magisk.receivers.DownloadReceiver; -import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -28,41 +19,6 @@ import java.util.Locale; public class Utils { - public static boolean isDownloading = false; - - public static void dlAndReceive(Context context, DownloadReceiver receiver, String link, String filename) { - if (isDownloading) - return; - - Activity.runWithPermission(context, - new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, () -> { - File file = new File(Const.EXTERNAL_PATH, getLegalFilename(filename)); - - if ((!file.getParentFile().exists() && !file.getParentFile().mkdirs()) - || (file.exists() && !file.delete())) { - return; - } - - MagiskManager.toast(context.getString(R.string.downloading_toast, filename), Toast.LENGTH_LONG); - isDownloading = true; - - DownloadManager.Request request = new DownloadManager - .Request(Uri.parse(link)) - .setDestinationUri(Uri.fromFile(file)); - - 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)); - }); - } - - public static String getLegalFilename(CharSequence filename) { - return filename.toString().replace(" ", "_").replace("'", "").replace("\"", "") - .replace("$", "").replace("`", "").replace("*", "").replace("/", "_") - .replace("#", "").replace("@", "").replace("\\", "_"); - } - public static int getPrefsInt(SharedPreferences prefs, String key, int def) { return Integer.parseInt(prefs.getString(key, String.valueOf(def))); } @@ -93,13 +49,6 @@ public class Utils { return name; } - public static boolean checkNetworkStatus() { - ConnectivityManager manager = (ConnectivityManager) - MagiskManager.get().getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo networkInfo = manager.getActiveNetworkInfo(); - return networkInfo != null && networkInfo.isConnected(); - } - public static String getLocaleString(Locale locale, @StringRes int id) { Context context = MagiskManager.get(); Configuration config = context.getResources().getConfiguration(); diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f7ef05e55..00499049f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,6 @@ weakSelf; - public static Locale locale; - public static Locale defaultLocale; - - private static Handler mHandler = new Handler(); - - public Application() { - weakSelf = new WeakReference<>(this); - } - - @Override - public void onCreate() { - super.onCreate(); - locale = defaultLocale = Locale.getDefault(); - } - - public static void toast(CharSequence msg, int duration) { - mHandler.post(() -> Toast.makeText(weakSelf.get(), msg, duration).show()); - } - - public static void toast(int resId, int duration) { - mHandler.post(() -> Toast.makeText(weakSelf.get(), resId, duration).show()); - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java b/app/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java index 72aa7654f..6a283fa21 100644 --- a/app/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java +++ b/app/src/main/java/com/topjohnwu/magisk/receivers/DownloadReceiver.java @@ -8,9 +8,8 @@ import android.database.Cursor; import android.net.Uri; import android.widget.Toast; -import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.utils.Utils; +import com.topjohnwu.magisk.utils.Download; import java.io.File; @@ -35,14 +34,14 @@ public abstract class DownloadReceiver extends BroadcastReceiver { onDownloadDone(context, uri); break; default: - MagiskManager.toast(R.string.download_file_error, Toast.LENGTH_LONG); + Toast.makeText(context, R.string.download_file_error, Toast.LENGTH_LONG).show(); break; } context.unregisterReceiver(this); } c.close(); } - Utils.isDownloading = false; + Download.isDownloading = false; } public DownloadReceiver setDownloadID(long id) { diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Download.java b/app/src/main/java/com/topjohnwu/magisk/utils/Download.java new file mode 100644 index 000000000..dfe12f13e --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Download.java @@ -0,0 +1,67 @@ +package com.topjohnwu.magisk.utils; + +import android.Manifest; +import android.app.DownloadManager; +import android.content.Context; +import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.Uri; +import android.os.Environment; +import android.widget.Toast; + +import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.components.Activity; +import com.topjohnwu.magisk.receivers.DownloadReceiver; + +import java.io.File; + +public class Download { + + public static final File EXTERNAL_PATH = + new File(Environment.getExternalStorageDirectory(), "MagiskManager"); + + public static boolean isDownloading = false; + + public static void receive(Context context, DownloadReceiver receiver, String link, String filename) { + if (isDownloading) + return; + + Activity.runWithPermission(context, + new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, () -> { + File file = new File(EXTERNAL_PATH, getLegalFilename(filename)); + + if ((!file.getParentFile().exists() && !file.getParentFile().mkdirs()) + || (file.exists() && !file.delete())) { + return; + } + + Toast.makeText(context, context.getString(R.string.downloading_toast, filename), + Toast.LENGTH_LONG).show(); + + isDownloading = true; + + DownloadManager.Request request = new DownloadManager + .Request(Uri.parse(link)) + .setDestinationUri(Uri.fromFile(file)); + + 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)); + }); + } + + public static String getLegalFilename(CharSequence filename) { + return filename.toString().replace(" ", "_").replace("'", "").replace("\"", "") + .replace("$", "").replace("`", "").replace("*", "").replace("/", "_") + .replace("#", "").replace("@", "").replace("\\", "_"); + } + + public static boolean checkNetworkStatus(Context context) { + ConnectivityManager manager = (ConnectivityManager) + context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo = manager.getActiveNetworkInfo(); + return networkInfo != null && networkInfo.isConnected(); + } +} diff --git a/app/src/stub/java/com/topjohnwu/magisk/MagiskManager.java b/app/src/stub/java/com/topjohnwu/magisk/MagiskManager.java deleted file mode 100644 index 9a112f1ce..000000000 --- a/app/src/stub/java/com/topjohnwu/magisk/MagiskManager.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.topjohnwu.magisk; - -import com.topjohnwu.magisk.components.Application; - -public class MagiskManager extends Application { - - public int magiskVersionCode = -1; - - public static MagiskManager get() { - return (MagiskManager) weakSelf.get(); - } - - public void dumpPrefs() {/* NOP */} -} diff --git a/app/src/stub/java/com/topjohnwu/magisk/NoUIActivity.java b/app/src/stub/java/com/topjohnwu/magisk/NoUIActivity.java index 4caa96115..cf22ae35c 100644 --- a/app/src/stub/java/com/topjohnwu/magisk/NoUIActivity.java +++ b/app/src/stub/java/com/topjohnwu/magisk/NoUIActivity.java @@ -7,25 +7,29 @@ import android.os.Bundle; import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.receivers.ManagerInstall; -import com.topjohnwu.magisk.utils.Const; -import com.topjohnwu.magisk.utils.Utils; +import com.topjohnwu.magisk.utils.Download; import com.topjohnwu.magisk.utils.WebService; import org.json.JSONException; import org.json.JSONObject; +import java.util.Locale; + public class NoUIActivity extends Activity { private String apkLink; private String version; private int versionCode; + public static final String URL = + "https://raw.githubusercontent.com/topjohnwu/magisk_files/master/stable.json"; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (Utils.checkNetworkStatus()) { + if (Download.checkNetworkStatus(this)) { AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> { - String str = WebService.getString(Const.Url.STABLE_URL); + String str = WebService.getString(URL); try { JSONObject json = new JSONObject(str); JSONObject manager = json.getJSONObject("app"); @@ -38,14 +42,15 @@ public class NoUIActivity extends Activity { return; } runOnUiThread(() -> { - String filename = Utils.fmt("MagiskManager-v%s(%d).apk", version, versionCode); + String filename = String.format(Locale.US, "MagiskManager-v%s(%d).apk", + version, versionCode); new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT) .setCancelable(false) .setTitle(R.string.app_name) .setMessage(R.string.upgrade_msg) .setPositiveButton(R.string.yes, (d, w) -> runWithPermission(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, () -> { - Utils.dlAndReceive(this, new ManagerInstall(), apkLink, filename); + Download.receive(this, new ManagerInstall(), apkLink, filename); finish(); })) .setNegativeButton(R.string.no_thanks, (d, w) -> finish()) diff --git a/app/src/stub/java/com/topjohnwu/magisk/receivers/BootLauncher.java b/app/src/stub/java/com/topjohnwu/magisk/receivers/BootLauncher.java index 8f7060bea..bc5a7f78e 100644 --- a/app/src/stub/java/com/topjohnwu/magisk/receivers/BootLauncher.java +++ b/app/src/stub/java/com/topjohnwu/magisk/receivers/BootLauncher.java @@ -3,14 +3,16 @@ package com.topjohnwu.magisk.receivers; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.text.TextUtils; import com.topjohnwu.magisk.NoUIActivity; public class BootLauncher extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - Intent i = new Intent(context, NoUIActivity.class); - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(i); + if (TextUtils.equals(intent.getAction(), Intent.ACTION_BOOT_COMPLETED)) { + Intent i = new Intent(context, NoUIActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(i); + } } }