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 83a84c25f..6ec735c4d 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java @@ -71,12 +71,12 @@ class InstallMethodDialog extends AlertDialog.Builder { Networking.get(Data.magiskLink) .setDownloadProgressListener(progress) .setErrorHandler(((conn, e) -> progress.dlFail())) - .getAsFile(f -> { + .getAsFile(zip, f -> { progress.dlDone(); SnackbarMaker.make(a, a.getString(R.string.internal_storage, "/Download/" + filename), Snackbar.LENGTH_LONG).show(); - }, zip); + }); }); } 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 4dffab030..8e16b1178 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java @@ -46,14 +46,14 @@ public class UninstallDialog extends CustomAlertDialog { Networking.get(Data.uninstallerLink) .setDownloadProgressListener(progress) .setErrorHandler(((conn, e) -> progress.dlFail())) - .getAsFile(f -> { + .getAsFile(zip, f -> { progress.dismiss(); Intent intent = new Intent(activity, ClassMap.get(FlashActivity.class)) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .setData(Uri.fromFile(f)) .putExtra(Const.Key.FLASH_ACTION, Const.Value.UNINSTALL); activity.startActivity(intent); - }, zip); + }); }); } } diff --git a/app/src/full/java/com/topjohnwu/magisk/utils/DownloadApp.java b/app/src/full/java/com/topjohnwu/magisk/utils/DownloadApp.java index f96bd5481..646d1881a 100644 --- a/app/src/full/java/com/topjohnwu/magisk/utils/DownloadApp.java +++ b/app/src/full/java/com/topjohnwu/magisk/utils/DownloadApp.java @@ -12,12 +12,8 @@ import com.topjohnwu.magisk.components.ProgressNotification; import com.topjohnwu.net.Networking; import com.topjohnwu.net.ResponseListener; import com.topjohnwu.superuser.ShellUtils; -import com.topjohnwu.utils.JarMap; -import com.topjohnwu.utils.SignAPK; -import java.io.BufferedOutputStream; import java.io.File; -import java.io.FileOutputStream; import dalvik.system.DexClassLoader; @@ -36,37 +32,25 @@ public class DownloadApp { private static void dlInstall(String name, ManagerDownloadListener listener) { File apk = new File(App.self.getCacheDir(), "manager.apk"); ProgressNotification progress = new ProgressNotification(name); - listener.setProgressNotification(progress); + listener.progress = progress; Networking.get(Data.managerLink) .setExecutor(AsyncTask.THREAD_POOL_EXECUTOR) .setDownloadProgressListener(progress) .setErrorHandler((conn, e) -> progress.dlFail()) - .getAsFile(listener, apk); + .getAsFile(apk, listener); } - abstract static class ManagerDownloadListener implements ResponseListener { + private abstract static class ManagerDownloadListener implements ResponseListener { + ProgressNotification progress; + } - private ProgressNotification progress; - - private void setProgressNotification(ProgressNotification progress) { - this.progress = progress; - } - - public abstract void onDownloadComplete(File apk, ProgressNotification progress); + private static class PatchPackageName extends ManagerDownloadListener { @Override public void onResponse(File apk) { - onDownloadComplete(apk, progress); - } - } - - static class PatchPackageName extends ManagerDownloadListener { - - @Override - public void onDownloadComplete(File apk, ProgressNotification progress) { File patched = apk; App app = App.self; - if (!App.self.getPackageName().equals(BuildConfig.APPLICATION_ID)) { + if (!app.getPackageName().equals(BuildConfig.APPLICATION_ID)) { progress.getNotificationBuilder() .setProgress(0, 0, true) .setContentTitle(app.getString(R.string.hide_manager_title)) @@ -91,10 +75,10 @@ public class DownloadApp { } } - static class RestoreManager extends ManagerDownloadListener { + private static class RestoreManager extends ManagerDownloadListener { @Override - public void onDownloadComplete(File apk, ProgressNotification progress) { + public void onResponse(File apk) { App app = App.self; progress.getNotificationBuilder() .setProgress(0, 0, true) diff --git a/core/src/main/java/com/topjohnwu/core/tasks/SafetyNet.java b/core/src/main/java/com/topjohnwu/core/tasks/SafetyNet.java index 1ddb28c4d..c0c86be13 100644 --- a/core/src/main/java/com/topjohnwu/core/tasks/SafetyNet.java +++ b/core/src/main/java/com/topjohnwu/core/tasks/SafetyNet.java @@ -38,14 +38,14 @@ public class SafetyNet { } catch (Exception ignored) { Shell.sh("rm -rf " + EXT_APK.getParent()).exec(); EXT_APK.getParentFile().mkdir(); - Networking.get(Const.Url.SNET_URL).getAsFile(f -> { + Networking.get(Const.Url.SNET_URL).getAsFile(EXT_APK, f -> { try { dyRun(activity); } catch (Exception e) { e.printStackTrace(); Topic.publish(false, Topic.SNET_CHECK_DONE, -1); } - }, EXT_APK); + }); } } } diff --git a/net/src/main/java/com/topjohnwu/net/BadRequest.java b/net/src/main/java/com/topjohnwu/net/BadRequest.java new file mode 100644 index 000000000..76923d055 --- /dev/null +++ b/net/src/main/java/com/topjohnwu/net/BadRequest.java @@ -0,0 +1,51 @@ +package com.topjohnwu.net; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.concurrent.Executor; + +class BadRequest extends Request { + + private IOException ex; + + BadRequest(IOException e) { super(null); ex = e; } + + @Override + public Request addHeaders(String key, String value) { return this; } + + @Override + public Result execForInputStream() { fail(); return new Result<>(); } + + @Override + public void getAsFile(File out, ResponseListener rs) { fail(); } + + @Override + public void execForFile(File out) { fail(); } + + @Override + public void getAsString(ResponseListener rs) { fail(); } + + @Override + public Result execForString() { fail(); return new Result<>(); } + + @Override + public void getAsJSONObject(ResponseListener rs) { fail(); } + + @Override + public Result execForJSONObject() { fail(); return new Result<>(); } + + @Override + public void getAsJSONArray(ResponseListener rs) { fail(); } + + @Override + public Result execForJSONArray() { fail(); return new Result<>(); } + + private void fail() { + if (err != null) + err.onError(null, ex); + } +} diff --git a/net/src/main/java/com/topjohnwu/net/Networking.java b/net/src/main/java/com/topjohnwu/net/Networking.java index d55f80eb5..2b7c3bbc6 100644 --- a/net/src/main/java/com/topjohnwu/net/Networking.java +++ b/net/src/main/java/com/topjohnwu/net/Networking.java @@ -27,7 +27,7 @@ public class Networking { conn.setConnectTimeout(CONNECT_TIMEOUT); return new Request(conn); } catch (IOException e) { - return new StubRequest(); + return new BadRequest(e); } } diff --git a/net/src/main/java/com/topjohnwu/net/ProgressInputStream.java b/net/src/main/java/com/topjohnwu/net/ProgressInputStream.java index 18a075926..843f6dd18 100644 --- a/net/src/main/java/com/topjohnwu/net/ProgressInputStream.java +++ b/net/src/main/java/com/topjohnwu/net/ProgressInputStream.java @@ -8,16 +8,12 @@ public class ProgressInputStream extends FilterInputStream { private long totalBytes; private long bytesDownloaded; + private DownloadProgressListener progress; - public ProgressInputStream(InputStream in, long total) { + public ProgressInputStream(InputStream in, long total, DownloadProgressListener listener) { super(in); totalBytes = total; - } - - protected void updateProgress(long bytesDownloaded, long totalBytes) {} - - private void update() { - Networking.mainHandler.post(() -> updateProgress(bytesDownloaded, totalBytes)); + progress = listener; } @Override @@ -25,7 +21,7 @@ public class ProgressInputStream extends FilterInputStream { int b = super.read(); if (b >= 0) { bytesDownloaded++; - update(); + Networking.mainHandler.post(() -> progress.onProgress(bytesDownloaded, totalBytes)); } return b; } @@ -40,7 +36,7 @@ public class ProgressInputStream extends FilterInputStream { int sz = super.read(b, off, len); if (sz > 0) { bytesDownloaded += sz; - update(); + Networking.mainHandler.post(() -> progress.onProgress(bytesDownloaded, totalBytes)); } return sz; } diff --git a/net/src/main/java/com/topjohnwu/net/Request.java b/net/src/main/java/com/topjohnwu/net/Request.java index 3f40ad875..24ca2b11a 100644 --- a/net/src/main/java/com/topjohnwu/net/Request.java +++ b/net/src/main/java/com/topjohnwu/net/Request.java @@ -23,8 +23,9 @@ public class Request { private HttpURLConnection conn; private Executor executor = null; private DownloadProgressListener progress = null; - private ErrorHandler err = null; - private int code; + private int code = -1; + + ErrorHandler err = null; private interface Requestor { T request() throws Exception; @@ -74,7 +75,7 @@ public class Request { return exec(this::getInputStream); } - public void getAsFile(ResponseListener rs, File out) { + public void getAsFile(File out, ResponseListener rs) { submit(() -> dlFile(out), rs); } @@ -110,7 +111,10 @@ public class Request { Result res = new Result<>(); try { res.result = req.request(); - } catch (Exception ignored) {} + } catch (Exception e) { + if (err != null) + err.onError(conn, e); + } return res; } @@ -135,12 +139,7 @@ public class Request { code = conn.getResponseCode(); InputStream in = conn.getInputStream(); if (progress != null) { - in = new ProgressInputStream(in, conn.getContentLength()) { - @Override - protected void updateProgress(long bytesDownloaded, long totalBytes) { - progress.onProgress(bytesDownloaded, totalBytes); - } - + in = new ProgressInputStream(in, conn.getContentLength(), progress) { @Override public void close() throws IOException { super.close(); diff --git a/net/src/main/java/com/topjohnwu/net/StubRequest.java b/net/src/main/java/com/topjohnwu/net/StubRequest.java deleted file mode 100644 index d9d9d9872..000000000 --- a/net/src/main/java/com/topjohnwu/net/StubRequest.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.topjohnwu.net; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.io.File; -import java.io.InputStream; -import java.util.concurrent.Executor; - -class StubRequest extends Request { - - StubRequest() { super(null); } - - @Override - public Request addHeaders(String key, String value) { return this; } - - @Override - public Request setDownloadProgressListener(DownloadProgressListener listener) { return this; } - - @Override - public Request setErrorHandler(ErrorHandler handler) { return this; } - - @Override - public Request setExecutor(Executor e) { return this; } - - @Override - public Result execForInputStream() { return new Result<>(); } - - @Override - public void getAsFile(ResponseListener rs, File out) {} - - @Override - public void getAsString(ResponseListener rs) {} - - @Override - public Result execForString() { return new Result<>(); } - - @Override - public void getAsJSONObject(ResponseListener rs){} - - @Override - public Result execForJSONObject() { return new Result<>(); } - - @Override - public void getAsJSONArray(ResponseListener rs){} - - @Override - public Result execForJSONArray() { return new Result<>(); } -}