diff --git a/app/src/main/java/com/topjohnwu/magisk/InstallFragment.java b/app/src/main/java/com/topjohnwu/magisk/InstallFragment.java deleted file mode 100644 index 7cda18221..000000000 --- a/app/src/main/java/com/topjohnwu/magisk/InstallFragment.java +++ /dev/null @@ -1,227 +0,0 @@ -package com.topjohnwu.magisk; - -import android.app.ProgressDialog; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.os.CountDownTimer; -import android.support.annotation.Nullable; -import android.support.design.widget.Snackbar; -import android.support.v7.widget.CardView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.Spinner; -import android.widget.TextView; - -import com.topjohnwu.magisk.asyncs.ProcessMagiskZip; -import com.topjohnwu.magisk.components.AlertDialogBuilder; -import com.topjohnwu.magisk.components.Fragment; -import com.topjohnwu.magisk.components.SnackbarMaker; -import com.topjohnwu.magisk.receivers.DownloadReceiver; -import com.topjohnwu.magisk.utils.CallbackEvent; -import com.topjohnwu.magisk.utils.Shell; -import com.topjohnwu.magisk.utils.Utils; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; -import butterknife.Unbinder; - -public class InstallFragment extends Fragment implements CallbackEvent.Listener { - - - private static final String UNINSTALLER = "magisk_uninstaller.sh"; - - @BindView(R.id.current_version_title) TextView currentVersionTitle; - @BindView(R.id.install_title) TextView installTitle; - @BindView(R.id.block_spinner) Spinner spinner; - @BindView(R.id.detect_bootimage) Button detectButton; - @BindView(R.id.install_button) CardView installButton; - @BindView(R.id.install_text) TextView installText; - @BindView(R.id.uninstall_button) CardView uninstallButton; - @BindView(R.id.keep_force_enc) CheckBox keepEncChkbox; - @BindView(R.id.keep_verity) CheckBox keepVerityChkbox; - - @OnClick(R.id.detect_bootimage) - public void toAutoDetect() { - if (magiskManager.bootBlock != null) { - spinner.setSelection(0); - } - } - - @OnClick(R.id.install_button) - public void install() { - String bootImage = null; - if (magiskManager.blockList != null) { - int idx = spinner.getSelectedItemPosition(); - if (magiskManager.bootBlock != null) { - if (idx > 0) { - bootImage = magiskManager.blockList.get(idx - 1); - } - } else { - if (idx > 0) { - bootImage = magiskManager.blockList.get(idx - 1); - } else { - SnackbarMaker.make(getActivity(), R.string.manual_boot_image, Snackbar.LENGTH_LONG); - } - } - } - final String finalBootImage = bootImage; - String filename = "Magisk-v" + magiskManager.remoteMagiskVersionCode + ".zip"; - new AlertDialogBuilder(getActivity()) - .setTitle(getString(R.string.repo_install_title, getString(R.string.magisk))) - .setMessage(getString(R.string.repo_install_msg, filename)) - .setCancelable(true) - .setPositiveButton(Shell.rootAccess() ? R.string.install : R.string.download, - (dialogInterface, i) -> Utils.dlAndReceive( - getActivity(), - new DownloadReceiver() { - private String boot = finalBootImage; - private boolean enc = keepEncChkbox.isChecked(); - private boolean verity = keepVerityChkbox.isChecked(); - - @Override - public void onDownloadDone(Uri uri) { - new ProcessMagiskZip(getActivity(), uri, boot, enc, verity).exec(); - } - }, - magiskManager.magiskLink, - Utils.getLegalFilename(filename))) - .setNeutralButton(R.string.release_notes, (dialog, which) -> { - if (magiskManager.releaseNoteLink != null) { - Intent openReleaseNoteLink = new Intent(Intent.ACTION_VIEW, Uri.parse(magiskManager.releaseNoteLink)); - openReleaseNoteLink.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - magiskManager.startActivity(openReleaseNoteLink); - } - }) - .setNegativeButton(R.string.no_thanks, null) - .show(); - } - - @OnClick(R.id.uninstall_button) - public void uninstall() { - new AlertDialogBuilder(getActivity()) - .setTitle(R.string.uninstall_magisk_title) - .setMessage(R.string.uninstall_magisk_msg) - .setPositiveButton(R.string.yes, (dialogInterface, i) -> { - try { - InputStream in = magiskManager.getAssets().open(UNINSTALLER); - File uninstaller = new File(magiskManager.getCacheDir(), UNINSTALLER); - FileOutputStream out = new FileOutputStream(uninstaller); - byte[] bytes = new byte[1024]; - int read; - while ((read = in.read(bytes)) != -1) { - out.write(bytes, 0, read); - } - in.close(); - out.close(); - ProgressDialog progress = new ProgressDialog(getActivity()); - progress.setTitle(R.string.reboot); - progress.show(); - new CountDownTimer(5000, 1000) { - @Override - public void onTick(long millisUntilFinished) { - progress.setMessage(getString(R.string.reboot_countdown, millisUntilFinished / 1000)); - } - - @Override - public void onFinish() { - progress.setMessage(getString(R.string.reboot_countdown, 0)); - Shell.su(true, "mv -f " + uninstaller + " /cache/" + UNINSTALLER, - "reboot"); - } - }.start(); - } catch (IOException e) { - e.printStackTrace(); - } - }) - .setNegativeButton(R.string.no_thanks, null) - .show(); - } - - private Unbinder unbinder; - private MagiskManager magiskManager; - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.fragment_install, container, false); - unbinder = ButterKnife.bind(this, v); - magiskManager = getApplication(); - if (magiskManager.magiskVersionCode < 0) { - currentVersionTitle.setText(getString(R.string.current_magisk_title, getString(R.string.version_none))); - } else { - currentVersionTitle.setText(getString(R.string.current_magisk_title, "v" + magiskManager.magiskVersionString)); - } - installTitle.setText(getString(R.string.install_magisk_title, "v" + magiskManager.remoteMagiskVersionString)); - - updateUI(); - return v; - } - - @Override - public void onTrigger(CallbackEvent event) { - updateUI(); - } - - private void updateUI() { - if (magiskManager.blockList == null || !Shell.rootAccess()) { - uninstallButton.setVisibility(View.GONE); - installText.setText(R.string.download); - detectButton.setEnabled(false); - keepEncChkbox.setEnabled(false); - keepVerityChkbox.setEnabled(false); - spinner.setEnabled(false); - } else { - uninstallButton.setVisibility(magiskManager.magiskVersionCode >= 130 ? View.VISIBLE : View.GONE); - installText.setText(R.string.download_install); - detectButton.setEnabled(true); - keepEncChkbox.setEnabled(true); - keepVerityChkbox.setEnabled(true); - spinner.setEnabled(true); - - List items = new ArrayList<>(); - if (magiskManager.bootBlock != null) { - items.add(getString(R.string.auto_detect, magiskManager.bootBlock)); - } else { - items.add(getString(R.string.cannot_auto_detect)); - } - items.addAll(magiskManager.blockList); - ArrayAdapter adapter = new ArrayAdapter<>(getActivity(), - android.R.layout.simple_spinner_item, items); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - spinner.setAdapter(adapter); - toAutoDetect(); - } - } - - @Override - public void onStart() { - super.onStart(); - getActivity().setTitle(R.string.install); - magiskManager.blockDetectionDone.register(this); - } - - @Override - public void onStop() { - magiskManager.blockDetectionDone.unRegister(this); - super.onStop(); - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - unbinder.unbind(); - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/StatusFragment.java b/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java similarity index 58% rename from app/src/main/java/com/topjohnwu/magisk/StatusFragment.java rename to app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java index 0ec84eb65..c0bf91d7a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/StatusFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java @@ -2,37 +2,60 @@ package com.topjohnwu.magisk; import android.animation.Animator; import android.animation.ValueAnimator; +import android.app.ProgressDialog; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; +import android.os.CountDownTimer; import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; import android.support.v4.widget.SwipeRefreshLayout; +import android.support.v7.widget.CardView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; +import android.widget.Spinner; import android.widget.TextView; import com.topjohnwu.magisk.asyncs.CheckUpdates; +import com.topjohnwu.magisk.asyncs.ProcessMagiskZip; import com.topjohnwu.magisk.components.AlertDialogBuilder; import com.topjohnwu.magisk.components.Fragment; +import com.topjohnwu.magisk.components.SnackbarMaker; +import com.topjohnwu.magisk.receivers.DownloadReceiver; import com.topjohnwu.magisk.utils.CallbackEvent; -import com.topjohnwu.magisk.utils.Logger; import com.topjohnwu.magisk.utils.Shell; import com.topjohnwu.magisk.utils.Utils; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + import butterknife.BindColor; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.Unbinder; -public class StatusFragment extends Fragment implements CallbackEvent.Listener { +public class MagiskFragment extends Fragment implements CallbackEvent.Listener { private static boolean noDialog = false; + private static int expandHeight = 0; + private static boolean mExpanded = false; + private MagiskManager magiskManager; private Unbinder unbinder; + @BindView(R.id.swipeRefreshLayout) SwipeRefreshLayout mSwipeRefreshLayout; @BindView(R.id.magisk_update_icon) ImageView magiskUpdateIcon; @@ -54,6 +77,16 @@ public class StatusFragment extends Fragment implements CallbackEvent.Listener 0) { - ((MainActivity) getActivity()).navigate(R.id.install); + @OnClick(R.id.detect_bootimage) + public void toAutoDetect() { + if (magiskManager.bootBlock != null) { + spinner.setSelection(0); } } - private MagiskManager magiskManager; - private static int expandHeight = 0; - private static boolean mExpanded = false; + @OnClick(R.id.install_button) + public void install() { + String bootImage = null; + if (magiskManager.blockList != null) { + int idx = spinner.getSelectedItemPosition(); + if (magiskManager.bootBlock != null) { + bootImage = magiskManager.bootBlock; + } else { + if (idx > 0) { + bootImage = magiskManager.blockList.get(idx - 1); + } else { + SnackbarMaker.make(getActivity(), R.string.manual_boot_image, Snackbar.LENGTH_LONG); + return; + } + } + } + final String finalBootImage = bootImage; + String filename = "Magisk-v" + magiskManager.remoteMagiskVersionString + ".zip"; + new AlertDialogBuilder(getActivity()) + .setTitle(getString(R.string.repo_install_title, getString(R.string.magisk))) + .setMessage(getString(R.string.repo_install_msg, filename)) + .setCancelable(true) + .setPositiveButton(Shell.rootAccess() ? R.string.install : R.string.download, + (dialogInterface, i) -> Utils.dlAndReceive( + getActivity(), + new DownloadReceiver() { + private String boot = finalBootImage; + private boolean enc = keepEncChkbox.isChecked(); + private boolean verity = keepVerityChkbox.isChecked(); + + @Override + public void onDownloadDone(Uri uri) { + new ProcessMagiskZip(getActivity(), uri, boot, enc, verity).exec(); + } + }, + magiskManager.magiskLink, + Utils.getLegalFilename(filename))) + .setNeutralButton(R.string.release_notes, (dialog, which) -> { + if (magiskManager.releaseNoteLink != null) { + Intent openReleaseNoteLink = new Intent(Intent.ACTION_VIEW, Uri.parse(magiskManager.releaseNoteLink)); + openReleaseNoteLink.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + magiskManager.startActivity(openReleaseNoteLink); + } + }) + .setNegativeButton(R.string.no_thanks, null) + .show(); + } + + @OnClick(R.id.uninstall_button) + public void uninstall() { + new AlertDialogBuilder(getActivity()) + .setTitle(R.string.uninstall_magisk_title) + .setMessage(R.string.uninstall_magisk_msg) + .setPositiveButton(R.string.yes, (dialogInterface, i) -> { + try { + InputStream in = magiskManager.getAssets().open(MagiskManager.UNINSTALLER); + File uninstaller = new File(magiskManager.getCacheDir(), MagiskManager.UNINSTALLER); + FileOutputStream out = new FileOutputStream(uninstaller); + byte[] bytes = new byte[1024]; + int read; + while ((read = in.read(bytes)) != -1) { + out.write(bytes, 0, read); + } + in.close(); + out.close(); + ProgressDialog progress = new ProgressDialog(getActivity()); + progress.setTitle(R.string.reboot); + progress.show(); + new CountDownTimer(5000, 1000) { + @Override + public void onTick(long millisUntilFinished) { + progress.setMessage(getString(R.string.reboot_countdown, millisUntilFinished / 1000)); + } + + @Override + public void onFinish() { + progress.setMessage(getString(R.string.reboot_countdown, 0)); + Shell.su(true, + "mv -f " + uninstaller + " /cache/" + MagiskManager.UNINSTALLER, + "reboot" + ); + } + }.start(); + } catch (IOException e) { + e.printStackTrace(); + } + }) + .setNegativeButton(R.string.no_thanks, null) + .show(); + } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.fragment_status, container, false); + View v = inflater.inflate(R.layout.fragment_magisk, container, false); unbinder = ButterKnife.bind(this, v); magiskManager = getApplication(); @@ -115,7 +236,7 @@ public class StatusFragment extends Fragment implements CallbackEvent.Listener gotoInstall()) + .setPositiveButton(R.string.goto_install, (d, i) -> {}) .setNegativeButton(R.string.no_thanks, null) .show(); } - updateUI(); + updateVersionUI(); if (magiskManager.updateCheckDone.isTriggered) updateCheckUI(); if (magiskManager.safetyNetDone.isTriggered) updateSafetyNetUI(); + if (magiskManager.blockDetectionDone.isTriggered) + updateInstallUI(); return v; } @@ -143,11 +266,11 @@ public class StatusFragment extends Fragment implements CallbackEvent.Listener event) { if (event == magiskManager.updateCheckDone) { - Logger.dev("StatusFragment: Update Check UI refresh triggered"); updateCheckUI(); } else if (event == magiskManager.safetyNetDone) { - Logger.dev("StatusFragment: SafetyNet UI refresh triggered"); updateSafetyNetUI(); + } else if (event == magiskManager.blockDetectionDone) { + updateInstallUI(); } } @@ -156,13 +279,15 @@ public class StatusFragment extends Fragment implements CallbackEvent.Listener= 130 ? View.VISIBLE : View.GONE); + installText.setText(R.string.download_install); + + List items = new ArrayList<>(); + if (magiskManager.bootBlock != null) { + items.add(getString(R.string.auto_detect, magiskManager.bootBlock)); + spinner.setEnabled(false); + } else { + items.add(getString(R.string.cannot_auto_detect)); + items.addAll(magiskManager.blockList); + } + ArrayAdapter adapter = new ArrayAdapter<>(getActivity(), + android.R.layout.simple_spinner_item, items); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinner.setAdapter(adapter); + toAutoDetect(); + } + } + private void updateSafetyNetUI() { int image, color; safetyNetProgress.setVisibility(View.GONE); diff --git a/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java b/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java index 7899cc5f2..5726e0735 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskManager.java @@ -27,6 +27,7 @@ public class MagiskManager extends Application { public static final String MAGISK_HIDE_PATH = "/magisk/.core/magiskhide/"; public static final String TMP_FOLDER_PATH = "/dev/tmp"; public static final String MAGISK_PATH = "/magisk"; + public static final String UNINSTALLER = "magisk_uninstaller.sh"; public static final String INTENT_SECTION = "section"; public static final String BUSYBOX_VERSION = "1.26.2"; diff --git a/app/src/main/java/com/topjohnwu/magisk/MainActivity.java b/app/src/main/java/com/topjohnwu/magisk/MainActivity.java index 02077425d..48f8d7b07 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MainActivity.java +++ b/app/src/main/java/com/topjohnwu/magisk/MainActivity.java @@ -94,7 +94,7 @@ public class MainActivity extends Activity @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); - navigate(savedInstanceState.getInt(MagiskManager.INTENT_SECTION, R.id.status)); + navigate(savedInstanceState.getInt(MagiskManager.INTENT_SECTION, R.id.magisk)); } @Override @@ -147,18 +147,14 @@ public class MainActivity extends Activity menu.findItem(R.id.log).setVisible(Shell.rootAccess()); menu.findItem(R.id.superuser).setVisible( Shell.rootAccess() && getApplicationContext().isSuClient); - menu.findItem(R.id.install).setVisible(getApplicationContext().remoteMagiskVersionCode > 0); } public void navigate(String item) { - int itemId = R.id.status; + int itemId = R.id.magisk; if (item != null) { switch (item) { - case "status": - itemId = R.id.status; - break; - case "install": - itemId = R.id.install; + case "magisk": + itemId = R.id.magisk; break; case "superuser": itemId = R.id.superuser; @@ -191,11 +187,8 @@ public class MainActivity extends Activity mDrawerItem = itemId; navigationView.setCheckedItem(itemId); switch (itemId) { - case R.id.status: - displayFragment(new StatusFragment(), "status", true); - break; - case R.id.install: - displayFragment(new InstallFragment(), "install", true); + case R.id.magisk: + displayFragment(new MagiskFragment(), "magisk", true); break; case R.id.superuser: displayFragment(new SuperuserFragment(), "superuser", true); diff --git a/app/src/main/jni/zipadjust.c b/app/src/main/jni/zipadjust.c index 7ea20985b..e5dc82ae3 100644 --- a/app/src/main/jni/zipadjust.c +++ b/app/src/main/jni/zipadjust.c @@ -1,5 +1,4 @@ #include -#include #include #include "zipadjust.h" diff --git a/app/src/main/res/layout/fragment_install.xml b/app/src/main/res/layout/fragment_install.xml deleted file mode 100644 index f6565c7cc..000000000 --- a/app/src/main/res/layout/fragment_install.xml +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -