Improve installation UI and dialog

This commit is contained in:
topjohnwu 2017-01-07 02:46:50 +08:00
parent 442fcf921c
commit a474eafe84
6 changed files with 73 additions and 18 deletions

View File

@ -30,6 +30,7 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi
public static List<String> blockList; public static List<String> blockList;
public static String bootBlock = null; public static String bootBlock = null;
@BindView(R.id.current_version_title) TextView currentVersionTitle;
@BindView(R.id.install_title) TextView installTitle; @BindView(R.id.install_title) TextView installTitle;
@BindView(R.id.block_spinner) Spinner spinner; @BindView(R.id.block_spinner) Spinner spinner;
@BindView(R.id.detect_bootimage) Button detectButton; @BindView(R.id.detect_bootimage) Button detectButton;
@ -43,13 +44,14 @@ public class InstallFragment extends Fragment implements CallbackHandler.EventLi
View v = inflater.inflate(R.layout.install_fragment, container, false); View v = inflater.inflate(R.layout.install_fragment, container, false);
ButterKnife.bind(this, v); ButterKnife.bind(this, v);
detectButton.setOnClickListener(v1 -> toAutoDetect()); detectButton.setOnClickListener(v1 -> toAutoDetect());
currentVersionTitle.setText(getString(R.string.current_magisk_title, StatusFragment.magiskVersionString));
installTitle.setText(getString(R.string.install_magisk_title, StatusFragment.remoteMagiskVersion)); installTitle.setText(getString(R.string.install_magisk_title, StatusFragment.remoteMagiskVersion));
flashButton.setOnClickListener(v1 -> { flashButton.setOnClickListener(v1 -> {
String bootImage = bootBlock; String bootImage = bootBlock;
if (bootImage == null) { if (bootImage == null) {
bootImage = blockList.get(spinner.getSelectedItemPosition() - 1); bootImage = blockList.get(spinner.getSelectedItemPosition() - 1);
} }
String filename = "Magisk-v" + String.valueOf(StatusFragment.remoteMagiskVersion) + ".zip"; String filename = "Magisk-v" + StatusFragment.remoteMagiskVersion + ".zip";
String finalBootImage = bootImage; String finalBootImage = bootImage;
MainActivity.alertBuilder MainActivity.alertBuilder
.setTitle(getString(R.string.repo_install_title, getString(R.string.magisk))) .setTitle(getString(R.string.repo_install_title, getString(R.string.magisk)))

View File

@ -1,6 +1,7 @@
package com.topjohnwu.magisk; package com.topjohnwu.magisk;
import android.Manifest; import android.Manifest;
import android.app.AlertDialog;
import android.app.Fragment; import android.app.Fragment;
import android.app.FragmentTransaction; import android.app.FragmentTransaction;
import android.content.Intent; import android.content.Intent;
@ -17,7 +18,6 @@ import android.support.v4.app.ActivityCompat;
import android.support.v4.view.GravityCompat; import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.Menu; import android.view.Menu;

View File

@ -1,7 +1,12 @@
package com.topjohnwu.magisk; package com.topjohnwu.magisk;
import android.app.AlertDialog;
import android.app.Fragment; import android.app.Fragment;
import android.app.FragmentTransaction; import android.app.FragmentTransaction;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout; import android.support.v4.widget.SwipeRefreshLayout;
@ -26,9 +31,11 @@ import butterknife.ButterKnife;
public class StatusFragment extends Fragment implements CallbackHandler.EventListener { public class StatusFragment extends Fragment implements CallbackHandler.EventListener {
public static double magiskVersion, remoteMagiskVersion = -1; public static double magiskVersion, remoteMagiskVersion = -1;
public static String magiskVersionString, magiskLink, magiskChangelog; public static String magiskVersionString = "(none)", magiskLink, releaseNoteLink;
public static int SNCheckResult = -1; public static int SNCheckResult = -1;
private static boolean noDialog = false;
public static final CallbackHandler.Event updateCheckDone = new CallbackHandler.Event(); public static final CallbackHandler.Event updateCheckDone = new CallbackHandler.Event();
public static final CallbackHandler.Event safetyNetDone = new CallbackHandler.Event(); public static final CallbackHandler.Event safetyNetDone = new CallbackHandler.Event();
@ -62,6 +69,8 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis
checkMagiskInfo(); checkMagiskInfo();
} }
private AlertDialog updateMagisk;
@Nullable @Nullable
@Override @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@ -84,13 +93,12 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis
safetyNetStatusText.setTextColor(defaultColor); safetyNetStatusText.setTextColor(defaultColor);
safetyNetDone.isTriggered = false; safetyNetDone.isTriggered = false;
noDialog = false;
updateUI(); updateUI();
new Async.CheckUpdates().exec(); new Async.CheckUpdates().exec();
}); });
updateUI();
safetyNetContainer.setOnClickListener(view -> { safetyNetContainer.setOnClickListener(view -> {
safetyNetProgress.setVisibility(View.VISIBLE); safetyNetProgress.setVisibility(View.VISIBLE);
safetyNetContainer.setBackgroundColor(trans); safetyNetContainer.setBackgroundColor(trans);
@ -99,7 +107,7 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis
Async.checkSafetyNet(getActivity()); Async.checkSafetyNet(getActivity());
}); });
if (magiskVersion < 0 && Shell.rootAccess()) { if (magiskVersion < 0 && Shell.rootAccess() && !noDialog) {
MainActivity.alertBuilder MainActivity.alertBuilder
.setTitle(R.string.no_magisk_title) .setTitle(R.string.no_magisk_title)
.setMessage(R.string.no_magisk_msg) .setMessage(R.string.no_magisk_msg)
@ -112,10 +120,12 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis
transaction.replace(R.id.content_frame, new InstallFragment(), "install").commit(); transaction.replace(R.id.content_frame, new InstallFragment(), "install").commit();
} catch (IllegalStateException ignored) {} } catch (IllegalStateException ignored) {}
}) })
.setNegativeButton(R.string.no_thanks, null) .setNegativeButton(R.string.no_thanks, (dialogInterface, i) -> noDialog = true)
.show(); .show();
} }
updateUI();
return v; return v;
} }
@ -229,6 +239,31 @@ public class StatusFragment extends Fragment implements CallbackHandler.EventLis
magiskCheckUpdatesProgress.setVisibility(View.GONE); magiskCheckUpdatesProgress.setVisibility(View.GONE);
mSwipeRefreshLayout.setRefreshing(false); mSwipeRefreshLayout.setRefreshing(false);
updateMagisk = MainActivity.alertBuilder
.setTitle(R.string.magisk_update_title)
.setMessage(getString(R.string.magisk_update_message, remoteMagiskVersion))
.setCancelable(true)
.setPositiveButton(R.string.goto_install, (dialogInterface, i) -> {
((MainActivity) getActivity()).navigationView.setCheckedItem(R.id.install);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
try {
transaction.replace(R.id.content_frame, new InstallFragment(), "install").commit();
} catch (IllegalStateException ignored) {}
})
.setNeutralButton(R.string.check_release_notes, (dialog, which) -> {
getActivity().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(releaseNoteLink)));
})
.setNegativeButton(R.string.no_thanks, (dialogInterface, i) -> noDialog = true)
.create();
if (magiskVersion < remoteMagiskVersion && Shell.rootAccess()) {
magiskStatusContainer.setOnClickListener(view -> updateMagisk.show());
if (!noDialog) {
updateMagisk.show();
}
}
} }
private void updateSafetyNetUI() { private void updateSafetyNetUI() {

View File

@ -59,12 +59,10 @@ public class Async {
String jsonStr = WebRequest.makeWebServiceCall(UPDATE_JSON, WebRequest.GET); String jsonStr = WebRequest.makeWebServiceCall(UPDATE_JSON, WebRequest.GET);
try { try {
JSONObject json = new JSONObject(jsonStr); JSONObject json = new JSONObject(jsonStr);
JSONObject magisk = json.getJSONObject("magisk"); JSONObject magisk = json.getJSONObject("magisk");
StatusFragment.remoteMagiskVersion = magisk.getDouble("versionCode"); StatusFragment.remoteMagiskVersion = magisk.getDouble("versionCode");
StatusFragment.magiskLink = magisk.getString("link"); StatusFragment.magiskLink = magisk.getString("link");
StatusFragment.magiskChangelog = magisk.getString("changelog"); StatusFragment.releaseNoteLink = magisk.getString("note");
} catch (JSONException ignored) {} } catch (JSONException ignored) {}
return null; return null;
} }

View File

@ -17,14 +17,30 @@
style="?attr/cardStyle" style="?attr/cardStyle"
app:cardUseCompatPadding="true"> app:cardUseCompatPadding="true">
<TextView <LinearLayout
android:id="@+id/install_title" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_gravity="center" android:padding="15dp">
android:gravity="center"
android:padding="15dp" <TextView
android:textStyle="bold" /> android:id="@+id/install_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:padding="5dp"
android:textStyle="bold" />
<TextView
android:id="@+id/current_version_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:padding="5dp"
android:textStyle="bold" />
</LinearLayout>
</android.support.v7.widget.CardView> </android.support.v7.widget.CardView>

View File

@ -41,7 +41,8 @@
<string name="advanced_settings_title">Advanced Settings</string> <string name="advanced_settings_title">Advanced Settings</string>
<string name="keep_force_encryption">Keep force encryption</string> <string name="keep_force_encryption">Keep force encryption</string>
<string name="keep_dm_verity">Keep dm-verity</string> <string name="keep_dm_verity">Keep dm-verity</string>
<string name="install_magisk_title">Install Magisk Version: v%1$.1f</string> <string name="current_magisk_title">Installed Magisk Version: v%1$s</string>
<string name="install_magisk_title">Latest Magisk Version: v%1$.1f</string>
<string name="magiskify" translatable="false">Magiskify</string> <string name="magiskify" translatable="false">Magiskify</string>
<!--Module Fragment--> <!--Module Fragment-->
@ -105,6 +106,9 @@
<string name="no_magisk_title">No Magisk Installed!</string> <string name="no_magisk_title">No Magisk Installed!</string>
<string name="no_magisk_msg">Do you want to download and install Magisk?</string> <string name="no_magisk_msg">Do you want to download and install Magisk?</string>
<string name="downloading_toast">Downloading %1$s</string> <string name="downloading_toast">Downloading %1$s</string>
<string name="magisk_update_title">New Magisk Update Available!</string>
<string name="magisk_update_message">Magisk v%1$.1f update is live, do you want to install?</string>
<string name="check_release_notes">Check release notes</string>
<!--URL Templates--> <!--URL Templates-->
<string name="url_main" translatable="false">https://api.github.com/orgs/Magisk-Modules-Repo/repos?access_token=%1$s</string> <string name="url_main" translatable="false">https://api.github.com/orgs/Magisk-Modules-Repo/repos?access_token=%1$s</string>