diff --git a/build.gradle b/build.gradle index a59d71652..3305d1843 100644 --- a/build.gradle +++ b/build.gradle @@ -52,7 +52,8 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') fullImplementation project(':utils') - implementation "com.android.support:support-v4:${rootProject.ext.supportLibVersion}" + implementation "com.android.support:support-core-utils:${rootProject.ext.supportLibVersion}" + fullImplementation "com.android.support:preference-v7:${rootProject.ext.supportLibVersion}" fullImplementation "com.android.support:recyclerview-v7:${rootProject.ext.supportLibVersion}" fullImplementation "com.android.support:cardview-v7:${rootProject.ext.supportLibVersion}" fullImplementation "com.android.support:design:${rootProject.ext.supportLibVersion}" diff --git a/src/full/AndroidManifest.xml b/src/full/AndroidManifest.xml index a0bd837d4..5523e0f42 100644 --- a/src/full/AndroidManifest.xml +++ b/src/full/AndroidManifest.xml @@ -3,7 +3,6 @@ package="com.topjohnwu.magisk"> - BuildConfig.VERSION_CODE) { install(); } else if (mm.remoteMagiskVersionCode >= Const.MAGISK_VER.FIX_ENV && - !Utils.cmdResult("env_check")) { + !RootUtils.cmdResult("env_check")) { ShowUI.envFixDialog(getActivity()); } } diff --git a/src/full/java/com/topjohnwu/magisk/MagiskLogFragment.java b/src/full/java/com/topjohnwu/magisk/MagiskLogFragment.java index b9c97b10f..73f08c1bf 100644 --- a/src/full/java/com/topjohnwu/magisk/MagiskLogFragment.java +++ b/src/full/java/com/topjohnwu/magisk/MagiskLogFragment.java @@ -89,7 +89,7 @@ public class MagiskLogFragment extends Fragment { return true; case R.id.menu_save: Utils.runWithPermission(getActivity(), - Manifest.permission.WRITE_EXTERNAL_STORAGE, + new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, () -> new LogManager().save()); return true; case R.id.menu_clear: diff --git a/src/full/java/com/topjohnwu/magisk/MagiskManager.java b/src/full/java/com/topjohnwu/magisk/MagiskManager.java index 6ca391d1c..15f95d9bf 100644 --- a/src/full/java/com/topjohnwu/magisk/MagiskManager.java +++ b/src/full/java/com/topjohnwu/magisk/MagiskManager.java @@ -8,21 +8,28 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; -import android.os.Handler; import android.preference.PreferenceManager; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.text.TextUtils; -import android.widget.Toast; +import android.util.Xml; +import com.topjohnwu.magisk.components.Application; import com.topjohnwu.magisk.container.Module; import com.topjohnwu.magisk.database.MagiskDatabaseHelper; import com.topjohnwu.magisk.database.RepoDatabaseHelper; import com.topjohnwu.magisk.services.UpdateCheckService; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.RootUtils; import com.topjohnwu.magisk.utils.Topic; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.superuser.BusyBox; import com.topjohnwu.superuser.Shell; +import com.topjohnwu.superuser.io.SuFile; +import com.topjohnwu.superuser.io.SuFileInputStream; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; import java.io.File; import java.io.IOException; @@ -32,10 +39,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; -public class MagiskManager extends Shell.ContainerApp { - - // Global weak reference to self - private static WeakReference weakSelf; +public class MagiskManager extends Application implements Shell.Container { // Topics public final Topic magiskHideDone = new Topic(); @@ -65,10 +69,6 @@ public class MagiskManager extends Shell.ContainerApp { public Map moduleMap; public List locales; - // Configurations - public static Locale locale; - public static Locale defaultLocale; - public boolean magiskHide; public boolean isDarkTheme; public int suRequestTimeout; @@ -87,12 +87,23 @@ public class MagiskManager extends Shell.ContainerApp { public SharedPreferences prefs; public MagiskDatabaseHelper mDB; public RepoDatabaseHelper repoDB; - public Runnable permissionGrantCallback = null; - private static Handler mHandler = new Handler(); + private volatile Shell mShell; public MagiskManager() { weakSelf = new WeakReference<>(this); + Shell.setContainer(this); + } + + @Nullable + @Override + public Shell getShell() { + return mShell; + } + + @Override + public void setShell(@Nullable Shell shell) { + mShell = shell; } @Override @@ -137,17 +148,16 @@ public class MagiskManager extends Shell.ContainerApp { String pkg = mDB.getStrings(Const.Key.SU_REQUESTER, Const.ORIG_PKG_NAME); if (getPackageName().equals(Const.ORIG_PKG_NAME) && !pkg.equals(Const.ORIG_PKG_NAME)) { mDB.setStrings(Const.Key.SU_REQUESTER, null); - Utils.uninstallPkg(pkg); + RootUtils.uninstallPkg(pkg); mDB = MagiskDatabaseHelper.getInstance(this); } - defaultLocale = Locale.getDefault(); setLocale(); loadConfig(); } public static MagiskManager get() { - return weakSelf.get(); + return (MagiskManager) weakSelf.get(); } public void setLocale() { @@ -183,7 +193,7 @@ public class MagiskManager extends Shell.ContainerApp { prefs.edit() .putBoolean(Const.Key.DARK_THEME, isDarkTheme) .putBoolean(Const.Key.MAGISKHIDE, magiskHide) - .putBoolean(Const.Key.HOSTS, Const.MAGISK_HOST_FILE().exists()) + .putBoolean(Const.Key.HOSTS, Const.MAGISK_HOST_FILE.exists()) .putBoolean(Const.Key.COREONLY, Const.MAGISK_DISABLE_FILE.exists()) .putString(Const.Key.SU_REQUEST_TIMEOUT, String.valueOf(suRequestTimeout)) .putString(Const.Key.SU_AUTO_RESPONSE, String.valueOf(suResponseType)) @@ -199,36 +209,24 @@ public class MagiskManager extends Shell.ContainerApp { .apply(); } - public static void toast(CharSequence msg, int duration) { - mHandler.post(() -> Toast.makeText(weakSelf.get(), msg, duration).show()); - } - - public static void toast(int resId, int duration) { - mHandler.post(() -> Toast.makeText(weakSelf.get(), resId, duration).show()); - } - public void loadMagiskInfo() { try { - magiskVersionString = Utils.cmd("magisk -v").split(":")[0]; - magiskVersionCode = Integer.parseInt(Utils.cmd("magisk -V")); - String s = Utils.cmd((magiskVersionCode >= Const.MAGISK_VER.RESETPROP_PERSIST ? "resetprop -p " : "getprop ") + magiskVersionString = RootUtils.cmd("magisk -v").split(":")[0]; + magiskVersionCode = Integer.parseInt(RootUtils.cmd("magisk -V")); + String s = RootUtils.cmd((magiskVersionCode >= Const.MAGISK_VER.RESETPROP_PERSIST ? "resetprop -p " : "getprop ") + Const.MAGISKHIDE_PROP); magiskHide = s == null || Integer.parseInt(s) != 0; } catch (Exception ignored) {} - bootBlock = Utils.cmd("echo \"$BOOTIMAGE\""); + bootBlock = RootUtils.cmd("echo \"$BOOTIMAGE\""); } public void getDefaultInstallFlags() { - keepVerity = Boolean.parseBoolean(Utils.cmd("getvar KEEPVERITY; echo $KEEPVERITY")) || - Utils.cmd("echo \"$DTBOIMAGE\"") != null; + keepVerity = Boolean.parseBoolean(RootUtils.cmd("getvar KEEPVERITY; echo $KEEPVERITY")) || + RootUtils.cmd("echo \"$DTBOIMAGE\"") != null; - keepEnc = Boolean.parseBoolean(Utils.cmd("getvar KEEPFORCEENCRYPT; echo $KEEPFORCEENCRYPT")) || - TextUtils.equals("encrypted", Utils.cmd("getprop ro.crypto.state")); - } - - public void setPermissionGrantCallback(Runnable callback) { - permissionGrantCallback = callback; + keepEnc = Boolean.parseBoolean(RootUtils.cmd("getvar KEEPFORCEENCRYPT; echo $KEEPFORCEENCRYPT")) || + TextUtils.equals("encrypted", RootUtils.cmd("getprop ro.crypto.state")); } public void setupUpdateCheck() { @@ -249,4 +247,72 @@ public class MagiskManager extends Shell.ContainerApp { scheduler.cancel(Const.UPDATE_SERVICE_VER); } } + + public void dumpPrefs() { + // Flush prefs to disk + prefs.edit().commit(); + File xml = new File(getFilesDir().getParent() + "/shared_prefs", + getPackageName() + "_preferences.xml"); + Shell.Sync.su(Utils.fmt("for usr in /data/user/*; do cat %s > ${usr}/%s; done", xml, Const.MANAGER_CONFIGS)); + } + + public void loadPrefs() { + SuFile config = new SuFile(Utils.fmt("/data/user/%d/%s", Const.USER_ID, Const.MANAGER_CONFIGS), true); + if (config.exists()) { + SharedPreferences.Editor editor = prefs.edit(); + try { + SuFileInputStream is = new SuFileInputStream(config); + XmlPullParser parser = Xml.newPullParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); + parser.setInput(is, "UTF-8"); + parser.nextTag(); + parser.require(XmlPullParser.START_TAG, null, "map"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) + continue; + String key = parser.getAttributeValue(null, "name"); + String value = parser.getAttributeValue(null, "value"); + switch (parser.getName()) { + case "string": + parser.require(XmlPullParser.START_TAG, null, "string"); + editor.putString(key, parser.nextText()); + parser.require(XmlPullParser.END_TAG, null, "string"); + break; + case "boolean": + parser.require(XmlPullParser.START_TAG, null, "boolean"); + editor.putBoolean(key, Boolean.parseBoolean(value)); + parser.nextTag(); + parser.require(XmlPullParser.END_TAG, null, "boolean"); + break; + case "int": + parser.require(XmlPullParser.START_TAG, null, "int"); + editor.putInt(key, Integer.parseInt(value)); + parser.nextTag(); + parser.require(XmlPullParser.END_TAG, null, "int"); + break; + case "long": + parser.require(XmlPullParser.START_TAG, null, "long"); + editor.putLong(key, Long.parseLong(value)); + parser.nextTag(); + parser.require(XmlPullParser.END_TAG, null, "long"); + break; + case "float": + parser.require(XmlPullParser.START_TAG, null, "int"); + editor.putFloat(key, Float.parseFloat(value)); + parser.nextTag(); + parser.require(XmlPullParser.END_TAG, null, "int"); + break; + default: + parser.next(); + } + } + } catch (IOException | XmlPullParserException e) { + e.printStackTrace(); + } + editor.remove(Const.Key.ETAG_KEY); + editor.apply(); + loadConfig(); + config.delete(); + } + } } diff --git a/src/full/java/com/topjohnwu/magisk/ModulesFragment.java b/src/full/java/com/topjohnwu/magisk/ModulesFragment.java index 2b783c1bf..679923ef3 100644 --- a/src/full/java/com/topjohnwu/magisk/ModulesFragment.java +++ b/src/full/java/com/topjohnwu/magisk/ModulesFragment.java @@ -40,7 +40,8 @@ public class ModulesFragment extends Fragment implements Topic.Subscriber { @BindView(R.id.empty_rv) TextView emptyRv; @OnClick(R.id.fab) public void selectFile() { - Utils.runWithPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE, () -> { + Utils.runWithPermission(getActivity(), + new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },() -> { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("application/zip"); startActivityForResult(intent, Const.ID.FETCH_ZIP); diff --git a/src/full/java/com/topjohnwu/magisk/SettingsActivity.java b/src/full/java/com/topjohnwu/magisk/SettingsActivity.java index 536fb9772..f328380f2 100644 --- a/src/full/java/com/topjohnwu/magisk/SettingsActivity.java +++ b/src/full/java/com/topjohnwu/magisk/SettingsActivity.java @@ -5,17 +5,18 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.PreferenceCategory; -import android.preference.PreferenceFragment; -import android.preference.PreferenceScreen; -import android.preference.SwitchPreference; +import android.support.v14.preference.SwitchPreference; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; +import android.support.v7.preference.ListPreference; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceCategory; +import android.support.v7.preference.PreferenceFragmentCompat; +import android.support.v7.preference.PreferenceScreen; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.widget.EditText; import android.widget.Toast; @@ -63,7 +64,7 @@ public class SettingsActivity extends Activity implements Topic.Subscriber { setFloating(); if (savedInstanceState == null) { - getFragmentManager().beginTransaction().add(R.id.container, new SettingsFragment()).commit(); + getSupportFragmentManager().beginTransaction().add(R.id.container, new SettingsFragment()).commit(); } } @@ -78,7 +79,7 @@ public class SettingsActivity extends Activity implements Topic.Subscriber { return new Topic[] { getMagiskManager().reloadActivity }; } - public static class SettingsFragment extends PreferenceFragment + public static class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener, Topic.Subscriber { private SharedPreferences prefs; @@ -90,9 +91,8 @@ public class SettingsActivity extends Activity implements Topic.Subscriber { private PreferenceCategory generalCatagory; @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.app_settings); + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferencesFromResource(R.xml.app_settings, rootKey); mm = Utils.getMagiskManager(getActivity()); prefs = mm.prefs; prefScreen = getPreferenceScreen(); @@ -126,13 +126,13 @@ public class SettingsActivity extends Activity implements Topic.Subscriber { EditText url = v.findViewById(R.id.custom_url); url.setText(mm.prefs.getString(Const.Key.CUSTOM_CHANNEL, "")); new AlertDialog.Builder(getActivity()) - .setTitle(R.string.settings_update_custom) - .setView(v) - .setPositiveButton(R.string.ok, (d, i) -> - prefs.edit().putString(Const.Key.CUSTOM_CHANNEL, - url.getText().toString()).apply()) - .setNegativeButton(R.string.close, null) - .show(); + .setTitle(R.string.settings_update_custom) + .setView(v) + .setPositiveButton(R.string.ok, (d, i) -> + prefs.edit().putString(Const.Key.CUSTOM_CHANNEL, + url.getText().toString()).apply()) + .setNegativeButton(R.string.close, null) + .show(); } return true; }); @@ -166,14 +166,15 @@ public class SettingsActivity extends Activity implements Topic.Subscriber { } else { if (Utils.checkNetworkStatus()) { restoreManager.setOnPreferenceClickListener((pref) -> { - Utils.runWithPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE, () -> { - Intent intent = new Intent(mm, ManagerUpdate.class); - intent.putExtra(Const.Key.INTENT_SET_LINK, mm.managerLink); - intent.putExtra(Const.Key.INTENT_SET_FILENAME, - Utils.fmt("MagiskManager-v%s(%d).apk", - mm.remoteManagerVersionString, mm.remoteManagerVersionCode)); - mm.sendBroadcast(intent); - }); + Utils.runWithPermission(getActivity(), + new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, () -> { + Intent intent = new Intent(mm, ManagerUpdate.class); + intent.putExtra(Const.Key.INTENT_SET_LINK, mm.managerLink); + intent.putExtra(Const.Key.INTENT_SET_FILENAME, + Utils.fmt("MagiskManager-v%s(%d).apk", + mm.remoteManagerVersionString, mm.remoteManagerVersionCode)); + mm.sendBroadcast(intent); + }); return true; }); } else { @@ -224,17 +225,17 @@ public class SettingsActivity extends Activity implements Topic.Subscriber { } @Override - public void onResume() { - super.onResume(); + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { prefs.registerOnSharedPreferenceChangeListener(this); subscribeTopics(); + return super.onCreateView(inflater, container, savedInstanceState); } @Override - public void onPause() { + public void onDestroyView() { prefs.unregisterOnSharedPreferenceChangeListener(this); unsubscribeTopics(); - super.onPause(); + super.onDestroyView(); } @Override @@ -244,7 +245,7 @@ public class SettingsActivity extends Activity implements Topic.Subscriber { case Const.Key.DARK_THEME: mm.isDarkTheme = prefs.getBoolean(key, false); mm.reloadActivity.publish(false); - break; + return; case Const.Key.COREONLY: if (prefs.getBoolean(key, false)) { try { @@ -265,12 +266,12 @@ public class SettingsActivity extends Activity implements Topic.Subscriber { case Const.Key.HOSTS: if (prefs.getBoolean(key, false)) { Shell.Async.su( - "cp -af /system/etc/hosts " + Const.MAGISK_HOST_FILE(), - "mount -o bind " + Const.MAGISK_HOST_FILE() + " /system/etc/hosts"); + "cp -af /system/etc/hosts " + Const.MAGISK_HOST_FILE, + "mount -o bind " + Const.MAGISK_HOST_FILE + " /system/etc/hosts"); } else { Shell.Async.su( "umount -l /system/etc/hosts", - "rm -f " + Const.MAGISK_HOST_FILE()); + "rm -f " + Const.MAGISK_HOST_FILE); } break; case Const.Key.ROOT_ACCESS: diff --git a/src/full/java/com/topjohnwu/magisk/SplashActivity.java b/src/full/java/com/topjohnwu/magisk/SplashActivity.java index d11e43343..d05297286 100644 --- a/src/full/java/com/topjohnwu/magisk/SplashActivity.java +++ b/src/full/java/com/topjohnwu/magisk/SplashActivity.java @@ -14,6 +14,7 @@ import com.topjohnwu.magisk.components.Activity; import com.topjohnwu.magisk.database.RepoDatabaseHelper; import com.topjohnwu.magisk.receivers.ShortcutReceiver; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.RootUtils; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.superuser.Shell; @@ -23,12 +24,13 @@ public class SplashActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + RootUtils.init(); MagiskManager mm = getMagiskManager(); mm.repoDB = new RepoDatabaseHelper(this); mm.loadMagiskInfo(); mm.getDefaultInstallFlags(); - Utils.loadPrefs(); + mm.loadPrefs(); // Dynamic detect all locales new LoadLocale().exec(); @@ -59,7 +61,7 @@ public class SplashActivity extends Activity { // Fire asynctasks loadModuleTask.exec(); // Check dtbo status - Utils.patchDTBO(); + RootUtils.patchDTBO(); } // Write back default values diff --git a/src/full/java/com/topjohnwu/magisk/asyncs/FlashZip.java b/src/full/java/com/topjohnwu/magisk/asyncs/FlashZip.java index dbee3e03d..66506497b 100644 --- a/src/full/java/com/topjohnwu/magisk/asyncs/FlashZip.java +++ b/src/full/java/com/topjohnwu/magisk/asyncs/FlashZip.java @@ -7,7 +7,9 @@ import android.view.View; import com.topjohnwu.magisk.FlashActivity; import com.topjohnwu.magisk.MagiskManager; +import com.topjohnwu.magisk.components.SnackbarMaker; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.RootUtils; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.magisk.utils.ZipUtils; import com.topjohnwu.superuser.Shell; @@ -39,7 +41,7 @@ public class FlashZip extends ParallelTask { private boolean unzipAndCheck() throws Exception { ZipUtils.unzip(mCachedFile, mCachedFile.getParentFile(), "META-INF/com/google/android", true); - String s = Utils.cmd("head -n 1 " + new File(mCachedFile.getParentFile(), "updater-script")); + String s = RootUtils.cmd("head -n 1 " + new File(mCachedFile.getParentFile(), "updater-script")); return s != null && s.contains("#MAGISK"); } @@ -93,7 +95,7 @@ public class FlashZip extends ParallelTask { switch (result) { case -1: console.add("! Installation failed"); - Utils.showUriSnack(getActivity(), mUri); + SnackbarMaker.showUri(getActivity(), mUri); break; case 0: console.add("! This zip is not a Magisk Module!"); diff --git a/src/full/java/com/topjohnwu/magisk/asyncs/HideManager.java b/src/full/java/com/topjohnwu/magisk/asyncs/HideManager.java index aa26881b6..753b65afd 100644 --- a/src/full/java/com/topjohnwu/magisk/asyncs/HideManager.java +++ b/src/full/java/com/topjohnwu/magisk/asyncs/HideManager.java @@ -7,7 +7,7 @@ import android.widget.Toast; import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.utils.Const; -import com.topjohnwu.magisk.utils.Utils; +import com.topjohnwu.magisk.utils.RootUtils; import com.topjohnwu.magisk.utils.ZipUtils; import com.topjohnwu.superuser.Shell; import com.topjohnwu.superuser.ShellUtils; @@ -136,8 +136,8 @@ public class HideManager extends ParallelTask { repack.delete(); mm.mDB.setStrings(Const.Key.SU_REQUESTER, pkg); - Utils.dumpPrefs(); - Utils.uninstallPkg(Const.ORIG_PKG_NAME); + mm.dumpPrefs(); + RootUtils.uninstallPkg(Const.ORIG_PKG_NAME); return true; } diff --git a/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java b/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java index 758882175..b52a1d2bc 100644 --- a/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java +++ b/src/full/java/com/topjohnwu/magisk/asyncs/InstallMagisk.java @@ -13,6 +13,7 @@ import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.container.TarEntry; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.RootUtils; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.magisk.utils.ZipUtils; import com.topjohnwu.superuser.Shell; @@ -147,7 +148,7 @@ public class InstallMagisk extends ParallelTask { case DIRECT_MODE: console.add("- Patch boot/ramdisk image: " + mBootLocation); if (mm.remoteMagiskVersionCode >= 1463) { - highCompression = Integer.parseInt(Utils.cmd(Utils.fmt( + highCompression = Integer.parseInt(RootUtils.cmd(Utils.fmt( "%s/magiskboot --parse %s; echo $?", install, mBootLocation))) == 2; if (highCompression) diff --git a/src/full/java/com/topjohnwu/magisk/asyncs/LoadModules.java b/src/full/java/com/topjohnwu/magisk/asyncs/LoadModules.java index 639b1e51d..06c95df49 100644 --- a/src/full/java/com/topjohnwu/magisk/asyncs/LoadModules.java +++ b/src/full/java/com/topjohnwu/magisk/asyncs/LoadModules.java @@ -11,7 +11,7 @@ import java.util.List; public class LoadModules extends ParallelTask { private List getModList() { - String command = "ls -d " + Const.MAGISK_PATH() + "/* | grep -v lost+found"; + String command = "ls -d " + Const.MAGISK_PATH + "/* | grep -v lost+found"; return Shell.Sync.su(command); } diff --git a/src/full/java/com/topjohnwu/magisk/asyncs/ProcessRepoZip.java b/src/full/java/com/topjohnwu/magisk/asyncs/ProcessRepoZip.java index c98addf36..5530256e0 100644 --- a/src/full/java/com/topjohnwu/magisk/asyncs/ProcessRepoZip.java +++ b/src/full/java/com/topjohnwu/magisk/asyncs/ProcessRepoZip.java @@ -12,6 +12,7 @@ import android.widget.Toast; import com.topjohnwu.magisk.FlashActivity; import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.components.SnackbarMaker; import com.topjohnwu.magisk.utils.Const; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.magisk.utils.WebService; @@ -147,7 +148,7 @@ public class ProcessRepoZip extends ParallelTask { intent.setData(uri).putExtra(Const.Key.FLASH_ACTION, Const.Value.FLASH_ZIP); activity.startActivity(intent); } else { - Utils.showUriSnack(activity, uri); + SnackbarMaker.showUri(activity, uri); } } else { MagiskManager.toast(R.string.process_error, Toast.LENGTH_LONG); @@ -157,7 +158,7 @@ public class ProcessRepoZip extends ParallelTask { @Override public ParallelTask exec(Void... voids) { - Utils.runWithPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE, + Utils.runWithPermission(getActivity(), new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, () -> super.exec(voids)); return this; } diff --git a/src/full/java/com/topjohnwu/magisk/asyncs/RestoreImages.java b/src/full/java/com/topjohnwu/magisk/asyncs/RestoreImages.java index e70e3171f..f55bfae8d 100644 --- a/src/full/java/com/topjohnwu/magisk/asyncs/RestoreImages.java +++ b/src/full/java/com/topjohnwu/magisk/asyncs/RestoreImages.java @@ -4,7 +4,7 @@ import android.widget.Toast; import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; -import com.topjohnwu.magisk.utils.Utils; +import com.topjohnwu.magisk.utils.RootUtils; import com.topjohnwu.superuser.Shell; import com.topjohnwu.superuser.ShellUtils; @@ -13,9 +13,9 @@ public class RestoreImages extends ParallelTask { @Override protected Boolean doInBackground(Void... voids) { String sha1; - sha1 = Utils.cmd("cat /.backup/.sha1"); + sha1 = RootUtils.cmd("cat /.backup/.sha1"); if (sha1 == null) { - sha1 = Utils.cmd("cat /init.magisk.rc | grep STOCKSHA1"); + sha1 = RootUtils.cmd("cat /init.magisk.rc | grep STOCKSHA1"); if (sha1 == null) return false; sha1 = sha1.substring(sha1.indexOf('=') + 1); diff --git a/src/full/java/com/topjohnwu/magisk/components/Activity.java b/src/full/java/com/topjohnwu/magisk/components/FlavorActivity.java similarity index 64% rename from src/full/java/com/topjohnwu/magisk/components/Activity.java rename to src/full/java/com/topjohnwu/magisk/components/FlavorActivity.java index d97123ff2..91179498f 100644 --- a/src/full/java/com/topjohnwu/magisk/components/Activity.java +++ b/src/full/java/com/topjohnwu/magisk/components/FlavorActivity.java @@ -1,13 +1,9 @@ package com.topjohnwu.magisk.components; -import android.content.Intent; -import android.content.pm.PackageManager; import android.content.res.AssetManager; -import android.content.res.Configuration; import android.content.res.Resources; import android.os.Bundle; import android.support.annotation.Keep; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StyleRes; import android.support.v7.app.AppCompatActivity; @@ -16,33 +12,29 @@ import android.view.WindowManager; import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.utils.Topic; -import com.topjohnwu.magisk.utils.Utils; -public abstract class Activity extends AppCompatActivity { +public abstract class FlavorActivity extends AppCompatActivity { private AssetManager swappedAssetManager = null; private Resources swappedResources = null; private Resources.Theme swappedTheme = null; - private ActivityResultListener activityResultListener; - - public Activity() { - super(); - Configuration configuration = new Configuration(); - configuration.setLocale(MagiskManager.locale); - applyOverrideConfiguration(configuration); - } @StyleRes public int getDarkTheme() { return -1; } + public MagiskManager getMagiskManager() { + return (MagiskManager) super.getApplicationContext(); + } + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (this instanceof Topic.Subscriber) { ((Topic.Subscriber) this).subscribeTopics(); } + if (getMagiskManager().isDarkTheme && getDarkTheme() != -1) { setTheme(getDarkTheme()); } @@ -56,34 +48,15 @@ public abstract class Activity extends AppCompatActivity { super.onDestroy(); } - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - MagiskManager mm = getMagiskManager(); - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - if (mm.permissionGrantCallback != null) { - mm.permissionGrantCallback.run(); - } + private static AssetManager getAssets(String apk) { + try { + AssetManager asset = AssetManager.class.newInstance(); + AssetManager.class.getMethod("addAssetPath", String.class).invoke(asset, apk); + return asset; + } catch (Exception e) { + e.printStackTrace(); + return null; } - mm.permissionGrantCallback = null; - } - - @Override - public Resources.Theme getTheme() { - return swappedTheme == null ? super.getTheme() : swappedTheme; - } - - @Override - public AssetManager getAssets() { - return swappedAssetManager == null ? super.getAssets() : swappedAssetManager; - } - - @Override - public Resources getResources() { - return swappedResources == null ? super.getResources() : swappedResources; - } - - public MagiskManager getMagiskManager() { - return (MagiskManager) super.getApplicationContext(); } protected void setFloating() { @@ -101,20 +74,23 @@ public abstract class Activity extends AppCompatActivity { } @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (activityResultListener != null) - activityResultListener.onActivityResult(requestCode, resultCode, data); - activityResultListener = null; + public Resources.Theme getTheme() { + return swappedTheme == null ? super.getTheme() : swappedTheme; } - public void startActivityForResult(Intent intent, int requestCode, ActivityResultListener listener) { - activityResultListener = listener; - super.startActivityForResult(intent, requestCode); + @Override + public AssetManager getAssets() { + return swappedAssetManager == null ? super.getAssets() : swappedAssetManager; + } + + @Override + public Resources getResources() { + return swappedResources == null ? super.getResources() : swappedResources; } @Keep public void swapResources(String dexPath, int resId) { - swappedAssetManager = Utils.getAssets(dexPath); + swappedAssetManager = getAssets(dexPath); if (swappedAssetManager == null) return; Resources res = super.getResources(); @@ -129,9 +105,4 @@ public abstract class Activity extends AppCompatActivity { swappedResources = null; swappedTheme = null; } - - public interface ActivityResultListener { - void onActivityResult(int requestCode, int resultCode, Intent data); - } - } diff --git a/src/full/java/com/topjohnwu/magisk/components/SnackbarMaker.java b/src/full/java/com/topjohnwu/magisk/components/SnackbarMaker.java index da9eaecb5..bf873790f 100644 --- a/src/full/java/com/topjohnwu/magisk/components/SnackbarMaker.java +++ b/src/full/java/com/topjohnwu/magisk/components/SnackbarMaker.java @@ -1,11 +1,15 @@ package com.topjohnwu.magisk.components; import android.app.Activity; +import android.net.Uri; import android.support.annotation.StringRes; import android.support.design.widget.Snackbar; import android.view.View; import android.widget.TextView; +import com.topjohnwu.magisk.R; +import com.topjohnwu.magisk.utils.Utils; + public class SnackbarMaker { public static Snackbar make(Activity activity, CharSequence text, int duration) { @@ -34,4 +38,10 @@ public class SnackbarMaker { text.setMaxLines(Integer.MAX_VALUE); } + public static void showUri(Activity activity, Uri uri) { + make(activity, activity.getString(R.string.internal_storage, + "/MagiskManager/" + Utils.getNameFromUri(activity, uri)), + Snackbar.LENGTH_LONG) + .setAction(R.string.ok, (v)->{}).show(); + } } diff --git a/src/full/java/com/topjohnwu/magisk/services/OnBootIntentService.java b/src/full/java/com/topjohnwu/magisk/services/OnBootIntentService.java index 3e8b2039b..d2dd0a5db 100644 --- a/src/full/java/com/topjohnwu/magisk/services/OnBootIntentService.java +++ b/src/full/java/com/topjohnwu/magisk/services/OnBootIntentService.java @@ -8,6 +8,7 @@ import android.support.v4.app.NotificationCompat; import com.topjohnwu.magisk.MagiskManager; import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.utils.Const; +import com.topjohnwu.magisk.utils.RootUtils; import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.superuser.Shell; @@ -43,7 +44,7 @@ public class OnBootIntentService extends IntentService { mm.loadMagiskInfo(); mm.getDefaultInstallFlags(); if (Shell.rootAccess()) { - Utils.patchDTBO(); + RootUtils.patchDTBO(); } } } diff --git a/src/full/java/com/topjohnwu/magisk/utils/RootUtils.java b/src/full/java/com/topjohnwu/magisk/utils/RootUtils.java new file mode 100644 index 000000000..5e81ca9f0 --- /dev/null +++ b/src/full/java/com/topjohnwu/magisk/utils/RootUtils.java @@ -0,0 +1,43 @@ +package com.topjohnwu.magisk.utils; + +import com.topjohnwu.magisk.MagiskManager; +import com.topjohnwu.superuser.Shell; +import com.topjohnwu.superuser.ShellUtils; +import com.topjohnwu.superuser.io.SuFile; + +public class RootUtils { + + public static void init() { + Const.MAGISK_DISABLE_FILE = new SuFile("/cache/.disable_magisk", true); + SuFile file = new SuFile("/sbin/.core/img", true); + if (file.exists()) { + Const.MAGISK_PATH = file; + } else if ((file = new SuFile("/dev/magisk/img", true)).exists()) { + Const.MAGISK_PATH = file; + } else { + Const.MAGISK_PATH = new SuFile("/magisk", true); + } + Const.MAGISK_HOST_FILE = new SuFile(Const.MAGISK_PATH + "/.core/hosts"); + } + + public static String cmd(String cmd) { + return ShellUtils.fastCmd(Shell.getShell(), cmd); + } + + public static boolean cmdResult(String cmd) { + return ShellUtils.fastCmdResult(Shell.getShell(), cmd); + } + + public static void uninstallPkg(String pkg) { + Shell.Sync.su("db_clean " + Const.USER_ID, "pm uninstall " + pkg); + } + + public static void patchDTBO() { + MagiskManager mm = MagiskManager.get(); + if (mm.magiskVersionCode >= Const.MAGISK_VER.DTBO_SUPPORT && !mm.keepVerity) { + if (ShellUtils.fastCmdResult(Shell.getShell(), "patch_dtbo_image")) { + ShowUI.dtboPatchedNotification(); + } + } + } +} diff --git a/src/full/java/com/topjohnwu/magisk/utils/ShowUI.java b/src/full/java/com/topjohnwu/magisk/utils/ShowUI.java index f3a53cb19..b25596ada 100644 --- a/src/full/java/com/topjohnwu/magisk/utils/ShowUI.java +++ b/src/full/java/com/topjohnwu/magisk/utils/ShowUI.java @@ -20,6 +20,7 @@ import com.topjohnwu.magisk.SplashActivity; import com.topjohnwu.magisk.asyncs.InstallMagisk; import com.topjohnwu.magisk.asyncs.RestoreImages; import com.topjohnwu.magisk.components.AlertDialogBuilder; +import com.topjohnwu.magisk.components.SnackbarMaker; import com.topjohnwu.magisk.receivers.DownloadReceiver; import com.topjohnwu.magisk.receivers.ManagerUpdate; import com.topjohnwu.magisk.receivers.RebootReceiver; @@ -136,7 +137,7 @@ public class ShowUI { if (Shell.rootAccess()) { options.add(mm.getString(R.string.direct_install)); } - String s = Utils.cmd("echo $SLOT"); + String s = RootUtils.cmd("echo $SLOT"); if (s != null) { options.add(mm.getString(R.string.install_second_slot)); } @@ -185,7 +186,7 @@ public class ShowUI { receiver = new DownloadReceiver() { @Override public void onDownloadDone(Uri uri) { - Utils.showUriSnack(activity, uri); + SnackbarMaker.showUri(activity, uri); } }; break; @@ -210,7 +211,7 @@ public class ShowUI { if (slot[1] == 'a') slot[1] = 'b'; else slot[1] = 'a'; // Then find the boot image again - boot = Utils.cmd( + boot = RootUtils.cmd( "SLOT=" + String.valueOf(slot) + "; find_boot_image;" + "echo \"$BOOTIMAGE\"" @@ -254,7 +255,8 @@ public class ShowUI { .setMessage(mm.getString(R.string.repo_install_msg, filename)) .setCancelable(true) .setPositiveButton(R.string.install, (d, i) -> { - Utils.runWithPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE, () -> { + Utils.runWithPermission(activity, + new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, () -> { Intent intent = new Intent(mm, ManagerUpdate.class); intent.putExtra(Const.Key.INTENT_SET_LINK, mm.managerLink); intent.putExtra(Const.Key.INTENT_SET_FILENAME, filename); @@ -297,10 +299,10 @@ public class ShowUI { } catch (IOException ignored) {} MagiskManager.toast(R.string.uninstall_toast, Toast.LENGTH_LONG); - new Handler().postDelayed(() -> Utils.uninstallPkg(mm.getPackageName()), 5000); + new Handler().postDelayed(() -> RootUtils.uninstallPkg(mm.getPackageName()), 5000); }) .setNeutralButton(R.string.restore_img, (d, i) -> new RestoreImages().exec()) - .setNegativeButton(R.string.uninstall_app, (d, i) -> Utils.uninstallPkg(mm.getPackageName())) + .setNegativeButton(R.string.uninstall_app, (d, i) -> RootUtils.uninstallPkg(mm.getPackageName())) .show(); } } diff --git a/src/full/java/com/topjohnwu/magisk/utils/Topic.java b/src/full/java/com/topjohnwu/magisk/utils/Topic.java index 4b27d0600..d174c576a 100644 --- a/src/full/java/com/topjohnwu/magisk/utils/Topic.java +++ b/src/full/java/com/topjohnwu/magisk/utils/Topic.java @@ -1,8 +1,7 @@ package com.topjohnwu.magisk.utils; import java.lang.ref.WeakReference; -import java.util.Iterator; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; public class Topic { @@ -15,23 +14,24 @@ public class Topic { private List> subscribers; private Object[] results; - public void subscribe(Subscriber sub) { - if (subscribers == null) { - subscribers = new LinkedList<>(); - } + public Topic() { + subscribers = new SyncArrayList<>(); + } + + public synchronized void subscribe(Subscriber sub) { subscribers.add(new WeakReference<>(sub)); } - public void unsubscribe() { - subscribers = null; + public synchronized void unsubscribe() { + subscribers = new SyncArrayList<>(); } - public void unsubscribe(Subscriber sub) { - for (Iterator> i = subscribers.iterator(); i.hasNext();) { - WeakReference subscriber = i.next(); - if (subscriber.get() == null || subscriber.get() == sub) { - i.remove(); - } + public synchronized void unsubscribe(Subscriber sub) { + List> subs = subscribers; + subscribers = new ArrayList<>(); + for (WeakReference subscriber : subs) { + if (subscriber.get() != null && subscriber.get() != sub) + subscribers.add(subscriber); } } @@ -52,11 +52,11 @@ public class Topic { if (record) state = PUBLISHED; this.results = results; - if (subscribers != null) { - for (WeakReference subscriber : subscribers) { - if (subscriber.get() != null) - subscriber.get().onTopicPublished(this); - } + // Snapshot + List> subs = subscribers; + for (WeakReference subscriber : subs) { + if (subscriber != null && subscriber.get() != null) + subscriber.get().onTopicPublished(this); } } @@ -89,4 +89,11 @@ public class Topic { void onTopicPublished(Topic topic); Topic[] getSubscription(); } + + private static class SyncArrayList extends ArrayList { + @Override + public synchronized boolean add(E e) { + return super.add(e); + } + } } diff --git a/src/full/res/values-ar/strings.xml b/src/full/res/values-ar/strings.xml index 026636e04..8944809fe 100644 --- a/src/full/res/values-ar/strings.xml +++ b/src/full/res/values-ar/strings.xml @@ -63,15 +63,10 @@ منتدى الدعم - أن هذه الميزة لا تعمل دون الحصول على إذن الكتابة على التخزين الخارجي. - لا شكراً - نعم - موافق إغلاق تثبيت %1$s هل تريد تثبيت %1$s ? التنزيل - خطأ تنزيل الملف إعادة التشغيل معالجة الملف المضغوط … جاري التنزيل %1$s diff --git a/src/full/res/values-bg/strings.xml b/src/full/res/values-bg/strings.xml index 236c04a5e..77ec9f3fa 100644 --- a/src/full/res/values-bg/strings.xml +++ b/src/full/res/values-bg/strings.xml @@ -74,17 +74,11 @@ Страница за поддръжка - Тази функция няма да работи без разрешение за запис във външната памет. - Не, благодаря - Да - OK Затваряне Инсталиране на %1$s Желаете ли да инсталирате %1$s сега? Изтегляне - Грешка при изтеглянето на файла Рестартиране - Изтегляне на %1$s Налице е нова версия на Magisk! Трябва да рестартирате за прилагане на настройките Бележки diff --git a/src/full/res/values-cs/strings.xml b/src/full/res/values-cs/strings.xml index bbb4f21e2..8ecd328b7 100644 --- a/src/full/res/values-cs/strings.xml +++ b/src/full/res/values-cs/strings.xml @@ -60,18 +60,13 @@ Vlákno podpory na fóru - Tato funkce nebude fungovat bez povolení k zápisu na externí úložiště. - Ne, díky - Ano - OK + Zavřít Instalovat %1$s Chcete nainstalovat %1$s ? Stáhnout - Chyba při Stahování souboru Restart Zpracování zip souboru … - Stahování %1$s K dispozici je aktualizace Magisk! Restartovat pro použití nastavení Poznámky k vydání diff --git a/src/full/res/values-de/strings.xml b/src/full/res/values-de/strings.xml index 3dc428ae4..0c9138700 100644 --- a/src/full/res/values-de/strings.xml +++ b/src/full/res/values-de/strings.xml @@ -77,17 +77,11 @@ Hilfeforum - Diese Funktion benötigt Rechte zum Schreiben auf den externen Speicher. - Nein danke - Ja - OK Schließen Installiere %1$s Möchtest du %1$s installieren? Herunterladen - Fehler beim Herunterladen der Datei Neustart - Herunterladen von %1$s Neue Magisk-Aktualisierung verfügbar! Neustarten, um die Änderungen anzuwenden Änderungen diff --git a/src/full/res/values-el/strings.xml b/src/full/res/values-el/strings.xml index a999d502a..a8700d699 100644 --- a/src/full/res/values-el/strings.xml +++ b/src/full/res/values-el/strings.xml @@ -74,17 +74,11 @@ Σύνδεσμος υποστήριξης - Η λειτουργία αυτή δεν θα δουλέψει χωρίς την άδεια εγγραφής στον εξωτερικό χώρο αποθηκεύσης. - Όχι ευχαριστώ - Ναι - OK Κλείσιμο Εγκατάσταση %1$s Θέλετε να εγκαταστήσετε το %1$s τώρα; Λήψη - Σφάλμα στη λήψη του αρχείου Επανεκκίνηση - Κατέβασμα %1$s Νέα Ενημέρωση Magisk Διαθέσιμη! Επανεκκίνηση για εφαρμογή ρυθμίσεων Σημειώσεις έκδοσης diff --git a/src/full/res/values-es/strings.xml b/src/full/res/values-es/strings.xml index a26a81d38..27b3c3da3 100644 --- a/src/full/res/values-es/strings.xml +++ b/src/full/res/values-es/strings.xml @@ -74,18 +74,12 @@ Hilo de soporte - Esta opción no funcionará sin permiso de escritura en la memoria externa. - No gracias - - Aceptar Cerrar Instalar %1$s ¿Quieres instalar %1$s ahora? Descargar - Error descargando archivo Reiniciar Procesando archivo zip… - Descargando %1$s ¡Nueva actualización de Magisk disponible! Reinicia para aplicar los ajustes Notas de lanzamiento diff --git a/src/full/res/values-et/strings.xml b/src/full/res/values-et/strings.xml index 60142958c..d61000af7 100644 --- a/src/full/res/values-et/strings.xml +++ b/src/full/res/values-et/strings.xml @@ -11,11 +11,11 @@ Magisk pole installitud - Kontrollin uuendusi... + Kontrollin uuendusi… Magisk v%1$s on saadaval! Sobimatu uuenduste kanal Koputa, et alustada SafetyNet\'i kontrolli - Kontrollin SafetyNet\'i olekut... + Kontrollin SafetyNet\'i olekut… SafetyNet\'i kontroll edukas SafetyNet\'i API viga Võrguühendus puudub @@ -74,17 +74,11 @@ Foorumi tugiteema - See funktsioon ei tööta ilma välismälule kirjutamise õiguseta. - Tänan ei - Jah - OK Sulge Installi %1$s Kas soovid kohe installida %1$s? Allalaadimine - Faili allalaadimisel esines viga Taaskäivita - Laadin %1$s alla Magisk\'ile on uuendus saadaval! Taaskäivita seadete rakendamiseks Väljalaskemärkmed @@ -93,18 +87,18 @@ ZIP on salvestatud:\n [Sisemälu]%1$s Laadin alla - Laadin ZIP-faili alla (%1$d%%)... + Laadin ZIP-faili alla (%1$d%%)… Töötlen - Töötlen ZIP-faili... + Töötlen ZIP-faili… Magisk Manager\'ile on uuendus saadaval! Vajuta allalaadimiseks ja installimiseks DTBO sai paigatud! Magisk Manager on paiganud dtbo.img, palun taaskäivita Magisk\'i uuendused Välgutamine - Peidan Magisk Manager\'i... - See võib aega võtta... - Magisk Manager\'i peitmine ebaõnnestus... + Peidan Magisk Manager\'i… + See võib aega võtta… + Magisk Manager\'i peitmine ebaõnnestus… Laadi ainult ZIP alla Paika käivituspildi fail Otsene install (soovitatud) diff --git a/src/full/res/values-fr/strings.xml b/src/full/res/values-fr/strings.xml index 51094d12d..b741b17b9 100644 --- a/src/full/res/values-fr/strings.xml +++ b/src/full/res/values-fr/strings.xml @@ -74,17 +74,11 @@ Fil d\'assistance - Cette fonctionnalité ne marchera pas sans la permission d\'écriture sur le stockage externe. - Non merci - Oui - OK Fermer Installer %1$s Voulez-vous installer %1$s maintenant ? Télécharger - Erreur de téléchargement du fichier Redémarrer - Téléchargement %1$s Nouvelle mis à jour Magisk disponible! Redémarrer afin d\'appliquer les réglages Notes de version diff --git a/src/full/res/values-hr/strings.xml b/src/full/res/values-hr/strings.xml index 2f97548a8..1a67f68da 100644 --- a/src/full/res/values-hr/strings.xml +++ b/src/full/res/values-hr/strings.xml @@ -12,7 +12,7 @@ Magisk nije instaliran - Provjera ažuriranja... + Provjera ažuriranja… Dostupna je Maigsk inačica v%1$s! Dodirni za SafetyNet provjeru Provjera SafetyNet statusa @@ -67,17 +67,11 @@ Tema podrške - Ova značajka neće raditi bez dopuštenja za korištenje vanjske pohrane. - Ne hvala - Da - OK Zatvori Instaliraj %1$s Da li želite instalirati %1$s sada? Preuzmi - Pogreška prilikom preuzimanja datoteke Ponovno podizanje sustava - Preuzimanje %1$s Dostupno je novo Magisk ažuriranje! Ponovno pokrenite kako biste primjenili postavke Bilješke o izdavanju aplikacije diff --git a/src/full/res/values-in/strings.xml b/src/full/res/values-in/strings.xml index 77a18189f..f6cab5834 100644 --- a/src/full/res/values-in/strings.xml +++ b/src/full/res/values-in/strings.xml @@ -74,17 +74,11 @@ Thread dukungan - Fitur ini tidak akan bekerja tanpa izin untuk menulis ke penyimpanan eksternal. - Tidak, terima kasih - Ya - OK Tutup Pasang %1$s Apakah Anda ingin memasang %1$s sekarang? Unduh - Kesalahan mengunduh file Reboot - Mengunduh %1$s Pembaruan Magisk Tersedia! Reboot untuk menerapkan pengaturan Catatan rilis diff --git a/src/full/res/values-it/strings.xml b/src/full/res/values-it/strings.xml index 0157a860b..b0bb0ac89 100644 --- a/src/full/res/values-it/strings.xml +++ b/src/full/res/values-it/strings.xml @@ -74,17 +74,11 @@ Thread di supporto - Questa funzione non sarà attiva senza l\'autorizzazione di scrittura nella memoria di archiviazione esterna - No, grazie - - OK Chiudi Installazione di %1$s Vuoi installare %1$s? Download - Errore nel download del file Riavvia - Download di %1$s È disponibile un nuovo aggiornamento di Magisk! Riavvia per applicare Note di rilascio @@ -226,4 +220,4 @@ UID destinazione:\u0020 Comando:\u0020 - + diff --git a/src/full/res/values-ja/strings.xml b/src/full/res/values-ja/strings.xml index d14020f8d..ed895a131 100644 --- a/src/full/res/values-ja/strings.xml +++ b/src/full/res/values-ja/strings.xml @@ -11,7 +11,7 @@ Magiskがインストールされていません - 更新を確認中... + 更新を確認中… Magisk v%1$s が利用可能です! 不正な更新チャンネルです タップしてSafetyNetチェックを開始 @@ -74,17 +74,11 @@ サポートスレッド - この機能は外部ストレージへの書き込み権限がないと動作しません - いいえ - はい - OK 閉じる %1$s をインストール %1$s をインストールしますか? ダウンロード - ダウンロード中にエラーが発生しました 再起動 - %1$s をダウンロード中 新しいMagiskの更新が利用可能です! 再起動して設定を適用する 更新履歴 diff --git a/src/full/res/values-ko/strings.xml b/src/full/res/values-ko/strings.xml index c00287355..511357107 100644 --- a/src/full/res/values-ko/strings.xml +++ b/src/full/res/values-ko/strings.xml @@ -60,17 +60,11 @@ 지원 스레드 - 이 기능은 외부 저장소 쓰기 권한 없이는 작동하지 않습니다. - 아니오, 괜찮습니다 - - 확인 닫기 %1$s 설치 정말 %1$s을(를) 설치하시겠습니까? - 파일 다운로드 오류 다시 시작 zip 파일 처리 중… - %1$s 다운로드 중 새 버전의 Magisk를 사용할 수 있습니다! 기기를 다시 시작하면 설정이 적용됩니다. 릴리즈 노트 diff --git a/src/full/res/values-lt/strings.xml b/src/full/res/values-lt/strings.xml index a9f7c5044..8a3238723 100644 --- a/src/full/res/values-lt/strings.xml +++ b/src/full/res/values-lt/strings.xml @@ -75,17 +75,11 @@ Mūsų XDA puslapis - Ši funkija neveiks be prieigos prie saugyklos - Ačiū, nereikia - Taip - Gerai Uždaryti Instaliuoti %1$s Ar jūs norite instaliuoti %1$s? Atsisiųsti - Atsisiunčiant failą įvyko klaida Perkrauti - Atsisiunčiamas %1$s Atsirado nauja Magisk versija! Nustatymų įgalinimui prašome perkrauti telefoną Pakeitimai diff --git a/src/full/res/values-nl/strings.xml b/src/full/res/values-nl/strings.xml index aa325307f..3fbb5c21f 100644 --- a/src/full/res/values-nl/strings.xml +++ b/src/full/res/values-nl/strings.xml @@ -74,17 +74,11 @@ Hulp thread - Deze functie werkt niet zonder schrijfpermissie voor externe opslag. - Nee bedankt - Ja - Oké Sluiten %1$s installeren Zeker weten %1$s installeren? Downloaden - Fout tijdens downloaden Herstarten - %1$s downloaden Nieuwe Magisk update beschikbaar! Herstarten om instellingen toe te passen Publicatie notities diff --git a/src/full/res/values-pl/strings.xml b/src/full/res/values-pl/strings.xml index 6b11143a6..f0fc87ea4 100644 --- a/src/full/res/values-pl/strings.xml +++ b/src/full/res/values-pl/strings.xml @@ -1,10 +1,7 @@ - - - Moduły Pobieranie Superuser @@ -77,17 +74,11 @@ Strona Wsparcia - Ta funkcja nie będzie działać bez uprawnień do zapisu na pamięci zewnętrznej. - Nie dziękuję - Tak - OK Zamknij Zainstaluj %1$s Czy chcesz zainstalować %1$s ? Pobierz - Błąd pobierania pliku Restart - Pobieranie %1$s Nowa Wersja Magisk Dostępna! Uruchom ponownie, aby zastosować ustawienia Zmiany diff --git a/src/full/res/values-pt-rBR/strings.xml b/src/full/res/values-pt-rBR/strings.xml index d873cba94..4011d499c 100644 --- a/src/full/res/values-pt-rBR/strings.xml +++ b/src/full/res/values-pt-rBR/strings.xml @@ -74,17 +74,11 @@ Tópico de suporte - Este recurso não funcionará sem permissão para gravar no armazenamento externo. - Não - Sim - OK Fechar Instalar %1$s Instalar %1$s agora? Baixar - Erro ao baixar arquivo Reiniciar - Baixando %1$s Nova Atualização do Magisk Disponível! Reinicie para aplicar as definições Notas de lançamento diff --git a/src/full/res/values-pt-rPT/strings.xml b/src/full/res/values-pt-rPT/strings.xml index 3727dcd06..e4835fa78 100644 --- a/src/full/res/values-pt-rPT/strings.xml +++ b/src/full/res/values-pt-rPT/strings.xml @@ -1,187 +1,180 @@ - + - -Módulos -Transferir -root -Registo -Definições -Instalar + + Módulos + Transferir + root + Registo + Definições + Instalar - -Magisk não instalado - -A procurar por atualizações… -Magisk v%1$s disponível! + + Magisk não instalado + A procurar por atualizações… + Magisk v%1$s disponível! Pressione para verificar SafetyNet -A verificar o estado do SafetyNet… -SafetyNet verificado com sucesso -Erro na API SafetyNet -Perda de ligação -Serviço foi interrompido -A resposta é inválida + A verificar o estado do SafetyNet… + SafetyNet verificado com sucesso + Erro na API SafetyNet + Perda de ligação + Serviço foi interrompido + A resposta é inválida - + Definições avançadas -Manter encriptação forçada -Manter AVB 2.0/dm-verity -Versão instalada: %1$s -Última versão: %1$s -Desinstalar -Desinstalar Magisk -Atualizar %1$s + Manter encriptação forçada + Manter AVB 2.0/dm-verity + Versão instalada: %1$s + Última versão: %1$s + Desinstalar + Desinstalar Magisk + Atualizar %1$s - -(Nenhuma informação fornecida) -Nenhum módulo encontrado -Módulo será atualizado depois de reiniciar -Módulo será removido depois de reiniciar -Módulo não será removido ao reiniciar -Módulo será desativado depois de reiniciar -Módulo será ativado depois de reiniciar -Criado por %1$s + + (Nenhuma informação fornecida) + Nenhum módulo encontrado + Módulo será atualizado depois de reiniciar + Módulo será removido depois de reiniciar + Módulo não será removido ao reiniciar + Módulo será desativado depois de reiniciar + Módulo será ativado depois de reiniciar + Criado por %1$s - -Atualização disponível -Instalado -Não Instalado + + Atualização disponível + Instalado + Não Instalado - -Gravar registo -Recarregar -Limpar registo agora -Registo limpo com sucesso -Registo está vazio -Não foi possível gravar o registo para o cartão SD: + + Gravar registo + Recarregar + Limpar registo agora + Registo limpo com sucesso + Registo está vazio + Não foi possível gravar o registo para o cartão SD: - -Sobre + + Sobre Lista de alterações da aplicação -Versão do aplicação -Código fonte -Doar -Tradutores da Aplicação -Suporte + Versão do aplicação + Código fonte + Doar + Tradutores da Aplicação + Suporte - -Esta funcionalidade não funcionará sem permissão de escrita do armazenamento externo. -Não, Obrigado -Sim -OK -Fechar -Instalar %1$s -Deseja instalar%1$s agora? -Transferir -Erro ao transferir ficheiro + + Fechar + Instalar %1$s + Deseja instalar%1$s agora? + Transferir Reiniciar -A transferir %1$s -Nova atualização do Magisk disponível! -Reinicie para aplicar definições -Notas da atualização -Cache do repositório apagado + Nova atualização do Magisk disponível! + Reinicie para aplicar definições + Notas da atualização + Cache do repositório apagado Erro no processo -O zip foi guardado em: + O zip foi guardado em: \n[Armazenamento interno]%1$s -A transferir ficheiro zip (%1$d%%) … -A processar -A processar ficheiro zip … + A transferir ficheiro zip (%1$d%%) … + A processar + A processar ficheiro zip … Nova atualização do Magisk Manager disponível! -Pressione para transferir e instalar -Atualizações do Magisk -A instalar -A esconder Magisk Manager… -Isto pode demorar algum tempo... -Falha ao esconder Magisk Manager… -Transferir Apenas Ficheiro Zip -Patch a Imagem de Arranque -Instalar Diretamente (Recomendado) -Selecionar Método -Desinstalação Completa -Restauração feita! + Pressione para transferir e instalar + Atualizações do Magisk + A instalar + A esconder Magisk Manager… + Isto pode demorar algum tempo... + Falha ao esconder Magisk Manager… + Transferir Apenas Ficheiro Zip + Patch a Imagem de Arranque + Instalar Diretamente (Recomendado) + Selecionar Método + Desinstalação Completa + Restauração feita! - -Geral -Tema escuro -Ativa o tema escuro + + Geral + Tema escuro + Ativa o tema escuro Apagar Cache de Repositório -Apaga a informação cache de repositórios online. online, forçando a aplicação a atualizar online -Esconder Magisk Manager -Língua -(Padrão do Sistema) -Estável -Beta -Magisk somente em Modo Core -Ativar somente funcionalidades principais, todos os módulos não serão carregados. MagiskSU, MagiskHide, e systemless hosts ainda estará ativado -Oculta Magisk de várias deteções -Ativar systemless hosts -Suporte de systemless para aplicações Adblock + Apaga a informação cache de repositórios online. online, forçando a aplicação a atualizar online + Esconder Magisk Manager + Língua + (Padrão do Sistema) + Estável + Beta + Magisk somente em Modo Core + Ativar somente funcionalidades principais, todos os módulos não serão carregados. MagiskSU, MagiskHide, e systemless hosts ainda estará ativado + Oculta Magisk de várias deteções + Ativar systemless hosts + Suporte de systemless para aplicações Adblock -Aplicações e ADB -Somente Aplicações -Somente ADB -Desativado -10 segundos -20 segundos -30 segundos -60 segundos -Acesso de root -Resposta Automática -Tempo limite de solicitação -Notificação de root -%1$s segundos -Autenticar novamente após atualizar -Autenticar novamente permissões de root após atualizar aplicações + Aplicações e ADB + Somente Aplicações + Somente ADB + Desativado + 10 segundos + 20 segundos + 30 segundos + 60 segundos + Acesso de root + Resposta Automática + Tempo limite de solicitação + Notificação de root + %1$s segundos + Autenticar novamente após atualizar + Autenticar novamente permissões de root após atualizar aplicações -Modo Multi-Utilizador -Apenas Proprietário de Dispositivo -Gerido Proprietário do Dispositivo -Independente de Utilizadores -Apenas o proprietário tem acesso a root -Apenas o proprietário pode gerir acesso root e receber pedidos -Cada utilizador tem suas próprias regras de root separadas -Um pedido foi enviado ao proprietário do dispositivo. Mude para o proprietário e conceda a permissão + Modo Multi-Utilizador + Apenas Proprietário de Dispositivo + Gerido Proprietário do Dispositivo + Independente de Utilizadores + Apenas o proprietário tem acesso a root + Apenas o proprietário pode gerir acesso root e receber pedidos + Cada utilizador tem suas próprias regras de root separadas + Um pedido foi enviado ao proprietário do dispositivo. Mude para o proprietário e conceda a permissão -Cada sessão root terá sua própria identificação isolada -Identificação Global -Herdar Identificação -Identificação Isolada -Todas as sessões root usam a identificação de montagem global -As sessões de root herdarão a identificação do seu solicitante -Cada sessão root terá sua própria identificação isolada + Cada sessão root terá sua própria identificação isolada + Identificação Global + Herdar Identificação + Identificação Isolada + Todas as sessões root usam a identificação de montagem global + As sessões de root herdarão a identificação do seu solicitante + Cada sessão root terá sua própria identificação isolada - -Pedido de root -Negar%1$s -Negar -Perguntar -Permitir -Concede acesso total ao seu dispositivo. + + Pedido de root + Negar%1$s + Negar + Perguntar + Permitir + Concede acesso total ao seu dispositivo. \nNegue se não tiver certeza! -Sempre -Uma vez -10 minutos -20 minutos -30 minutos -60 minutos -%1$s foi permitido o acesso de root -%1$s foi negado o acesso de root -Não foram encontrados aplicações -Acesso de root a %1$s foi permitido -Acesso de root a %1$s foi negado -Notificações de %1$s está ativado -Notificações da %1$s está desativado -Registo de %1$s está ativado -Registo de %1$s está desativado -%1$s direitos foram revogados -Revogar? -Revogar os diretos do %1$s, Confirmar? -Notificação(pop-up) -Nenhum + Sempre + Uma vez + 10 minutos + 20 minutos + 30 minutos + 60 minutos + %1$s foi permitido o acesso de root + %1$s foi negado o acesso de root + Não foram encontrados aplicações + Acesso de root a %1$s foi permitido + Acesso de root a %1$s foi negado + Notificações de %1$s está ativado + Notificações da %1$s está desativado + Registo de %1$s está ativado + Registo de %1$s está desativado + %1$s direitos foram revogados + Revogar? + Revogar os diretos do %1$s, Confirmar? + Notificação(pop-up) + Nenhum - -PID:\u0020 -Alvo UID:\u0020 -Comando:\u0020 + + PID:\u0020 + Alvo UID:\u0020 + Comando:\u0020 diff --git a/src/full/res/values-ro/strings.xml b/src/full/res/values-ro/strings.xml index 8cf45f98a..895dcbac2 100644 --- a/src/full/res/values-ro/strings.xml +++ b/src/full/res/values-ro/strings.xml @@ -68,17 +68,11 @@ Pagina de suport - Această caracteristică nu va funcționa fără permisiunea de a scrie pe memoria externă. - Nu, mulţumesc - Da - OK Închide Instalare %1$s Instalaţi %1$s? Descărcare - Eroare la descărcarea fișierului Repornire - Descărcare %1$s O nouă actualizare Magisk este disponibilă! Reporniți pentru a aplica setările Note de lansare diff --git a/src/full/res/values-ru/strings.xml b/src/full/res/values-ru/strings.xml index 0d08c8004..7b79ac39d 100644 --- a/src/full/res/values-ru/strings.xml +++ b/src/full/res/values-ru/strings.xml @@ -1,10 +1,7 @@ - - - Модули Репозиторий Суперпользователь @@ -77,17 +74,11 @@ Домашняя страница - Требуется разрешение на запись во внешнее хранилище. - Нет - Да - OK Закрыть Установка %1$s Установить %1$s ? Скачать - Ошибка загрузки файла Перезагрузка - Загрузка %1$s Доступно обновление Magisk! Для применения настроек перезагрузите устройство О версии diff --git a/src/full/res/values-sr/strings.xml b/src/full/res/values-sr/strings.xml index 766857ef9..c0d2cba64 100644 --- a/src/full/res/values-sr/strings.xml +++ b/src/full/res/values-sr/strings.xml @@ -67,17 +67,11 @@ Подршка - Ово својство неће радити без дозволе приступу екстерном складишту. - Не хвала - Да - ОК Затвори Инсталирај %1$s Да ли желите да инсталирате %1$s? Преузми - Грешка при преузимању фајла Рестартуј - Преузимање %1$s Нови Адбејт Магиска Доступан! Рестартуј да примениш подешавања Белешке обљављивања diff --git a/src/full/res/values-sv/strings.xml b/src/full/res/values-sv/strings.xml index 682ac5f82..f8de1a0c1 100644 --- a/src/full/res/values-sv/strings.xml +++ b/src/full/res/values-sv/strings.xml @@ -65,18 +65,12 @@ Supporttråd - Denna funktionen måste ha behörighet att skriva till externt lagringsutrymme. - Nej tack - Ja - OK Stäng Installera %1$s Vill du installera %1$s ? Ladda ner - Fel vid nerladdning av fil Starta om Bearbetar ZIP-filen … - Laddar ner %1$s En uppdatering av Magisk finns tillgänglig! Starta om för att tillämpa inställningar Release notes diff --git a/src/full/res/values-tr/strings.xml b/src/full/res/values-tr/strings.xml index 3ffc8f056..a35db5a00 100644 --- a/src/full/res/values-tr/strings.xml +++ b/src/full/res/values-tr/strings.xml @@ -73,17 +73,11 @@ Destek konusu - Bu özellik harici depolamaya yazma izni olmadan çalışmaz. - Hayır teşekkürler - Evet - Tamam Kapat %1$s yükle %1$s yüklensin mi? İndir - Dosya indirme hatası Yeniden başlat - %1$s indiriliyor Yeni Magisk Güncellemesi Mevcut! Ayarları uygulamak için yeniden başlatın Sürüm notları diff --git a/src/full/res/values-uk/strings.xml b/src/full/res/values-uk/strings.xml index 8878155e5..04029df59 100644 --- a/src/full/res/values-uk/strings.xml +++ b/src/full/res/values-uk/strings.xml @@ -73,17 +73,11 @@ Сторінка підтримки - Ця функція не працюватиме без дозволу на запис у Внутрішнє сховище - Ні, дякую - Так - OK Закрити Встановити %1$s Бажаєте встановити %1$s ? Завантажити - Помилка завантаження файлу Перезавантаження - Завантаження %1$s Доступне оновлення Magisk! Для застосування змін перезавантажте пристрій Особливості версії diff --git a/src/full/res/values-vi/strings.xml b/src/full/res/values-vi/strings.xml index 28c74bc7d..4acda7d3d 100644 --- a/src/full/res/values-vi/strings.xml +++ b/src/full/res/values-vi/strings.xml @@ -60,18 +60,12 @@ Chủ đề hỗ trợ - Tính năng này không hoạt động nếu thiếu quyền ghi vào bộ nhớ ngoài. - Không, cảm ơn - - OK Đóng Cài đặt %1$s Bạn muốn cài đặt %1$s ? Tải xuống - Lỗi tải tập tin Khởi động lại Đang xử lý tập tin zip … - Đang tải xuống %1$s Có cập nhật Magisk mới! Khởi động lại để áp dụng thiết lập Ghi chú phát hành diff --git a/src/full/res/values-zh-rCN/strings.xml b/src/full/res/values-zh-rCN/strings.xml index aeded757c..a853d8bf0 100644 --- a/src/full/res/values-zh-rCN/strings.xml +++ b/src/full/res/values-zh-rCN/strings.xml @@ -74,17 +74,11 @@ 支持主题 - 未授予写入内置存储权限,此功能无法正常工作。 - 不,谢谢 - - 关闭 安装 %1$s 是否立即安装 %1$s ? 下载 - 下载文件时出错 重启 - 正在下载 %1$s Magisk 可更新! 重启以应用设置 发布说明 diff --git a/src/full/res/values-zh-rTW/strings.xml b/src/full/res/values-zh-rTW/strings.xml index fad6a12b9..363bf48a7 100644 --- a/src/full/res/values-zh-rTW/strings.xml +++ b/src/full/res/values-zh-rTW/strings.xml @@ -59,15 +59,10 @@ 討論串 - 未授予寫入外部存儲權限,此功能無法正常工作。 - 不,謝謝 - 安裝 %1$s 你想要安裝 %1$s 嗎? - 下載文件時出錯 重啟 正在處理 zip 文件 … - 正在下載 %1$s Magisk 可更新! 重啟以完成設定 發布說明 @@ -79,7 +74,6 @@ 使用深色主題 清除資源庫快取 清除已暫存的在線資源庫快取,強制刷新在線數據 - Magisk 核心功能模式 隱藏 Magisk 使其不被多種方法檢測到 Systemless hosts @@ -133,7 +127,6 @@ "指令: " 關閉 Zip 已被儲存到:\n[內部儲存空間]%1$s - 處理失敗 下載 處理中 diff --git a/src/full/res/values/strings.xml b/src/full/res/values/strings.xml index 6400589f2..f06395d74 100644 --- a/src/full/res/values/strings.xml +++ b/src/full/res/values/strings.xml @@ -73,17 +73,11 @@ Support thread - This feature will not work without permission to write external storage. - No thanks - Yes - OK Close Install %1$s Do you want to install %1$s now? Download - Error downloading file Reboot - Downloading %1$s New Magisk Update Available! Reboot to apply settings Release notes diff --git a/src/full/res/values/styles.xml b/src/full/res/values/styles.xml index 9a577d0a9..701b5db06 100644 --- a/src/full/res/values/styles.xml +++ b/src/full/res/values/styles.xml @@ -13,6 +13,7 @@ true @android:color/transparent @android:color/secondary_text_light + @style/PreferenceThemeOverlay.v14.Material