diff --git a/app/src/full/java/com/topjohnwu/magisk/MagiskFragment.java b/app/src/full/java/com/topjohnwu/magisk/MagiskFragment.java index 46567a9f2..b50e01b8a 100644 --- a/app/src/full/java/com/topjohnwu/magisk/MagiskFragment.java +++ b/app/src/full/java/com/topjohnwu/magisk/MagiskFragment.java @@ -3,6 +3,7 @@ package com.topjohnwu.magisk; import android.app.NotificationManager; import android.content.Context; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.v4.widget.SwipeRefreshLayout; @@ -20,12 +21,16 @@ import android.widget.TextView; import com.topjohnwu.magisk.asyncs.CheckSafetyNet; import com.topjohnwu.magisk.asyncs.CheckUpdates; -import com.topjohnwu.magisk.components.AlertDialogBuilder; +import com.topjohnwu.magisk.components.Activity; +import com.topjohnwu.magisk.components.CustomAlertDialog; +import com.topjohnwu.magisk.components.EnvFixDialog; import com.topjohnwu.magisk.components.ExpandableView; import com.topjohnwu.magisk.components.Fragment; +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.ISafetyNetHelper; -import com.topjohnwu.magisk.utils.ShowUI; import com.topjohnwu.magisk.utils.Topic; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.superuser.Shell; @@ -84,11 +89,11 @@ public class MagiskFragment extends Fragment safetyNetProgress.setVisibility(View.VISIBLE); safetyNetRefreshIcon.setVisibility(View.GONE); safetyNetStatusText.setText(R.string.checking_safetyNet_status); - new CheckSafetyNet(getActivity()).exec(); + new CheckSafetyNet(requireActivity()).exec(); collapse(); }; if (!TextUtils.equals(mm.getPackageName(), Const.ORIG_PKG_NAME)) { - new AlertDialogBuilder(getActivity()) + new CustomAlertDialog(requireActivity()) .setTitle(R.string.cannot_check_sn_title) .setMessage(R.string.cannot_check_sn_notice) .setCancelable(true) @@ -96,7 +101,7 @@ public class MagiskFragment extends Fragment .show(); } else if (!CheckSafetyNet.dexPath.exists()) { // Show dialog - new AlertDialogBuilder(getActivity()) + new CustomAlertDialog(requireActivity()) .setTitle(R.string.proprietary_title) .setMessage(R.string.proprietary_notice) .setCancelable(true) @@ -115,25 +120,26 @@ public class MagiskFragment extends Fragment // Show Manager update first if (mm.remoteManagerVersionCode > BuildConfig.VERSION_CODE) { - ShowUI.managerInstallDialog(getActivity()); + new ManagerInstallDialog((Activity) requireActivity()).show(); return; } ((NotificationManager) mm.getSystemService(Context.NOTIFICATION_SERVICE)).cancelAll(); - ShowUI.magiskInstallDialog(getActivity()); + new MagiskInstallDialog((Activity) getActivity()).show(); } @OnClick(R.id.uninstall_button) void uninstall() { - ShowUI.uninstallDialog(getActivity()); + new UninstallDialog(requireActivity()).show(); } @Nullable @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_magisk, container, false); unbinder = ButterKnife.bind(this, v); - getActivity().setTitle(R.string.magisk); + requireActivity().setTitle(R.string.magisk); mm = getApplication(); @@ -204,7 +210,7 @@ public class MagiskFragment extends Fragment } private void updateUI() { - ((MainActivity) getActivity()).checkHideSection(); + ((MainActivity) requireActivity()).checkHideSection(); boolean hasNetwork = Utils.checkNetworkStatus(); boolean hasRoot = Shell.rootAccess(); @@ -266,7 +272,7 @@ public class MagiskFragment extends Fragment install(); } else if (mm.remoteMagiskVersionCode >= Const.MAGISK_VER.FIX_ENV && !ShellUtils.fastCmdResult("env_check")) { - ShowUI.envFixDialog(getActivity()); + new EnvFixDialog(requireActivity()).show(); } } } diff --git a/app/src/full/java/com/topjohnwu/magisk/adapters/PolicyAdapter.java b/app/src/full/java/com/topjohnwu/magisk/adapters/PolicyAdapter.java index abaa4e8c3..78383bd97 100644 --- a/app/src/full/java/com/topjohnwu/magisk/adapters/PolicyAdapter.java +++ b/app/src/full/java/com/topjohnwu/magisk/adapters/PolicyAdapter.java @@ -12,7 +12,7 @@ import android.widget.Switch; import android.widget.TextView; import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.components.AlertDialogBuilder; +import com.topjohnwu.magisk.components.CustomAlertDialog; import com.topjohnwu.magisk.components.ExpandableView; import com.topjohnwu.magisk.components.SnackbarMaker; import com.topjohnwu.magisk.container.Policy; @@ -93,7 +93,7 @@ public class PolicyAdapter extends RecyclerView.Adapter new AlertDialogBuilder((Activity) v.getContext()) + holder.delete.setOnClickListener(v -> new CustomAlertDialog((Activity) v.getContext()) .setTitle(R.string.su_revoke_title) .setMessage(v.getContext().getString(R.string.su_revoke_msg, policy.appName)) .setPositiveButton(R.string.yes, (dialog, which) -> { 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 959d074dd..2b1224137 100644 --- a/app/src/full/java/com/topjohnwu/magisk/adapters/ReposAdapter.java +++ b/app/src/full/java/com/topjohnwu/magisk/adapters/ReposAdapter.java @@ -16,7 +16,7 @@ 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.AlertDialogBuilder; +import com.topjohnwu.magisk.components.CustomAlertDialog; import com.topjohnwu.magisk.container.Module; import com.topjohnwu.magisk.container.Repo; import com.topjohnwu.magisk.database.RepoDatabaseHelper; @@ -102,7 +102,7 @@ public class ReposAdapter extends SectionedAdapter { String filename = repo.getName() + "-" + repo.getVersion() + ".zip"; - new AlertDialogBuilder((Activity) context) + new CustomAlertDialog((Activity) context) .setTitle(context.getString(R.string.repo_install_title, repo.getName())) .setMessage(context.getString(R.string.repo_install_msg, filename)) .setCancelable(true) diff --git a/app/src/full/java/com/topjohnwu/magisk/asyncs/CheckUpdates.java b/app/src/full/java/com/topjohnwu/magisk/asyncs/CheckUpdates.java index b8e6495a4..06bd67055 100644 --- a/app/src/full/java/com/topjohnwu/magisk/asyncs/CheckUpdates.java +++ b/app/src/full/java/com/topjohnwu/magisk/asyncs/CheckUpdates.java @@ -3,7 +3,7 @@ package com.topjohnwu.magisk.asyncs; import com.topjohnwu.magisk.BuildConfig; import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.utils.Const; -import com.topjohnwu.magisk.utils.ShowUI; +import com.topjohnwu.magisk.utils.NotificationMgr; import com.topjohnwu.magisk.utils.WebService; import org.json.JSONException; @@ -59,9 +59,9 @@ public class CheckUpdates extends ParallelTask { MagiskManager mm = MagiskManager.get(); if (showNotification) { if (BuildConfig.VERSION_CODE < mm.remoteManagerVersionCode) { - ShowUI.managerUpdateNotification(); + NotificationMgr.managerUpdate(); } else if (mm.magiskVersionCode < mm.remoteMagiskVersionCode) { - ShowUI.magiskUpdateNotification(); + NotificationMgr.magiskUpdate(); } } mm.updateCheckDone.publish(); diff --git a/app/src/full/java/com/topjohnwu/magisk/components/AlertDialogBuilder.java b/app/src/full/java/com/topjohnwu/magisk/components/CustomAlertDialog.java similarity index 92% rename from app/src/full/java/com/topjohnwu/magisk/components/AlertDialogBuilder.java rename to app/src/full/java/com/topjohnwu/magisk/components/CustomAlertDialog.java index 568d69444..c4ad30251 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/AlertDialogBuilder.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/CustomAlertDialog.java @@ -18,7 +18,7 @@ import com.topjohnwu.magisk.R; import butterknife.BindView; import butterknife.ButterKnife; -public class AlertDialogBuilder extends AlertDialog.Builder { +public class CustomAlertDialog extends AlertDialog.Builder { @BindView(R.id.button_panel) LinearLayout buttons; @BindView(R.id.message_panel) LinearLayout messagePanel; @@ -34,17 +34,7 @@ public class AlertDialogBuilder extends AlertDialog.Builder { private AlertDialog dialog; - public AlertDialogBuilder(@NonNull Activity context) { - super(context); - setup(); - } - - public AlertDialogBuilder(@NonNull Activity context, @StyleRes int themeResId) { - super(context, themeResId); - setup(); - } - - private void setup() { + { View v = LayoutInflater.from(getContext()).inflate(R.layout.alert_dialog, null); ButterKnife.bind(this, v); super.setView(v); @@ -55,9 +45,12 @@ public class AlertDialogBuilder extends AlertDialog.Builder { messagePanel.setVisibility(View.GONE); } - @Override - public AlertDialog.Builder setTitle(int titleId) { - return super.setTitle(titleId); + public CustomAlertDialog(@NonNull Activity context) { + super(context); + } + + public CustomAlertDialog(@NonNull Activity context, @StyleRes int themeResId) { + super(context, themeResId); } @Override diff --git a/app/src/full/java/com/topjohnwu/magisk/components/EnvFixDialog.java b/app/src/full/java/com/topjohnwu/magisk/components/EnvFixDialog.java new file mode 100644 index 000000000..2a3afe31f --- /dev/null +++ b/app/src/full/java/com/topjohnwu/magisk/components/EnvFixDialog.java @@ -0,0 +1,33 @@ +package com.topjohnwu.magisk.components; + +import android.app.Activity; +import android.content.Context; +import android.net.Uri; +import android.support.annotation.NonNull; + +import com.topjohnwu.magisk.MagiskManager; +import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.asyncs.InstallMagisk; +import com.topjohnwu.magisk.receivers.DownloadReceiver; +import com.topjohnwu.magisk.utils.Utils; + +public class EnvFixDialog extends CustomAlertDialog { + + public EnvFixDialog(@NonNull Activity activity) { + super(activity); + MagiskManager mm = Utils.getMagiskManager(activity); + String filename = Utils.fmt("Magisk-v%s(%d).zip", + mm.remoteMagiskVersionString, mm.remoteMagiskVersionCode); + setTitle(R.string.env_fix_title); + setMessage(R.string.env_fix_msg); + setCancelable(true); + setPositiveButton(R.string.yes, (d, i) -> Utils.dlAndReceive(activity, + new DownloadReceiver() { + @Override + public void onDownloadDone(Context context, Uri uri) { + new InstallMagisk(activity, uri).exec(); + } + }, mm.magiskLink, filename)); + setNegativeButton(R.string.no_thanks, null); + } +} 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 ecc127b1d..837dca094 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/FlavorActivity.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/FlavorActivity.java @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.components; +import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.annotation.StyleRes; @@ -12,6 +13,8 @@ import com.topjohnwu.magisk.utils.Topic; public abstract class FlavorActivity extends AppCompatActivity { + private ActivityResultListener activityResultListener; + @StyleRes public int getDarkTheme() { return -1; @@ -27,7 +30,6 @@ public abstract class FlavorActivity extends AppCompatActivity { if (this instanceof Topic.Subscriber) { ((Topic.Subscriber) this).subscribeTopics(); } - if (getMagiskManager().isDarkTheme && getDarkTheme() != -1) { setTheme(getDarkTheme()); } @@ -54,4 +56,20 @@ public abstract class FlavorActivity extends AppCompatActivity { setFinishOnTouchOutside(true); } } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (activityResultListener != null) + activityResultListener.onActivityResult(requestCode, resultCode, data); + activityResultListener = null; + } + + public void startActivityForResult(Intent intent, int requestCode, ActivityResultListener listener) { + activityResultListener = listener; + super.startActivityForResult(intent, requestCode); + } + + public interface ActivityResultListener { + void onActivityResult(int requestCode, int resultCode, Intent data); + } } diff --git a/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java b/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java new file mode 100644 index 000000000..c59e224b5 --- /dev/null +++ b/app/src/full/java/com/topjohnwu/magisk/components/InstallMethodDialog.java @@ -0,0 +1,101 @@ +package com.topjohnwu.magisk.components; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AlertDialog; +import android.widget.Toast; + +import com.topjohnwu.magisk.FlashActivity; +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.Utils; + +import java.util.List; + +class InstallMethodDialog extends AlertDialog.Builder { + + InstallMethodDialog(Activity activity, List options, String filename) { + super(activity); + MagiskManager mm = Utils.getMagiskManager(activity); + setTitle(R.string.select_method); + setItems(options.toArray(new String [0]), (dialog, idx) -> { + DownloadReceiver receiver = null; + switch (idx) { + case 1: + if (mm.remoteMagiskVersionCode < 1400) { + SnackbarMaker.make(activity, R.string.no_boot_file_patch_support, + Snackbar.LENGTH_LONG).show(); + return; + } + MagiskManager.toast(R.string.boot_file_patch_msg, Toast.LENGTH_LONG); + Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.setType("*/*"); + activity.startActivityForResult(intent, Const.ID.SELECT_BOOT, + (requestCode, resultCode, data) -> { + if (requestCode == Const.ID.SELECT_BOOT && + resultCode == Activity.RESULT_OK && data != null) { + Utils.dlAndReceive(activity, new SelectBoot(data), + mm.magiskLink, filename); + } + }); + return; + case 0: + receiver = new DownloadReceiver() { + @Override + public void onDownloadDone(Context context, Uri uri) { + SnackbarMaker.showUri(activity, uri); + } + }; + break; + case 2: + receiver = new DownloadReceiver() { + @Override + public void onDownloadDone(Context context, Uri uri) { + Intent intent = new Intent(context, FlashActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .setData(uri).putExtra(Const.Key.FLASH_ACTION, + Const.Value.FLASH_MAGISK); + context.startActivity(intent); + } + }; + break; + case 3: + receiver = new DownloadReceiver() { + @Override + public void onDownloadDone(Context context, Uri uri) { + Intent intent = new Intent(context, FlashActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .setData(uri).putExtra(Const.Key.FLASH_ACTION, + Const.Value.FLASH_SECOND_SLOT); + context.startActivity(intent); + } + }; + default: + } + Utils.dlAndReceive(activity, receiver, mm.magiskLink, filename); + }); + } + + private class SelectBoot extends DownloadReceiver { + + private Intent data; + + public SelectBoot(Intent data) { + this.data = data; + } + + @Override + public void onDownloadDone(Context context, Uri uri) { + Intent intent = new Intent(context, FlashActivity.class); + intent.setData(uri) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(Const.Key.FLASH_SET_BOOT, data.getData()) + .putExtra(Const.Key.FLASH_ACTION, Const.Value.PATCH_BOOT); + context.startActivity(intent); + } + } +} diff --git a/app/src/full/java/com/topjohnwu/magisk/components/MagiskInstallDialog.java b/app/src/full/java/com/topjohnwu/magisk/components/MagiskInstallDialog.java new file mode 100644 index 000000000..6fcb2bb9d --- /dev/null +++ b/app/src/full/java/com/topjohnwu/magisk/components/MagiskInstallDialog.java @@ -0,0 +1,53 @@ +package com.topjohnwu.magisk.components; + +import android.content.Intent; +import android.net.Uri; +import android.text.TextUtils; + +import com.topjohnwu.magisk.MagiskManager; +import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.asyncs.MarkDownWindow; +import com.topjohnwu.magisk.utils.Utils; +import com.topjohnwu.superuser.Shell; +import com.topjohnwu.superuser.ShellUtils; + +import java.util.ArrayList; +import java.util.List; + +public class MagiskInstallDialog extends CustomAlertDialog { + public MagiskInstallDialog(Activity activity) { + super(activity); + MagiskManager mm = Utils.getMagiskManager(activity); + String filename = Utils.fmt("Magisk-v%s(%d).zip", + mm.remoteMagiskVersionString, mm.remoteMagiskVersionCode); + setTitle(mm.getString(R.string.repo_install_title, mm.getString(R.string.magisk))); + setMessage(mm.getString(R.string.repo_install_msg, filename)); + setCancelable(true); + setPositiveButton(R.string.install, (d, i) -> { + List options = new ArrayList<>(); + options.add(mm.getString(R.string.download_zip_only)); + options.add(mm.getString(R.string.patch_boot_file)); + if (Shell.rootAccess()) { + options.add(mm.getString(R.string.direct_install)); + } + String s = ShellUtils.fastCmd("grep_prop ro.build.ab_update"); + if (!s.isEmpty() && Boolean.parseBoolean(s)) { + options.add(mm.getString(R.string.install_second_slot)); + } + new InstallMethodDialog(activity, options, filename).show(); + }); + setNegativeButton(R.string.no_thanks, null); + if (!TextUtils.isEmpty(mm.magiskNoteLink)) { + setNeutralButton(R.string.release_notes, (d, i) -> { + if (mm.magiskNoteLink.contains("forum.xda-developers")) { + // Open forum links in browser + Intent openLink = new Intent(Intent.ACTION_VIEW, Uri.parse(mm.magiskNoteLink)); + openLink.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mm.startActivity(openLink); + } else { + new MarkDownWindow(activity, null, mm.magiskNoteLink).exec(); + } + }); + } + } +} diff --git a/app/src/full/java/com/topjohnwu/magisk/components/ManagerInstallDialog.java b/app/src/full/java/com/topjohnwu/magisk/components/ManagerInstallDialog.java new file mode 100644 index 000000000..31486b4bc --- /dev/null +++ b/app/src/full/java/com/topjohnwu/magisk/components/ManagerInstallDialog.java @@ -0,0 +1,38 @@ +package com.topjohnwu.magisk.components; + +import android.Manifest; +import android.content.Intent; +import android.support.annotation.NonNull; +import android.text.TextUtils; + +import com.topjohnwu.magisk.MagiskManager; +import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.asyncs.MarkDownWindow; +import com.topjohnwu.magisk.receivers.ManagerUpdate; +import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.Utils; + +public class ManagerInstallDialog extends CustomAlertDialog { + + public ManagerInstallDialog(@NonNull Activity activity) { + super(activity); + MagiskManager mm = Utils.getMagiskManager(activity); + String filename = Utils.fmt("MagiskManager-v%s(%d).apk", + mm.remoteManagerVersionString, mm.remoteManagerVersionCode); + setTitle(mm.getString(R.string.repo_install_title, mm.getString(R.string.app_name))); + setMessage(mm.getString(R.string.repo_install_msg, filename)); + setCancelable(true); + setPositiveButton(R.string.install, (d, i) -> activity.runWithPermission( + new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, () -> { + Intent intent = new Intent(mm, ManagerUpdate.class); + intent.putExtra(Const.Key.INTENT_SET_LINK, mm.managerLink); + intent.putExtra(Const.Key.INTENT_SET_FILENAME, filename); + mm.sendBroadcast(intent); + })) + .setNegativeButton(R.string.no_thanks, null); + if (!TextUtils.isEmpty(mm.managerNoteLink)) { + setNeutralButton(R.string.app_changelog, (d, i) -> + new MarkDownWindow(activity, null, mm.managerNoteLink).exec()); + } + } +} diff --git a/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java b/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java new file mode 100644 index 000000000..e5ca5e7e8 --- /dev/null +++ b/app/src/full/java/com/topjohnwu/magisk/components/UninstallDialog.java @@ -0,0 +1,40 @@ +package com.topjohnwu.magisk.components; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.support.annotation.NonNull; +import android.text.TextUtils; + +import com.topjohnwu.magisk.FlashActivity; +import com.topjohnwu.magisk.MagiskManager; +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.Utils; + +public class UninstallDialog extends CustomAlertDialog { + + public UninstallDialog(@NonNull Activity activity) { + super(activity); + MagiskManager mm = Utils.getMagiskManager(activity); + setTitle(R.string.uninstall_magisk_title); + setMessage(R.string.uninstall_magisk_msg); + 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() { + @Override + public void onDownloadDone(Context context, Uri uri) { + Intent intent = new Intent(context, FlashActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .setData(uri) + .putExtra(Const.Key.FLASH_ACTION, Const.Value.UNINSTALL); + context.startActivity(intent); + } + }, mm.uninstallerLink, "magisk-uninstaller.zip")); + } + } +} diff --git a/app/src/full/java/com/topjohnwu/magisk/services/OnBootService.java b/app/src/full/java/com/topjohnwu/magisk/services/OnBootService.java index 26f8153c3..0613ec6fc 100644 --- a/app/src/full/java/com/topjohnwu/magisk/services/OnBootService.java +++ b/app/src/full/java/com/topjohnwu/magisk/services/OnBootService.java @@ -6,7 +6,7 @@ import android.support.annotation.NonNull; import android.support.v4.app.JobIntentService; import com.topjohnwu.magisk.utils.Const; -import com.topjohnwu.magisk.utils.ShowUI; +import com.topjohnwu.magisk.utils.NotificationMgr; import com.topjohnwu.superuser.Shell; import com.topjohnwu.superuser.ShellUtils; @@ -28,6 +28,6 @@ public class OnBootService extends JobIntentService { Shell shell = Shell.newInstance(); if (shell.getStatus() >= Shell.ROOT_SHELL && Boolean.parseBoolean(ShellUtils.fastCmd(shell, "mm_patch_dtbo"))) - ShowUI.dtboPatchedNotification(); + NotificationMgr.dtboPatched(); } } diff --git a/app/src/full/java/com/topjohnwu/magisk/utils/NotificationMgr.java b/app/src/full/java/com/topjohnwu/magisk/utils/NotificationMgr.java new file mode 100644 index 000000000..1f26539bf --- /dev/null +++ b/app/src/full/java/com/topjohnwu/magisk/utils/NotificationMgr.java @@ -0,0 +1,84 @@ +package com.topjohnwu.magisk.utils; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.support.v4.app.NotificationCompat; +import android.support.v4.app.TaskStackBuilder; + +import com.topjohnwu.magisk.MagiskManager; +import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.SplashActivity; +import com.topjohnwu.magisk.receivers.ManagerUpdate; +import com.topjohnwu.magisk.receivers.RebootReceiver; + +public class NotificationMgr { + + public static void magiskUpdate() { + MagiskManager mm = MagiskManager.get(); + + Intent intent = new Intent(mm, SplashActivity.class); + intent.putExtra(Const.Key.OPEN_SECTION, "magisk"); + TaskStackBuilder stackBuilder = TaskStackBuilder.create(mm); + stackBuilder.addParentStack(SplashActivity.class); + stackBuilder.addNextIntent(intent); + PendingIntent pendingIntent = stackBuilder.getPendingIntent(Const.ID.MAGISK_UPDATE_NOTIFICATION_ID, + PendingIntent.FLAG_UPDATE_CURRENT); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(mm, Const.ID.NOTIFICATION_CHANNEL); + builder.setSmallIcon(R.drawable.ic_magisk_outline) + .setContentTitle(mm.getString(R.string.magisk_update_title)) + .setContentText(mm.getString(R.string.magisk_update_available, mm.remoteMagiskVersionString)) + .setVibrate(new long[]{0, 100, 100, 100}) + .setAutoCancel(true) + .setContentIntent(pendingIntent); + + NotificationManager notificationManager = + (NotificationManager) mm.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.notify(Const.ID.MAGISK_UPDATE_NOTIFICATION_ID, builder.build()); + } + + public static void managerUpdate() { + MagiskManager mm = MagiskManager.get(); + String filename = Utils.fmt("MagiskManager-v%s(%d).apk", + mm.remoteManagerVersionString, mm.remoteManagerVersionCode); + + Intent intent = new Intent(mm, ManagerUpdate.class); + intent.putExtra(Const.Key.INTENT_SET_LINK, mm.managerLink); + intent.putExtra(Const.Key.INTENT_SET_FILENAME, filename); + PendingIntent pendingIntent = PendingIntent.getBroadcast(mm, + Const.ID.APK_UPDATE_NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(mm, Const.ID.NOTIFICATION_CHANNEL); + builder.setSmallIcon(R.drawable.ic_magisk_outline) + .setContentTitle(mm.getString(R.string.manager_update_title)) + .setContentText(mm.getString(R.string.manager_download_install)) + .setVibrate(new long[]{0, 100, 100, 100}) + .setAutoCancel(true) + .setContentIntent(pendingIntent); + + NotificationManager notificationManager = + (NotificationManager) mm.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.notify(Const.ID.APK_UPDATE_NOTIFICATION_ID, builder.build()); + } + + public static void dtboPatched() { + MagiskManager mm = MagiskManager.get(); + + Intent intent = new Intent(mm, RebootReceiver.class); + PendingIntent pendingIntent = PendingIntent.getBroadcast(mm, + Const.ID.DTBO_NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(mm, Const.ID.NOTIFICATION_CHANNEL); + builder.setSmallIcon(R.drawable.ic_magisk_outline) + .setContentTitle(mm.getString(R.string.dtbo_patched_title)) + .setContentText(mm.getString(R.string.dtbo_patched_reboot)) + .setVibrate(new long[]{0, 100, 100, 100}) + .addAction(R.drawable.ic_refresh, mm.getString(R.string.reboot), pendingIntent); + + NotificationManager notificationManager = + (NotificationManager) mm.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.notify(Const.ID.DTBO_NOTIFICATION_ID, builder.build()); + } +} diff --git a/app/src/full/java/com/topjohnwu/magisk/utils/ShowUI.java b/app/src/full/java/com/topjohnwu/magisk/utils/ShowUI.java deleted file mode 100644 index 66f95ed76..000000000 --- a/app/src/full/java/com/topjohnwu/magisk/utils/ShowUI.java +++ /dev/null @@ -1,278 +0,0 @@ -package com.topjohnwu.magisk.utils; - -import android.Manifest; -import android.app.Activity; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.support.v4.app.NotificationCompat; -import android.support.v4.app.TaskStackBuilder; -import android.support.v7.app.AlertDialog; -import android.text.TextUtils; -import android.widget.Toast; - -import com.topjohnwu.magisk.FlashActivity; -import com.topjohnwu.magisk.MagiskManager; -import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.SplashActivity; -import com.topjohnwu.magisk.asyncs.InstallMagisk; -import com.topjohnwu.magisk.asyncs.MarkDownWindow; -import com.topjohnwu.magisk.asyncs.RestoreImages; -import com.topjohnwu.magisk.components.AlertDialogBuilder; -import com.topjohnwu.magisk.components.SnackbarMaker; -import com.topjohnwu.magisk.receivers.DownloadReceiver; -import com.topjohnwu.magisk.receivers.ManagerUpdate; -import com.topjohnwu.magisk.receivers.RebootReceiver; -import com.topjohnwu.superuser.Shell; -import com.topjohnwu.superuser.ShellUtils; - -import java.util.ArrayList; -import java.util.List; - -public class ShowUI { - - public static void magiskUpdateNotification() { - MagiskManager mm = MagiskManager.get(); - - Intent intent = new Intent(mm, SplashActivity.class); - intent.putExtra(Const.Key.OPEN_SECTION, "magisk"); - TaskStackBuilder stackBuilder = TaskStackBuilder.create(mm); - stackBuilder.addParentStack(SplashActivity.class); - stackBuilder.addNextIntent(intent); - PendingIntent pendingIntent = stackBuilder.getPendingIntent(Const.ID.MAGISK_UPDATE_NOTIFICATION_ID, - PendingIntent.FLAG_UPDATE_CURRENT); - - NotificationCompat.Builder builder = new NotificationCompat.Builder(mm, Const.ID.NOTIFICATION_CHANNEL); - builder.setSmallIcon(R.drawable.ic_magisk_outline) - .setContentTitle(mm.getString(R.string.magisk_update_title)) - .setContentText(mm.getString(R.string.magisk_update_available, mm.remoteMagiskVersionString)) - .setVibrate(new long[]{0, 100, 100, 100}) - .setAutoCancel(true) - .setContentIntent(pendingIntent); - - NotificationManager notificationManager = - (NotificationManager) mm.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.notify(Const.ID.MAGISK_UPDATE_NOTIFICATION_ID, builder.build()); - } - - public static void managerUpdateNotification() { - MagiskManager mm = MagiskManager.get(); - String filename = Utils.fmt("MagiskManager-v%s(%d).apk", - mm.remoteManagerVersionString, mm.remoteManagerVersionCode); - - Intent intent = new Intent(mm, ManagerUpdate.class); - intent.putExtra(Const.Key.INTENT_SET_LINK, mm.managerLink); - intent.putExtra(Const.Key.INTENT_SET_FILENAME, filename); - PendingIntent pendingIntent = PendingIntent.getBroadcast(mm, - Const.ID.APK_UPDATE_NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT); - - NotificationCompat.Builder builder = new NotificationCompat.Builder(mm, Const.ID.NOTIFICATION_CHANNEL); - builder.setSmallIcon(R.drawable.ic_magisk_outline) - .setContentTitle(mm.getString(R.string.manager_update_title)) - .setContentText(mm.getString(R.string.manager_download_install)) - .setVibrate(new long[]{0, 100, 100, 100}) - .setAutoCancel(true) - .setContentIntent(pendingIntent); - - NotificationManager notificationManager = - (NotificationManager) mm.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.notify(Const.ID.APK_UPDATE_NOTIFICATION_ID, builder.build()); - } - - public static void dtboPatchedNotification() { - MagiskManager mm = MagiskManager.get(); - - Intent intent = new Intent(mm, RebootReceiver.class); - PendingIntent pendingIntent = PendingIntent.getBroadcast(mm, - Const.ID.DTBO_NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT); - - NotificationCompat.Builder builder = new NotificationCompat.Builder(mm, Const.ID.NOTIFICATION_CHANNEL); - builder.setSmallIcon(R.drawable.ic_magisk_outline) - .setContentTitle(mm.getString(R.string.dtbo_patched_title)) - .setContentText(mm.getString(R.string.dtbo_patched_reboot)) - .setVibrate(new long[]{0, 100, 100, 100}) - .addAction(R.drawable.ic_refresh, mm.getString(R.string.reboot), pendingIntent); - - NotificationManager notificationManager = - (NotificationManager) mm.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.notify(Const.ID.DTBO_NOTIFICATION_ID, builder.build()); - } - - public static void envFixDialog(Activity activity) { - MagiskManager mm = Utils.getMagiskManager(activity); - String filename = Utils.fmt("Magisk-v%s(%d).zip", - mm.remoteMagiskVersionString, mm.remoteMagiskVersionCode); - new AlertDialogBuilder(activity) - .setTitle(R.string.env_fix_title) - .setMessage(R.string.env_fix_msg) - .setCancelable(true) - .setPositiveButton(R.string.yes, (d, i) -> { - Utils.dlAndReceive(activity, new DownloadReceiver() { - @Override - public void onDownloadDone(Context context, Uri uri) { - new InstallMagisk(activity, uri).exec(); - } - }, mm.magiskLink, filename); - }) - .setNegativeButton(R.string.no_thanks, null) - .show(); - } - - public static void magiskInstallDialog(Activity activity) { - MagiskManager mm = Utils.getMagiskManager(activity); - String filename = Utils.fmt("Magisk-v%s(%d).zip", - mm.remoteMagiskVersionString, mm.remoteMagiskVersionCode); - AlertDialog.Builder b = 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)) - .setCancelable(true) - .setPositiveButton(R.string.install, (d, i) -> { - List options = new ArrayList<>(); - options.add(mm.getString(R.string.download_zip_only)); - options.add(mm.getString(R.string.patch_boot_file)); - if (Shell.rootAccess()) { - options.add(mm.getString(R.string.direct_install)); - } - String s = ShellUtils.fastCmd("grep_prop ro.build.ab_update"); - if (s != null && Boolean.parseBoolean(s)) { - options.add(mm.getString(R.string.install_second_slot)); - } - new AlertDialog.Builder(activity) - .setTitle(R.string.select_method) - .setItems( - options.toArray(new String [0]), - (dialog, idx) -> { - DownloadReceiver receiver = null; - switch (idx) { - case 1: - if (mm.remoteMagiskVersionCode < 1400) { - MagiskManager.toast(R.string.no_boot_file_patch_support, Toast.LENGTH_LONG); - return; - } - MagiskManager.toast(R.string.boot_file_patch_msg, Toast.LENGTH_LONG); - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.setType("*/*"); - ((com.topjohnwu.magisk.components.Activity) activity) - .startActivityForResult(intent, Const.ID.SELECT_BOOT, - (requestCode, resultCode, data) -> { - if (requestCode == Const.ID.SELECT_BOOT - && resultCode == Activity.RESULT_OK && data != null) { - Utils.dlAndReceive( - activity, - new DownloadReceiver() { - @Override - public void onDownloadDone(Context context, Uri uri) { - Intent intent = new Intent(mm, FlashActivity.class); - intent.setData(uri) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .putExtra(Const.Key.FLASH_SET_BOOT, data.getData()) - .putExtra(Const.Key.FLASH_ACTION, Const.Value.PATCH_BOOT); - mm.startActivity(intent); - } - }, - mm.magiskLink, - filename - ); - } - }); - return; - case 0: - receiver = new DownloadReceiver() { - @Override - public void onDownloadDone(Context context, Uri uri) { - SnackbarMaker.showUri(activity, uri); - } - }; - break; - case 2: - receiver = new DownloadReceiver() { - @Override - public void onDownloadDone(Context context, Uri uri) { - Intent intent = new Intent(mm, FlashActivity.class); - intent.setData(uri).putExtra(Const.Key.FLASH_ACTION, - Const.Value.FLASH_MAGISK); - activity.startActivity(intent); - } - }; - break; - case 3: - receiver = new DownloadReceiver() { - @Override - public void onDownloadDone(Context context, Uri uri) { - Intent intent = new Intent(mm, FlashActivity.class); - intent.setData(uri).putExtra(Const.Key.FLASH_ACTION, - Const.Value.FLASH_SECOND_SLOT); - activity.startActivity(intent); - } - }; - default: - } - Utils.dlAndReceive(activity, receiver, mm.magiskLink, filename); - } - ).show(); - }) - .setNegativeButton(R.string.no_thanks, null); - if (!TextUtils.isEmpty(mm.magiskNoteLink)) { - b.setNeutralButton(R.string.release_notes, (d, i) -> { - if (mm.magiskNoteLink.contains("forum.xda-developers")) { - // Open forum links in browser - Intent openLink = new Intent(Intent.ACTION_VIEW, Uri.parse(mm.magiskNoteLink)); - openLink.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mm.startActivity(openLink); - } else { - new MarkDownWindow(activity, null, mm.magiskNoteLink).exec(); - } - }); - } - b.show(); - } - - public static void managerInstallDialog(Activity activity) { - MagiskManager mm = Utils.getMagiskManager(activity); - String filename = Utils.fmt("MagiskManager-v%s(%d).apk", - mm.remoteManagerVersionString, mm.remoteManagerVersionCode); - AlertDialog.Builder b = 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, filename)) - .setCancelable(true) - .setPositiveButton(R.string.install, (d, i) -> { - com.topjohnwu.magisk.components.Activity.runWithPermission(activity, - new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, () -> { - Intent intent = new Intent(mm, ManagerUpdate.class); - intent.putExtra(Const.Key.INTENT_SET_LINK, mm.managerLink); - intent.putExtra(Const.Key.INTENT_SET_FILENAME, filename); - mm.sendBroadcast(intent); - }); - }) - .setNegativeButton(R.string.no_thanks, null); - if (!TextUtils.isEmpty(mm.managerNoteLink)) { - b.setNeutralButton(R.string.app_changelog, (d, i) -> - new MarkDownWindow(activity, null, mm.managerNoteLink).exec()); - } - b.show(); - } - - public static void uninstallDialog(Activity activity) { - MagiskManager mm = Utils.getMagiskManager(activity); - AlertDialog.Builder b = new AlertDialogBuilder(activity) - .setTitle(R.string.uninstall_magisk_title) - .setMessage(R.string.uninstall_magisk_msg) - .setNeutralButton(R.string.restore_img, (d, i) -> new RestoreImages(activity).exec()); - if (!TextUtils.isEmpty(mm.uninstallerLink)) { - b.setPositiveButton(R.string.complete_uninstall, (d, i) -> - Utils.dlAndReceive(activity, new DownloadReceiver() { - @Override - public void onDownloadDone(Context context, Uri uri) { - Intent intent = new Intent(context, FlashActivity.class) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .setData(uri) - .putExtra(Const.Key.FLASH_ACTION, Const.Value.UNINSTALL); - context.startActivity(intent); - } - }, mm.uninstallerLink, "magisk-uninstaller.zip")); - } - b.show(); - } -} diff --git a/app/src/main/java/com/topjohnwu/magisk/components/Activity.java b/app/src/main/java/com/topjohnwu/magisk/components/Activity.java index 9c0e75c44..3cc4aba96 100644 --- a/app/src/main/java/com/topjohnwu/magisk/components/Activity.java +++ b/app/src/main/java/com/topjohnwu/magisk/components/Activity.java @@ -17,8 +17,6 @@ public abstract class Activity extends FlavorActivity { protected static Runnable permissionGrantCallback; - private ActivityResultListener activityResultListener; - public Activity() { super(); Configuration configuration = new Configuration(); @@ -74,21 +72,4 @@ public abstract class Activity extends FlavorActivity { } permissionGrantCallback = null; } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (activityResultListener != null) - activityResultListener.onActivityResult(requestCode, resultCode, data); - activityResultListener = null; - } - - public void startActivityForResult(Intent intent, int requestCode, ActivityResultListener listener) { - activityResultListener = listener; - super.startActivityForResult(intent, requestCode); - } - - public interface ActivityResultListener { - void onActivityResult(int requestCode, int resultCode, Intent data); - } - }