294 lines
11 KiB
Java
Raw Normal View History

2018-08-30 03:57:48 -04:00
package com.topjohnwu.magisk.fragments;
2016-12-25 03:05:22 +08:00
2018-08-19 00:59:56 +08:00
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
2016-12-25 03:05:22 +08:00
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
2017-05-21 12:16:38 +08:00
import android.widget.CheckBox;
2017-05-20 03:04:14 +08:00
import android.widget.LinearLayout;
2016-12-25 03:05:22 +08:00
2018-08-30 03:57:48 -04:00
import com.topjohnwu.magisk.BuildConfig;
2019-01-30 03:10:12 -05:00
import com.topjohnwu.magisk.Config;
2018-08-30 03:57:48 -04:00
import com.topjohnwu.magisk.MainActivity;
import com.topjohnwu.magisk.R;
2018-08-01 17:57:11 +08:00
import com.topjohnwu.magisk.components.BaseActivity;
import com.topjohnwu.magisk.components.BaseFragment;
2018-07-28 22:52:40 +08:00
import com.topjohnwu.magisk.components.EnvFixDialog;
import com.topjohnwu.magisk.components.MagiskInstallDialog;
import com.topjohnwu.magisk.components.ManagerInstallDialog;
2019-01-30 17:11:03 -05:00
import com.topjohnwu.magisk.components.SafetyNet;
2018-07-28 22:52:40 +08:00
import com.topjohnwu.magisk.components.UninstallDialog;
import com.topjohnwu.magisk.components.UpdateCardHolder;
2019-01-30 03:10:12 -05:00
import com.topjohnwu.magisk.tasks.CheckUpdates;
import com.topjohnwu.magisk.utils.Topic;
2018-12-27 14:35:55 +08:00
import com.topjohnwu.net.Networking;
2018-01-21 06:07:24 +08:00
import com.topjohnwu.superuser.Shell;
2018-06-20 04:43:03 +08:00
import com.topjohnwu.superuser.ShellUtils;
2016-12-25 03:05:22 +08:00
import java.util.Locale;
2018-09-10 02:27:45 -04:00
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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;
2016-12-25 03:05:22 +08:00
2018-08-01 17:57:11 +08:00
public class MagiskFragment extends BaseFragment
2019-01-28 14:51:29 -05:00
implements SwipeRefreshLayout.OnRefreshListener, Topic.Subscriber {
2016-12-25 03:05:22 +08:00
2017-08-31 03:07:33 +08:00
private static boolean shownDialog = false;
2017-05-21 12:16:38 +08:00
@BindView(R.id.swipeRefreshLayout) SwipeRefreshLayout mSwipeRefreshLayout;
@BindView(R.id.linearLayout) LinearLayout root;
@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.uninstall_button) CardView uninstallButton;
@BindColor(R.color.red500) int colorBad;
@BindColor(R.color.green500) int colorOK;
@BindColor(R.color.yellow500) int colorWarn;
@BindColor(R.color.green500) int colorNeutral;
@BindColor(R.color.blue500) int colorInfo;
private UpdateCardHolder magisk;
private UpdateCardHolder manager;
2019-01-30 17:11:03 -05:00
private SafetyNet safetyNet;
private Transition transition;
private void magiskInstall(View v) {
2017-09-03 14:58:21 +08:00
// Show Manager update first
2019-01-21 15:49:03 -05:00
if (Config.remoteManagerVersionCode > BuildConfig.VERSION_CODE) {
new ManagerInstallDialog(requireActivity()).show();
2017-09-03 14:58:21 +08:00
return;
}
new MagiskInstallDialog((BaseActivity) requireActivity()).show();
}
2017-09-03 14:58:21 +08:00
private void managerInstall(View v) {
new ManagerInstallDialog(requireActivity()).show();
2017-05-21 12:16:38 +08:00
}
@OnClick(R.id.uninstall_button)
void uninstall() {
2018-07-28 22:52:40 +08:00
new UninstallDialog(requireActivity()).show();
2017-05-21 12:16:38 +08:00
}
2016-12-25 03:05:22 +08:00
@Nullable
@Override
2018-07-28 22:52:40 +08:00
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
2017-05-21 12:16:38 +08:00
View v = inflater.inflate(R.layout.fragment_magisk, container, false);
unbinder = new MagiskFragment_ViewBinding(this, v);
2018-07-28 22:52:40 +08:00
requireActivity().setTitle(R.string.magisk);
2017-08-30 02:28:24 +08:00
2019-01-30 17:11:03 -05:00
safetyNet = new SafetyNet(v);
magisk = new UpdateCardHolder(inflater, root);
manager = new UpdateCardHolder(inflater, root);
root.addView(magisk.itemView, 0);
root.addView(manager.itemView, 1);
2019-01-21 15:49:03 -05:00
keepVerityChkbox.setChecked(Config.keepVerity);
keepVerityChkbox.setOnCheckedChangeListener((view, checked) -> Config.keepVerity = checked);
keepEncChkbox.setChecked(Config.keepEnc);
keepEncChkbox.setOnCheckedChangeListener((view, checked) -> Config.keepEnc = checked);
2017-12-07 04:20:15 +08:00
2017-05-24 00:37:15 +08:00
mSwipeRefreshLayout.setOnRefreshListener(this);
2017-02-07 04:09:49 +08:00
2019-01-30 14:45:45 -05:00
magisk.install.setOnClickListener(this::magiskInstall);
manager.install.setOnClickListener(this::managerInstall);
if (Config.get(Config.Key.COREONLY)) {
magisk.additional.setText(R.string.core_only_enabled);
magisk.additional.setVisibility(View.VISIBLE);
}
if (!app.getPackageName().equals(BuildConfig.APPLICATION_ID)) {
manager.additional.setText("(" + app.getPackageName() + ")");
manager.additional.setVisibility(View.VISIBLE);
}
transition = new TransitionSet()
.setOrdering(TransitionSet.ORDERING_TOGETHER)
.addTransition(new Fade(Fade.OUT))
.addTransition(new ChangeBounds())
.addTransition(new Fade(Fade.IN));
updateUI();
2016-12-25 03:05:22 +08:00
return v;
}
2019-01-30 17:41:12 -05:00
@Override
public void onDestroyView() {
super.onDestroyView();
safetyNet.unbinder.unbind();
magisk.unbinder.unbind();
manager.unbinder.unbind();
}
2017-05-24 00:37:15 +08:00
@Override
public void onRefresh() {
mSwipeRefreshLayout.setRefreshing(false);
TransitionManager.beginDelayedTransition(root, transition);
2019-01-30 17:11:03 -05:00
safetyNet.reset();
magisk.reset();
manager.reset();
2017-05-24 00:37:15 +08:00
Config.loadMagiskInfo();
updateUI();
2017-05-24 00:37:15 +08:00
2018-08-01 00:47:31 +08:00
Topic.reset(getSubscribedTopics());
2019-01-21 15:49:03 -05:00
Config.remoteMagiskVersionString = null;
Config.remoteMagiskVersionCode = -1;
2017-05-24 00:37:15 +08:00
2017-08-31 03:07:33 +08:00
shownDialog = false;
2017-05-24 00:37:15 +08:00
// Trigger state check
2018-12-27 14:35:55 +08:00
if (Networking.checkNetworkStatus(app)) {
2018-08-02 00:41:10 +08:00
CheckUpdates.check();
2017-05-24 00:37:15 +08:00
}
}
2016-12-25 15:11:59 +08:00
@Override
2018-08-01 00:47:31 +08:00
public int[] getSubscribedTopics() {
2019-01-30 17:11:03 -05:00
return new int[] {Topic.UPDATE_CHECK_DONE};
2016-12-25 15:11:59 +08:00
}
2016-12-25 03:05:22 +08:00
@Override
2018-08-01 00:47:31 +08:00
public void onPublish(int topic, Object[] result) {
2019-01-30 17:11:03 -05:00
updateCheckUI();
2016-12-25 03:05:22 +08:00
}
2018-08-19 00:59:56 +08:00
private boolean hasGms() {
PackageManager pm = app.getPackageManager();
2018-08-19 00:59:56 +08:00
PackageInfo info;
try {
info = pm.getPackageInfo("com.google.android.gms", 0);
} catch (PackageManager.NameNotFoundException e) {
return false;
}
return info.applicationInfo.enabled;
}
2017-05-23 16:51:23 +08:00
private void updateUI() {
2018-07-28 22:52:40 +08:00
((MainActivity) requireActivity()).checkHideSection();
2016-12-25 22:36:51 +08:00
int image, color;
String status;
2019-01-21 15:49:03 -05:00
if (Config.magiskVersionCode < 0) {
2017-05-19 08:37:57 -07:00
color = colorBad;
image = R.drawable.ic_cancel;
status = getString(R.string.magisk_version_error);
magisk.status.setText(status);
magisk.currentVersion.setVisibility(View.GONE);
2016-12-25 22:36:51 +08:00
} else {
2017-05-19 08:37:57 -07:00
color = colorOK;
image = R.drawable.ic_check_circle;
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);
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);
2016-12-25 03:05:22 +08:00
}
}
private void updateCheckUI() {
int image, color;
String status;
2018-08-22 11:50:21 +08:00
2019-01-21 15:49:03 -05:00
if (Config.remoteMagiskVersionCode < 0) {
2016-12-25 03:05:22 +08:00
color = colorNeutral;
image = R.drawable.ic_help;
status = getString(R.string.invalid_update_channel);
2016-12-25 03:05:22 +08:00
} else {
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 {
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);
}
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)));
2019-01-21 15:49:03 -05:00
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);
2017-11-21 02:11:20 +08:00
} else {
color = colorOK;
image = R.drawable.ic_check_circle;
status = getString(R.string.manager_up_to_date);
manager.install.setText(R.string.install);
2017-11-21 02:11:20 +08:00
}
2017-09-03 00:17:42 +08:00
}
manager.statusIcon.setImageResource(image);
manager.statusIcon.setColorFilter(color);
manager.status.setText(status);
2017-09-03 00:17:42 +08:00
magisk.setValid(Config.remoteMagiskVersionCode > 0);
manager.setValid(Config.remoteManagerVersionCode > 0);
2016-12-25 03:05:22 +08:00
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);
}
2018-05-13 18:14:10 +08:00
if (!shownDialog && !ShellUtils.fastCmdResult("env_check")) {
shownDialog = true;
new EnvFixDialog(requireActivity()).show();
2018-05-13 18:14:10 +08:00
}
2016-12-25 03:05:22 +08:00
}
}