2017-02-15 05:24:02 +08:00
|
|
|
package com.topjohnwu.magisk.asyncs;
|
|
|
|
|
|
|
|
import android.app.Activity;
|
|
|
|
import android.app.ProgressDialog;
|
2017-07-18 00:59:22 +08:00
|
|
|
import android.content.Intent;
|
2017-02-15 05:24:02 +08:00
|
|
|
import android.net.Uri;
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
2017-07-18 00:59:22 +08:00
|
|
|
import com.topjohnwu.magisk.FlashActivity;
|
2017-02-15 05:24:02 +08:00
|
|
|
import com.topjohnwu.magisk.R;
|
|
|
|
import com.topjohnwu.magisk.utils.Logger;
|
|
|
|
import com.topjohnwu.magisk.utils.Shell;
|
|
|
|
import com.topjohnwu.magisk.utils.Utils;
|
|
|
|
import com.topjohnwu.magisk.utils.ZipUtils;
|
|
|
|
|
2017-02-15 23:43:30 +08:00
|
|
|
import java.io.File;
|
|
|
|
import java.io.FileInputStream;
|
|
|
|
import java.io.FileNotFoundException;
|
2017-02-15 05:24:02 +08:00
|
|
|
import java.io.OutputStream;
|
|
|
|
|
|
|
|
public class ProcessRepoZip extends ParallelTask<Void, Void, Boolean> {
|
|
|
|
|
|
|
|
private Uri mUri;
|
|
|
|
private ProgressDialog progressDialog;
|
2017-02-16 17:50:36 +08:00
|
|
|
private boolean mInstall;
|
2017-02-15 05:24:02 +08:00
|
|
|
|
2017-02-16 17:50:36 +08:00
|
|
|
public ProcessRepoZip(Activity context, Uri uri, boolean install) {
|
2017-02-15 05:24:02 +08:00
|
|
|
super(context);
|
|
|
|
mUri = uri;
|
2017-02-16 17:50:36 +08:00
|
|
|
mInstall = install;
|
2017-02-15 05:24:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onPreExecute() {
|
2017-07-19 18:01:22 +08:00
|
|
|
Activity activity = getActivity();
|
|
|
|
if (activity == null) return;
|
2017-02-15 05:24:02 +08:00
|
|
|
progressDialog = ProgressDialog.show(activity,
|
2017-02-16 17:50:36 +08:00
|
|
|
activity.getString(R.string.zip_process_title),
|
|
|
|
activity.getString(R.string.zip_process_msg));
|
2017-02-15 05:24:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected Boolean doInBackground(Void... params) {
|
2017-07-19 18:01:22 +08:00
|
|
|
Activity activity = getActivity();
|
|
|
|
if (activity == null) return null;
|
2017-02-15 05:24:02 +08:00
|
|
|
try {
|
|
|
|
|
2017-02-15 23:43:30 +08:00
|
|
|
// Create temp file
|
2017-07-19 16:10:17 +08:00
|
|
|
File temp1 = new File(activity.getCacheDir(), "1.zip");
|
|
|
|
File temp2 = new File(activity.getCacheDir(), "2.zip");
|
|
|
|
activity.getCacheDir().mkdirs();
|
2017-06-16 03:07:46 +08:00
|
|
|
temp1.createNewFile();
|
|
|
|
temp2.createNewFile();
|
2017-02-15 23:43:30 +08:00
|
|
|
|
|
|
|
// First remove top folder in Github source zip, Uri -> temp1
|
2017-06-16 03:07:46 +08:00
|
|
|
ZipUtils.removeTopFolder(activity.getContentResolver().openInputStream(mUri), temp1);
|
2017-02-15 05:24:02 +08:00
|
|
|
|
2017-02-15 23:43:30 +08:00
|
|
|
// Then sign the zip for the first time, temp1 -> temp2
|
2017-06-16 03:07:46 +08:00
|
|
|
ZipUtils.signZip(activity, temp1, temp2, false);
|
2017-02-15 23:43:30 +08:00
|
|
|
|
2017-06-16 03:07:46 +08:00
|
|
|
// Adjust the zip to prevent unzip issues, temp2 -> temp1
|
|
|
|
ZipUtils.zipAdjust(temp2.getPath(), temp1.getPath());
|
2017-02-15 23:43:30 +08:00
|
|
|
|
2017-06-16 03:07:46 +08:00
|
|
|
// Finally, sign the whole zip file again, temp1 -> temp2
|
|
|
|
ZipUtils.signZip(activity, temp1, temp2, true);
|
2017-02-15 23:43:30 +08:00
|
|
|
|
2017-06-16 03:07:46 +08:00
|
|
|
// Write it back to the downloaded zip, temp2 -> Uri
|
2017-07-22 17:39:34 +08:00
|
|
|
try (OutputStream out = activity.getContentResolver().openOutputStream(mUri);
|
|
|
|
FileInputStream in = new FileInputStream(temp2)
|
|
|
|
) {
|
2017-02-15 23:43:30 +08:00
|
|
|
byte[] buffer = new byte[4096];
|
|
|
|
int length;
|
2017-07-22 17:39:34 +08:00
|
|
|
if (out == null) throw new FileNotFoundException();
|
2017-02-15 23:43:30 +08:00
|
|
|
while ((length = in.read(buffer)) > 0)
|
2017-07-22 17:39:34 +08:00
|
|
|
out.write(buffer, 0, length);
|
2017-02-15 05:24:02 +08:00
|
|
|
}
|
2017-02-15 23:43:30 +08:00
|
|
|
|
|
|
|
// Delete the temp file
|
|
|
|
temp1.delete();
|
|
|
|
temp2.delete();
|
|
|
|
|
2017-02-15 05:24:02 +08:00
|
|
|
return true;
|
|
|
|
} catch (Exception e) {
|
|
|
|
Logger.error("ProcessRepoZip: Error!");
|
|
|
|
e.printStackTrace();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected void onPostExecute(Boolean result) {
|
2017-07-19 18:01:22 +08:00
|
|
|
Activity activity = getActivity();
|
|
|
|
if (activity == null) return;
|
2017-02-15 05:24:02 +08:00
|
|
|
progressDialog.dismiss();
|
|
|
|
if (result) {
|
2017-02-21 03:30:37 +08:00
|
|
|
if (Shell.rootAccess() && mInstall) {
|
2017-07-19 16:10:17 +08:00
|
|
|
activity.startActivity(new Intent(activity, FlashActivity.class).setData(mUri));
|
2017-02-21 03:30:37 +08:00
|
|
|
} else {
|
2017-02-15 05:24:02 +08:00
|
|
|
Utils.showUriSnack(activity, mUri);
|
2017-02-21 03:30:37 +08:00
|
|
|
}
|
2017-02-15 05:24:02 +08:00
|
|
|
} else {
|
2017-07-19 18:01:22 +08:00
|
|
|
Utils.getMagiskManager(activity).toast(R.string.process_error, Toast.LENGTH_LONG);
|
2017-02-15 05:24:02 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|