diff --git a/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java b/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java index b22190f0a..817b39714 100644 --- a/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/MagiskFragment.java @@ -104,7 +104,7 @@ public class MagiskFragment extends Fragment { magiskCheckUpdatesStatus.setText(getString(R.string.magisk_update_available, String.valueOf(Utils.remoteMagiskVersion))); magiskUpdateView.setOnClickListener(view -> new AlertDialog.Builder(getActivity()) .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) .setPositiveButton(R.string.download_install, (dialogInterface, i) -> { Utils.downloadAndReceive( @@ -131,7 +131,7 @@ public class MagiskFragment extends Fragment { appCheckUpdatesStatus.setText(getString(R.string.app_update_available, String.valueOf(Utils.remoteAppVersion))); appUpdateView.setOnClickListener(view -> new AlertDialog.Builder(getActivity()) .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) .setPositiveButton(R.string.download_install, (dialogInterface, i) -> { Utils.downloadAndReceive(getActivity(), diff --git a/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java index 3c3f0c357..ecaa9f18c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/ModulesFragment.java @@ -65,7 +65,7 @@ public class ModulesFragment extends Fragment { }); - new Utils.LoadModules(getActivity(), false).execute(); + new Utils.LoadModules(getActivity()).execute(); mTaskDelegate = result -> { if (result.equals("OK")) { RefreshUI(); @@ -117,7 +117,7 @@ public class ModulesFragment extends Fragment { viewPager.setAdapter(new TabsAdapter(getChildFragmentManager())); tabLayout.setupWithViewPager(viewPager); viewPager.setCurrentItem(viewPagePosition); - new Utils.LoadModules(getActivity(), true).execute(); + new Utils.LoadModules(getActivity()).execute(); Collections.sort(listModules, new CustomComparator()); Collections.sort(listModulesCache, new CustomComparator()); new updateUI().execute(); diff --git a/app/src/main/java/com/topjohnwu/magisk/RootFragment.java b/app/src/main/java/com/topjohnwu/magisk/RootFragment.java index 2c2ff9549..6206c0d98 100644 --- a/app/src/main/java/com/topjohnwu/magisk/RootFragment.java +++ b/app/src/main/java/com/topjohnwu/magisk/RootFragment.java @@ -101,11 +101,8 @@ public class RootFragment extends Fragment { new updateUI().execute(); rootToggle.setOnClickListener(toggle -> { - Shell.su(((CompoundButton) toggle).isChecked() ? "setprop magisk.root 1" : "setprop magisk.root 0"); - new Handler().postDelayed(() -> new updateUI().execute(), 1000); - if (!((CompoundButton) toggle).isChecked()) { - autoRootToggle.setChecked(false); - } + Utils.toggleRoot(((CompoundButton) toggle).isChecked()); + new updateUI().execute(); }); autoRootToggle.setOnClickListener(toggle -> { @@ -116,7 +113,7 @@ public class RootFragment extends Fragment { selinuxToggle.setOnClickListener(toggle -> { Shell.su(((CompoundButton) toggle).isChecked() ? "setenforce 1" : "setenforce 0"); - new Handler().postDelayed(() -> new updateUI().execute(), 1000); + new updateUI().execute(); }); return view; diff --git a/app/src/main/java/com/topjohnwu/magisk/module/RepoHelper.java b/app/src/main/java/com/topjohnwu/magisk/module/RepoHelper.java index f360be9cd..664604045 100644 --- a/app/src/main/java/com/topjohnwu/magisk/module/RepoHelper.java +++ b/app/src/main/java/com/topjohnwu/magisk/module/RepoHelper.java @@ -46,7 +46,7 @@ public class RepoHelper { new BuildFromWeb(delegate).execute(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US); String date = format.format(Calendar.getInstance().getTime()); - prefs.edit().putString("last_update",date).apply(); + prefs.edit().putString("last_update", date).apply(); } else { Log.d(TAG, "RepoHelper: Building from cache"); BuildFromCache(); diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java index b3318b0b9..7f55aca79 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/Utils.java @@ -70,25 +70,45 @@ public class Utils { public static boolean fileExist(String path) { List ret; - ret = Shell.sh("if [ -f " + path + " ]; then echo true; else echo false; fi"); - if (!Boolean.parseBoolean(ret.get(0)) && Shell.rootAccess()) - ret = Shell.su("if [ -f " + path + " ]; then echo true; else echo false; fi"); + String command = "if [ -f " + path + " ]; then echo true; else echo false; fi"; + if (Shell.rootAccess()) { + ret = Shell.su(command); + } else { + ret = Shell.sh(command); + } + return Boolean.parseBoolean(ret.get(0)); + } + + public static boolean rootEnabled() { + List ret; + String command = "if [ -z $(which su) ]; then echo false; else echo true; fi"; + ret = Shell.sh(command); return Boolean.parseBoolean(ret.get(0)); } 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()) { return false; } 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) { + String command = "rm -f " + path + " 2>/dev/null; if [ -f " + path + " ]; then echo false; else echo true; fi"; if (!Shell.rootAccess()) { return false; } 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"); } } @@ -108,10 +128,6 @@ public class Utils { return ret; } - public Utils(Context context) { - Context appContext = context; - } - public static void downloadAndReceive(Context context, DownloadReceiver receiver, String link, String file) { if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(context, R.string.permissionNotGranted, Toast.LENGTH_LONG).show(); @@ -130,6 +146,30 @@ public class Utils { 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 Context mContext; long downloadID; @@ -421,49 +461,12 @@ public class Utils { return false; } - 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 { private Context mContext; - private boolean doReload; - public LoadModules(Context context, boolean reload) { + public LoadModules(Context context) { mContext = context; - doReload = reload; } @Override @@ -471,7 +474,7 @@ public class Utils { ModulesFragment.listModules.clear(); ModulesFragment.listModulesCache.clear(); List 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 magiskCache = getModList(MAGISK_CACHE_PATH); for (String mod : magisk) { diff --git a/app/src/main/res/drawable/ic_cloud_download.xml b/app/src/main/res/drawable/ic_cloud_download.xml new file mode 100644 index 000000000..261c31217 --- /dev/null +++ b/app/src/main/res/drawable/ic_cloud_download.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/menu/drawer.xml b/app/src/main/res/menu/drawer.xml index 1276fb206..397a9c27c 100644 --- a/app/src/main/res/menu/drawer.xml +++ b/app/src/main/res/menu/drawer.xml @@ -27,7 +27,7 @@ - - Info su… - Changelog dell\'app - Sviluppatori principali - topjohnwu in collaborazione con dvdandroid]]> - Codice sorgente - Traduttori dell\'app - Versione dell\'app - Moduli in cache - Il modulo verrà disabilitato al prossimo riavvio - Il modulo verrà abilitato al prossimo riavvio - Log - Il log è vuoto - Non è possibile leggere il log: - Log pulito correttamente - Non è stato possibile il log nella SD card: - Versione installata di Magisk v%1$s - Pulisci log adesso - Ricarica - Salva nella SD - Invia - Moduli - Chiudi navigation drawer - Apri navigation drawer - Nessun modulo trovato - Accesso root rifiutato; funzionalità limitate - Questa funzionalità non funzionerà senza il permesso di scrittura della memoria esterna. - Il modulo verrà rimosso al prossimo riavvio - Il modulo non verrà rimosso al prossimo riavvio - Root montato - Root montato e abilitato. Safety Net (Android Pay) NON funzionerà - Non rootato - Safety Net (Android Pay) dovrebbe funzionare - Non correttamente installato - Root non correttamente installato. Safety Net (Android Pay) NON funzionerà, è ed impossibile attivare i toggle - Root Toggle - Root non montato - Safety Net (Android Pay) dovrebbe funzionare, ma non il root temporaneo - SD card non trovata o non scrivibile - SELinux è forzato - SELinux è permissivo\nSpegni SELinux solamente se necessario! - Samsung non supporta la modifica dello stato di SELinux - SeLinux Toggle - Thread di supporto - dvdandroid - Hai installato Magisk? - Errore root - Stato Safety Net sconosciuto - Stato SELinux sconosciuto - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5dfe39c3e..9d8d18d86 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -83,7 +83,7 @@ No root access, functionality limited No thanks %1$s Update! - Changelog:
%3$s]]>
+ New version v%2$s of %1$s is available!\nChangelog:\n%3$s Download and install Error downloading file File downloaded in %1$s\nFlash it in recovery manually diff --git a/build.gradle b/build.gradle index ec075a896..24cf38d8a 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { mavenCentral() } 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 // in the individual module build.gradle files