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
- Sí
- 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
- Sì
- 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
- Có
- 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