Compare commits

8 Commits

Author SHA1 Message Date
乌堆小透明
6693a23b21 New Crowdin updates (#195)
* New translations strings.xml (Portuguese, Brazilian)
[ci skip] New translations from Crowdin

* New translations strings.xml (Chinese Simplified)
[ci skip] New translations from Crowdin

* New translations strings.xml (Portuguese)
[ci skip] New translations from Crowdin
2022-10-02 18:10:02 +08:00
乌堆小透明
dad4c50c79 New Crowdin updates (#194)
* New translations strings.xml (Romanian)
[ci skip] New translations from Crowdin

* New translations strings.xml (Thai)
[ci skip] New translations from Crowdin

* New translations strings.xml (Portuguese, Brazilian)
[ci skip] New translations from Crowdin

* New translations strings.xml (Chinese Traditional)
[ci skip] New translations from Crowdin

* New translations strings.xml (Chinese Simplified)
[ci skip] New translations from Crowdin

* New translations strings.xml (Turkish)
[ci skip] New translations from Crowdin

* New translations strings.xml (Russian)
[ci skip] New translations from Crowdin

* New translations strings.xml (Portuguese)
[ci skip] New translations from Crowdin

* New translations strings.xml (Korean)
[ci skip] New translations from Crowdin

* New translations strings.xml (Japanese)
[ci skip] New translations from Crowdin

* New translations strings.xml (Arabic)
[ci skip] New translations from Crowdin

* New translations strings.xml (Spanish)
[ci skip] New translations from Crowdin

* New translations strings.xml (Chinese Traditional, Hong Kong)
[ci skip] New translations from Crowdin

* New translations strings.xml (Portuguese, Brazilian)
[ci skip] New translations from Crowdin

* New translations strings.xml (Chinese Simplified)
[ci skip] New translations from Crowdin
2022-10-02 18:07:35 +08:00
LittleTurtle2333
50c4513229 更新版本号至1.6.8 2022-10-02 17:59:35 +08:00
LittleTurtle2333
49ec54c98a 移除开机免输入密码 2022-10-02 17:59:21 +08:00
LittleTurtle2333
0058de24ac 更新CorePatch至上游版本 2022-10-02 17:03:31 +08:00
xiao_wine
ff09f77b43 Merge pull request #192
* 同步blockmiui上游

* 同步blockmiui上游

* Merge branch 'Simplicity-Team:main' into main

* 删除一个log

* 添加 隐藏新HD图标(随缘多语言文件)

* Merge remote-tracking branch 'origin/main'

* 添加 开机免输密码

* strings.xml
2022-10-02 16:34:29 +08:00
Alex Zhang
3abafe1cf9 新增:电量与性能:阻止杀后台应用 (#186)
* 新增:电量与性能:阻止杀后台应用

参考自 https://www.coolapk.com/feed/37905475?shareKey=ODVjZjU1ZGI1YmMyNjJmZjkxNjU~
by 向晚今天吃了咩@coolapk
已获授权

* 新增:电量与性能:使 Millet 更加激进

参考自 https://www.coolapk.com/feed/37574229?shareKey=YWNmMWQ4ZTY2MDI4NjJmZjkxOTg~
by 向晚今天吃了咩@coolapk
已获授权

* 电量与性能:阻止杀后台应用:更新描述

* 电量与性能:阻止杀后台应用:添加更多防杀

* 电量与性能:使 Millet 更加激进: 强制开启 Millet

* 电量与性能:使 Millet 更加激进: 冻结延迟设置为3秒

* 电量与性能:使 Millet 更加激进: 允许 Millet 冻结活跃的应用

* 电量与性能:阻止杀后台应用:更新描述

* 电量与性能:允许 Millet 冻结活跃的应用: 检查使 Millet 更加激进
2022-10-02 16:09:49 +08:00
方块君
6a70d0c20f 增加 新控制中心天气 (不完美) (#180) 2022-10-02 16:09:29 +08:00
30 changed files with 1973 additions and 412 deletions

View File

@@ -13,7 +13,7 @@ android {
minSdk = 31
targetSdk = 33
versionCode = 68
versionName = "1.6.7"
versionName = "1.6.8"
buildConfigField("String", "BUILD_TIME", "\"${System.currentTimeMillis()}\"")
}

View File

@@ -2,7 +2,7 @@ package com.lt2333.simplicitytools.hook
import com.lt2333.simplicitytools.BuildConfig
import com.lt2333.simplicitytools.hook.app.*
import com.lt2333.simplicitytools.hook.app.android.corepatch.CorePatch
import com.lt2333.simplicitytools.hook.app.android.corepatch.CorePatchMainHook
import com.lt2333.simplicitytools.util.xposed.EasyXposedInit
import com.lt2333.simplicitytools.util.xposed.base.AppRegister
import de.robv.android.xposed.IXposedHookZygoteInit
@@ -35,7 +35,7 @@ class XposedEntry : EasyXposedInit() {
override fun initZygote(startupParam: IXposedHookZygoteInit.StartupParam?) {
super.initZygote(startupParam)
CorePatch().initZygote(startupParam)
CorePatchMainHook().initZygote(startupParam)
}
}

View File

@@ -1,7 +1,7 @@
package com.lt2333.simplicitytools.hook.app
import com.lt2333.simplicitytools.hook.app.android.*
import com.lt2333.simplicitytools.hook.app.android.corepatch.CorePatch
import com.lt2333.simplicitytools.hook.app.android.corepatch.CorePatchMainHook
import com.lt2333.simplicitytools.util.xposed.base.AppRegister
import de.robv.android.xposed.callbacks.XC_LoadPackage
@@ -10,8 +10,7 @@ object Android : AppRegister() {
override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
//核心破解
CorePatch().handleLoadPackage(lpparam)
CorePatchMainHook().handleLoadPackage(lpparam)
autoInitHooks(
lpparam,
DisableFlagSecure, //允许截图

View File

@@ -1,6 +1,8 @@
package com.lt2333.simplicitytools.hook.app
import com.lt2333.simplicitytools.hook.app.powerkeeper.DoNotClearApp
import com.lt2333.simplicitytools.hook.app.powerkeeper.LockMaxFps
import com.lt2333.simplicitytools.hook.app.powerkeeper.MakeMilletMoreAggressive
import com.lt2333.simplicitytools.hook.app.powerkeeper.PreventRecoveryOfBatteryOptimizationWhitelist
import com.lt2333.simplicitytools.util.xposed.base.AppRegister
import de.robv.android.xposed.callbacks.XC_LoadPackage
@@ -12,6 +14,8 @@ object PowerKeeper: AppRegister() {
autoInitHooks(lpparam,
LockMaxFps, //锁定最高刷新率
PreventRecoveryOfBatteryOptimizationWhitelist, //防止恢复电池优化白名单
DoNotClearApp,//阻止杀后台
MakeMilletMoreAggressive,//使 Millet 更激进
)
}
}

View File

@@ -23,6 +23,7 @@ object SystemUI: AppRegister() {
RemoveTheLeftSideOfTheLockScreen, //移除锁屏负一屏功能
RemoveLockScreenCamera, //移除锁屏相机功能
NotificationWeather, //通知面板天气
NewNotificationWeather, // 新控制中心天气
OldNotificationWeather,
ControlCenterWeather, //控制中心天气
//StatusBarCurrent, //TODO状态栏电流
@@ -40,6 +41,7 @@ object SystemUI: AppRegister() {
CanNotificationSlide, //允许下滑通知打开小窗
LockScreenClockDisplaySeconds, // 锁屏时钟显示秒
ShowWifiStandard, // 显示 WIFI 角标
NoPasswordHook, // 显示 WIFI 角标
)
}
}

View File

@@ -0,0 +1,142 @@
package com.lt2333.simplicitytools.hook.app.android.corepatch;
import android.content.pm.ApplicationInfo;
import android.content.pm.Signature;
import com.lt2333.simplicitytools.BuildConfig;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.IXposedHookZygoteInit;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XSharedPreferences;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class CorePatchForQ extends XposedHelper implements IXposedHookLoadPackage, IXposedHookZygoteInit {
XSharedPreferences prefs = new XSharedPreferences(BuildConfig.APPLICATION_ID, "config");
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException {
// 允许降级
Class<?> packageClazz = XposedHelpers.findClass("android.content.pm.PackageParser.Package", loadPackageParam.classLoader);
hookAllMethods("com.android.server.pm.PackageManagerService", loadPackageParam.classLoader, "checkDowngrade", new XC_MethodHook() {
public void beforeHookedMethod(MethodHookParam methodHookParam) throws Throwable {
super.beforeHookedMethod(methodHookParam);
if (prefs.getBoolean("downgrade", true)) {
Object packageInfoLite = methodHookParam.args[0];
if (prefs.getBoolean("downgrade", true)) {
Field field = packageClazz.getField("mVersionCode");
field.setAccessible(true);
field.set(packageInfoLite, 0);
field = packageClazz.getField("mVersionCodeMajor");
field.setAccessible(true);
field.set(packageInfoLite, 0);
}
}
}
});
hookAllMethods("android.util.jar.StrictJarVerifier", loadPackageParam.classLoader, "verifyMessageDigest",
new ReturnConstant(prefs, "authcreak", true));
hookAllMethods("android.util.jar.StrictJarVerifier", loadPackageParam.classLoader, "verify",
new ReturnConstant(prefs, "authcreak", true));
hookAllMethods("java.security.MessageDigest", loadPackageParam.classLoader, "isEqual",
new ReturnConstant(prefs, "authcreak", true));
hookAllMethods("com.android.server.pm.PackageManagerServiceUtils", loadPackageParam.classLoader, "verifySignatures",
new ReturnConstant(prefs, "authcreak", false));
Class<?> signingDetails = XposedHelpers.findClass("android.content.pm.PackageParser.SigningDetails", loadPackageParam.classLoader);
Constructor<?> findConstructorExact = XposedHelpers.findConstructorExact(signingDetails, Signature[].class, Integer.TYPE);
findConstructorExact.setAccessible(true);
Class<?> packageParserException = XposedHelpers.findClass("android.content.pm.PackageParser.PackageParserException", loadPackageParam.classLoader);
Field error = XposedHelpers.findField(packageParserException, "error");
error.setAccessible(true);
Object[] signingDetailsArgs = new Object[2];
signingDetailsArgs[0] = new Signature[]{new Signature(SIGNATURE)};
signingDetailsArgs[1] = 1;
final Object newInstance = findConstructorExact.newInstance(signingDetailsArgs);
hookAllMethods("android.util.apk.ApkSignatureVerifier", loadPackageParam.classLoader, "verifyV1Signature", new XC_MethodHook() {
public void afterHookedMethod(MethodHookParam methodHookParam) throws Throwable {
super.afterHookedMethod(methodHookParam);
if (prefs.getBoolean("authcreak", true)) {
Throwable throwable = methodHookParam.getThrowable();
if (throwable != null) {
Throwable cause = throwable.getCause();
if (throwable.getClass() == packageParserException) {
if (error.getInt(throwable) == -103) {
methodHookParam.setResult(newInstance);
}
}
if (cause != null && cause.getClass() == packageParserException) {
if (error.getInt(cause) == -103) {
methodHookParam.setResult(newInstance);
}
}
}
}
}
});
//New package has a different signature
//处理覆盖安装但签名不一致
hookAllMethods(signingDetails, "checkCapability", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
if (prefs.getBoolean("digestCreak", true)) {
if ((Integer) param.args[1] != 4 && prefs.getBoolean("authcreak", true)) {
param.setResult(Boolean.TRUE);
}
}
}
});
hookAllMethods(signingDetails, "checkCapabilityRecover",
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
if (prefs.getBoolean("digestCreak", true)) {
if ((Integer) param.args[1] != 4 && prefs.getBoolean("authcreak", true)) {
param.setResult(Boolean.TRUE);
}
}
}
});
// if app is system app, allow to use hidden api, even if app not using a system signature
findAndHookMethod("android.content.pm.ApplicationInfo", loadPackageParam.classLoader, "isPackageWhitelistedForHiddenApis", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
if (prefs.getBoolean("digestCreak", true)) {
ApplicationInfo info = (ApplicationInfo) param.thisObject;
if ((info.flags & ApplicationInfo.FLAG_SYSTEM) != 0
|| (info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
param.setResult(true);
}
}
}
});
}
@Override
public void initZygote(StartupParam startupParam) {
hookAllMethods("android.content.pm.PackageParser", null, "getApkSigningVersion", XC_MethodReplacement.returnConstant(1));
hookAllConstructors("android.util.jar.StrictJarVerifier", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
if (prefs.getBoolean("enhancedMode", false)) {
param.args[3] = Boolean.FALSE;
}
}
});
}
}

View File

@@ -1,15 +1,12 @@
/**
* 代码来自 https://github.com/LSPosed/CorePatch
* GPL-2.0 License
**/
package com.lt2333.simplicitytools.hook.app.android.corepatch;
import android.app.AndroidAppHelper;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.util.Log;
import com.lt2333.simplicitytools.BuildConfig;
@@ -20,7 +17,6 @@ import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.zip.ZipEntry;
import de.robv.android.xposed.IXposedHookLoadPackage;
@@ -32,12 +28,17 @@ import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class CorePatch extends XposedHelper implements IXposedHookLoadPackage, IXposedHookZygoteInit {
public class CorePatchForR extends XposedHelper implements IXposedHookLoadPackage, IXposedHookZygoteInit {
XSharedPreferences prefs = new XSharedPreferences(BuildConfig.APPLICATION_ID, "config");
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException {
Log.d(CorePatchMainHook.TAG, "downgrade" + prefs.getBoolean("downgrade->", true));
Log.d(CorePatchMainHook.TAG, "authcreak" + prefs.getBoolean("authcreak->", true));
Log.d(CorePatchMainHook.TAG, "digestCreak" + prefs.getBoolean("digestCreak->", true));
Log.d(CorePatchMainHook.TAG, "UsePreSig" + prefs.getBoolean("UsePreSig->", false));
// 允许降级
findAndHookMethod("com.android.server.pm.PackageManagerService", loadPackageParam.classLoader,
"checkDowngrade",
@@ -113,7 +114,7 @@ public class CorePatch extends XposedHelper implements IXposedHookLoadPackage, I
public void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
if (prefs.getBoolean("digestCreak", true)) {
if(!prefs.getBoolean("UsePreSig", false)) {
if (!prefs.getBoolean("UsePreSig", false)) {
final Object block = constructor.newInstance(param.args[0]);
Object[] infos = (Object[]) XposedHelpers.callMethod(block, "getSignerInfos");
Object info = infos[0];
@@ -131,24 +132,28 @@ public class CorePatch extends XposedHelper implements IXposedHookLoadPackage, I
Throwable throwable = methodHookParam.getThrowable();
if (throwable != null) {
Signature[] lastSigs = null;
if(prefs.getBoolean("UsePreSig", false)) {
if (prefs.getBoolean("UsePreSig", false)) {
PackageManager PM = AndroidAppHelper.currentApplication().getPackageManager();
if(PM == null){
XposedBridge.log("E: ${}" + BuildConfig.APPLICATION_ID + " Cannot get the Package Manager... Are you using MiUI?");
}else {
if (PM == null) {
XposedBridge.log("E: " + BuildConfig.APPLICATION_ID + " Cannot get the Package Manager... Are you using MiUI?");
} else {
PackageInfo pI = PM.getPackageArchiveInfo((String) methodHookParam.args[0], 0);
PackageInfo InstpI = PM.getPackageInfo(pI.packageName, PackageManager.GET_SIGNATURES);
lastSigs = InstpI.signatures;
}
}else {
if(prefs.getBoolean("digestCreak", true)) {
} else {
if (prefs.getBoolean("digestCreak", true)) {
final Object origJarFile = constructorExact.newInstance(methodHookParam.args[0], true, false);
final ZipEntry manifestEntry = (ZipEntry) XposedHelpers.callMethod(origJarFile, "findEntry", "AndroidManifest.xml");
final Certificate[][] lastCerts = (Certificate[][]) XposedHelpers.callStaticMethod(ASV, "loadCertificates", origJarFile, manifestEntry);
lastSigs = (Signature[]) XposedHelpers.callStaticMethod(ASV, "convertToSignatures", (Object) lastCerts);
}
}
signingDetailsArgs[0] = Objects.requireNonNullElseGet(lastSigs, () -> new Signature[]{new Signature(SIGNATURE)});
if (lastSigs != null) {
signingDetailsArgs[0] = lastSigs;
} else {
signingDetailsArgs[0] = new Signature[]{new Signature(SIGNATURE)};
}
Object newInstance = findConstructorExact.newInstance(signingDetailsArgs);
//修复 java.lang.ClassCastException: Cannot cast android.content.pm.PackageParser$SigningDetails to android.util.apk.ApkSignatureVerifier$SigningDetailsWithDigests
@@ -156,7 +161,7 @@ public class CorePatch extends XposedHelper implements IXposedHookLoadPackage, I
if (signingDetailsWithDigests != null) {
Constructor<?> signingDetailsWithDigestsConstructorExact = XposedHelpers.findConstructorExact(signingDetailsWithDigests, signingDetails, Map.class);
signingDetailsWithDigestsConstructorExact.setAccessible(true);
newInstance = signingDetailsWithDigestsConstructorExact.newInstance(newInstance, null);
newInstance = signingDetailsWithDigestsConstructorExact.newInstance(new Object[]{newInstance, null});
}
Throwable cause = throwable.getCause();
@@ -203,22 +208,6 @@ public class CorePatch extends XposedHelper implements IXposedHookLoadPackage, I
}
}
});
if (prefs.getBoolean("digestCreak", true) && prefs.getBoolean("UsePreSig", false)) {
Class<?> pmClass = findClass("com.android.server.pm.PackageManagerService", loadPackageParam.classLoader);
Class<?> pPClass = findClass("com.android.server.pm.parsing.pkg.ParsedPackage", loadPackageParam.classLoader);
XposedHelpers.findAndHookMethod(pmClass, "doesSignatureMatchForPermissions", String.class, pPClass, int.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
//If we decide to crack this then at least make sure they are same apks, avoid another one that tries to impersonate.
if (param.getResult().equals(false)) {
String pPname = (String) XposedHelpers.callMethod(param.args[1], "getPackageName");
if (pPname.contentEquals((String) param.args[0])) {
param.setResult(true);
}
}
}
});
}
}
@Override

View File

@@ -0,0 +1,28 @@
package com.lt2333.simplicitytools.hook.app.android.corepatch;
import java.lang.reflect.InvocationTargetException;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class CorePatchForS extends CorePatchForR {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException {
super.handleLoadPackage(loadPackageParam);
if (prefs.getBoolean("digestCreak", true) && prefs.getBoolean("UsePreSig", false)) {
findAndHookMethod("com.android.server.pm.PackageManagerService", loadPackageParam.classLoader, "doesSignatureMatchForPermissions", String.class, "com.android.server.pm.parsing.pkg.ParsedPackage", int.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//If we decide to crack this then at least make sure they are same apks, avoid another one that tries to impersonate.
if (param.getResult().equals(false)) {
String pPname = (String) XposedHelpers.callMethod(param.args[1], "getPackageName");
if (pPname.contentEquals((String) param.args[0])) {
param.setResult(true);
}
}
}
});
}
}
}

View File

@@ -0,0 +1,4 @@
package com.lt2333.simplicitytools.hook.app.android.corepatch;
public class CorePatchForSv2 extends CorePatchForS{
}

View File

@@ -0,0 +1,85 @@
package com.lt2333.simplicitytools.hook.app.android.corepatch;
import android.util.Log;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Member;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class CorePatchForT extends CorePatchForSv2 {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws IllegalAccessException, InvocationTargetException, InstantiationException {
super.handleLoadPackage(loadPackageParam);
findAndHookMethod("com.android.server.pm.PackageManagerServiceUtils", loadPackageParam.classLoader,
"checkDowngrade",
"com.android.server.pm.parsing.pkg.AndroidPackage",
"android.content.pm.PackageInfoLite",
new ReturnConstant(prefs, "downgrade", null));
var utilClass = findClass("com.android.server.pm.PackageManagerServiceUtils", loadPackageParam.classLoader);
Class<?> signingDetails = XposedHelpers.findClass("android.content.pm.SigningDetails", loadPackageParam.classLoader);
//New package has a different signature
//处理覆盖安装但签名不一致
hookAllMethods(signingDetails, "checkCapability", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
// Don't handle PERMISSION (grant SIGNATURE permissions to pkgs with this cert)
// Or applications will have all privileged permissions
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/pm/PackageParser.java;l=5947?q=CertCapabilities
if (((Integer) param.args[1] != 4) && prefs.getBoolean("digestCreak", true)) {
param.setResult(true);
}
}
});
if (utilClass != null) {
for (var m : utilClass.getDeclaredMethods()) {
if ("verifySignatures".equals(m.getName())) {
try {
XposedBridge.class.getDeclaredMethod("deoptimizeMethod", Member.class).invoke(null, m);
} catch (Throwable e) {
Log.e("CorePatch", "deoptimizing failed", e);
}
}
}
}
// Package " + packageName + " signatures do not match previously installed version; ignoring!"
// public boolean checkCapability(String sha256String, @CertCapabilities int flags) {
// public boolean checkCapability(SigningDetails oldDetails, @CertCapabilities int flags)
hookAllMethods("android.content.pm.PackageParser", loadPackageParam.classLoader, "checkCapability", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
Log.e("CorePatch", "checkCapability");
// Don't handle PERMISSION (grant SIGNATURE permissions to pkgs with this cert)
// Or applications will have all privileged permissions
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/java/android/content/pm/PackageParser.java;l=5947?q=CertCapabilities
if (prefs.getBoolean("authcreak", true)) {
if ((Integer) param.args[1] != 4) {
param.setResult(true);
}
}
}
});
if (prefs.getBoolean("digestCreak", true) && prefs.getBoolean("UsePreSig", false)) {
findAndHookMethod("com.android.server.pm.InstallPackageHelper", loadPackageParam.classLoader, "doesSignatureMatchForPermissions", String.class, "com.android.server.pm.parsing.pkg.ParsedPackage", int.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
//If we decide to crack this then at least make sure they are same apks, avoid another one that tries to impersonate.
if (param.getResult().equals(false)) {
String pPname = (String) XposedHelpers.callMethod(param.args[1], "getPackageName");
if (pPname.contentEquals((String) param.args[0])) {
param.setResult(true);
}
}
}
});
}
}
}

View File

@@ -0,0 +1,67 @@
package com.lt2333.simplicitytools.hook.app.android.corepatch;
import android.os.Build;
import android.util.Log;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.IXposedHookZygoteInit;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class CorePatchMainHook implements IXposedHookLoadPackage, IXposedHookZygoteInit {
public static final String TAG = "WooBox: CorePatch";
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (("android".equals(lpparam.packageName)) && (lpparam.processName.equals("android"))) {
Log.d(TAG, "Current sdk version " + Build.VERSION.SDK_INT);
switch (Build.VERSION.SDK_INT) {
case Build.VERSION_CODES.TIRAMISU: // 33
new CorePatchForT().handleLoadPackage(lpparam);
break;
case Build.VERSION_CODES.S_V2: // 32
new CorePatchForSv2().handleLoadPackage(lpparam);
break;
case Build.VERSION_CODES.S: // 31
new CorePatchForS().handleLoadPackage(lpparam);
break;
case Build.VERSION_CODES.R: // 30
new CorePatchForR().handleLoadPackage(lpparam);
break;
case Build.VERSION_CODES.Q: // 29
new CorePatchForQ().handleLoadPackage(lpparam);
break;
default:
XposedBridge.log(TAG + ": Warning: Unsupported Version of Android " + Build.VERSION.SDK_INT);
break;
}
}
}
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
if (startupParam.startsSystemServer) {
Log.d(TAG, "Current sdk version " + Build.VERSION.SDK_INT);
switch (Build.VERSION.SDK_INT) {
case Build.VERSION_CODES.TIRAMISU: // 33
new CorePatchForT().initZygote(startupParam);
break;
case Build.VERSION_CODES.S_V2: // 32
new CorePatchForSv2().initZygote(startupParam);
break;
case Build.VERSION_CODES.S: // 31
new CorePatchForS().initZygote(startupParam);
break;
case Build.VERSION_CODES.R: // 30
new CorePatchForR().initZygote(startupParam);
break;
case Build.VERSION_CODES.Q: // 29
new CorePatchForQ().initZygote(startupParam);
break;
default:
XposedBridge.log(TAG + ": Warning: Unsupported Version of Android " + Build.VERSION.SDK_INT);
break;
}
}
}
}

View File

@@ -0,0 +1,74 @@
package com.lt2333.simplicitytools.hook.app.powerkeeper
import com.github.kyuubiran.ezxhelper.utils.findMethod
import com.github.kyuubiran.ezxhelper.utils.hookBefore
import com.lt2333.simplicitytools.util.hasEnable
import com.lt2333.simplicitytools.util.xposed.base.HookRegister
object DoNotClearApp : HookRegister() {
override fun init() {
findMethod("com.miui.powerkeeper.statemachine.SleepModeControllerNew") {
name == "clearApp"
}.hookBefore {
hasEnable("do_not_clear_app") {
it.result = null
}
}
findMethod("com.miui.powerkeeper.statemachine.PowerStateMachine") {
name == "clearAppWhenScreenOffTimeOut"
}.hookBefore {
hasEnable("do_not_clear_app") {
it.result = null
}
}
findMethod("com.miui.powerkeeper.statemachine.PowerStateMachine") {
name == "clearAppWhenScreenOffTimeOutInNight"
}.hookBefore {
hasEnable("do_not_clear_app") {
it.result = null
}
}
findMethod("com.miui.powerkeeper.powerchecker.PowerCheckerController") {
name == "clearApp"
}.hookBefore {
hasEnable("do_not_clear_app") {
it.result = null
}
}
findMethod("com.miui.powerkeeper.powerchecker.PowerCheckerController") {
name == "autoKillApp"
}.hookBefore {
hasEnable("do_not_clear_app") {
it.result = null
}
}
findMethod("com.miui.powerkeeper.statemachine.SleepModeController\$SleepProcessHelper") {
name == "killAppsInSleep"
}.hookBefore {
hasEnable("do_not_clear_app") {
it.result = null
}
}
findMethod("com.miui.powerkeeper.statemachine.DynamicTurboPowerHandler") {
name == "clearApp"
}.hookBefore {
hasEnable("do_not_clear_app") {
it.result = null
}
}
findMethod("miui.process.ProcessManager") {
name == "kill"
}.hookBefore {
hasEnable("do_not_clear_app") {
it.result = false
}
}
}
}

View File

@@ -0,0 +1,77 @@
package com.lt2333.simplicitytools.hook.app.powerkeeper
import com.github.kyuubiran.ezxhelper.utils.findMethod
import com.github.kyuubiran.ezxhelper.utils.hookBefore
import com.lt2333.simplicitytools.util.hasEnable
import com.lt2333.simplicitytools.util.xposed.base.HookRegister
object MakeMilletMoreAggressive : HookRegister() {
override fun init() {
findMethod("com.miui.powerkeeper.controller.FrozenAppController") {
name == "appIsAllowToFrozen"
}.hookBefore {
hasEnable("make_millet_more_aggressive") {
it.result = true
}
}
findMethod("com.miui.powerkeeper.controller.FrozenAppController\$FrozenUtil") {
name == "isHasRunningStateProcess"
}.hookBefore {
hasEnable("make_millet_more_aggressive") {
it.result = false
}
}
findMethod("com.miui.powerkeeper.controller.FrozenAppController\$FrozenUtil") {
name == "isExectingService"
}.hookBefore {
hasEnable("make_millet_more_aggressive") {
it.result = false
}
}
findMethod("com.miui.powerkeeper.controller.FrozenAppController\$FrozenUtil") {
name == "isReceivingBroadcast"
}.hookBefore {
hasEnable("make_millet_more_aggressive") {
it.result = false
}
}
findMethod("com.miui.powerkeeper.controller.FrozenAppController\$FrozenUtil") {
name == "isHasProcessOOMTooLow"
}.hookBefore {
hasEnable("make_millet_more_aggressive") {
it.result = false
}
}
findMethod("com.miui.powerkeeper.controller.FrozenAppController") {
name == "isHasNotification"
}.hookBefore {
hasEnable("make_millet_more_aggressive") {
it.result = false
}
}
findMethod("com.miui.powerkeeper.millet.MilletConfig") {
name == "getEnable"
}.hookBefore {
hasEnable("make_millet_more_aggressive") {
it.result = true
}
}
findMethod("com.miui.powerkeeper.controller.FrozenAppController\$AppStateFrozenControl") {
name == "frozenAppLater" &&
parameterTypes.contentEquals(arrayOf(Int::class.java))
}.hookBefore {
hasEnable("make_millet_more_aggressive") {
it.args[0] = 3000
}
}
findMethod("com.miui.powerkeeper.controller.FrozenAppController\$AppStateFrozenControl") {
name == "isAllowFrozenNow"
}.hookBefore {
hasEnable("make_millet_more_aggressive") {
hasEnable("make_millet_ignore_active") {
it.result = true
}
}
}
}
}

View File

@@ -2,9 +2,9 @@ package com.lt2333.simplicitytools.hook.app.systemui
import android.view.View
import android.widget.ImageView
import com.github.kyuubiran.ezxhelper.utils.findMethod
import com.github.kyuubiran.ezxhelper.utils.getObjectAs
import com.github.kyuubiran.ezxhelper.utils.hookAfter
import android.util.Log
import com.github.kyuubiran.ezxhelper.utils.*
import com.lt2333.simplicitytools.util.XSPUtils
import com.lt2333.simplicitytools.util.hasEnable
import com.lt2333.simplicitytools.util.xposed.base.HookRegister
import de.robv.android.xposed.XC_MethodHook
@@ -12,6 +12,8 @@ import de.robv.android.xposed.XC_MethodHook
object HideHDIcon : HookRegister() {
override fun init() {
findMethod("com.android.systemui.statusbar.StatusBarMobileView") {
name == "initViewState" && parameterCount == 1
}.hookAfter {
@@ -23,6 +25,11 @@ object HideHDIcon : HookRegister() {
}.hookAfter {
hide(it)
}
hasEnable("hide_new_hd_icon") {
findMethod("com.android.systemui.statusbar.policy.HDController") { name == "update" }.hookBefore {
it.result = null
}
}
}
private fun hide(it: XC_MethodHook.MethodHookParam) {

View File

@@ -0,0 +1,53 @@
package com.lt2333.simplicitytools.hook.app.systemui
import android.annotation.SuppressLint
import android.content.pm.ApplicationInfo
import android.widget.TextView
import com.github.kyuubiran.ezxhelper.utils.*
import com.lt2333.simplicitytools.util.XSPUtils
import com.lt2333.simplicitytools.util.hasEnable
import com.lt2333.simplicitytools.util.xposed.base.HookRegister
import com.lt2333.simplicitytools.view.WeatherData
@SuppressLint("StaticFieldLeak")
object NewNotificationWeather : HookRegister() {
lateinit var weather: WeatherData
var clockId: Int = -2
@SuppressLint("DiscouragedApi", "ClickableViewAccessibility")
override fun init() = hasEnable("control_center_weather") {
val isDisplayCity = XSPUtils.getBoolean("notification_weather_city", false)
findMethod("com.android.systemui.controlcenter.phone.widget.ControlCenterDateView", findSuper = true) { name == "onDetachedFromWindow" }.hookBefore {
if ((it.thisObject as TextView).id == clockId && this::weather.isInitialized) {
weather.onDetachedFromWindow()
}
}
findMethod("com.android.systemui.controlcenter.phone.widget.ControlCenterDateView", findSuper = true) { name == "setText" }.hookBefore {
val time = it.args[0]?.toString()
val view = it.thisObject as TextView
if (view.id == clockId && time != null && this::weather.isInitialized) {
// TODO("调高天气位置")
// val layout = view.layoutParams as ViewGroup.MarginLayoutParams
// val y = view.height / 2
// layout.topMargin = -y
it.args[0] = "${weather.weatherData}$time"
}
}
findMethod("com.android.systemui.shared.plugins.PluginManagerImpl") { name == "getClassLoader" }.hookAfter { getClassLoader ->
val appInfo = getClassLoader.args[0] as ApplicationInfo
val classLoader = getClassLoader.result as ClassLoader
if (appInfo.packageName == "miui.systemui.plugin") {
findMethod("miui.systemui.controlcenter.windowview.MainPanelHeaderController", classLoader = classLoader) { name == "addClockViews" }.hookAfter {
val dateView = it.thisObject.getObjectAs<TextView>("dateView")
clockId = dateView.id
weather = WeatherData(dateView.context, isDisplayCity)
weather.callBacks = {
dateView.invokeMethod("updateTime")
}
}
}
}
}
}

View File

@@ -0,0 +1,21 @@
package com.lt2333.simplicitytools.hook.app.systemui
import com.github.kyuubiran.ezxhelper.utils.findMethod
import com.github.kyuubiran.ezxhelper.utils.hookBefore
import com.lt2333.simplicitytools.util.hasEnable
import com.lt2333.simplicitytools.util.xposed.base.HookRegister
object NoPasswordHook : HookRegister() {
override fun init() {
hasEnable("no_need_to_enter_password_when_power_on") {
findMethod("com.android.internal.widget.LockPatternUtils\$StrongAuthTracker") { name == "isBiometricAllowedForUser" }.hookBefore {
it.result = true
}
findMethod("com.android.internal.widget.LockPatternUtils") { name == "isBiometricAllowedForUser" }.hookBefore {
it.result = true
}
}
}
}

View File

@@ -0,0 +1,107 @@
package com.lt2333.simplicitytools.view
import android.annotation.SuppressLint
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.database.ContentObserver
import android.net.Uri
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.text.TextUtils
import android.widget.TextClock
import android.widget.TextView
import android.widget.Toast
import com.github.kyuubiran.ezxhelper.utils.*
import de.robv.android.xposed.XposedBridge
import java.util.*
@SuppressLint("ViewConstructor", "SetTextI18n")
class WeatherData(val context: Context?, private val showCity: Boolean) {
private val mContext: Context
private val WEATHER_URI = Uri.parse("content://weather/weather")
private val mHandler: Handler
private val mWeatherObserver: ContentObserver?
private val mWeatherRunnable: WeatherRunnable
var weatherData: String = "\n"
var callBacks: () -> Unit = {}
init {
mHandler =
object : Handler(Looper.getMainLooper()) {
override fun handleMessage(message: Message) {
val str = message.obj as String
weatherData = if (TextUtils.isEmpty(str)) "\n" else "$str\n"
callBacks()
}
}
mWeatherObserver = WeatherContentObserver(mHandler)
mContext = context!!
mWeatherRunnable = WeatherRunnable()
context.contentResolver.registerContentObserver(WEATHER_URI, true, mWeatherObserver)
updateWeatherInfo()
}
private inner class WeatherContentObserver(handler: Handler?) : ContentObserver(handler) {
override fun onChange(z: Boolean) {
updateWeatherInfo()
}
}
inner class WeatherRunnable : Runnable {
override fun run() {
var str = ""
try {
val query = mContext.contentResolver.query(WEATHER_URI, null, null, null, null)
if (query != null) {
if (query.moveToFirst()) {
str = if (showCity) {
query.getString(query.getColumnIndexOrThrow("city_name")) + " " + query.getString(query.getColumnIndexOrThrow("description")) + " " + query.getString(query.getColumnIndexOrThrow("temperature"))
} else {
query.getString(query.getColumnIndexOrThrow("description")) + " " + query.getString(query.getColumnIndexOrThrow("temperature"))
}
}
query.close()
}
} catch (e: Exception) {
}
val obtainMessage2 = mHandler.obtainMessage()
obtainMessage2.what = 100
obtainMessage2.obj = str
mHandler.sendMessage(obtainMessage2)
}
}
private fun updateWeatherInfo() {
mHandler.removeCallbacks(mWeatherRunnable)
mHandler.postDelayed(mWeatherRunnable, 200)
}
fun onDetachedFromWindow() {
if (mWeatherObserver != null) {
mContext.contentResolver.unregisterContentObserver(mWeatherObserver)
}
}
fun startCalendarApp() {
mContext.classLoader.loadClass("com.miui.systemui.util.CommonUtil").invokeStaticMethod("startCalendarApp", args(context), argTypes(Context::class.java))
}
fun startWeatherApp() {
try {
val intent = Intent().apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
component = ComponentName(
"com.miui.weather2",
"com.miui.weather2.ActivityWeatherMain"
)
}
mContext.startActivity(intent)
} catch (e: Exception) {
Toast.makeText(context, "启动失败", Toast.LENGTH_LONG).show()
}
}
}

View File

@@ -1,4 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="other">غير ذلك</string>
<string name="disable_flag_secure">السماح بلقطة الشاشة</string>
<string name="home">الصفحة الرئيسية</string>
<string name="home_time">عرض ساعة الشاشة الرئيسية دائماً</string>
<string name="reboot">إعادة تشغيل النظام</string>
<!--Status bar icons-->
<string name="status_bar_icon">أيقونات شريط الحالة</string>
<string name="hide_no_sim_icon">إخفاء أيقونة No SIM</string>
<string name="hide_sim_one_icon">إخفاء أيقونة SIM Card 1</string>
<string name="hide_sim_two_icon">إخفاء أيقونة SIM Card 2</string>
<string name="hide_vpn_icon">إخفاء أيقونة VPN</string>
</resources>

View File

@@ -218,4 +218,10 @@
<string name="take_effect_after_reboot">Se activa después de reiniciar</string>
<string name="media_volume_steps_summary">Activar esta opción puede hacer que el desplazamiento de la barra de volumen se congele o que el volumen Bluetooth sea anormal</string>
<string name="can_notification_slide_summary">Es posible que algunas notificaciones a través de Mi Push no sean soportadas.</string>
<string name="screen_hole_location">Ubicación del agujero de pantalla</string>
<string name="custom_clock_mode">Modo de reloj personalizado</string>
<string name="custom_clock_format_geek">Formato de reloj</string>
<string name="off">Apagado</string>
<string name="center">Centro</string>
<string name="left_or_right">Izquierda o Derecha</string>
</resources>

View File

@@ -218,4 +218,12 @@
<string name="take_effect_after_reboot">機能は再起動後に有効になります</string>
<string name="media_volume_steps_summary">オンにすると、ボリュームバーのスクロールがフリーズしたり、Bluetoothの音量が異常になる場合があります</string>
<string name="can_notification_slide_summary">一部のMi Pushによる通知では機能しない場合があります。</string>
<string name="screen_hole_location">画面穴の場所</string>
<string name="custom_clock_mode">カスタム時計モード</string>
<string name="custom_clock_format_geek">時刻の表示方法</string>
<string name="off">オフ</string>
<string name="center">中央</string>
<string name="left_or_right">左または右</string>
<string name="preset">プリセット</string>
<string name="geek">オタク</string>
</resources>

View File

@@ -1,4 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="performance">성능</string>
<string name="lock_max_fps">최대 프레임으로 고정</string>
<string name="ui">UI</string>
<string name="delete_on_post_notification">알림 위에 표시 끄기</string>
<string name="delete_on_post_notification_summary">\"이 앱은 다른 앱 위에 표시됩니다\" 알림 끄기</string>
<string name="other">다른</string>
<string name="disable_flag_secure">스크린샷 허용</string>
<string name="disable_flag_secure_summary">허용되지 않은 소프트웨어의 스크린샷 허용\n보안을 위해 제어 센터에 드롭다운 빠른 설정 추가 지원</string>
<string name="home"></string>
<string name="home_time">홈 화면 시계 항상 켜짐</string>
<string name="reboot_host">모든 범위 다시 시작</string>
<string name="reboot">시스템 재부팅</string>
<!--Status bar icons-->
<string name="status_bar_icon">상태 표시줄 아이콘</string>
<string name="hide_no_sim_icon">유심 없음 아이콘 숨기기</string>
<string name="hide_sim_one_icon">1번 심 아이콘 숨기기</string>
<string name="hide_sim_two_icon">2번 심 아이콘 숨기기</string>
<string name="hide_vpn_icon">VPN 아이콘 숨기기</string>
<string name="hide_airplane_icon">비행기 모드 아이콘 숨기기</string>
<string name="hide_wifi_icon">와이파이 아이콘 숨기기</string>
<string name="hide_bluetooth_icon">블루투스 아이콘 숨기기</string>
<string name="hide_volume_zen_icon">무음 및 방해 금지 모드 아이콘 숨기기</string>
<string name="hide_alarm_icon">알람 아이콘 숨기기</string>
<string name="hide_hotspot_icon">모바일 핫스팟 아이콘 숨기기</string>
<string name="hide_headset_icon">해드셋 아이콘 숨기기</string>
<string name="hide_bluetooth_battery_icon">블루투스 기기 배터리 아이콘 숨기기</string>
<string name="hide_nfc_icon">NFC 아이콘 숨기기</string>
<string name="hide_big_hd_icon">큰 HD 아이콘 숨기기</string>
<string name="hide_small_hd_icon">작은 HD 아이콘 숨기기</string>
<string name="hide_hd_no_service_icon">HD 서비스 없음 아이콘 숨기기</string>
<string name="about">에 대한</string>
<string name="about_module">모듈에 대해</string>
<string name="verison">버전</string>
<string name="dev_coolapk">작성자 Coolapk</string>
<string name="opensource">소스 저장소 열기</string>
<string name="github_url">개발에 참여하는 더 많은 개발자를 환영합니다</string>
<string name="issues">피드백 및 제안</string>
<string name="issues_url">클릭해 GitHub 이슈 보기</string>
<string name="xposeddescription">MIUI 13(Android 12) 용 커스텀 도구</string>
<string name="statusbar">상태 바</string>
<string name="status_bar_time_seconds">화면 표시 시간</string>
<string name="status_bar_network_speed_refresh_speed">몇 초에 네트워크 속도 새로 고침</string>
<string name="remove_the_maximum_number_of_notification_icons">알림 아이콘의 최대 숫자 끄기</string>
<string name="main_switch">모듈 메인 스위치</string>
<string name="hide_gps_icon">GPS 아이콘 숨기기</string>
<string name="hide_status_bar_network_speed_second">네트워크 속도 단위(/s) 숨기기</string>
<string name="menu">메뉴</string>
<string name="Tips"></string>
<string name="skip_waiting_time">5/10초 경고 시간 건너뛰기</string>
<string name="unlock_unlimited_cropping">사진/스크린샷 자르기 제한 끄기</string>
<string name="hide_slave_wifi_icon">WIFI 보조 아이콘 끄기</string>
<string name="HideLauncherIcon">런처 아이콘 끄기</string>
<string name="hide_battery_percentage_icon">배터리 퍼센트 표시(%) 끄기</string>
<string name="hide_battery_icon">배터리 아이콘 숨기기</string>
<string name="status_bar_clock_format">상태바 시계 형태</string>
<string name="status_bar_time_year">연도 표시</string>
<string name="status_bar_time_month">달 표시</string>
<string name="status_bar_time_day">일 표시</string>
<string name="status_bar_time_week">요일 표시</string>
<string name="status_bar_time_hide_space">공간 숨기기</string>
<string name="allow_screenshots">스크린샷 허용</string>
<string name="lock_max">현재 제한 고정</string>
<string name="status_bar_time_double_hour">중국식 12시간 표시</string>
<string name="custom_clock_switch">맞춤형 시계 스위치</string>
<string name="status_bar_time_period">오전/오후 표시</string>
<string name="status_bar_time_double_line">두 줄</string>
<string name="status_bar_clock_size">시계 크기(0: 변경 안함)</string>
<string name="status_bar_clock_double_line_size">이중 행 크기(0: 변경 안함)</string>
<string name="matters_needing_attention">기능이 작동하지 않나요? </string>
<string name="Done">확인</string>
<string name="about_module_summary">모듈 관련 정보 보기</string>
<string name="contributor_list">오픈소스 저장소 기여자 목록</string>
<string name="developer">개발자</string>
<string name="thank_list">기여자 목록</string>
<string name="third_party_open_source_statement">서드파티 오픈소서 상태</string>
<string name="corepacth">제한 끄기</string>
<string name="corepacth_summary">다운그레이드/다른 서명/서명되지 않은 설치 지원</string>
<string name="prevent_recovery_of_battery_optimization_white_list">배터리 최적화 화이트리스트 복구 방지</string>
<string name="failed_after_restart">시스템 다시시작 후 복원됩니다</string>
<string name="battery_optimization">배터리 최적화</string>
<string name="battery_optimization_summary">MIUI에서 숨겨진 배터리 최적화 메뉴 퀵 오픈</string>
<string name="remove_small_window_restrictions">작은 창 강제하기</string>
<string name="app_coolapk_url">5점 리뷰 해주세요!</string>
<string name="app_coolapk_url_summary">이것은 우리를 더 쉽게 찾을 수 있게 해줍니다</string>
<string name="qq_channel">공식 QQ 채널에 참여하세요</string>
<string name="tg_channel">공식 TG 채널에 참여하세요</string>
<string name="tg_channel_summary">채널 페이지에 있는 대화 그룹에 입장 할 수 있습니다</string>
<string name="discussions">토론</string>
<string name="remove_small_window_restrictions_summary">작은 창의 시스템 블랙리스트 및 소프트웨어 금지 무시</string>
<string name="remove_the_left_side_of_the_lock_screen">잠금화면 사이드 패널 끄기</string>
<string name="remove_lock_screen_camera">잠금화면 카메라 끄기</string>
<string name="only_official_default_themes_are_supported">공식 기본 테마만이 지원됩니다</string>
<string name="lock_one_hundred">보안 앱에서 100포인트 설정</string>
<string name="scope">스코프</string>
<string name="scope_android">시스템 프레임워크</string>
<string name="scope_systemui">시스템 Ui</string>
<string name="scope_miuihome">홈 화면</string>
<string name="scope_other">기타</string>
<string name="status_bar_network_speed_refresh_speed_summary">상태 표시줄에 있는 네트워크 속도의 새로 고침 빈도를 1초로 변경</string>
<string name="hide_battery_percentage_icon_summary">배터리 백분율 표시 기능은 직접 켜야 합니다</string>
<string name="hide_status_bar_network_speed_second_summary">상태 표시줄에 있는 네트워크 속도의 (/s) 단위 숨기기</string>
<string name="remove_the_maximum_number_of_notification_icons_summary">상태 표시줄의 알림 3개 제한 끄기</string>
<string name="scope_systemui_summary">시스템 인터페이스, 상태 표시줄, 잠금 화면 등 커스텀하기</string>
<string name="scope_android_summary">모듈을 처음 활성화하거나 모듈이 업데이트된 후, 여기의 기능은 시스템을 다시 시작한 후 적용됩니다.</string>
<string name="scope_other_summary">보안 앱, 사진 편집기, 배터리, 성능 등</string>
</resources>

View File

@@ -219,4 +219,11 @@
<string name="media_volume_steps_summary">Activarea poate provoca înghețarea derulării barei de volum sau volumul Bluetooth să fie anormal</string>
<string name="can_notification_slide_summary">Este posibil ca unele notificări prin Mi Push să nu fie acceptate.</string>
<string name="screen_hole_location">Locație gaură ecran</string>
<string name="custom_clock_mode">Mod ceas personalizat</string>
<string name="custom_clock_format_geek">Format ceas</string>
<string name="off">Oprit</string>
<string name="center">La centru</string>
<string name="left_or_right">Stânga sau dreapta</string>
<string name="preset">Presetare</string>
<string name="geek">Tocilar</string>
</resources>

View File

@@ -222,4 +222,18 @@
<string name="take_effect_after_reboot">Вступит в силу после перезагрузки</string>
<string name="media_volume_steps_summary">Включение может привести к ненормальной прокрутке строки громкости</string>
<string name="can_notification_slide_summary">Некоторые уведомления через Mi Push могут не поддерживаться.</string>
<string name="screen_hole_location">Расположение выреза на экране</string>
<string name="custom_clock_mode">Пользовательский режим часов</string>
<string name="custom_clock_format_geek">Формат часов</string>
<string name="off">Выкл.</string>
<string name="center">Центр</string>
<string name="left_or_right">Влево/Вправо</string>
<string name="preset">Шаблон</string>
<string name="geek">Продвинутый</string>
<string name="do_not_clear_app">Предотвращение отключения фоновых приложений</string>
<string name="do_not_clear_app_summary">Может привести к увеличению энергопотребления</string>
<string name="make_millet_more_aggressive">Сделать Millet более агрессивным</string>
<string name="make_millet_more_aggressive_summary">Позволяет Millet замораживать приложения, когда фоновые приложения имеют уведомления, запущенные службы и запущенные процессы.</string>
<string name="make_millet_ignore_active">Разрешить Millet замораживать активные приложения</string>
<string name="make_millet_ignore_active_summary">Очень агрессивно и может повлиять на работу приложений</string>
</resources>

View File

@@ -1,4 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="performance">ประสิทธิภาพ</string>
<string name="lock_max_fps">ล็อคค่า FPS สูงสุด</string>
<string name="ui">การแสดงผล</string>
<string name="delete_on_post_notification">ลบการแสดงผล บนแถบการแจ้งเตือน</string>
<!--Status bar icons-->
</resources>

View File

@@ -26,6 +26,7 @@
<string name="hide_hotspot_icon">Taşınabilir erişim noktası simgesini gizle</string>
<string name="hide_headset_icon">Kulaklık simgesini gizle</string>
<string name="hide_bluetooth_battery_icon">Bluetooth pil simgesini gizle</string>
<string name="hide_nfc_icon">NFC simgesini gizle</string>
<string name="hide_big_hd_icon">Büyük HD simgesini gizle</string>
<string name="hide_small_hd_icon">Küçük HD simgesini gizle</string>
<string name="hide_hd_no_service_icon">HD Hizmet Yok simgesini gizle

View File

@@ -29,6 +29,7 @@
<string name="hide_nfc_icon">隐藏 NFC 图标</string>
<string name="hide_big_hd_icon">隐藏 大HD 图标</string>
<string name="hide_small_hd_icon">隐藏 小HD 图标</string>
<string name="hide_new_hd_icon">隐藏 新HD 图标</string>
<string name="hide_hd_no_service_icon">隐藏 HD无服务 图标</string>
<string name="about">关于</string>
<string name="about_module">关于模块</string>
@@ -226,4 +227,10 @@
<string name="left_or_right">左右</string>
<string name="preset">预设</string>
<string name="geek">极客</string>
<string name="do_not_clear_app">防止杀死后台应用</string>
<string name="do_not_clear_app_summary">可能造成耗电增加,建议配合“使 Millet 更加激进”食用不建议配合墓碑、A1内存管理等会强制应用进入缓存的模块使用。</string>
<string name="make_millet_more_aggressive">使 Millet 更加激进</string>
<string name="make_millet_more_aggressive_summary">允许 Millet 在后台应用有通知、有服务运行、有进程运行的情况下冻结应用。\n不希望被冻结的应用可将省电策略设置为无限制\n启用前请先卸载墓碑和 NoANR 相关模块。</string>
<string name="make_millet_ignore_active">允许 Millet 冻结活跃的应用</string>
<string name="make_millet_ignore_active_summary">非常激进,可能会影响应用运行</string>
</resources>

View File

@@ -218,4 +218,10 @@
<string name="take_effect_after_reboot">重新開機後生效</string>
<string name="media_volume_steps_summary">開啟後可能會導致音量條的滾動卡頓或藍牙音量異常</string>
<string name="can_notification_slide_summary">可能無法支援一些使用小米推送(Mi Push)推播的通知</string>
<string name="screen_hole_location">螢幕挖孔位置</string>
<string name="custom_clock_mode">自訂時鐘模式</string>
<string name="custom_clock_format_geek">時鐘格式</string>
<string name="off">關閉</string>
<string name="center">置中</string>
<string name="left_or_right">左右</string>
</resources>

View File

@@ -31,6 +31,7 @@
<string name="hide_nfc_icon">Hide NFC icon</string>
<string name="hide_big_hd_icon">Hide big HD icon</string>
<string name="hide_small_hd_icon">Hide small HD icon</string>
<string name="hide_new_hd_icon">Hide new HD icon</string>
<string name="hide_hd_no_service_icon">Hide HD No Service icon</string>
<string name="about">About</string>
@@ -230,4 +231,10 @@
<string name="left_or_right">Left or Right</string>
<string name="preset">Preset</string>
<string name="geek">Geek</string>
<string name="do_not_clear_app">Prevent killing background apps</string>
<string name="do_not_clear_app_summary">May cause increased power consumption, recommended with \"Make Millet more aggressive\", NOT recommended for use with tombstones</string>
<string name="make_millet_more_aggressive">Make Millet more aggressive</string>
<string name="make_millet_more_aggressive_summary">Allows Millet to freeze apps while background apps have notifications, services running, and processes running.\nApps that don\'t want to be frozen can set Battery saver to No restriction\nPlease uninstall tombstone and NoANR related modules before enabling.</string>
<string name="make_millet_ignore_active">Allow Millet to freeze active apps</string>
<string name="make_millet_ignore_active_summary">Very aggressive and may affect application running</string>
</resources>