Commit 57af984e authored by topjohnwu's avatar topjohnwu

Add status fragment

parent 442e840a
package com.topjohnwu.magisk;
import android.app.Fragment;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.topjohnwu.magisk.receivers.DownloadReceiver;
import com.topjohnwu.magisk.utils.Async;
import com.topjohnwu.magisk.utils.Shell;
import com.topjohnwu.magisk.utils.Utils;
import com.topjohnwu.magisk.utils.ZipUtils;
import java.io.File;
import butterknife.ButterKnife;
// Currently empty, placing some code that we be used in the future
public class InstallFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.install_fragment, container, false);
ButterKnife.bind(this, v);
return v;
}
@Override
public void onResume() {
super.onResume();
getActivity().setTitle(R.string.install);
}
private AlertDialog.OnClickListener flashMagisk = (dialogInterface, i) -> Utils.dlAndReceive(
getActivity(),
new DownloadReceiver() {
@Override
public void task(Uri uri) {
new Async.FlashZIP(mContext, uri, mFilename) {
@Override
protected boolean unzipAndCheck() {
publishProgress(mContext.getString(R.string.zip_install_unzip_zip_msg));
if (Shell.rootAccess()) {
// We might not have busybox yet, unzip with Java
// We will have complete busybox after Magisk installation
ZipUtils.unzip(mCachedFile, new File(mCachedFile.getParent(), "magisk"));
Shell.su(
"mkdir -p " + Async.TMP_FOLDER_PATH + "/magisk",
"cp -af " + mCachedFile.getParent() + "/magisk/. " + Async.TMP_FOLDER_PATH + "/magisk"
);
}
super.unzipAndCheck();
return true;
}
@Override
protected void done() {
Shell.su("setprop magisk.version " + String.valueOf(StatusFragment.remoteMagiskVersion));
super.done();
}
}.exec();
}
},
StatusFragment.magiskLink,
"Magisk-v" + String.valueOf(StatusFragment.remoteMagiskVersion) + ".zip");
}
...@@ -67,6 +67,7 @@ public class LogFragment extends Fragment { ...@@ -67,6 +67,7 @@ public class LogFragment extends Fragment {
super.onResume(); super.onResume();
setHasOptionsMenu(true); setHasOptionsMenu(true);
new LogManager().read(); new LogManager().read();
getActivity().setTitle(R.string.log);
} }
@Override @Override
......
...@@ -84,6 +84,7 @@ public class MagiskHideFragment extends Fragment { ...@@ -84,6 +84,7 @@ public class MagiskHideFragment extends Fragment {
super.onResume(); super.onResume();
setHasOptionsMenu(true); setHasOptionsMenu(true);
mView = this.getView(); mView = this.getView();
getActivity().setTitle(R.string.magiskhide);
} }
private class LoadApps extends Async.RootTask<Void, Void, Void> { private class LoadApps extends Async.RootTask<Void, Void, Void> {
......
...@@ -37,10 +37,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -37,10 +37,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
@BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.toolbar) Toolbar toolbar;
@BindView(R.id.drawer_layout) DrawerLayout drawer; @BindView(R.id.drawer_layout) DrawerLayout drawer;
@BindView(R.id.nav_view) NavigationView navigationView; @BindView(R.id.nav_view) public NavigationView navigationView;
@IdRes @IdRes
private int mSelectedId = R.id.magisk; private int mSelectedId = R.id.status;
@Override @Override
protected void onCreate(final Bundle savedInstanceState) { protected void onCreate(final Bundle savedInstanceState) {
...@@ -59,10 +59,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -59,10 +59,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
} }
if (!Shell.rootAccess()) {
Snackbar.make(findViewById(android.R.id.content), R.string.no_root_access, Snackbar.LENGTH_LONG).show();
}
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
...@@ -125,7 +121,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -125,7 +121,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
private void checkHideSection() { private void checkHideSection() {
Menu menu = navigationView.getMenu(); Menu menu = navigationView.getMenu();
if (MagiskFragment.magiskVersion == -1) { if (StatusFragment.magiskVersion == -1) {
menu.findItem(R.id.magiskhide).setVisible(false); menu.findItem(R.id.magiskhide).setVisible(false);
menu.findItem(R.id.modules).setVisible(false); menu.findItem(R.id.modules).setVisible(false);
menu.findItem(R.id.downloads).setVisible(false); menu.findItem(R.id.downloads).setVisible(false);
...@@ -141,28 +137,27 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -141,28 +137,27 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
Fragment navFragment = null; Fragment navFragment = null;
String tag = ""; String tag = "";
switch (itemId) { switch (itemId) {
case R.id.magisk: case R.id.status:
setTitle(R.string.magisk); tag = "status";
tag = "magisk"; navFragment = new StatusFragment();
navFragment = new MagiskFragment(); break;
case R.id.install:
tag = "install";
navFragment = new InstallFragment();
break; break;
case R.id.modules: case R.id.modules:
setTitle(R.string.modules);
tag = "modules"; tag = "modules";
navFragment = new ModulesFragment(); navFragment = new ModulesFragment();
break; break;
case R.id.downloads: case R.id.downloads:
setTitle(R.string.downloads);
tag = "downloads"; tag = "downloads";
navFragment = new ReposFragment(); navFragment = new ReposFragment();
break; break;
case R.id.magiskhide: case R.id.magiskhide:
setTitle(R.string.magiskhide);
tag = "magiskhide"; tag = "magiskhide";
navFragment = new MagiskHideFragment(); navFragment = new MagiskHideFragment();
break; break;
case R.id.log: case R.id.log:
setTitle(R.string.log);
tag = "log"; tag = "log";
navFragment = new LogFragment(); navFragment = new LogFragment();
break; break;
...@@ -179,8 +174,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -179,8 +174,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out); transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
try { try {
transaction.replace(R.id.content_frame, navFragment, tag).commit(); transaction.replace(R.id.content_frame, navFragment, tag).commit();
} catch (IllegalStateException ignored) { } catch (IllegalStateException ignored) {}
}
} }
} }
} }
\ No newline at end of file
...@@ -92,6 +92,7 @@ public class ModulesFragment extends Fragment { ...@@ -92,6 +92,7 @@ public class ModulesFragment extends Fragment {
super.onResume(); super.onResume();
mView = this.getView(); mView = this.getView();
prefs.registerOnSharedPreferenceChangeListener(listener); prefs.registerOnSharedPreferenceChangeListener(listener);
getActivity().setTitle(R.string.modules);
} }
@Override @Override
......
...@@ -114,6 +114,7 @@ public class ReposFragment extends Fragment { ...@@ -114,6 +114,7 @@ public class ReposFragment extends Fragment {
super.onResume(); super.onResume();
setHasOptionsMenu(true); setHasOptionsMenu(true);
prefs.registerOnSharedPreferenceChangeListener(listener); prefs.registerOnSharedPreferenceChangeListener(listener);
getActivity().setTitle(R.string.downloads);
} }
@Override @Override
......
...@@ -89,10 +89,10 @@ public class SettingsActivity extends AppCompatActivity { ...@@ -89,10 +89,10 @@ public class SettingsActivity extends AppCompatActivity {
themePreference.setSummary(themePreference.getValue()); themePreference.setSummary(themePreference.getValue());
if (MagiskFragment.magiskVersion < 9) { if (StatusFragment.magiskVersion < 9) {
hostsPreference.setEnabled(false); hostsPreference.setEnabled(false);
busyboxPreference.setEnabled(false); busyboxPreference.setEnabled(false);
} else if (MagiskFragment.magiskVersion < 8) { } else if (StatusFragment.magiskVersion < 8) {
magiskhidePreference.setEnabled(false); magiskhidePreference.setEnabled(false);
} else { } else {
busyboxPreference.setEnabled(true); busyboxPreference.setEnabled(true);
......
...@@ -5,11 +5,9 @@ import android.content.SharedPreferences; ...@@ -5,11 +5,9 @@ import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
import com.topjohnwu.magisk.utils.Async; import com.topjohnwu.magisk.utils.Async;
import com.topjohnwu.magisk.utils.Logger; import com.topjohnwu.magisk.utils.Logger;
import com.topjohnwu.magisk.utils.SafetyNetHelper;
import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.magisk.utils.Utils;
public class SplashActivity extends AppCompatActivity { public class SplashActivity extends AppCompatActivity {
...@@ -38,24 +36,6 @@ public class SplashActivity extends AppCompatActivity { ...@@ -38,24 +36,6 @@ public class SplashActivity extends AppCompatActivity {
.putBoolean("hosts", Utils.itemExist(false, "/magisk/.core/hosts")) .putBoolean("hosts", Utils.itemExist(false, "/magisk/.core/hosts"))
.apply(); .apply();
// Simple POC for checking SN status
new SafetyNetHelper(getApplicationContext()) {
@Override
public void handleResults(int i) {
switch (i) {
case -1:
Toast.makeText(mContext, "SN: Error", Toast.LENGTH_LONG).show();
break;
case 0:
Toast.makeText(mContext, "SN: Fail", Toast.LENGTH_LONG).show();
break;
case 1:
Toast.makeText(mContext, "SN: Success", Toast.LENGTH_LONG).show();
break;
}
}
}.requestTest();
new Async.CheckUpdates(prefs).exec(); new Async.CheckUpdates(prefs).exec();
new Async.LoadModules(prefs) { new Async.LoadModules(prefs) {
......
...@@ -12,8 +12,8 @@ import android.support.v7.app.AlertDialog; ...@@ -12,8 +12,8 @@ import android.support.v7.app.AlertDialog;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import com.topjohnwu.magisk.MagiskFragment;
import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.R;
import com.topjohnwu.magisk.StatusFragment;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
...@@ -63,14 +63,14 @@ public class Async { ...@@ -63,14 +63,14 @@ public class Async {
JSONObject magisk = json.getJSONObject("magisk"); JSONObject magisk = json.getJSONObject("magisk");
JSONObject app = json.getJSONObject("app"); JSONObject app = json.getJSONObject("app");
MagiskFragment.remoteMagiskVersion = magisk.getDouble("versionCode"); StatusFragment.remoteMagiskVersion = magisk.getDouble("versionCode");
MagiskFragment.magiskLink = magisk.getString("link"); StatusFragment.magiskLink = magisk.getString("link");
MagiskFragment.magiskChangelog = magisk.getString("changelog"); StatusFragment.magiskChangelog = magisk.getString("changelog");
MagiskFragment.remoteAppVersion = app.getString("version"); StatusFragment.remoteAppVersion = app.getString("version");
MagiskFragment.remoteAppVersionCode = app.getInt("versionCode"); StatusFragment.remoteAppVersionCode = app.getInt("versionCode");
MagiskFragment.appLink = app.getString("link"); StatusFragment.appLink = app.getString("link");
MagiskFragment.appChangelog = app.getString("changelog"); StatusFragment.appChangelog = app.getString("changelog");
} catch (JSONException ignored) { } catch (JSONException ignored) {
Logger.dev("JSON error!"); Logger.dev("JSON error!");
......
...@@ -15,7 +15,6 @@ import org.json.JSONException; ...@@ -15,7 +15,6 @@ import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.Arrays;
public abstract class SafetyNetHelper public abstract class SafetyNetHelper
implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks { implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks {
......
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:viewportWidth="24.0"> android:viewportHeight="24.0">
<path <path
android:fillColor="#fff" android:fillColor="#fff"
android:pathData="M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z"/> android:pathData="M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2zM17,15.59L15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 17,15.59z"/>
</vector> </vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:viewportWidth="24.0"> android:viewportHeight="24.0">
<path <path
android:fillColor="#fff" android:fillColor="#FF000000"
android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z"/> android:pathData="M13,7h-2v2h2L13,7zM13,11h-2v6h2v-6zM17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19L7,19L7,5h10v14z"/>
</vector> </vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#fff"
android:pathData="M21,10.12h-6.78l2.74,-2.82c-2.73,-2.7 -7.15,-2.8 -9.88,-0.1 -2.73,2.71 -2.73,7.08 0,9.79 2.73,2.71 7.15,2.71 9.88,0C18.32,15.65 19,14.08 19,12.1h2c0,1.98 -0.88,4.55 -2.64,6.29 -3.51,3.48 -9.21,3.48 -12.72,0 -3.5,-3.47 -3.53,-9.11 -0.02,-12.58 3.51,-3.47 9.14,-3.47 12.65,0L21,3v7.12zM12.5,8v4.25l3.5,2.08 -0.72,1.21L11,13V8h1.5z"/>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
...@@ -37,6 +37,15 @@ ...@@ -37,6 +37,15 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<TextView
android:id="@+id/magisk_version"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:padding="6dp"
android:textStyle="bold"/>
<FrameLayout <FrameLayout
android:id="@+id/magisk_status_container" android:id="@+id/magisk_status_container"
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -51,23 +60,30 @@ ...@@ -51,23 +60,30 @@
android:layout_height="84dp" android:layout_height="84dp"
android:layout_gravity="center"/> android:layout_gravity="center"/>
<ProgressBar
android:id="@+id/magisk_check_updates_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</FrameLayout> </FrameLayout>
<TextView <TextView
android:id="@+id/magisk_version" android:id="@+id/magisk_update_status"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:padding="6dp" android:padding="6dp"
android:textStyle="bold"/> android:textStyle="bold"
android:text="@string/checking_for_updates" />
</LinearLayout> </LinearLayout>
</android.support.v7.widget.CardView> </android.support.v7.widget.CardView>
<android.support.v7.widget.CardView <android.support.v7.widget.CardView
android:id="@+id/magisk_updateView" android:id="@+id/rootStatusView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
...@@ -82,8 +98,17 @@ ...@@ -82,8 +98,17 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<TextView
android:id="@+id/root_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:padding="6dp"
android:textStyle="bold"/>
<FrameLayout <FrameLayout
android:id="@+id/magisk_check_updates_container" android:id="@+id/root_status_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="100dp" android:layout_height="100dp"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
...@@ -91,22 +116,15 @@ ...@@ -91,22 +116,15 @@
android:orientation="vertical"> android:orientation="vertical">
<ImageView <ImageView
android:id="@+id/magisk_check_updates_icon" android:id="@+id/root_status_icon"
android:layout_width="84dp" android:layout_width="84dp"
android:layout_height="84dp" android:layout_height="84dp"
android:layout_gravity="center" android:layout_gravity="center" />
android:src="@drawable/ic_check_circle"/>
<ProgressBar
android:id="@+id/magisk_check_updates_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</FrameLayout> </FrameLayout>
<TextView <TextView
android:id="@+id/magisk_check_updates_status" android:id="@+id/root_info"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
...@@ -119,7 +137,7 @@ ...@@ -119,7 +137,7 @@
</android.support.v7.widget.CardView> </android.support.v7.widget.CardView>
<android.support.v7.widget.CardView <android.support.v7.widget.CardView
android:id="@+id/app_updateView" android:id="@+id/safetyNetView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="4dp" android:layout_marginBottom="4dp"
...@@ -135,21 +153,21 @@ ...@@ -135,21 +153,21 @@
android:orientation="vertical"> android:orientation="vertical">
<FrameLayout <FrameLayout
android:id="@+id/app_check_updates_container" android:id="@+id/safetyNet_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="100dp" android:layout_height="100dp"
android:foregroundGravity="center" android:foregroundGravity="center"
android:orientation="vertical"> android:orientation="vertical">
<ImageView <ImageView
android:id="@+id/app_check_updates_icon" android:id="@+id/safetyNet_icon"
android:layout_width="84dp" android:layout_width="84dp"
android:layout_height="84dp" android:layout_height="84dp"
android:layout_gravity="center" android:layout_gravity="center"
android:src="@drawable/ic_check_circle"/> android:src="@drawable/ic_check_circle"/>
<ProgressBar <ProgressBar
android:id="@+id/app_check_updates_progress" android:id="@+id/safetyNet_check_progress"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center"/> android:layout_gravity="center"/>
...@@ -157,13 +175,14 @@ ...@@ -157,13 +175,14 @@
</FrameLayout> </FrameLayout>
<TextView <TextView
android:id="@+id/app_check_updates_status" android:id="@+id/safetyNet_status"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:padding="6dp" android:padding="6dp"
android:textStyle="bold"/> android:textStyle="bold"
android:text="@string/checking_safetyNet_status" />
</LinearLayout> </LinearLayout>
......
...@@ -6,9 +6,14 @@ ...@@ -6,9 +6,14 @@
android:id="@+id/main_group"> android:id="@+id/main_group">
<item <item
android:id="@+id/magisk" android:id="@+id/status"
android:icon="@drawable/ic_device_information"
android:title="@string/status"/>
<item
android:id="@+id/install"
android:icon="@drawable/magisk" android:icon="@drawable/magisk"
android:title="@string/magisk"/> android:title="@string/install"/>
<item <item
android:id="@+id/modules" android:id="@+id/modules"
......
...@@ -11,15 +11,25 @@ ...@@ -11,15 +11,25 @@
<string name="downloads">Downloads</string> <string name="downloads">Downloads</string>
<string name="log">Log</string> <string name="log">Log</string>
<string name="settings">Settings</string> <string name="settings">Settings</string>
<string name="status">Status</string>
<string name="install">Install</string>
<!--Magisk Fragment--> <!--Status Fragment-->
<string name="magisk_version">Installed Magisk v%1$s</string> <string name="magisk_version">Installed Magisk v%1$s</string>
<string name="magisk_version_error">Have you installed Magisk?</string> <string name="magisk_version_error">Magisk not installed</string>
<string name="app_update_available">Magisk Manager App v%1$s update!</string> <string name="checking_for_updates">Checking for updates…</string>
<string name="magisk_update_available">Magisk v%1$s update!</string> <string name="magisk_update_available">Magisk v%1$s available!</string>
<string name="cannot_check_updates">Cannot check for updates</string> <string name="cannot_check_updates">Cannot check for updates, no Internet?</string>
<string name="up_to_date">Latest version of %1$s installed</string> <string name="up_to_date">Latest version of %1$s installed</string>
<string name="root_error">Rooted but no root permission, not allowed?</string>
<string name="not_rooted">Not rooted</string>
<string name="proper_root">Properly rooted</string>
<string name="checking_safetyNet_status">Checking SafetyNet status…</string>
<string name="safetyNet_error">Cannot check SafetyNet, no Internet?</string>
<string name="safetyNet_fail">SafetyNet Failed: CTS profile mismatch</string>
<string name="safetyNet_pass">SafetyNet Passed</string>
<string name="root_info_warning">Functionality greatly limited</string>
<!--Root Fragment--> <!--Root Fragment-->
...@@ -54,7 +64,7 @@ ...@@ -54,7 +64,7 @@
<string name="app_developers">Main developers</string> <string name="app_developers">Main developers</string>
<string name="app_developers_"><![CDATA[App created by <a href="https://github.com/topjohnwu">topjohnwu</a> in collaboration with <a href="https://github.com/d8ahazard">Digitalhigh</a> and <a href="https://github.com/dvdandroid">Dvdandroid</a>.]]></string> <string name="app_developers_"><![CDATA[App created by <a href="https://github.com/topjohnwu">topjohnwu</a> in collaboration with <a href="https://github.com/d8ahazard">Digitalhigh</a> and <a href="https://github.com/dvdandroid">Dvdandroid</a>.]]></string>
<string name="app_changelog">App\'s changelog</string> <string name="app_changelog">App\'s changelog</string>
<string name="translators"/> <string name="translators" />
<string name="app_version">App\'s version</string> <string name="app_version">App\'s version</string>
<string name="app_source_code">Source code</string> <string name="app_source_code">Source code</string>
<string name="donation">Donation</string> <string name="donation">Donation</string>
...@@ -65,11 +75,9 @@ ...@@ -65,11 +75,9 @@
<string name="permissionNotGranted">This feature will not work without permission to write external storage.</string> <string name="permissionNotGranted">This feature will not work without permission to write external storage.</string>
<string name="no_root_access">No root access, functionality limited</string> <string name="no_root_access">No root access, functionality limited</string>
<string name="no_thanks">No thanks</string> <string name="no_thanks">No thanks</string>
<string name="update_title">%1$s Update!</string>
<string name="update_msg">New version v%2$s of %1$s is available!\nChangelog:\n%3$s</string>
<string name="repo_install_title">Install %1$s</string> <string name="repo_install_title">Install %1$s</string>
<string name="repo_install_msg">Do you want to install %1$s ?</string> <string name="repo_install_msg">Do you want to install %1$s ?</string>
<string name="download_install">Download and install</string> <string name="download_install">Go to \"Install\" section</string>
<string name="download_file_error">Error downloading file</string> <string name="download_file_error">Error downloading file</string>
<string name="install_error">Installation error!</string> <string name="install_error">Installation error!</string>
<string name="manual_install_1">Zip file placed in %1$s</string> <string name="manual_install_1">Zip file placed in %1$s</string>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment