Compare commits

..

14 Commits

Author SHA1 Message Date
topjohnwu
1adf331268 Bump version 2017-12-29 04:03:05 +08:00
topjohnwu
349b3e961b More robust sudb handling 2017-12-29 04:01:39 +08:00
topjohnwu
96650c06f0 Fix the issue that installation configs won't stick 2017-12-29 03:21:51 +08:00
dark-basic #DarkBasic BasicHD
26038a0a07 Update strings.xml 2017-12-29 01:44:36 +08:00
topjohnwu
6a148b5dd9 Add sorting repo by update time 2017-12-27 01:07:33 +08:00
topjohnwu
0e109ef979 Remove snet version checkpoint, always check by code 2017-12-26 18:24:43 +08:00
topjohnwu
de2285d5e9 Bump version 2017-12-26 03:59:28 +08:00
topjohnwu
b2483ba437 Add version check within binary 2017-12-26 03:59:28 +08:00
topjohnwu
a82a5e5a49 Update snet.apk 2017-12-26 03:57:22 +08:00
topjohnwu
d161a02e71 Fix bug in sudb init 2017-12-25 01:38:38 +08:00
Ilya Kushnir
d2b6a700b1 Update RU strings 2017-12-25 01:37:05 +08:00
Matthias Urhahn
af203cef24 Update strings.xml
Improved german translation.
2017-12-25 01:36:52 +08:00
Madis
673e917e76 et: Missing strings and improvements 2017-12-25 01:36:38 +08:00
RoySchutte
a3bd41db54 Update strings.xml 2017-12-25 01:36:20 +08:00
29 changed files with 299 additions and 179 deletions

View File

@@ -2,14 +2,14 @@ apply plugin: 'com.android.application'
android { android {
compileSdkVersion 27 compileSdkVersion 27
buildToolsVersion "27.0.2" buildToolsVersion "27.0.3"
defaultConfig { defaultConfig {
applicationId "com.topjohnwu.magisk" applicationId "com.topjohnwu.magisk"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 27 targetSdkVersion 27
versionCode 80 versionCode 84
versionName "5.5.0" versionName "5.5.2"
ndk { ndk {
moduleName 'zipadjust' moduleName 'zipadjust'
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'

BIN
snet.apk

Binary file not shown.

View File

@@ -1,9 +1,4 @@
### v5.5.0 ### v5.5.2
- Fix dynamic resource loading, prevent crashes when checking SafetyNet - Support sorting online repos with last update
- Update SignAPK to use very little RAM for supporting old devices - Fix issue that advanced installation settings won't stick
- Support settings migration after hiding Magisk Manager - Prevent sudb crashing Magisk Manager
- Add reboot menu in modules section
- Add dark theme to superuser request dialogs
- Properly handle new `HIGHCOMP` and add recommended `KEEPVERITY` and `KEEPFORCEENCRYPT` flags for installation
- Support new paths for v14.6
- Massive improvements in repackaging Magisk Manager

View File

@@ -56,7 +56,7 @@ public class FlashActivity extends Activity {
void saveLogs() { void saveLogs() {
Calendar now = Calendar.getInstance(); Calendar now = Calendar.getInstance();
String filename = String.format(Locale.US, String filename = String.format(Locale.US,
"install_log_%04d%02d%02d_%02d:%02d:%02d.log", "install_log_%04d%02d%02d_%02d%02d%02d.log",
now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1, now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1,
now.get(Calendar.DAY_OF_MONTH), now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.DAY_OF_MONTH), now.get(Calendar.HOUR_OF_DAY),
now.get(Calendar.MINUTE), now.get(Calendar.SECOND)); now.get(Calendar.MINUTE), now.get(Calendar.SECOND));

View File

@@ -91,7 +91,7 @@ public class MagiskFragment extends Fragment
new CheckSafetyNet(getActivity()).exec(); new CheckSafetyNet(getActivity()).exec();
collapse(); collapse();
}; };
if (mm.snetVersion < 0) { if (!CheckSafetyNet.dexPath.exists()) {
// Show dialog // Show dialog
new AlertDialogBuilder(getActivity()) new AlertDialogBuilder(getActivity())
.setTitle(R.string.proprietary_title) .setTitle(R.string.proprietary_title)
@@ -138,13 +138,9 @@ public class MagiskFragment extends Fragment
setupExpandable(); setupExpandable();
keepVerityChkbox.setChecked(mm.keepVerity); keepVerityChkbox.setChecked(mm.keepVerity);
keepVerityChkbox.setOnCheckedChangeListener((view, isChecked) -> { keepVerityChkbox.setOnCheckedChangeListener((view, checked) -> mm.keepVerity = checked);
mm.keepVerity = isChecked;
});
keepEncChkbox.setChecked(mm.keepEnc); keepEncChkbox.setChecked(mm.keepEnc);
keepEncChkbox.setOnCheckedChangeListener((view, isChecked) -> { keepEncChkbox.setOnCheckedChangeListener((view, checked) -> mm.keepEnc = checked);
mm.keepEnc = isChecked;
});
mSwipeRefreshLayout.setOnRefreshListener(this); mSwipeRefreshLayout.setOnRefreshListener(this);
updateUI(); updateUI();

View File

@@ -114,7 +114,7 @@ public class MagiskLogFragment extends Fragment {
switch (mode) { switch (mode) {
case 0: case 0:
StringBuildingList logList = new StringBuildingList(); StringBuildingList logList = new StringBuildingList();
Shell.su(logList, "cat " + Const.MAGISK_LOG + " | tail -n 1000"); Shell.su(logList, "cat " + Const.MAGISK_LOG + " | tail -n 5000");
return logList.getCharSequence(); return logList.getCharSequence();
case 1: case 1:
@@ -125,7 +125,7 @@ public class MagiskLogFragment extends Fragment {
case 2: case 2:
Calendar now = Calendar.getInstance(); Calendar now = Calendar.getInstance();
String filename = String.format(Locale.US, String filename = String.format(Locale.US,
"magisk_log_%04d%02d%02d_%02d:%02d:%02d.log", "magisk_log_%04d%02d%02d_%02d%02d%02d.log",
now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1, now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1,
now.get(Calendar.DAY_OF_MONTH), now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.DAY_OF_MONTH), now.get(Calendar.HOUR_OF_DAY),
now.get(Calendar.MINUTE), now.get(Calendar.SECOND)); now.get(Calendar.MINUTE), now.get(Calendar.SECOND));

View File

@@ -49,7 +49,6 @@ public class MagiskManager extends Application {
public int remoteManagerVersionCode = -1; public int remoteManagerVersionCode = -1;
public String managerLink; public String managerLink;
public String bootBlock = null; public String bootBlock = null;
public int snetVersion;
public boolean keepVerity = false; public boolean keepVerity = false;
public boolean keepEnc = false; public boolean keepEnc = false;
@@ -76,6 +75,7 @@ public class MagiskManager extends Application {
public int updateChannel; public int updateChannel;
public String bootFormat; public String bootFormat;
public String customChannelUrl; public String customChannelUrl;
public int repoOrder;
// Global resources // Global resources
public SharedPreferences prefs; public SharedPreferences prefs;
@@ -106,7 +106,7 @@ public class MagiskManager extends Application {
} catch (PackageManager.NameNotFoundException ignored) { /* Expected */ } } catch (PackageManager.NameNotFoundException ignored) { /* Expected */ }
} }
suDB = new SuDatabaseHelper(false); suDB = SuDatabaseHelper.getSuDB(false);
repoDB = new RepoDatabaseHelper(this); repoDB = new RepoDatabaseHelper(this);
defaultLocale = Locale.getDefault(); defaultLocale = Locale.getDefault();
setLocale(); setLocale();
@@ -145,8 +145,30 @@ public class MagiskManager extends Application {
updateNotification = prefs.getBoolean(Const.Key.UPDATE_NOTIFICATION, true); updateNotification = prefs.getBoolean(Const.Key.UPDATE_NOTIFICATION, true);
updateChannel = Utils.getPrefsInt(prefs, Const.Key.UPDATE_CHANNEL, Const.Value.STABLE_CHANNEL); updateChannel = Utils.getPrefsInt(prefs, Const.Key.UPDATE_CHANNEL, Const.Value.STABLE_CHANNEL);
bootFormat = prefs.getString(Const.Key.BOOT_FORMAT, ".img"); bootFormat = prefs.getString(Const.Key.BOOT_FORMAT, ".img");
snetVersion = prefs.getInt(Const.Key.SNET_VER, -1);
customChannelUrl = prefs.getString(Const.Key.CUSTOM_CHANNEL, ""); customChannelUrl = prefs.getString(Const.Key.CUSTOM_CHANNEL, "");
repoOrder = prefs.getInt(Const.Key.REPO_ORDER, Const.Value.ORDER_NAME);
}
public void writeConfig() {
prefs.edit()
.putBoolean(Const.Key.DARK_THEME, isDarkTheme)
.putBoolean(Const.Key.MAGISKHIDE, magiskHide)
.putBoolean(Const.Key.UPDATE_NOTIFICATION, updateNotification)
.putBoolean(Const.Key.HOSTS, Utils.itemExist(Const.MAGISK_HOST_FILE()))
.putBoolean(Const.Key.COREONLY, Utils.itemExist(Const.MAGISK_DISABLE_FILE))
.putBoolean(Const.Key.SU_REAUTH, suReauth)
.putString(Const.Key.SU_REQUEST_TIMEOUT, String.valueOf(suRequestTimeout))
.putString(Const.Key.SU_AUTO_RESPONSE, String.valueOf(suResponseType))
.putString(Const.Key.SU_NOTIFICATION, String.valueOf(suNotificationType))
.putString(Const.Key.ROOT_ACCESS, String.valueOf(suAccessState))
.putString(Const.Key.SU_MULTIUSER_MODE, String.valueOf(multiuserMode))
.putString(Const.Key.SU_MNT_NS, String.valueOf(suNamespaceMode))
.putString(Const.Key.UPDATE_CHANNEL, String.valueOf(updateChannel))
.putString(Const.Key.LOCALE, localeConfig)
.putString(Const.Key.BOOT_FORMAT, bootFormat)
.putInt(Const.Key.UPDATE_SERVICE_VER, Const.UPDATE_SERVICE_VER)
.putInt(Const.Key.REPO_ORDER, repoOrder)
.apply();
} }
public static void toast(String msg, int duration) { public static void toast(String msg, int duration) {
@@ -190,6 +212,14 @@ public class MagiskManager extends Application {
if (Utils.isValidShellResponse(ret)) if (Utils.isValidShellResponse(ret))
bootBlock = ret.get(0); bootBlock = ret.get(0);
if (suDB != null && !SuDatabaseHelper.verified) {
suDB.close();
suDB = SuDatabaseHelper.getSuDB(true);
}
}
public void getDefaultInstallFlags() {
List<String> ret;
ret = Shell.su("echo \"$DTBOIMAGE\""); ret = Shell.su("echo \"$DTBOIMAGE\"");
if (Utils.isValidShellResponse(ret)) if (Utils.isValidShellResponse(ret))
keepVerity = true; keepVerity = true;
@@ -213,11 +243,6 @@ public class MagiskManager extends Application {
if (Utils.isValidShellResponse(ret)) if (Utils.isValidShellResponse(ret))
keepEnc = Boolean.parseBoolean(ret.get(0)); keepEnc = Boolean.parseBoolean(ret.get(0));
} catch (NumberFormatException ignored) {} } catch (NumberFormatException ignored) {}
if (suDB != null && !SuDatabaseHelper.verified) {
suDB.close();
suDB = new SuDatabaseHelper();
}
} }
public void setPermissionGrantCallback(Runnable callback) { public void setPermissionGrantCallback(Runnable callback) {

View File

@@ -1,5 +1,6 @@
package com.topjohnwu.magisk; package com.topjohnwu.magisk;
import android.app.AlertDialog;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout; import android.support.v4.widget.SwipeRefreshLayout;
@@ -7,6 +8,7 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.SearchView; import android.widget.SearchView;
@@ -15,6 +17,7 @@ import android.widget.TextView;
import com.topjohnwu.magisk.adapters.ReposAdapter; import com.topjohnwu.magisk.adapters.ReposAdapter;
import com.topjohnwu.magisk.asyncs.UpdateRepos; import com.topjohnwu.magisk.asyncs.UpdateRepos;
import com.topjohnwu.magisk.components.Fragment; import com.topjohnwu.magisk.components.Fragment;
import com.topjohnwu.magisk.utils.Const;
import com.topjohnwu.magisk.utils.Topic; import com.topjohnwu.magisk.utils.Topic;
import butterknife.BindView; import butterknife.BindView;
@@ -98,6 +101,22 @@ public class ReposFragment extends Fragment implements Topic.Subscriber {
}); });
} }
@Override
public boolean onOptionsItemSelected(MenuItem item) {
MagiskManager mm = getApplication();
if (item.getItemId() == R.id.repo_sort) {
new AlertDialog.Builder(getActivity())
.setTitle(R.string.sorting_order)
.setSingleChoiceItems(R.array.sorting_orders, mm.repoOrder, (d, which) -> {
mm.repoOrder = which;
mm.prefs.edit().putInt(Const.Key.REPO_ORDER, mm.repoOrder).apply();
adapter.notifyDBChanged();
d.dismiss();
}).show();
}
return true;
}
@Override @Override
public void onDestroyView() { public void onDestroyView() {
super.onDestroyView(); super.onDestroyView();

View File

@@ -34,6 +34,7 @@ public class SplashActivity extends Activity {
MagiskManager mm = getMagiskManager(); MagiskManager mm = getMagiskManager();
mm.loadMagiskInfo(); mm.loadMagiskInfo();
mm.getDefaultInstallFlags();
Utils.loadPrefs(); Utils.loadPrefs();
// Dynamic detect all locales // Dynamic detect all locales
@@ -61,7 +62,7 @@ public class SplashActivity extends Activity {
if (Shell.rootAccess() && mm.magiskVersionCode > 0) { if (Shell.rootAccess() && mm.magiskVersionCode > 0) {
// Add update checking service // Add update checking service
if (Const.Value.UPDATE_SERVICE_VER > mm.prefs.getInt(Const.Key.UPDATE_SERVICE_VER, -1)) { if (Const.UPDATE_SERVICE_VER > mm.prefs.getInt(Const.Key.UPDATE_SERVICE_VER, -1)) {
ComponentName service = new ComponentName(this, UpdateCheckService.class); ComponentName service = new ComponentName(this, UpdateCheckService.class);
JobInfo info = new JobInfo.Builder(Const.ID.UPDATE_SERVICE_ID, service) JobInfo info = new JobInfo.Builder(Const.ID.UPDATE_SERVICE_ID, service)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
@@ -79,24 +80,7 @@ public class SplashActivity extends Activity {
} }
// Write back default values // Write back default values
mm.prefs.edit() mm.writeConfig();
.putBoolean(Const.Key.DARK_THEME, mm.isDarkTheme)
.putBoolean(Const.Key.MAGISKHIDE, mm.magiskHide)
.putBoolean(Const.Key.UPDATE_NOTIFICATION, mm.updateNotification)
.putBoolean(Const.Key.HOSTS, Utils.itemExist(Const.MAGISK_HOST_FILE()))
.putBoolean(Const.Key.COREONLY, Utils.itemExist(Const.MAGISK_DISABLE_FILE))
.putBoolean(Const.Key.SU_REAUTH, mm.suReauth)
.putString(Const.Key.SU_REQUEST_TIMEOUT, String.valueOf(mm.suRequestTimeout))
.putString(Const.Key.SU_AUTO_RESPONSE, String.valueOf(mm.suResponseType))
.putString(Const.Key.SU_NOTIFICATION, String.valueOf(mm.suNotificationType))
.putString(Const.Key.ROOT_ACCESS, String.valueOf(mm.suAccessState))
.putString(Const.Key.SU_MULTIUSER_MODE, String.valueOf(mm.multiuserMode))
.putString(Const.Key.SU_MNT_NS, String.valueOf(mm.suNamespaceMode))
.putString(Const.Key.UPDATE_CHANNEL, String.valueOf(mm.updateChannel))
.putString(Const.Key.LOCALE, mm.localeConfig)
.putString(Const.Key.BOOT_FORMAT, mm.bootFormat)
.putInt(Const.Key.UPDATE_SERVICE_VER, Const.Value.UPDATE_SERVICE_VER)
.apply();
mm.hasInit = true; mm.hasInit = true;

View File

@@ -108,7 +108,7 @@ public class ApplicationAdapter extends RecyclerView.Adapter<ApplicationAdapter.
@BindView(R.id.app_icon) ImageView appIcon; @BindView(R.id.app_icon) ImageView appIcon;
@BindView(R.id.app_name) TextView appName; @BindView(R.id.app_name) TextView appName;
@BindView(R.id.app_package) TextView appPackage; @BindView(R.id.package_name) TextView appPackage;
@BindView(R.id.checkbox) CheckBox checkBox; @BindView(R.id.checkbox) CheckBox checkBox;
ViewHolder(View itemView) { ViewHolder(View itemView) {

View File

@@ -95,6 +95,7 @@ public class ReposAdapter extends SectionedAdapter<ReposAdapter.SectionHolder, R
String author = repo.getAuthor(); String author = repo.getAuthor();
holder.author.setText(TextUtils.isEmpty(author) ? null : context.getString(R.string.author, author)); holder.author.setText(TextUtils.isEmpty(author) ? null : context.getString(R.string.author, author));
holder.description.setText(repo.getDescription()); holder.description.setText(repo.getDescription());
holder.updateTime.setText(context.getString(R.string.updated_on, repo.getLastUpdateString()));
holder.infoLayout.setOnClickListener(v -> holder.infoLayout.setOnClickListener(v ->
new MarkDownWindow((Activity) context, null, repo.getDetailUrl()).exec()); new MarkDownWindow((Activity) context, null, repo.getDetailUrl()).exec());
@@ -180,6 +181,7 @@ public class ReposAdapter extends SectionedAdapter<ReposAdapter.SectionHolder, R
@BindView(R.id.author) TextView author; @BindView(R.id.author) TextView author;
@BindView(R.id.info_layout) LinearLayout infoLayout; @BindView(R.id.info_layout) LinearLayout infoLayout;
@BindView(R.id.download) ImageView downloadImage; @BindView(R.id.download) ImageView downloadImage;
@BindView(R.id.update_time) TextView updateTime;
RepoHolder(View itemView) { RepoHolder(View itemView) {
super(itemView); super(itemView);

View File

@@ -12,6 +12,7 @@ import java.io.BufferedInputStream;
import java.io.BufferedOutputStream; import java.io.BufferedOutputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.lang.reflect.Proxy; import java.lang.reflect.Proxy;
@@ -21,42 +22,57 @@ import dalvik.system.DexClassLoader;
public class CheckSafetyNet extends ParallelTask<Void, Void, Exception> { public class CheckSafetyNet extends ParallelTask<Void, Void, Exception> {
private File dexPath; public static final File dexPath =
new File(MagiskManager.get().getFilesDir().getParent() + "/snet", "snet.apk");
private DexClassLoader loader; private DexClassLoader loader;
private Class<?> helperClazz, callbackClazz;
public CheckSafetyNet(Activity activity) { public CheckSafetyNet(Activity activity) {
super(activity); super(activity);
dexPath = new File(activity.getCacheDir().getParent() + "/snet", "snet.apk");
} }
@Override private void dlSnet() throws IOException {
protected void onPreExecute() { Shell.sh("rm -rf " + dexPath.getParent());
MagiskManager mm = MagiskManager.get(); HttpURLConnection conn = WebService.request(Const.Url.SNET_URL, null);
if (mm.snetVersion != Const.Value.SNET_VER) { dexPath.getParentFile().mkdir();
Shell.sh("rm -rf " + dexPath.getParent()); try (
OutputStream out = new BufferedOutputStream(new FileOutputStream(dexPath));
InputStream in = new BufferedInputStream(conn.getInputStream())) {
Utils.inToOut(in, out);
} }
mm.snetVersion = Const.Value.SNET_VER; conn.disconnect();
mm.prefs.edit().putInt(Const.Key.SNET_VER, Const.Value.SNET_VER).apply(); }
private void loadClasses() throws ClassNotFoundException {
loader = new DexClassLoader(dexPath.toString(), dexPath.getParent(),
null, ClassLoader.getSystemClassLoader());
helperClazz = loader.loadClass(Const.SNET_PKG + ".SafetyNetHelper");
callbackClazz = loader.loadClass(Const.SNET_PKG + ".SafetyNetCallback");
} }
@Override @Override
protected Exception doInBackground(Void... voids) { protected Exception doInBackground(Void... voids) {
int snet_ver = -1;
try { try {
if (!dexPath.exists()) { if (!dexPath.exists())
HttpURLConnection conn = WebService.request(Const.Url.SNET_URL, null); dlSnet();
dexPath.getParentFile().mkdir(); loadClasses();
try (
OutputStream out = new BufferedOutputStream(new FileOutputStream(dexPath)); try {
InputStream in = new BufferedInputStream(conn.getInputStream())) { snet_ver = (int) helperClazz.getMethod("getVersion").invoke(null);
Utils.inToOut(in, out); } catch (NoSuchMethodException e) {
} e.printStackTrace();
conn.disconnect(); }
if (snet_ver != Const.SNET_VER) {
dlSnet();
loadClasses();
} }
loader = new DexClassLoader(dexPath.toString(), dexPath.getParent(),
null, ClassLoader.getSystemClassLoader());
} catch (Exception e) { } catch (Exception e) {
return e; return e;
} }
return null; return null;
} }
@@ -65,8 +81,6 @@ public class CheckSafetyNet extends ParallelTask<Void, Void, Exception> {
MagiskManager mm = MagiskManager.get(); MagiskManager mm = MagiskManager.get();
try { try {
if (err != null) throw err; if (err != null) throw err;
Class<?> helperClazz = loader.loadClass(Const.SNET_PKG + ".SafetyNetHelper");
Class<?> callbackClazz = loader.loadClass(Const.SNET_PKG + ".SafetyNetCallback");
Object helper = helperClazz.getConstructors()[0].newInstance( Object helper = helperClazz.getConstructors()[0].newInstance(
getActivity(), dexPath.getPath(), Proxy.newProxyInstance( getActivity(), dexPath.getPath(), Proxy.newProxyInstance(
loader, new Class[] { callbackClazz }, (proxy, method, args) -> { loader, new Class[] { callbackClazz }, (proxy, method, args) -> {

View File

@@ -3,9 +3,11 @@ package com.topjohnwu.magisk.container;
import android.content.ContentValues; import android.content.ContentValues;
import android.database.Cursor; import android.database.Cursor;
import com.topjohnwu.magisk.MagiskManager;
import com.topjohnwu.magisk.utils.Const; import com.topjohnwu.magisk.utils.Const;
import com.topjohnwu.magisk.utils.WebService; import com.topjohnwu.magisk.utils.WebService;
import java.text.DateFormat;
import java.util.Date; import java.util.Date;
public class Repo extends BaseModule { public class Repo extends BaseModule {
@@ -40,7 +42,7 @@ public class Repo extends BaseModule {
if (getVersionCode() < 0) { if (getVersionCode() < 0) {
throw new IllegalRepoException("Repo [" + repoName + "] does not contain versionCode"); throw new IllegalRepoException("Repo [" + repoName + "] does not contain versionCode");
} }
if (getMinMagiskVersion() < Const.Value.MIN_MODULE_VER) { if (getMinMagiskVersion() < Const.MIN_MODULE_VER) {
throw new IllegalRepoException("Repo [" + repoName + "] is outdated"); throw new IllegalRepoException("Repo [" + repoName + "] is outdated");
} }
} }
@@ -78,6 +80,11 @@ public class Repo extends BaseModule {
return String.format(Const.Url.FILE_URL, repoName, "README.md"); return String.format(Const.Url.FILE_URL, repoName, "README.md");
} }
public String getLastUpdateString() {
return DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM,
MagiskManager.locale).format(mLastUpdate);
}
public Date getLastUpdate() { public Date getLastUpdate() {
return mLastUpdate; return mLastUpdate;
} }

View File

@@ -28,7 +28,7 @@ public class RepoDatabaseHelper extends SQLiteOpenHelper {
// Clear bad repos // Clear bad repos
mDb.delete(TABLE_NAME, "minMagisk<?", mDb.delete(TABLE_NAME, "minMagisk<?",
new String[] { String.valueOf(Const.Value.MIN_MODULE_VER) }); new String[] { String.valueOf(Const.MIN_MODULE_VER) });
} }
@Override @Override
@@ -95,9 +95,17 @@ public class RepoDatabaseHelper extends SQLiteOpenHelper {
} }
public Cursor getRepoCursor() { public Cursor getRepoCursor() {
String orderBy = null;
switch (mm.repoOrder) {
case Const.Value.ORDER_NAME:
orderBy = "name COLLATE NOCASE";
break;
case Const.Value.ORDER_DATE:
orderBy = "last_update DESC";
}
return mDb.query(TABLE_NAME, null, "minMagisk<=?", return mDb.query(TABLE_NAME, null, "minMagisk<=?",
new String[] { String.valueOf(mm.magiskVersionCode) }, new String[] { String.valueOf(mm.magiskVersionCode) },
null, null, "name COLLATE NOCASE"); null, null, orderBy);
} }
public List<String> getRepoIDList() { public List<String> getRepoIDList() {

View File

@@ -41,6 +41,10 @@ public class SuDatabaseHelper extends SQLiteOpenHelper {
private PackageManager pm; private PackageManager pm;
private SQLiteDatabase mDb; private SQLiteDatabase mDb;
private static void unmntDB() {
Shell.su(Utils.fmt("umount -l /data/user*/*/%s/*/*.db", MagiskManager.get().getPackageName()));
}
private static Context initDB(boolean verify) { private static Context initDB(boolean verify) {
Context context, de = null; Context context, de = null;
MagiskManager ce = MagiskManager.get(); MagiskManager ce = MagiskManager.get();
@@ -58,7 +62,7 @@ public class SuDatabaseHelper extends SQLiteOpenHelper {
File db = Utils.getDB(context, DB_NAME); File db = Utils.getDB(context, DB_NAME);
if (!verify) { if (!verify) {
if (db.length() == 0) { if (db.exists() && db.length() == 0) {
ce.loadMagiskInfo(); ce.loadMagiskInfo();
// Continue verification // Continue verification
} else { } else {
@@ -70,16 +74,20 @@ public class SuDatabaseHelper extends SQLiteOpenHelper {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (ce.magiskVersionCode < 1410) { if (ce.magiskVersionCode < 1410) {
if (context == de) { if (context == de) {
unmntDB();
ce.moveDatabaseFrom(de, DB_NAME); ce.moveDatabaseFrom(de, DB_NAME);
context = ce; context = ce;
} }
} else { } else {
if (context == ce) { if (context == ce) {
unmntDB();
de.moveDatabaseFrom(ce, DB_NAME); de.moveDatabaseFrom(ce, DB_NAME);
context = de; context = de;
} }
} }
} }
// Context might be updated
db = Utils.getDB(context, DB_NAME);
if (!Shell.rootAccess()) if (!Shell.rootAccess())
return context; return context;
@@ -100,7 +108,7 @@ public class SuDatabaseHelper extends SQLiteOpenHelper {
// New global su db // New global su db
Shell.su(Utils.fmt("mkdir %s 2>/dev/null; chmod 700 %s", GLOBAL_DB.getParent(), GLOBAL_DB.getParent())); Shell.su(Utils.fmt("mkdir %s 2>/dev/null; chmod 700 %s", GLOBAL_DB.getParent(), GLOBAL_DB.getParent()));
if (!Utils.itemExist(GLOBAL_DB)) { if (!Utils.itemExist(GLOBAL_DB)) {
Utils.javaCreateFile(db); context.openOrCreateDatabase(DB_NAME, 0, null).close();
Shell.su(Utils.fmt("cp -af %s %s; rm -f %s*", db, GLOBAL_DB, db)); Shell.su(Utils.fmt("cp -af %s %s; rm -f %s*", db, GLOBAL_DB, db));
} }
verified = TextUtils.equals(Utils.checkInode(GLOBAL_DB), Utils.checkInode(db)); verified = TextUtils.equals(Utils.checkInode(GLOBAL_DB), Utils.checkInode(db));
@@ -117,12 +125,17 @@ public class SuDatabaseHelper extends SQLiteOpenHelper {
return context; return context;
} }
public SuDatabaseHelper() { public static SuDatabaseHelper getSuDB(boolean verify) {
this(true); try {
} return new SuDatabaseHelper(initDB(verify));
} catch(Exception e) {
public SuDatabaseHelper(boolean verify) { // Try to catch runtime exceptions and remove all db for retry
this(initDB(verify)); unmntDB();
Shell.su(Utils.fmt("rm -rf /data/user*/*/magisk.db /data/adb/magisk.db /data/user*/*/%s/databases"),
MagiskManager.get().getPackageName());
e.printStackTrace();
return new SuDatabaseHelper(initDB(false));
}
} }
private SuDatabaseHelper(Context context) { private SuDatabaseHelper(Context context) {

View File

@@ -30,6 +30,11 @@ public class Const {
public static final File EXTERNAL_PATH = new File(Environment.getExternalStorageDirectory(), "MagiskManager"); public static final File EXTERNAL_PATH = new File(Environment.getExternalStorageDirectory(), "MagiskManager");
public static final String MANAGER_CONFIGS = ".tmp.magisk.config"; public static final String MANAGER_CONFIGS = ".tmp.magisk.config";
// Versions
public static final int UPDATE_SERVICE_VER = 1;
public static final int SNET_VER = 7;
public static final int MIN_MODULE_VER = 1400;
public static String BUSYBOX_PATH() { public static String BUSYBOX_PATH() {
if (Utils.itemExist("/sbin/.core/busybox/busybox")) { if (Utils.itemExist("/sbin/.core/busybox/busybox")) {
return "/sbin/.core/busybox"; return "/sbin/.core/busybox";
@@ -84,12 +89,12 @@ public class Const {
public static class Url { public static class Url {
public static final String STABLE_URL = "https://raw.githubusercontent.com/topjohnwu/MagiskManager/update/stable.json"; public static final String STABLE_URL = "https://raw.githubusercontent.com/topjohnwu/MagiskManager/update/stable.json";
public static final String BETA_URL = "https://raw.githubusercontent.com/topjohnwu/MagiskManager/update/beta.json"; public static final String BETA_URL = "https://raw.githubusercontent.com/topjohnwu/MagiskManager/update/beta.json";
public static final String SNET_URL = "https://github.com/topjohnwu/MagiskManager/raw/afff3c0a49cec8d797e486be3092e256b4bf5375/snet.apk"; public static final String SNET_URL = "https://github.com/topjohnwu/MagiskManager/raw/a82a5e5a49285df65da91d2e8b24f4783841b515/snet.apk";
public static final String REPO_URL = "https://api.github.com/users/Magisk-Modules-Repo/repos?per_page=100&page=%d"; public static final String REPO_URL = "https://api.github.com/users/Magisk-Modules-Repo/repos?per_page=100&page=%d";
public static final String FILE_URL = "https://raw.githubusercontent.com/Magisk-Modules-Repo/%s/master/%s"; public static final String FILE_URL = "https://raw.githubusercontent.com/Magisk-Modules-Repo/%s/master/%s";
public static final String ZIP_URL = "https://github.com/Magisk-Modules-Repo/%s/archive/master.zip"; public static final String ZIP_URL = "https://github.com/Magisk-Modules-Repo/%s/archive/master.zip";
public static final String DONATION_URL = "https://www.paypal.me/topjohnwu"; public static final String DONATION_URL = "https://www.paypal.me/topjohnwu";
public static final String XDA_THREAD = "http://forum.xda-developers.com/showthread.php?t=3432382"; public static final String XDA_THREAD = "http://forum.xda-developers.com/showthread.php?t=3473445";
public static final String SOURCE_CODE_URL = "https://github.com/topjohnwu/MagiskManager"; public static final String SOURCE_CODE_URL = "https://github.com/topjohnwu/MagiskManager";
} }
@@ -118,7 +123,6 @@ public class Const {
public static final String UPDATE_CHANNEL = "update_channel"; public static final String UPDATE_CHANNEL = "update_channel";
public static final String CUSTOM_CHANNEL = "custom_channel"; public static final String CUSTOM_CHANNEL = "custom_channel";
public static final String BOOT_FORMAT = "boot_format"; public static final String BOOT_FORMAT = "boot_format";
public static final String SNET_VER = "snet_version";
public static final String UPDATE_SERVICE_VER = "update_service_version"; public static final String UPDATE_SERVICE_VER = "update_service_version";
public static final String APP_VER = "app_version"; public static final String APP_VER = "app_version";
public static final String MAGISKHIDE = "magiskhide"; public static final String MAGISKHIDE = "magiskhide";
@@ -129,6 +133,7 @@ public class Const {
public static final String ETAG_KEY = "ETag"; public static final String ETAG_KEY = "ETag";
public static final String LINK_KEY = "Link"; public static final String LINK_KEY = "Link";
public static final String IF_NONE_MATCH = "If-None-Match"; public static final String IF_NONE_MATCH = "If-None-Match";
public static final String REPO_ORDER = "repo_order";
} }
@@ -158,8 +163,7 @@ public class Const {
public static final String PATCH_BOOT = "patch"; public static final String PATCH_BOOT = "patch";
public static final String FLASH_MAGISK = "magisk"; public static final String FLASH_MAGISK = "magisk";
public static final int[] timeoutList = {0, -1, 10, 20, 30, 60}; public static final int[] timeoutList = {0, -1, 10, 20, 30, 60};
public static final int UPDATE_SERVICE_VER = 1; public static final int ORDER_NAME = 0;
public static final int SNET_VER = 6; public static final int ORDER_DATE = 1;
public static final int MIN_MODULE_VER = 1400;
} }
} }

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="?attr/imageColorTint"
android:pathData="M3,18h6v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h12v-2L3,11v2z"/>
</vector>

View File

@@ -15,71 +15,63 @@
card_view:cardCornerRadius="@dimen/card_corner_radius" card_view:cardCornerRadius="@dimen/card_corner_radius"
card_view:cardElevation="@dimen/card_elevation"> card_view:cardElevation="@dimen/card_elevation">
<RelativeLayout <LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="fill_parent" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:id="@+id/info_layout"
android:padding="@dimen/card_layout_padding"> android:paddingStart="10dp"
android:paddingEnd="10dp"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<ImageView <ImageView
android:id="@+id/app_icon" android:id="@+id/app_icon"
android:layout_width="@dimen/card_appicon_size" android:layout_width="50dp"
android:layout_height="@dimen/card_appicon_size" android:layout_height="50dp"
android:layout_centerVertical="true" android:layout_gravity="center_vertical"
android:scaleType="centerCrop"/> android:gravity="end" />
<LinearLayout <LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignBottom="@+id/app_icon"
android:gravity="center_horizontal"
android:orientation="vertical" android:orientation="vertical"
android:paddingEnd="@dimen/card_appicon_size" android:layout_width="0dp"
android:paddingStart="65dp" android:layout_height="wrap_content"
android:weightSum="1"> android:layout_weight="1"
android:layout_gravity="center_vertical"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp">
<TextView <TextView
android:id="@+id/app_name" android:id="@+id/app_name"
android:layout_width="fill_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1"
android:maxLines="1" android:maxLines="1"
android:paddingEnd="3dp" android:ellipsize="end"
android:paddingStart="3dp" android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold"/> android:textIsSelectable="false"/>
<TextView <TextView
android:id="@+id/app_package" android:id="@+id/package_name"
android:layout_width="fill_parent" android:layout_width="match_parent"
android:layout_height="25dp" android:layout_height="wrap_content"
android:ellipsize="marquee" android:maxLines="1"
android:gravity="center_vertical" android:ellipsize="end"
android:marqueeRepeatLimit="marquee_forever" android:textAppearance="?android:attr/textAppearanceSmall"
android:paddingEnd="3dp" android:textColor="@android:color/tertiary_text_dark"
android:paddingStart="3dp" android:textIsSelectable="false" />
android:singleLine="true"/>
</LinearLayout> </LinearLayout>
<LinearLayout <CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:focusable="false"
android:layout_centerVertical="true"> android:layout_gravity="center_vertical"
android:src="@drawable/ic_menu_overflow_material"
<CheckBox android:checked="false" />
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:gravity="center"
android:src="@drawable/ic_menu_overflow_material"
android:checked="false" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</android.support.v7.widget.CardView> </android.support.v7.widget.CardView>

View File

@@ -52,7 +52,6 @@
android:maxLines="1" android:maxLines="1"
android:ellipsize="end" android:ellipsize="end"
android:textAppearance="?android:attr/textAppearanceMedium" android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorPrimary"
android:textIsSelectable="false"/> android:textIsSelectable="false"/>
<TextView <TextView

View File

@@ -67,6 +67,15 @@
android:textAppearance="?android:attr/textAppearanceSmall" android:textAppearance="?android:attr/textAppearanceSmall"
android:textIsSelectable="false" /> android:textIsSelectable="false" />
<TextView
android:id="@+id/update_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@android:color/tertiary_text_dark"
android:textIsSelectable="false"
android:textStyle="bold|italic" />
</LinearLayout> </LinearLayout>
<ImageView <ImageView

View File

@@ -2,9 +2,15 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/repo_sort"
android:icon="@drawable/ic_sort"
app:showAsAction="always"/>
<item <item
android:id="@+id/repo_search" android:id="@+id/repo_search"
android:title="" android:title=""
app:actionViewClass="android.widget.SearchView" app:actionViewClass="android.widget.SearchView"
app:showAsAction="always"/> app:showAsAction="always"/>
</menu> </menu>

View File

@@ -55,7 +55,7 @@
<string name="not_installed">Nicht installiert</string> <string name="not_installed">Nicht installiert</string>
<!--Log Fragment--> <!--Log Fragment-->
<string name="menuSaveLog">Log auf speichern</string> <string name="menuSaveLog">Protokoll speichern</string>
<string name="menuReload">Log erneut laden</string> <string name="menuReload">Log erneut laden</string>
<string name="menuClearLog">Log löschen</string> <string name="menuClearLog">Log löschen</string>
<string name="logs_cleared">Log gelöscht</string> <string name="logs_cleared">Log gelöscht</string>
@@ -213,4 +213,4 @@
<string name="target_uid">Ziel-UID:\u0020</string> <string name="target_uid">Ziel-UID:\u0020</string>
<string name="command">Befehl:\u0020</string> <string name="command">Befehl:\u0020</string>
</resources> </resources>

View File

@@ -50,6 +50,10 @@
<string name="update_available">Actualización disponible</string> <string name="update_available">Actualización disponible</string>
<string name="installed">Instalado</string> <string name="installed">Instalado</string>
<string name="not_installed">No Instalado</string> <string name="not_installed">No Instalado</string>
<string name="updated_on">Actualizando en: %1$s</string>
<string name="sorting_order">Orden de Clasificación</string>
<string name="sort_by_name">Ordenar por nombre</string>
<string name="sort_by_update">Ordenar según la última actualización</string>
<!--Log Fragment--> <!--Log Fragment-->
<string name="menuSaveLog">Guardar registro</string> <string name="menuSaveLog">Guardar registro</string>

View File

@@ -11,7 +11,6 @@
<!--Status Fragment--> <!--Status Fragment-->
<string name="magisk_version_error">Magisk pole installitud</string> <string name="magisk_version_error">Magisk pole installitud</string>
<string name="checking_for_updates">Kontrollin uuendusi...</string> <string name="checking_for_updates">Kontrollin uuendusi...</string>
<string name="magisk_update_available">Magisk v%1$s on saadaval!</string> <string name="magisk_update_available">Magisk v%1$s on saadaval!</string>
<string name="invalid_update_channel">Sobimatu uuenduste kanal</string> <string name="invalid_update_channel">Sobimatu uuenduste kanal</string>
@@ -43,6 +42,9 @@
<string name="disable_file_created">Moodul keelatakse järgmisel taaskäivitusel</string> <string name="disable_file_created">Moodul keelatakse järgmisel taaskäivitusel</string>
<string name="disable_file_removed">Moodul lubatakse järgmisel taaskäivitusel</string> <string name="disable_file_removed">Moodul lubatakse järgmisel taaskäivitusel</string>
<string name="author">Loodud %1$s poolt</string> <string name="author">Loodud %1$s poolt</string>
<string name="reboot_recovery">Taaskäivita taastusesse</string>
<string name="reboot_bootloader">Taaskäivita käivitushaldurisse</string>
<string name="reboot_download">Taaskäivita allalaadimisrežiimi</string>
<!--Repo Fragment--> <!--Repo Fragment-->
<string name="update_available">Uuendus saadaval</string> <string name="update_available">Uuendus saadaval</string>
@@ -107,6 +109,8 @@
<string name="no_boot_file_patch_support">Magisk\'i sihtversioon ei toeta käivituspildi faili paikamist</string> <string name="no_boot_file_patch_support">Magisk\'i sihtversioon ei toeta käivituspildi faili paikamist</string>
<string name="boot_file_patch_msg">Vali originaalne käivituspildi väljastus .img või .img.tar vormingus</string> <string name="boot_file_patch_msg">Vali originaalne käivituspildi väljastus .img või .img.tar vormingus</string>
<string name="complete_uninstall">Täielik eemaldus</string> <string name="complete_uninstall">Täielik eemaldus</string>
<string name="restore_img">Taasta pildid</string>
<string name="uninstall_app">Desinstalli rakendus</string>
<string name="restore_done">Taastus valmis!</string> <string name="restore_done">Taastus valmis!</string>
<string name="restore_fail">Originaalne varundus puudub!</string> <string name="restore_fail">Originaalne varundus puudub!</string>
<string name="uninstall_toast">Eemaldan Magisk Manager\'i 5 sekundi pärast, palun tee peale seda käsitsi taaskäivitus</string> <string name="uninstall_toast">Eemaldan Magisk Manager\'i 5 sekundi pärast, palun tee peale seda käsitsi taaskäivitus</string>
@@ -173,6 +177,7 @@
<string name="global_summary">Kõik juurkasutaja sessioonid kasutavad globaalset monteerimise nimeruumi</string> <string name="global_summary">Kõik juurkasutaja sessioonid kasutavad globaalset monteerimise nimeruumi</string>
<string name="requester_summary">Juurkasutaja sessioonid võtavad üle selle taotleja nimeruumi</string> <string name="requester_summary">Juurkasutaja sessioonid võtavad üle selle taotleja nimeruumi</string>
<string name="isolate_summary">Iga juurkasutaja sessioon saab oma isoleeritud nimeruumi</string> <string name="isolate_summary">Iga juurkasutaja sessioon saab oma isoleeritud nimeruumi</string>
<string name="android_o_not_support">Pole toetatud Androidi versioonis 8.0+</string>
<!--Superuser--> <!--Superuser-->
<string name="su_request_title">Superkasutaja taotlus</string> <string name="su_request_title">Superkasutaja taotlus</string>
@@ -187,18 +192,18 @@
<string name="twentymin">20 min</string> <string name="twentymin">20 min</string>
<string name="thirtymin">30 min</string> <string name="thirtymin">30 min</string>
<string name="sixtymin">60 min</string> <string name="sixtymin">60 min</string>
<string name="su_allow_toast">%1$s anti superkasutaja õigused</string> <string name="su_allow_toast">Rakendusele %1$s anti superkasutaja õigused</string>
<string name="su_deny_toast">%1$s keelati superkasutaja õigused</string> <string name="su_deny_toast">Rakendusel %1$s keelati superkasutaja õigused</string>
<string name="no_apps_found">Rakendusi ei leitud</string> <string name="no_apps_found">Rakendusi ei leitud</string>
<string name="su_snack_grant">%1$s superkasutaja õigused on antud</string> <string name="su_snack_grant">Rakenduse %1$s superkasutaja õigused on antud</string>
<string name="su_snack_deny">%1$s superkasutaja õigused on keelatud</string> <string name="su_snack_deny">Rakenduse %1$s superkasutaja õigused on keelatud</string>
<string name="su_snack_notif_on">%1$s teated on lubatud</string> <string name="su_snack_notif_on">Rakenduse %1$s teated on lubatud</string>
<string name="su_snack_notif_off">%1$s teated on keelatud</string> <string name="su_snack_notif_off">Rakenduse %1$s teated on keelatud</string>
<string name="su_snack_log_on">%1$s logimine on lubatud</string> <string name="su_snack_log_on">Rakenduse %1$s logimine on lubatud</string>
<string name="su_snack_log_off">%1$s logimine on keelatud</string> <string name="su_snack_log_off">Rakenduse %1$s logimine on keelatud</string>
<string name="su_snack_revoke">%1$s õigused on eemaldatud</string> <string name="su_snack_revoke">Rakenduse %1$s õigused on eemaldatud</string>
<string name="su_revoke_title">Eemaldad?</string> <string name="su_revoke_title">Eemaldad?</string>
<string name="su_revoke_msg">Kinnitad %1$s õiguste eemaldamise?</string> <string name="su_revoke_msg">Kinnitad rakenduse %1$s õiguste eemaldamise?</string>
<string name="toast">Hüpik</string> <string name="toast">Hüpik</string>
<string name="none">Puudub</string> <string name="none">Puudub</string>

View File

@@ -11,9 +11,9 @@
<!--Status Fragment--> <!--Status Fragment-->
<string name="magisk_version_error">Magisk niet geïnstalleerd</string> <string name="magisk_version_error">Magisk niet geïnstalleerd</string>
<string name="checking_for_updates">Controleren op updates…</string> <string name="checking_for_updates">Controleren op updates…</string>
<string name="magisk_update_available">Magisk v%1$s beschikbaar!</string> <string name="magisk_update_available">Magisk v%1$s beschikbaar!</string>
<string name="invalid_update_channel">Ongeldig bijwerkkanaal</string>
<string name="safetyNet_check_text">Tik om SafetyNet controle te starten</string> <string name="safetyNet_check_text">Tik om SafetyNet controle te starten</string>
<string name="checking_safetyNet_status">SafetyNet status controleren…</string> <string name="checking_safetyNet_status">SafetyNet status controleren…</string>
<string name="safetyNet_check_success">SafetyNet controle succesvol</string> <string name="safetyNet_check_success">SafetyNet controle succesvol</string>
@@ -42,6 +42,9 @@
<string name="disable_file_created">Module wordt uitgeschakeld bij volgende herstart</string> <string name="disable_file_created">Module wordt uitgeschakeld bij volgende herstart</string>
<string name="disable_file_removed">Module wordt ingeschakeld bij volgende herstart</string> <string name="disable_file_removed">Module wordt ingeschakeld bij volgende herstart</string>
<string name="author">Gemaakt door %1$s</string> <string name="author">Gemaakt door %1$s</string>
<string name="reboot_recovery">Herstart naar Recovery</string>
<string name="reboot_bootloader">Herstart naar Bootloader</string>
<string name="reboot_download">Herstart naar Download</string>
<!--Repo Fragment--> <!--Repo Fragment-->
<string name="update_available">Update beschikbaar</string> <string name="update_available">Update beschikbaar</string>
@@ -91,11 +94,13 @@
<string name="zip_process_msg">Zip-bestand verwerken…</string> <string name="zip_process_msg">Zip-bestand verwerken…</string>
<string name="manager_update_title">Nieuwe Magisk Manager update beschikbaar!</string> <string name="manager_update_title">Nieuwe Magisk Manager update beschikbaar!</string>
<string name="manager_download_install">Tik om te downloaden en installeren</string> <string name="manager_download_install">Tik om te downloaden en installeren</string>
<string name="dtbo_patched_title">DTBO is gepatched!</string>
<string name="dtbo_patched_reboot">Magisk Manager heeft dtbo.img gepatched, herstarten a.u.b.</string>
<string name="magisk_updates">Magisk updates</string> <string name="magisk_updates">Magisk updates</string>
<string name="flashing">Flashen</string> <string name="flashing">Flashen</string>
<string name="hide_manager_toast">Magisk Manager verbergen…</string> <string name="hide_manager_toast">Magisk Manager verbergen…</string>
<string name="hide_manager_fail_toast">Magisk Manager verbergen mislukt…</string>
<string name="hide_manager_toast2">Dit kan even duren…</string> <string name="hide_manager_toast2">Dit kan even duren…</string>
<string name="hide_manager_fail_toast">Magisk Manager verbergen mislukt…</string>
<string name="download_zip_only">Alleen zip downloaden</string> <string name="download_zip_only">Alleen zip downloaden</string>
<string name="patch_boot_file">Boot image-bestand patchen</string> <string name="patch_boot_file">Boot image-bestand patchen</string>
<string name="direct_install">Direct installeren (aangeraden)</string> <string name="direct_install">Direct installeren (aangeraden)</string>
@@ -104,11 +109,14 @@
<string name="no_boot_file_patch_support">Magisk versie ondersteund geen boot image-bestand patchen</string> <string name="no_boot_file_patch_support">Magisk versie ondersteund geen boot image-bestand patchen</string>
<string name="boot_file_patch_msg">Kies originele boot image-dump in .img- of .img.tar-formaat</string> <string name="boot_file_patch_msg">Kies originele boot image-dump in .img- of .img.tar-formaat</string>
<string name="complete_uninstall">Compleet deïnstalleren</string> <string name="complete_uninstall">Compleet deïnstalleren</string>
<string name="restore_img">Images herstellen</string>
<string name="uninstall_app">App deïnstalleren</string>
<string name="restore_done">Herstel voltooid!</string> <string name="restore_done">Herstel voltooid!</string>
<string name="restore_fail">Originele back-up bestaat niet!</string> <string name="restore_fail">Originele back-up bestaat niet!</string>
<string name="uninstall_toast">Magisk Manager wordt over 5 seconden verwijderd, hierna handmatig herstarten aub</string> <string name="uninstall_toast">Magisk Manager wordt over 5 seconden verwijderd, hierna handmatig herstarten aub</string>
<string name="proprietary_title">Google\'s code downloaden</string> <string name="proprietary_title">Google\'s code downloaden</string>
<string name="proprietary_notice">Magisk Manager is FOSS, dus bevat geen SafetyNet API code van Google.\n\nSta je Magisk Manager toe om een extensie te downloaden (bevat GoogleApiClient) voor SafetyNet controles?</string> <string name="proprietary_notice">Magisk Manager is FOSS, dus bevat geen SafetyNet API code van Google.\n\nSta je Magisk Manager toe om een extensie te downloaden (bevat GoogleApiClient) voor SafetyNet controles?</string>
<string name="su_db_corrupt">SU database is corrupt, nieuwe db maken…</string>
<!--Settings Activity --> <!--Settings Activity -->
<string name="settings_general_category">Algemeen</string> <string name="settings_general_category">Algemeen</string>
@@ -126,6 +134,8 @@
<string name="settings_update_channel_title">Update-kanaal</string> <string name="settings_update_channel_title">Update-kanaal</string>
<string name="settings_update_stable">Stabiel</string> <string name="settings_update_stable">Stabiel</string>
<string name="settings_update_beta">Beta</string> <string name="settings_update_beta">Beta</string>
<string name="settings_update_custom">Aangepast</string>
<string name="settings_update_custom_msg">Aangepaste URL invoeren</string>
<string name="settings_boot_format_title">Gepatchte boot uitvoerformaat</string> <string name="settings_boot_format_title">Gepatchte boot uitvoerformaat</string>
<string name="settings_boot_format_summary">Kies het formaat van de boot image uitvoer.\nKies .img om via fastboot/downloadmodus te flashen; kies .img.tar om via ODIN te flashen.</string> <string name="settings_boot_format_summary">Kies het formaat van de boot image uitvoer.\nKies .img om via fastboot/downloadmodus te flashen; kies .img.tar om via ODIN te flashen.</string>
<string name="settings_core_only_title">Magisk basismodus</string> <string name="settings_core_only_title">Magisk basismodus</string>
@@ -166,6 +176,7 @@
<string name="global_summary">Alle rootsessies gebruiken de globale naamruimte</string> <string name="global_summary">Alle rootsessies gebruiken de globale naamruimte</string>
<string name="requester_summary">Rootsessies verkrijgen de verzoeker\'s naamruimte</string> <string name="requester_summary">Rootsessies verkrijgen de verzoeker\'s naamruimte</string>
<string name="isolate_summary">Iedere rootsessie heeft een eigen geïsoleerde naamruimte</string> <string name="isolate_summary">Iedere rootsessie heeft een eigen geïsoleerde naamruimte</string>
<string name="android_o_not_support">Ondersteunt geen Android 8.0+</string>
<!--Superuser--> <!--Superuser-->
<string name="su_request_title">Superuser verzoek</string> <string name="su_request_title">Superuser verzoek</string>

View File

@@ -1,11 +1,14 @@
<resources> <resources>
<!--Universal--> <!--Universal-->
<!--Welcome Activity--> <!--Welcome Activity-->
<string name="modules">Модули</string> <string name="modules">Модули</string>
<string name="downloads">Загрузки</string> <string name="downloads">Репозиторий</string>
<string name="superuser">Суперпользователь</string> <string name="superuser">Суперпользователь</string>
<string name="log">Журнал</string> <string name="log">Логи</string>
<string name="settings">Настройки</string> <string name="settings">Настройки</string>
<string name="install">Установка</string> <string name="install">Установка</string>
@@ -16,7 +19,7 @@
<string name="invalid_update_channel">Неверный канал обновлений</string> <string name="invalid_update_channel">Неверный канал обновлений</string>
<string name="safetyNet_check_text">Проверить статус SafetyNet</string> <string name="safetyNet_check_text">Проверить статус SafetyNet</string>
<string name="checking_safetyNet_status">Проверка статуса SafetyNet…</string> <string name="checking_safetyNet_status">Проверка статуса SafetyNet…</string>
<string name="safetyNet_check_success">Проверка SafetyNet пройдена</string> <string name="safetyNet_check_success">Результат проверки SafetyNet</string>
<string name="safetyNet_api_error">Ошибка SafetyNet API</string> <string name="safetyNet_api_error">Ошибка SafetyNet API</string>
<string name="safetyNet_network_loss">Нет подключения к сети</string> <string name="safetyNet_network_loss">Нет подключения к сети</string>
<string name="safetyNet_service_disconnected">Служба была остановлена</string> <string name="safetyNet_service_disconnected">Служба была остановлена</string>
@@ -24,24 +27,27 @@
<!--Install Fragment--> <!--Install Fragment-->
<string name="advanced_settings_title">Расширенные настройки</string> <string name="advanced_settings_title">Расширенные настройки</string>
<string name="keep_force_encryption">Оставить шифрование</string> <string name="keep_force_encryption">Сохранить шифрование</string>
<string name="keep_dm_verity">Оставить AVB 2.0/dm-verity</string> <string name="keep_dm_verity">Сохранить AVB 2.0/dm-verity</string>
<string name="current_magisk_title">Установлена версия: %1$s</string> <string name="current_magisk_title">Установлена версия: %1$s</string>
<string name="install_magisk_title">Последняя версия: %1$s</string> <string name="install_magisk_title">Последняя версия: %1$s</string>
<string name="uninstall">Удаление</string> <string name="uninstall">Удаление</string>
<string name="uninstall_magisk_title">Удаление Magisk</string> <string name="uninstall_magisk_title">Удаление Magisk</string>
<string name="uninstall_magisk_msg">Все модули будут отключены/удалены. Root-права будут удалены. Данные будут зашифрованы.</string> <string name="uninstall_magisk_msg">Все модули будут отключены/удалены. Root-права будут удалены. Данные будут зашифрованы.</string>
<string name="update">Обновить %1$s</string> <string name="update">Обновить %1$s</string>
<!--Module Fragment--> <!--Module Fragment-->
<string name="no_info_provided">(Нет информации)</string> <string name="no_info_provided">(Нет информации)</string>
<string name="no_modules_found">Модули не обнаружены</string> <string name="no_modules_found">Модули не найдены</string>
<string name="update_file_created">Модуль будет обновлен после перезагрузки</string> <string name="update_file_created">Модуль будет обновлен после перезагрузки</string>
<string name="remove_file_created">Модуль будет удален после перезагрузки</string> <string name="remove_file_created">Модуль будет удален после перезагрузки</string>
<string name="remove_file_deleted">Модуль не будет удален после перезагрузки</string> <string name="remove_file_deleted">Модуль не будет удален после перезагрузки</string>
<string name="disable_file_created">Модуль будет отключен после перезагрузки</string> <string name="disable_file_created">Модуль будет отключен после перезагрузки</string>
<string name="disable_file_removed">Модуль будет активирован после перезагрузки</string> <string name="disable_file_removed">Модуль будет активирован после перезагрузки</string>
<string name="author">Разработчик: %1$s</string> <string name="author">Разработчик: %1$s</string>
<string name="reboot_recovery">Перезагрузка в Recovery</string>
<string name="reboot_bootloader">Перезагрузка в Bootloader</string>
<string name="reboot_download">Перезагрузка в Download</string>
<!--Repo Fragment--> <!--Repo Fragment-->
<string name="update_available">Доступно обновление</string> <string name="update_available">Доступно обновление</string>
@@ -49,12 +55,12 @@
<string name="not_installed">Не установлены</string> <string name="not_installed">Не установлены</string>
<!--Log Fragment--> <!--Log Fragment-->
<string name="menuSaveLog">Сохранить логи</string> <string name="menuSaveLog">Сохранить лог</string>
<string name="menuReload">Обновить</string> <string name="menuReload">Обновить</string>
<string name="menuClearLog">Очистить логи</string> <string name="menuClearLog">Очистить лог</string>
<string name="logs_cleared">История успешно очищена</string> <string name="logs_cleared">Лог успешно очищен</string>
<string name="log_is_empty">Журнал пуст</string> <string name="log_is_empty">Лог пуст</string>
<string name="logs_save_failed">Не удалось сохранить лог-файл в SD Card:</string> <string name="logs_save_failed">Не удалось сохранить лог в SD Card:</string>
<!--About Activity--> <!--About Activity-->
<string name="about">О приложении</string> <string name="about">О приложении</string>
@@ -67,7 +73,7 @@
<string name="support_thread">Страница поддержки</string> <string name="support_thread">Страница поддержки</string>
<!--Toasts, Dialogs--> <!--Toasts, Dialogs-->
<string name="permissionNotGranted">Данная функция не будет работать без разрешения на запись во внешнее хранилище</string> <string name="permissionNotGranted">Требуется разрешение на запись во внешнее хранилище.</string>
<string name="no_thanks">Нет</string> <string name="no_thanks">Нет</string>
<string name="yes">Да</string> <string name="yes">Да</string>
<string name="ok">OK</string> <string name="ok">OK</string>
@@ -106,10 +112,12 @@
<string name="no_boot_file_patch_support">Целевая версия Magisk не поддерживает патчинг boot-образов</string> <string name="no_boot_file_patch_support">Целевая версия Magisk не поддерживает патчинг boot-образов</string>
<string name="boot_file_patch_msg">Выберите файл ядра (boot), .img либо .img.tar формата</string> <string name="boot_file_patch_msg">Выберите файл ядра (boot), .img либо .img.tar формата</string>
<string name="complete_uninstall">Удалить</string> <string name="complete_uninstall">Удалить</string>
<string name="restore_img">Восстановить образы</string>
<string name="uninstall_app">Удалить приложение</string>
<string name="restore_done">Восстановление завершено!</string> <string name="restore_done">Восстановление завершено!</string>
<string name="restore_fail">Резервная копия отсутствует!</string> <string name="restore_fail">Резервная копия отсутствует!</string>
<string name="uninstall_toast">Удаление Magisk Manager в течении 5 секунд. Выполните перезагрузку.</string> <string name="uninstall_toast">Удаление Magisk Manager в течении 5 секунд. Выполните перезагрузку.</string>
<string name="proprietary_title">Загрузка собственного кода</string> <string name="proprietary_title">Загрузка SafetyNet</string>
<string name="proprietary_notice">Magisk Manager — свободно распространяемый продукт, он не содержит собственный код SafetyNet API от Google.\n\nРазрешить Magisk Manager загрузить расширение (содержит GoogleApiClient) для проверки SafetyNet?</string> <string name="proprietary_notice">Magisk Manager — свободно распространяемый продукт, он не содержит собственный код SafetyNet API от Google.\n\nРазрешить Magisk Manager загрузить расширение (содержит GoogleApiClient) для проверки SafetyNet?</string>
<string name="su_db_corrupt">База данных SU повреждена, будет создана новая</string> <string name="su_db_corrupt">База данных SU повреждена, будет создана новая</string>
@@ -126,10 +134,10 @@
<string name="language">Язык</string> <string name="language">Язык</string>
<string name="system_default">По умолчанию (системный)</string> <string name="system_default">По умолчанию (системный)</string>
<string name="settings_update">Настройки обновления</string> <string name="settings_update">Настройки обновления</string>
<string name="settings_update_channel_title">Источник обновления</string> <string name="settings_update_channel_title">Источник обновлений</string>
<string name="settings_update_stable">Стабильный релиз</string> <string name="settings_update_stable">Стабильный канал</string>
<string name="settings_update_beta">Beta релиз</string> <string name="settings_update_beta">Beta канал</string>
<string name="settings_update_custom">Неофициальная сборка</string> <string name="settings_update_custom">Сторонний канал</string>
<string name="settings_update_custom_msg">Вставьте ссылку</string> <string name="settings_update_custom_msg">Вставьте ссылку</string>
<string name="settings_boot_format_title">Формат образа ядра</string> <string name="settings_boot_format_title">Формат образа ядра</string>
<string name="settings_boot_format_summary">Выберите формат патченого образа ядра.\n.img - для прошивки через fastboot/download режим.\n.img.tar - для прошивки через ODIN.</string> <string name="settings_boot_format_summary">Выберите формат патченого образа ядра.\n.img - для прошивки через fastboot/download режим.\n.img.tar - для прошивки через ODIN.</string>
@@ -148,18 +156,18 @@
<string name="settings_su_request_30">30 секунд</string> <string name="settings_su_request_30">30 секунд</string>
<string name="settings_su_request_60">60 секунд</string> <string name="settings_su_request_60">60 секунд</string>
<string name="superuser_access">Уровень доступа</string> <string name="superuser_access">Уровень доступа</string>
<string name="auto_response">Автоответ</string> <string name="auto_response">Автоматический ответ</string>
<string name="request_timeout">Период запроса</string> <string name="request_timeout">Период запроса</string>
<string name="superuser_notification">Уведомление суперпользователя</string> <string name="superuser_notification">Уведомление Суперпользователя</string>
<string name="request_timeout_summary">%1$s сек.</string> <string name="request_timeout_summary">%1$s секунд</string>
<string name="settings_su_reauth_title">Реаутентификация после обновления</string> <string name="settings_su_reauth_title">Повторная аутентификация</string>
<string name="settings_su_reauth_summary">Перевыдача прав суперпользователя после обновлений приложения</string> <string name="settings_su_reauth_summary">Повторный запрос прав Суперпользователя после обновления приложения</string>
<string name="multiuser_mode">Многопользовательский режим</string> <string name="multiuser_mode">Многопользовательский режим</string>
<string name="settings_owner_only">Только владелец</string> <string name="settings_owner_only">Только владелец</string>
<string name="settings_owner_manage">Регулировка владельцем</string> <string name="settings_owner_manage">Регулировка владельцем</string>
<string name="settings_user_independent">Независимый пользователь</string> <string name="settings_user_independent">Независимый пользователь</string>
<string name="owner_only_summary">Только владелец имеет root-доступ</string> <string name="owner_only_summary">Только владелец имеет Root-доступ</string>
<string name="owner_manage_summary">Только владелец может управлять root-доступом и обрабатывать запросы на предоставление</string> <string name="owner_manage_summary">Только владелец может управлять root-доступом и обрабатывать запросы на предоставление</string>
<string name="user_indepenent_summary">Каждый пользователь имеет свои собственные правила root-доступа</string> <string name="user_indepenent_summary">Каждый пользователь имеет свои собственные правила root-доступа</string>
<string name="multiuser_hint_owner_request">Запрос был отправлен владельцу устройства. Пожалуйста, переключитесь на профиль владельца и предоставьте разрешение</string> <string name="multiuser_hint_owner_request">Запрос был отправлен владельцу устройства. Пожалуйста, переключитесь на профиль владельца и предоставьте разрешение</string>
@@ -171,7 +179,8 @@
<string name="global_summary">Все сеансы Суперпользователя используют глобальное пространство имён</string> <string name="global_summary">Все сеансы Суперпользователя используют глобальное пространство имён</string>
<string name="requester_summary">Сессии Суперпользователя наследуют пространство имен запрашивающего</string> <string name="requester_summary">Сессии Суперпользователя наследуют пространство имен запрашивающего</string>
<string name="isolate_summary">Каждая сессия Суперпользователя будет иметь собственное изолированное пространство имен</string> <string name="isolate_summary">Каждая сессия Суперпользователя будет иметь собственное изолированное пространство имен</string>
<string name="android_o_not_support">Не поддерживается в Android 8.0+</string>
<!--Superuser--> <!--Superuser-->
<string name="su_request_title">Запрос прав Суперпользователя</string> <string name="su_request_title">Запрос прав Суперпользователя</string>
<string name="deny_with_str">Отказать %1$s</string> <string name="deny_with_str">Отказать %1$s</string>
@@ -202,7 +211,7 @@
<!--Superuser logs--> <!--Superuser logs-->
<string name="pid">PID:\u0020</string> <string name="pid">PID:\u0020</string>
<string name="target_uid">Целевой UID:\u0020</string> <string name="target_uid">UID:\u0020</string>
<string name="command">Команда:\u0020</string> <string name="command">Команда:\u0020</string>
</resources> </resources>

View File

@@ -83,4 +83,9 @@
<item>.img.tar</item> <item>.img.tar</item>
</string-array> </string-array>
<string-array name="sorting_orders">
<item>@string/sort_by_name</item>
<item>@string/sort_by_update</item>
</string-array>
</resources> </resources>

View File

@@ -53,6 +53,10 @@
<string name="update_available">Update Available</string> <string name="update_available">Update Available</string>
<string name="installed">Installed</string> <string name="installed">Installed</string>
<string name="not_installed">Not Installed</string> <string name="not_installed">Not Installed</string>
<string name="updated_on">Updated on: %1$s</string>
<string name="sorting_order">Sorting Order</string>
<string name="sort_by_name">Sort by name</string>
<string name="sort_by_update">Sort by last update</string>
<!--Log Fragment--> <!--Log Fragment-->
<string name="menuSaveLog">Save log</string> <string name="menuSaveLog">Save log</string>

View File

@@ -12,7 +12,7 @@
<item name="windowActionBar">false</item> <item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item>
<item name="imageColorTint">@android:color/background_dark</item> <item name="imageColorTint">@android:color/secondary_text_light</item>
</style> </style>
<style name="AppTheme.Dark" parent="Theme.AppCompat.NoActionBar"> <style name="AppTheme.Dark" parent="Theme.AppCompat.NoActionBar">
@@ -25,7 +25,7 @@
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:textColorSecondary">@color/dark_secondary_text</item> <item name="android:textColorSecondary">@color/dark_secondary_text</item>
<item name="imageColorTint">@android:color/background_light</item> <item name="imageColorTint">@color/dark_secondary_text</item>
</style> </style>
<style name="CardViewStyle.Dark" parent="CardView"> <style name="CardViewStyle.Dark" parent="CardView">