From 18ab6b51fdd99c9f89cd8177d9e0f22046051496 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Mon, 28 Jan 2019 14:24:52 -0500 Subject: [PATCH] Magisk info UI redesign Major UI overhaul WIP --- app/build.gradle | 1 + .../components/ManagerInstallDialog.java | 3 +- .../magisk/components/Notifications.java | 2 +- .../magisk/components/UpdateCardHolder.java | 50 +++++ .../magisk/fragments/MagiskFragment.java | 187 ++++++++++++------ app/src/full/res/drawable/ic_update.xml | 11 +- app/src/full/res/layout/fragment_magisk.xml | 176 ++--------------- .../res/layout/list_item_console.xml | 0 app/src/full/res/layout/update_card.xml | 98 +++++++++ app/src/full/res/values-ar/strings.xml | 8 +- app/src/full/res/values-bg/strings.xml | 6 +- app/src/full/res/values-ca/strings.xml | 6 +- app/src/full/res/values-cs/strings.xml | 4 +- app/src/full/res/values-de/strings.xml | 6 +- app/src/full/res/values-el/strings.xml | 6 +- app/src/full/res/values-es/strings.xml | 6 +- app/src/full/res/values-et/strings.xml | 6 +- app/src/full/res/values-fr/strings.xml | 6 +- app/src/full/res/values-hr/strings.xml | 6 +- app/src/full/res/values-in/strings.xml | 6 +- app/src/full/res/values-it/strings.xml | 6 +- app/src/full/res/values-ja/strings.xml | 6 +- app/src/full/res/values-ko/strings.xml | 4 +- app/src/full/res/values-lt/strings.xml | 6 +- app/src/full/res/values-nb/strings.xml | 6 +- app/src/full/res/values-nl/strings.xml | 6 +- app/src/full/res/values-pl/strings.xml | 6 +- app/src/full/res/values-pt-rBR/strings.xml | 6 +- app/src/full/res/values-pt-rPT/strings.xml | 6 +- app/src/full/res/values-ro/strings.xml | 6 +- app/src/full/res/values-ru/strings.xml | 6 +- app/src/full/res/values-sk/strings.xml | 6 +- app/src/full/res/values-sr/strings.xml | 6 +- app/src/full/res/values-sv/strings.xml | 6 +- app/src/full/res/values-tr/strings.xml | 6 +- app/src/full/res/values-uk/strings.xml | 6 +- app/src/full/res/values-vi/strings.xml | 6 +- app/src/full/res/values-zh-rCN/strings.xml | 6 +- app/src/full/res/values-zh-rTW/strings.xml | 6 +- app/src/full/res/values/strings.xml | 10 +- 40 files changed, 393 insertions(+), 323 deletions(-) create mode 100644 app/src/full/java/com/topjohnwu/magisk/components/UpdateCardHolder.java rename app/src/{main => full}/res/layout/list_item_console.xml (100%) create mode 100644 app/src/full/res/layout/update_card.xml diff --git a/app/build.gradle b/app/build.gradle index 45c103722..7584938e3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -73,6 +73,7 @@ dependencies { fullImplementation "com.google.android.material:material:${androidXVersion}" fullImplementation 'android.arch.work:work-runtime:1.0.0-beta03' fullImplementation 'androidx.room:room-runtime:2.0.0' + fullImplementation 'androidx.transition:transition:1.0.1' def butterKnifeVersion = '10.0.0' fullImplementation "com.jakewharton:butterknife-runtime:${butterKnifeVersion}" diff --git a/app/src/full/java/com/topjohnwu/magisk/components/ManagerInstallDialog.java b/app/src/full/java/com/topjohnwu/magisk/components/ManagerInstallDialog.java index e44ffefe5..02c1afea8 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/ManagerInstallDialog.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/ManagerInstallDialog.java @@ -1,5 +1,6 @@ package com.topjohnwu.magisk.components; +import android.app.Activity; import android.text.TextUtils; import com.topjohnwu.core.Config; @@ -11,7 +12,7 @@ import androidx.annotation.NonNull; public class ManagerInstallDialog extends CustomAlertDialog { - public ManagerInstallDialog(@NonNull BaseActivity a) { + public ManagerInstallDialog(@NonNull Activity a) { super(a); String name = Utils.fmt("MagiskManager v%s(%d)", Config.remoteManagerVersionString, Config.remoteManagerVersionCode); diff --git a/app/src/full/java/com/topjohnwu/magisk/components/Notifications.java b/app/src/full/java/com/topjohnwu/magisk/components/Notifications.java index af930c093..9b2b27e62 100644 --- a/app/src/full/java/com/topjohnwu/magisk/components/Notifications.java +++ b/app/src/full/java/com/topjohnwu/magisk/components/Notifications.java @@ -52,7 +52,7 @@ public class Notifications { NotificationCompat.Builder builder = new NotificationCompat.Builder(app, Const.ID.UPDATE_NOTIFICATION_CHANNEL); builder.setSmallIcon(R.drawable.ic_magisk_outline) .setContentTitle(app.getString(R.string.magisk_update_title)) - .setContentText(app.getString(R.string.magisk_update_available, Config.remoteMagiskVersionString)) + .setContentText(app.getString(R.string.manager_download_install)) .setVibrate(new long[]{0, 100, 100, 100}) .setAutoCancel(true) .setContentIntent(pendingIntent); diff --git a/app/src/full/java/com/topjohnwu/magisk/components/UpdateCardHolder.java b/app/src/full/java/com/topjohnwu/magisk/components/UpdateCardHolder.java new file mode 100644 index 000000000..583dee172 --- /dev/null +++ b/app/src/full/java/com/topjohnwu/magisk/components/UpdateCardHolder.java @@ -0,0 +1,50 @@ +package com.topjohnwu.magisk.components; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.topjohnwu.magisk.R; + +import butterknife.BindView; + +public class UpdateCardHolder { + + @BindView(R.id.status_icon) public ImageView statusIcon; + @BindView(R.id.progress) public ProgressBar progress; + @BindView(R.id.status) public TextView status; + @BindView(R.id.current_version) public TextView currentVersion; + @BindView(R.id.latest_version) public TextView latestVersion; + @BindView(R.id.install) public Button install; + + public View itemView; + + public UpdateCardHolder(LayoutInflater inflater, ViewGroup root) { + itemView = inflater.inflate(R.layout.update_card, root, false); + new UpdateCardHolder_ViewBinding(this, itemView); + } + + public void setValid(boolean valid) { + progress.setVisibility(View.GONE); + statusIcon.setVisibility(View.VISIBLE); + if (valid) { + install.setVisibility(View.VISIBLE); + latestVersion.setVisibility(View.VISIBLE); + } else { + install.setVisibility(View.GONE); + latestVersion.setVisibility(View.GONE); + } + } + + public void reset() { + progress.setVisibility(View.VISIBLE); + statusIcon.setVisibility(View.INVISIBLE); + latestVersion.setVisibility(View.GONE); + install.setVisibility(View.GONE); + status.setText(R.string.checking_for_updates); + } +} diff --git a/app/src/full/java/com/topjohnwu/magisk/fragments/MagiskFragment.java b/app/src/full/java/com/topjohnwu/magisk/fragments/MagiskFragment.java index aee57aebb..b2484f38f 100644 --- a/app/src/full/java/com/topjohnwu/magisk/fragments/MagiskFragment.java +++ b/app/src/full/java/com/topjohnwu/magisk/fragments/MagiskFragment.java @@ -1,7 +1,5 @@ package com.topjohnwu.magisk.fragments; -import android.app.NotificationManager; -import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; @@ -12,7 +10,6 @@ import android.widget.CheckBox; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; -import android.widget.RelativeLayout; import android.widget.TextView; import com.topjohnwu.core.Config; @@ -31,15 +28,23 @@ import com.topjohnwu.magisk.components.ExpandableView; import com.topjohnwu.magisk.components.MagiskInstallDialog; import com.topjohnwu.magisk.components.ManagerInstallDialog; import com.topjohnwu.magisk.components.UninstallDialog; +import com.topjohnwu.magisk.components.UpdateCardHolder; import com.topjohnwu.net.Networking; import com.topjohnwu.superuser.Shell; import com.topjohnwu.superuser.ShellUtils; +import java.util.Locale; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.cardview.widget.CardView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import androidx.transition.ChangeBounds; +import androidx.transition.Fade; +import androidx.transition.Transition; +import androidx.transition.TransitionManager; +import androidx.transition.TransitionSet; import butterknife.BindColor; import butterknife.BindView; import butterknife.OnClick; @@ -50,17 +55,11 @@ public class MagiskFragment extends BaseFragment private Container expandableContainer = new Container(); private static boolean shownDialog = false; - @BindView(R.id.swipeRefreshLayout) public SwipeRefreshLayout mSwipeRefreshLayout; + @BindView(R.id.swipeRefreshLayout) SwipeRefreshLayout mSwipeRefreshLayout; + @BindView(R.id.linearLayout) LinearLayout root; @BindView(R.id.core_only_notice) CardView coreOnlyNotice; - @BindView(R.id.magisk_update) RelativeLayout magiskUpdate; - @BindView(R.id.magisk_update_icon) ImageView magiskUpdateIcon; - @BindView(R.id.magisk_update_status) TextView magiskUpdateText; - @BindView(R.id.magisk_update_progress) ProgressBar magiskUpdateProgress; - @BindView(R.id.magisk_status_icon) ImageView magiskStatusIcon; - @BindView(R.id.magisk_version) TextView magiskVersionText; - @BindView(R.id.safetyNet_card) CardView safetyNetCard; @BindView(R.id.safetyNet_refresh) ImageView safetyNetRefreshIcon; @BindView(R.id.safetyNet_status) TextView safetyNetStatusText; @@ -74,8 +73,6 @@ public class MagiskFragment extends BaseFragment @BindView(R.id.install_option_card) CardView installOptionCard; @BindView(R.id.keep_force_enc) CheckBox keepEncChkbox; @BindView(R.id.keep_verity) CheckBox keepVerityChkbox; - @BindView(R.id.install_button) CardView installButton; - @BindView(R.id.install_text) TextView installText; @BindView(R.id.uninstall_button) CardView uninstallButton; @BindColor(R.color.red500) int colorBad; @@ -84,6 +81,10 @@ public class MagiskFragment extends BaseFragment @BindColor(R.color.green500) int colorNeutral; @BindColor(R.color.blue500) int colorInfo; + private UpdateCardHolder magisk; + private UpdateCardHolder manager; + private Transition transition; + @OnClick(R.id.safetyNet_title) void safetyNet() { Runnable task = () -> { @@ -105,19 +106,19 @@ public class MagiskFragment extends BaseFragment } else { task.run(); } - } - @OnClick(R.id.install_button) - void install() { + private void magiskInstall(View v) { // Show Manager update first if (Config.remoteManagerVersionCode > BuildConfig.VERSION_CODE) { - new ManagerInstallDialog((BaseActivity) requireActivity()).show(); + new ManagerInstallDialog(requireActivity()).show(); return; } + new MagiskInstallDialog((BaseActivity) requireActivity()).show(); + } - ((NotificationManager) app.getSystemService(Context.NOTIFICATION_SERVICE)).cancelAll(); - new MagiskInstallDialog((BaseActivity) getActivity()).show(); + private void managerInstall(View v) { + new ManagerInstallDialog(requireActivity()).show(); } @OnClick(R.id.uninstall_button) @@ -136,40 +137,56 @@ public class MagiskFragment extends BaseFragment expandableContainer.expandLayout = expandLayout; setupExpandable(); + magisk = new UpdateCardHolder(inflater, root); + manager = new UpdateCardHolder(inflater, root); + magisk.install.setOnClickListener(this::magiskInstall); + manager.install.setOnClickListener(this::managerInstall); + root.addView(magisk.itemView, 0); + root.addView(manager.itemView, 1); + keepVerityChkbox.setChecked(Config.keepVerity); keepVerityChkbox.setOnCheckedChangeListener((view, checked) -> Config.keepVerity = checked); keepEncChkbox.setChecked(Config.keepEnc); keepEncChkbox.setOnCheckedChangeListener((view, checked) -> Config.keepEnc = checked); mSwipeRefreshLayout.setOnRefreshListener(this); - updateUI(); + coreOnlyNotice.setVisibility(Config.get(Config.Key.COREONLY) ? View.VISIBLE : View.GONE); + safetyNetCard.setVisibility(hasGms() && Networking.checkNetworkStatus(app) ? + View.VISIBLE : View.GONE); + + transition = new TransitionSet() + .setOrdering(TransitionSet.ORDERING_TOGETHER) + .addTransition(new Fade(Fade.OUT)) + .addTransition(new ChangeBounds()) + .addTransition(new Fade(Fade.IN)); + + updateUI(); return v; } @Override public void onRefresh() { + safetyNetStatusText.setText(R.string.safetyNet_check_text); + setExpanded(false); + + mSwipeRefreshLayout.setRefreshing(false); + TransitionManager.beginDelayedTransition(root, transition); + magisk.reset(); + manager.reset(); + Config.loadMagiskInfo(); updateUI(); - magiskUpdateText.setText(R.string.checking_for_updates); - magiskUpdateProgress.setVisibility(View.VISIBLE); - magiskUpdateIcon.setVisibility(View.GONE); - - safetyNetStatusText.setText(R.string.safetyNet_check_text); - Topic.reset(getSubscribedTopics()); Config.remoteMagiskVersionString = null; Config.remoteMagiskVersionCode = -1; - collapse(); shownDialog = false; // Trigger state check if (Networking.checkNetworkStatus(app)) { CheckUpdates.check(); - } else { - mSwipeRefreshLayout.setRefreshing(false); } } @@ -208,61 +225,109 @@ public class MagiskFragment extends BaseFragment private void updateUI() { ((MainActivity) requireActivity()).checkHideSection(); - - boolean hasNetwork = Networking.checkNetworkStatus(app); - boolean hasRoot = Shell.rootAccess(); - - magiskUpdate.setVisibility(hasNetwork ? View.VISIBLE : View.GONE); - installOptionCard.setVisibility(hasNetwork ? View.VISIBLE : View.GONE); - uninstallButton.setVisibility(hasRoot ? View.VISIBLE : View.GONE); - coreOnlyNotice.setVisibility(Config.get(Config.Key.COREONLY) ? View.VISIBLE : View.GONE); - int image, color; - + String status; if (Config.magiskVersionCode < 0) { color = colorBad; image = R.drawable.ic_cancel; - magiskVersionText.setText(R.string.magisk_version_error); + status = getString(R.string.magisk_version_error); + magisk.status.setText(status); + magisk.currentVersion.setVisibility(View.GONE); } else { color = colorOK; image = R.drawable.ic_check_circle; - magiskVersionText.setText(getString(R.string.current_magisk_title, "v" + Config.magiskVersionString)); + status = getString(R.string.magisk); + magisk.currentVersion.setText(getString(R.string.current_installed, + String.format(Locale.US, "v%s (%d)", + Config.magiskVersionString, Config.magiskVersionCode))); } + magisk.statusIcon.setColorFilter(color); + magisk.statusIcon.setImageResource(image); - magiskStatusIcon.setImageResource(image); - magiskStatusIcon.setColorFilter(color); + manager.statusIcon.setColorFilter(colorOK); + manager.statusIcon.setImageResource(R.drawable.ic_check_circle); + manager.currentVersion.setText(getString(R.string.current_installed, + String.format(Locale.US, "v%s (%d)", + BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE))); + + if (!Networking.checkNetworkStatus(app)) { + // No network, updateCheckUI will not be triggered + magisk.status.setText(status); + manager.status.setText(R.string.app_name); + magisk.setValid(false); + manager.setValid(false); + } } private void updateCheckUI() { int image, color; - - safetyNetCard.setVisibility(hasGms() ? View.VISIBLE : View.GONE); + String status; if (Config.remoteMagiskVersionCode < 0) { color = colorNeutral; image = R.drawable.ic_help; - magiskUpdateText.setText(R.string.invalid_update_channel); - installButton.setVisibility(View.GONE); + status = getString(R.string.invalid_update_channel); } else { - color = colorOK; - image = R.drawable.ic_check_circle; - magiskUpdateText.setText(getString(R.string.install_magisk_title, "v" + Config.remoteMagiskVersionString)); - installButton.setVisibility(View.VISIBLE); - if (Config.remoteManagerVersionCode > BuildConfig.VERSION_CODE) { - installText.setText(getString(R.string.update, getString(R.string.app_name))); - } else if (Config.magiskVersionCode > 0 && Config.remoteMagiskVersionCode > Config.magiskVersionCode) { - installText.setText(getString(R.string.update, getString(R.string.magisk))); + magisk.latestVersion.setText(getString(R.string.latest_version, + String.format(Locale.US, "v%s (%d)", + Config.remoteMagiskVersionString, Config.remoteMagiskVersionCode))); + if (Config.remoteMagiskVersionCode > Config.magiskVersionCode) { + color = colorInfo; + image = R.drawable.ic_update; + status = getString(R.string.magisk_update_title); + magisk.install.setText(R.string.update); } else { - installText.setText(R.string.install); + color = colorOK; + image = R.drawable.ic_check_circle; + status = getString(R.string.magisk_up_to_date); + magisk.install.setText(R.string.install); } } + if (Config.magiskVersionCode > 0) { + // Only override status if Magisk is installed + magisk.statusIcon.setImageResource(image); + magisk.statusIcon.setColorFilter(color); + magisk.status.setText(status); + } - magiskUpdateIcon.setImageResource(image); - magiskUpdateIcon.setColorFilter(color); - magiskUpdateIcon.setVisibility(View.VISIBLE); + if (Config.remoteManagerVersionCode < 0) { + color = colorNeutral; + image = R.drawable.ic_help; + status = getString(R.string.invalid_update_channel); + } else { + manager.latestVersion.setText(getString(R.string.latest_version, + String.format(Locale.US, "v%s (%d)", + Config.remoteManagerVersionString, Config.remoteManagerVersionCode))); + if (Config.remoteManagerVersionCode > BuildConfig.VERSION_CODE) { + color = colorInfo; + image = R.drawable.ic_update; + status = getString(R.string.manager_update_title); + manager.install.setText(R.string.update); + } else { + color = colorOK; + image = R.drawable.ic_check_circle; + status = getString(R.string.manager_up_to_date); + manager.install.setText(R.string.install); + } + } + manager.statusIcon.setImageResource(image); + manager.statusIcon.setColorFilter(color); + manager.status.setText(status); - magiskUpdateProgress.setVisibility(View.GONE); - mSwipeRefreshLayout.setRefreshing(false); + magisk.setValid(Config.remoteMagiskVersionCode > 0); + manager.setValid(Config.remoteManagerVersionCode > 0); + + TransitionManager.beginDelayedTransition(root, transition); + + if (Config.remoteMagiskVersionCode < 0) { + // Hide install related components + installOptionCard.setVisibility(View.GONE); + uninstallButton.setVisibility(View.GONE); + } else { + // Show install related components + installOptionCard.setVisibility(View.VISIBLE); + uninstallButton.setVisibility(Shell.rootAccess() ? View.VISIBLE : View.GONE); + } if (!shownDialog && !ShellUtils.fastCmdResult("env_check")) { shownDialog = true; diff --git a/app/src/full/res/drawable/ic_update.xml b/app/src/full/res/drawable/ic_update.xml index b2a2c14f0..91a4d5abf 100644 --- a/app/src/full/res/drawable/ic_update.xml +++ b/app/src/full/res/drawable/ic_update.xml @@ -1,9 +1,4 @@ - - + + diff --git a/app/src/full/res/layout/fragment_magisk.xml b/app/src/full/res/layout/fragment_magisk.xml index 8ba723094..961c91176 100644 --- a/app/src/full/res/layout/fragment_magisk.xml +++ b/app/src/full/res/layout/fragment_magisk.xml @@ -14,6 +14,7 @@ android:orientation="vertical"> @@ -23,25 +24,25 @@ style="?attr/cardStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="4dp" - android:layout_marginEnd="5dp" android:layout_marginStart="5dp" android:layout_marginTop="4dp" + android:layout_marginEnd="5dp" + android:layout_marginBottom="4dp" app:cardCornerRadius="@dimen/card_corner_radius" app:cardElevation="@dimen/card_elevation"> + android:layout_marginTop="12dp" + android:layout_marginBottom="12dp"> + app:srcCompat="@drawable/ic_warning" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -203,8 +117,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingEnd="10dp" - android:paddingStart="10dp"> + android:paddingStart="10dp" + android:paddingEnd="10dp"> + android:layout_marginTop="5dp" + android:layout_marginEnd="10dp" + android:layout_marginBottom="5dp" /> @@ -278,8 +193,8 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + +