mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-01-04 22:47:38 +00:00
Change root detection and toggle
This commit is contained in:
parent
f96865c2cb
commit
11e1d04dd1
@ -104,7 +104,7 @@ public class MagiskFragment extends Fragment {
|
|||||||
magiskCheckUpdatesStatus.setText(getString(R.string.magisk_update_available, String.valueOf(Utils.remoteMagiskVersion)));
|
magiskCheckUpdatesStatus.setText(getString(R.string.magisk_update_available, String.valueOf(Utils.remoteMagiskVersion)));
|
||||||
magiskUpdateView.setOnClickListener(view -> new AlertDialog.Builder(getActivity())
|
magiskUpdateView.setOnClickListener(view -> new AlertDialog.Builder(getActivity())
|
||||||
.setTitle(getString(R.string.update_title, getString(R.string.magisk)))
|
.setTitle(getString(R.string.update_title, getString(R.string.magisk)))
|
||||||
.setMessage(Html.fromHtml(getString(R.string.update_msg, getString(R.string.magisk), String.valueOf(Utils.remoteMagiskVersion), Utils.magiskChangelog)))
|
.setMessage(getString(R.string.update_msg, getString(R.string.magisk), String.valueOf(Utils.remoteMagiskVersion), Utils.magiskChangelog))
|
||||||
.setCancelable(true)
|
.setCancelable(true)
|
||||||
.setPositiveButton(R.string.download_install, (dialogInterface, i) -> {
|
.setPositiveButton(R.string.download_install, (dialogInterface, i) -> {
|
||||||
Utils.downloadAndReceive(
|
Utils.downloadAndReceive(
|
||||||
@ -131,7 +131,7 @@ public class MagiskFragment extends Fragment {
|
|||||||
appCheckUpdatesStatus.setText(getString(R.string.app_update_available, String.valueOf(Utils.remoteAppVersion)));
|
appCheckUpdatesStatus.setText(getString(R.string.app_update_available, String.valueOf(Utils.remoteAppVersion)));
|
||||||
appUpdateView.setOnClickListener(view -> new AlertDialog.Builder(getActivity())
|
appUpdateView.setOnClickListener(view -> new AlertDialog.Builder(getActivity())
|
||||||
.setTitle(getString(R.string.update_title, getString(R.string.app_name)))
|
.setTitle(getString(R.string.update_title, getString(R.string.app_name)))
|
||||||
.setMessage(Html.fromHtml(getString(R.string.update_msg, getString(R.string.app_name), String.valueOf(Utils.remoteAppVersion), Utils.appChangelog)))
|
.setMessage(getString(R.string.update_msg, getString(R.string.app_name), String.valueOf(Utils.remoteAppVersion), Utils.appChangelog))
|
||||||
.setCancelable(true)
|
.setCancelable(true)
|
||||||
.setPositiveButton(R.string.download_install, (dialogInterface, i) -> {
|
.setPositiveButton(R.string.download_install, (dialogInterface, i) -> {
|
||||||
Utils.downloadAndReceive(getActivity(),
|
Utils.downloadAndReceive(getActivity(),
|
||||||
|
@ -69,7 +69,7 @@ public class ModulesFragment extends Fragment {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
new Utils.LoadModules(getActivity(), false).execute();
|
new Utils.LoadModules(getActivity()).execute();
|
||||||
mTaskDelegate = result -> {
|
mTaskDelegate = result -> {
|
||||||
if (result.equals("OK")) {
|
if (result.equals("OK")) {
|
||||||
RefreshUI();
|
RefreshUI();
|
||||||
@ -121,7 +121,7 @@ public class ModulesFragment extends Fragment {
|
|||||||
viewPager.setAdapter(new TabsAdapter(getChildFragmentManager()));
|
viewPager.setAdapter(new TabsAdapter(getChildFragmentManager()));
|
||||||
tabLayout.setupWithViewPager(viewPager);
|
tabLayout.setupWithViewPager(viewPager);
|
||||||
viewPager.setCurrentItem(viewPagePosition);
|
viewPager.setCurrentItem(viewPagePosition);
|
||||||
new Utils.LoadModules(getActivity(), true).execute();
|
new Utils.LoadModules(getActivity()).execute();
|
||||||
Collections.sort(listModules, new CustomComparator());
|
Collections.sort(listModules, new CustomComparator());
|
||||||
Collections.sort(listModulesCache, new CustomComparator());
|
Collections.sort(listModulesCache, new CustomComparator());
|
||||||
new updateUI().execute();
|
new updateUI().execute();
|
||||||
|
@ -15,6 +15,7 @@ import android.widget.Switch;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.topjohnwu.magisk.utils.Shell;
|
import com.topjohnwu.magisk.utils.Shell;
|
||||||
|
import com.topjohnwu.magisk.utils.Utils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -65,13 +66,13 @@ public class RootFragment extends Fragment {
|
|||||||
new updateUI().execute();
|
new updateUI().execute();
|
||||||
|
|
||||||
rootToggle.setOnClickListener(toggle -> {
|
rootToggle.setOnClickListener(toggle -> {
|
||||||
Shell.su(((CompoundButton) toggle).isChecked() ? "setprop magisk.root 1" : "setprop magisk.root 0");
|
Utils.toggleRoot(((CompoundButton) toggle).isChecked());
|
||||||
new Handler().postDelayed(() -> new updateUI().execute(), 1000);
|
new updateUI().execute();
|
||||||
});
|
});
|
||||||
|
|
||||||
selinuxToggle.setOnClickListener(toggle -> {
|
selinuxToggle.setOnClickListener(toggle -> {
|
||||||
Shell.su(((CompoundButton) toggle).isChecked() ? "setenforce 1" : "setenforce 0");
|
Shell.su(((CompoundButton) toggle).isChecked() ? "setenforce 1" : "setenforce 0");
|
||||||
new Handler().postDelayed(() -> new updateUI().execute(), 1000);
|
new updateUI().execute();
|
||||||
});
|
});
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
@ -153,25 +154,25 @@ public class RootFragment extends Fragment {
|
|||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
// Proper root
|
// Proper root
|
||||||
if (new File("/magisk/.core/bin/su").exists()) {
|
if (Utils.rootEnabled()) {
|
||||||
// Mounted
|
// Enabled
|
||||||
rootStatusContainer.setBackgroundColor(accent);
|
rootStatusContainer.setBackgroundColor(accent);
|
||||||
rootStatusIcon.setImageResource(statusError);
|
rootStatusIcon.setImageResource(statusError);
|
||||||
rootStatus.setTextColor(accent);
|
rootStatus.setTextColor(accent);
|
||||||
rootStatus.setText(R.string.root_mounted);
|
rootStatus.setText(R.string.root_enabled);
|
||||||
rootToggle.setChecked(true);
|
rootToggle.setChecked(true);
|
||||||
safetyNetStatusIcon.setImageResource(statusError);
|
safetyNetStatusIcon.setImageResource(statusError);
|
||||||
safetyNetStatus.setText(R.string.root_mounted_info);
|
safetyNetStatus.setText(R.string.root_enabled_info);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
// Not Mounted
|
// Disabled
|
||||||
rootStatusContainer.setBackgroundColor(green500);
|
rootStatusContainer.setBackgroundColor(green500);
|
||||||
rootStatusIcon.setImageResource(statusOK);
|
rootStatusIcon.setImageResource(statusOK);
|
||||||
rootStatus.setTextColor(green500);
|
rootStatus.setTextColor(green500);
|
||||||
rootStatus.setText(R.string.root_unmounted);
|
rootStatus.setText(R.string.root_disabled);
|
||||||
rootToggle.setChecked(false);
|
rootToggle.setChecked(false);
|
||||||
safetyNetStatusIcon.setImageResource(statusOK);
|
safetyNetStatusIcon.setImageResource(statusOK);
|
||||||
safetyNetStatus.setText(R.string.root_unmounted_info);
|
safetyNetStatus.setText(R.string.root_disabled_info);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -5,6 +5,7 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
import android.os.AsyncTask;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@ -32,7 +33,6 @@ import butterknife.ButterKnife;
|
|||||||
public class WelcomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
|
public class WelcomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
|
||||||
|
|
||||||
private static final String SELECTED_ITEM_ID = "SELECTED_ITEM_ID";
|
private static final String SELECTED_ITEM_ID = "SELECTED_ITEM_ID";
|
||||||
private Context mContext;
|
|
||||||
|
|
||||||
private final Handler mDrawerHandler = new Handler();
|
private final Handler mDrawerHandler = new Handler();
|
||||||
|
|
||||||
@ -49,10 +49,6 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView
|
|||||||
setContentView(R.layout.activity_welcome);
|
setContentView(R.layout.activity_welcome);
|
||||||
ButterKnife.bind(this);
|
ButterKnife.bind(this);
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Startups
|
// Startups
|
||||||
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|
||||||
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
@ -67,15 +63,8 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView
|
|||||||
if (!prefs.contains("oauth_key")) {
|
if (!prefs.contains("oauth_key")) {
|
||||||
|
|
||||||
}
|
}
|
||||||
if (!prefs.contains("hasCachedRepos")) {
|
new Utils.LoadModules(this).execute();
|
||||||
new Utils.LoadModules(this, true).execute();
|
new Utils.LoadRepos(this, !prefs.contains("hasCachedRepos"), delegate).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
new Utils.LoadRepos(this, true,delegate).execute();
|
|
||||||
|
|
||||||
} else {
|
|
||||||
new Utils.LoadModules(getApplication(),false).execute();
|
|
||||||
new Utils.LoadRepos(this, false,delegate).execute();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ public class RepoHelper {
|
|||||||
new BuildFromWeb(delegate).execute();
|
new BuildFromWeb(delegate).execute();
|
||||||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
|
||||||
String date = format.format(Calendar.getInstance().getTime());
|
String date = format.format(Calendar.getInstance().getTime());
|
||||||
prefs.edit().putString("last_update",date).apply();
|
prefs.edit().putString("last_update", date).apply();
|
||||||
} else {
|
} else {
|
||||||
Log.d(TAG, "RepoHelper: Building from cache");
|
Log.d(TAG, "RepoHelper: Building from cache");
|
||||||
BuildFromCache();
|
BuildFromCache();
|
||||||
|
@ -69,25 +69,45 @@ public class Utils {
|
|||||||
|
|
||||||
public static boolean fileExist(String path) {
|
public static boolean fileExist(String path) {
|
||||||
List<String> ret;
|
List<String> ret;
|
||||||
ret = Shell.sh("if [ -f " + path + " ]; then echo true; else echo false; fi");
|
String command = "if [ -f " + path + " ]; then echo true; else echo false; fi";
|
||||||
if (!Boolean.parseBoolean(ret.get(0)) && Shell.rootAccess())
|
if (Shell.rootAccess()) {
|
||||||
ret = Shell.su("if [ -f " + path + " ]; then echo true; else echo false; fi");
|
ret = Shell.su(command);
|
||||||
|
} else {
|
||||||
|
ret = Shell.sh(command);
|
||||||
|
}
|
||||||
|
return Boolean.parseBoolean(ret.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean rootEnabled() {
|
||||||
|
List<String> ret;
|
||||||
|
String command = "if [ -z $(which su) ]; then echo false; else echo true; fi";
|
||||||
|
ret = Shell.sh(command);
|
||||||
return Boolean.parseBoolean(ret.get(0));
|
return Boolean.parseBoolean(ret.get(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean createFile(String path) {
|
public static boolean createFile(String path) {
|
||||||
|
String command = "touch " + path + " 2>/dev/null; if [ -f " + path + " ]; then echo true; else echo false; fi";
|
||||||
if (!Shell.rootAccess()) {
|
if (!Shell.rootAccess()) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
return Boolean.parseBoolean(Shell.su("touch " + path + " 2>/dev/null; if [ -f " + path + " ]; then echo true; else echo false; fi").get(0));
|
return Boolean.parseBoolean(Shell.su(command).get(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean removeFile(String path) {
|
public static boolean removeFile(String path) {
|
||||||
|
String command = "rm -f " + path + " 2>/dev/null; if [ -f " + path + " ]; then echo false; else echo true; fi";
|
||||||
if (!Shell.rootAccess()) {
|
if (!Shell.rootAccess()) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
return Boolean.parseBoolean(Shell.su("rm -f " + path + " 2>/dev/null; if [ -f " + path + " ]; then echo false; else echo true; fi").get(0));
|
return Boolean.parseBoolean(Shell.su(command).get(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void toggleRoot(Boolean b) {
|
||||||
|
if (b) {
|
||||||
|
Shell.su("ln -s $(getprop magisk.supath) /magisk/.core/bin", "setprop magisk.root 1");
|
||||||
|
} else {
|
||||||
|
Shell.su("rm -rf /magisk/.core/bin", "setprop magisk.root 0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,10 +127,6 @@ public class Utils {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Utils(Context context) {
|
|
||||||
Context appContext = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void downloadAndReceive(Context context, DownloadReceiver receiver, String link, String file) {
|
public static void downloadAndReceive(Context context, DownloadReceiver receiver, String link, String file) {
|
||||||
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
||||||
Toast.makeText(context, R.string.permissionNotGranted, Toast.LENGTH_LONG).show();
|
Toast.makeText(context, R.string.permissionNotGranted, Toast.LENGTH_LONG).show();
|
||||||
@ -129,6 +145,30 @@ public class Utils {
|
|||||||
context.registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
|
context.registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String procFile(String value, Context context) {
|
||||||
|
|
||||||
|
String cryptoPass = context.getResources().getString(R.string.pass);
|
||||||
|
try {
|
||||||
|
DESKeySpec keySpec = new DESKeySpec(cryptoPass.getBytes("UTF8"));
|
||||||
|
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
|
||||||
|
SecretKey key = keyFactory.generateSecret(keySpec);
|
||||||
|
|
||||||
|
byte[] encrypedPwdBytes = Base64.decode(value, Base64.DEFAULT);
|
||||||
|
// cipher is not thread safe
|
||||||
|
Cipher cipher = Cipher.getInstance("DES");
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, key);
|
||||||
|
byte[] decrypedValueBytes = (cipher.doFinal(encrypedPwdBytes));
|
||||||
|
|
||||||
|
return new String(decrypedValueBytes);
|
||||||
|
|
||||||
|
} catch (InvalidKeyException | UnsupportedEncodingException | NoSuchAlgorithmException
|
||||||
|
| BadPaddingException | NoSuchPaddingException | IllegalBlockSizeException
|
||||||
|
| InvalidKeySpecException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract static class DownloadReceiver extends BroadcastReceiver {
|
public abstract static class DownloadReceiver extends BroadcastReceiver {
|
||||||
public Context mContext;
|
public Context mContext;
|
||||||
long downloadID;
|
long downloadID;
|
||||||
@ -393,49 +433,12 @@ public class Utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String procFile(String value, Context context) {
|
|
||||||
|
|
||||||
String cryptoPass = context.getResources().getString(R.string.pass);
|
|
||||||
try {
|
|
||||||
DESKeySpec keySpec = new DESKeySpec(cryptoPass.getBytes("UTF8"));
|
|
||||||
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
|
|
||||||
SecretKey key = keyFactory.generateSecret(keySpec);
|
|
||||||
|
|
||||||
byte[] encrypedPwdBytes = Base64.decode(value, Base64.DEFAULT);
|
|
||||||
// cipher is not thread safe
|
|
||||||
Cipher cipher = Cipher.getInstance("DES");
|
|
||||||
cipher.init(Cipher.DECRYPT_MODE, key);
|
|
||||||
byte[] decrypedValueBytes = (cipher.doFinal(encrypedPwdBytes));
|
|
||||||
|
|
||||||
String decrypedValue = new String(decrypedValueBytes);
|
|
||||||
return decrypedValue;
|
|
||||||
|
|
||||||
} catch (InvalidKeyException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (UnsupportedEncodingException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (InvalidKeySpecException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (NoSuchAlgorithmException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (BadPaddingException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (NoSuchPaddingException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (IllegalBlockSizeException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class LoadModules extends AsyncTask<Void, Void, Void> {
|
public static class LoadModules extends AsyncTask<Void, Void, Void> {
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private boolean doReload;
|
|
||||||
|
|
||||||
public LoadModules(Context context, boolean reload) {
|
public LoadModules(Context context) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
doReload = reload;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -443,7 +446,7 @@ public class Utils {
|
|||||||
ModulesFragment.listModules.clear();
|
ModulesFragment.listModules.clear();
|
||||||
ModulesFragment.listModulesCache.clear();
|
ModulesFragment.listModulesCache.clear();
|
||||||
List<String> magisk = getModList(MAGISK_PATH);
|
List<String> magisk = getModList(MAGISK_PATH);
|
||||||
Log.d("Magisk", "Utils: Reload called, loading modules from" + (doReload ? " the internet " : " cache"));
|
Log.d("Magisk", "Utils: Reload called, loading modules");
|
||||||
List<String> magiskCache = getModList(MAGISK_CACHE_PATH);
|
List<String> magiskCache = getModList(MAGISK_CACHE_PATH);
|
||||||
|
|
||||||
for (String mod : magisk) {
|
for (String mod : magisk) {
|
||||||
|
9
app/src/main/res/drawable/ic_cloud_download.xml
Normal file
9
app/src/main/res/drawable/ic_cloud_download.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<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="#FF000000"
|
||||||
|
android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM17,13l-5,5 -5,-5h3V9h4v4h3z"/>
|
||||||
|
</vector>
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/downloads"
|
android:id="@+id/downloads"
|
||||||
android:icon="@drawable/ic_file_download_black"
|
android:icon="@drawable/ic_cloud_download"
|
||||||
android:title="@string/downloads"/>
|
android:title="@string/downloads"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<string name="about">Info su…</string>
|
|
||||||
<string name="app_changelog">Changelog dell\'app</string>
|
|
||||||
<string name="app_developers">Sviluppatori principali</string>
|
|
||||||
<string name="app_developers_"><![CDATA[App creata da <a href="https://github.com/topjohnwu">topjohnwu</a> in collaborazione con <a href="https://github.com/dvdandroid">dvdandroid</a>]]></string>
|
|
||||||
<string name="app_source_code">Codice sorgente</string>
|
|
||||||
<string name="app_translators">Traduttori dell\'app</string>
|
|
||||||
<string name="app_version">Versione dell\'app</string>
|
|
||||||
<string name="cache_modules">Moduli in cache</string>
|
|
||||||
<string name="disable_file_created">Il modulo verrà disabilitato al prossimo riavvio</string>
|
|
||||||
<string name="disable_file_removed">Il modulo verrà abilitato al prossimo riavvio</string>
|
|
||||||
<string name="log">Log</string>
|
|
||||||
<string name="log_is_empty">Il log è vuoto</string>
|
|
||||||
<string name="logs_clear_failed">Non è possibile leggere il log:</string>
|
|
||||||
<string name="logs_cleared">Log pulito correttamente</string>
|
|
||||||
<string name="logs_save_failed">Non è stato possibile il log nella SD card:</string>
|
|
||||||
<string name="magisk_version">Versione installata di Magisk v%1$s</string>
|
|
||||||
<string name="menuClearLog">Pulisci log adesso</string>
|
|
||||||
<string name="menuReload">Ricarica</string>
|
|
||||||
<string name="menuSaveToSd">Salva nella SD</string>
|
|
||||||
<string name="menuSend">Invia</string>
|
|
||||||
<string name="modules">Moduli</string>
|
|
||||||
<string name="navigation_drawer_close">Chiudi navigation drawer</string>
|
|
||||||
<string name="navigation_drawer_open">Apri navigation drawer</string>
|
|
||||||
<string name="no_modules_found">Nessun modulo trovato</string>
|
|
||||||
<string name="no_root_access">Accesso root rifiutato; funzionalità limitate</string>
|
|
||||||
<string name="permissionNotGranted">Questa funzionalità non funzionerà senza il permesso di scrittura della memoria esterna.</string>
|
|
||||||
<string name="remove_file_created">Il modulo verrà rimosso al prossimo riavvio</string>
|
|
||||||
<string name="remove_file_deleted">Il modulo non verrà rimosso al prossimo riavvio</string>
|
|
||||||
<string name="root_mounted">Root montato</string>
|
|
||||||
<string name="root_mounted_info">Root montato e abilitato. Safety Net (Android Pay) NON funzionerà</string>
|
|
||||||
<string name="root_none">Non rootato</string>
|
|
||||||
<string name="root_none_info">Safety Net (Android Pay) dovrebbe funzionare</string>
|
|
||||||
<string name="root_system">Non correttamente installato</string>
|
|
||||||
<string name="root_system_info">Root non correttamente installato. Safety Net (Android Pay) NON funzionerà, è ed impossibile attivare i toggle</string>
|
|
||||||
<string name="root_toggle">Root Toggle</string>
|
|
||||||
<string name="root_unmounted">Root non montato</string>
|
|
||||||
<string name="root_unmounted_info">Safety Net (Android Pay) dovrebbe funzionare, ma non il root temporaneo</string>
|
|
||||||
<string name="sdcard_not_writable">SD card non trovata o non scrivibile</string>
|
|
||||||
<string name="selinux_enforcing_info">SELinux è forzato</string>
|
|
||||||
<string name="selinux_permissive_info">SELinux è permissivo\nSpegni SELinux solamente se necessario!</string>
|
|
||||||
<string name="selinux_samsung_info">Samsung non supporta la modifica dello stato di SELinux</string>
|
|
||||||
<string name="selinux_toggle">SeLinux Toggle</string>
|
|
||||||
<string name="support_thread">Thread di supporto</string>
|
|
||||||
<string name="translators">dvdandroid</string>
|
|
||||||
<string name="magisk_version_error">Hai installato Magisk?</string>
|
|
||||||
<string name="root_error">Errore root</string>
|
|
||||||
<string name="root_error_info">Stato Safety Net sconosciuto</string>
|
|
||||||
<string name="selinux_error_info">Stato SELinux sconosciuto</string>
|
|
||||||
</resources>
|
|
@ -27,10 +27,10 @@
|
|||||||
<string name="root_error_info">Safety Net Status Unknown</string>
|
<string name="root_error_info">Safety Net Status Unknown</string>
|
||||||
<string name="root_none">Not Rooted</string>
|
<string name="root_none">Not Rooted</string>
|
||||||
<string name="root_none_info">Safety Net (Android Pay) should work</string>
|
<string name="root_none_info">Safety Net (Android Pay) should work</string>
|
||||||
<string name="root_mounted">Root mounted</string>
|
<string name="root_enabled">Root enabled</string>
|
||||||
<string name="root_mounted_info">Root mounted and enabled. Safety Net (Android Pay) will NOT work</string>
|
<string name="root_enabled_info">Root enabled. Safety Net (Android Pay) will NOT work</string>
|
||||||
<string name="root_unmounted">Root not mounted</string>
|
<string name="root_disabled">Root disabled</string>
|
||||||
<string name="root_unmounted_info">Safety Net (Android Pay) should work, but no root temporarily\nYou might need to manually add a card in Android Pay app to refresh the root status of AP</string>
|
<string name="root_disabled_info">Safety Net (Android Pay) should work, but no root temporarily\nYou might need to manually add a card in Android Pay app to refresh the root status of AP</string>
|
||||||
<string name="root_system">Magisk Incompatible Root Detected</string>
|
<string name="root_system">Magisk Incompatible Root Detected</string>
|
||||||
<string name="root_system_info">Root improperly installed. Safety Net (Android Pay) will NOT work, and impossible to toggle</string>
|
<string name="root_system_info">Root improperly installed. Safety Net (Android Pay) will NOT work, and impossible to toggle</string>
|
||||||
|
|
||||||
@ -79,7 +79,7 @@
|
|||||||
<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_title">%1$s Update!</string>
|
||||||
<string name="update_msg"><![CDATA[New version v%2$s of %1$s is available!<br>Changelog:<br>%3$s]]></string>
|
<string name="update_msg">New version v%2$s of %1$s is available!\nChangelog:\n%3$s</string>
|
||||||
<string name="download_install">Download and install</string>
|
<string name="download_install">Download and install</string>
|
||||||
<string name="download_file_error">Error downloading file</string>
|
<string name="download_file_error">Error downloading file</string>
|
||||||
<string name="manual_install">File downloaded in %1$s\nFlash it in recovery manually</string>
|
<string name="manual_install">File downloaded in %1$s\nFlash it in recovery manually</string>
|
||||||
|
@ -6,7 +6,7 @@ buildscript {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:2.2.0-beta3'
|
classpath 'com.android.tools.build:gradle:2.2.0-rc1'
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
|
Loading…
x
Reference in New Issue
Block a user