From 6a2c1ef361e62e6a7ee53763ffc0ec90eadd6c94 Mon Sep 17 00:00:00 2001 From: mu7220 <80700814+mu7220@users.noreply.github.com> Date: Sat, 2 Dec 2023 02:25:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hook/joyose/DisableCloudControl.java | 48 ------- .../module/hook/joyose/EnableGpuTuner.java | 48 ------- .../hook/mediaeditor/FilterManagerAll.kt | 7 -- .../module/hook/mediaeditor/UnlockDisney.kt | 12 +- .../module/hook/mishare/NoAutoTurnOff.kt | 25 ++-- .../screenrecorder/UnlockMoreVolumeFromNew.kt | 8 +- .../hook/screenshot/UnlockMinimumCropLimit.kt | 20 +-- .../hook/securitycenter/BlurSecurity.kt | 117 +++--------------- app/src/main/res/values/arrays.xml | 8 +- app/src/main/res/values/strings.xml | 38 +++--- 10 files changed, 70 insertions(+), 261 deletions(-) delete mode 100644 app/src/main/java/com/sevtinge/hyperceiler/module/hook/joyose/DisableCloudControl.java delete mode 100644 app/src/main/java/com/sevtinge/hyperceiler/module/hook/joyose/EnableGpuTuner.java diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/joyose/DisableCloudControl.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/joyose/DisableCloudControl.java deleted file mode 100644 index ede06a976d..0000000000 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/joyose/DisableCloudControl.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.sevtinge.hyperceiler.module.hook.joyose; - -/*import static com.sevtinge.hyperceiler.module.hook.joyose.JoyoseDexKit.mJoyoseResultMethodsMap; - -import com.sevtinge.hyperceiler.module.base.BaseHook; - -import java.lang.reflect.Method; -import java.util.List; -import java.util.Objects; - -import io.luckypray.dexkit.descriptor.member.DexMethodDescriptor; - -public class DisableCloudControl extends BaseHook { - - // Class mCloud; - - Method cloudControl; - - @Override - public void init() { - try { - List result = Objects.requireNonNull(JoyoseDexKit.mJoyoseResultMethodsMap.get("CloudControl")); - for (DexMethodDescriptor descriptor : result) { - cloudControl = descriptor.getMethodInstance(lpparam.classLoader); - if (cloudControl.getReturnType() == void.class) { - hookMethod(cloudControl, new MethodHook() { - @Override - protected void before(MethodHookParam param) { - param.setResult(null);// 2 - } - }); - } - } - } catch (Throwable e) { - e.printStackTrace(); - } - - *//*hookMethod(cloudControl, new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - param.setResult(null);//2 - } - });*//* - - // mCloud = findClassIfExists("com.xiaomi.joyose.cloud.g$a"); - - } -}*/ diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/joyose/EnableGpuTuner.java b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/joyose/EnableGpuTuner.java deleted file mode 100644 index a76c46437d..0000000000 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/joyose/EnableGpuTuner.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.sevtinge.hyperceiler.module.hook.joyose; - -/*import static com.sevtinge.hyperceiler.module.hook.joyose.JoyoseDexKit.mJoyoseResultMethodsMap; - -import com.sevtinge.hyperceiler.module.base.BaseHook; - -import java.lang.reflect.Method; -import java.util.List; -import java.util.Objects; - -import io.luckypray.dexkit.descriptor.member.DexMethodDescriptor; - -public class EnableGpuTuner extends BaseHook { - - // Class mCloud; - - Method gpuTuner; - - @Override - public void init() { - try { - List result = Objects.requireNonNull(JoyoseDexKit.mJoyoseResultMethodsMap.get("GpuTuner")); - for (DexMethodDescriptor descriptor : result) { - gpuTuner = descriptor.getMethodInstance(lpparam.classLoader); - if (gpuTuner.getReturnType() == boolean.class) { - hookMethod(gpuTuner, new MethodHook() { - @Override - protected void before(MethodHookParam param) { - param.setResult(true);// 2 - } - }); - } - } - } catch (Throwable e) { - e.printStackTrace(); - } - - *//*hookMethod(cloudControl, new MethodHook() { - @Override - protected void before(MethodHookParam param) throws Throwable { - param.setResult(null);//2 - } - });*//* - - // mCloud = findClassIfExists("com.xiaomi.joyose.cloud.g$a"); - - } -}*/ diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/FilterManagerAll.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/FilterManagerAll.kt index db08af6c1c..f3fb85b9e7 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/FilterManagerAll.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/FilterManagerAll.kt @@ -2,14 +2,12 @@ package com.sevtinge.hyperceiler.module.hook.mediaeditor import android.os.Build import com.github.kyuubiran.ezxhelper.ClassLoaderProvider.safeClassLoader -import com.github.kyuubiran.ezxhelper.ClassUtils.loadClass import com.github.kyuubiran.ezxhelper.ClassUtils.setStaticObject import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook import com.sevtinge.hyperceiler.module.base.BaseHook import com.sevtinge.hyperceiler.utils.DexKit.addUsingStringsEquals import com.sevtinge.hyperceiler.utils.DexKit.dexKitBridge import com.sevtinge.hyperceiler.utils.api.LazyClass.AndroidBuildCls -import org.luckypray.dexkit.query.enums.StringMatchType object FilterManagerAll : BaseHook() { @@ -23,11 +21,6 @@ object FilterManagerAll : BaseHook() { } override fun init() { - /*val result = mMediaEditorResultMethodsMap["FilterManager"]!! - val methodResult = result - MethodFinder.fromArray(methodResult).first { - returnType == List::class.java || (parameterCount == 1 && parameterTypes[0] == Bundle::class.java) - }*/ methodResult?.createHook { before { if (!this@FilterManagerAll::device.isInitialized) { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockDisney.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockDisney.kt index 2828fefdcf..7b4bccb42c 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockDisney.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mediaeditor/UnlockDisney.kt @@ -1,7 +1,7 @@ package com.sevtinge.hyperceiler.module.hook.mediaeditor -import com.github.kyuubiran.ezxhelper.EzXHelper -import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHooks +import com.github.kyuubiran.ezxhelper.EzXHelper.safeClassLoader +import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook import com.sevtinge.hyperceiler.module.base.BaseHook import com.sevtinge.hyperceiler.utils.DexKit.addUsingStringsEquals import com.sevtinge.hyperceiler.utils.DexKit.dexKitBridge @@ -20,13 +20,11 @@ object UnlockDisney : BaseHook() { returnType = "boolean" paramCount = 0 } - }.map { it.getMethodInstance(EzXHelper.classLoader) }.toList() + }.firstOrNull()?.getMethodInstance(safeClassLoader) // debug 用 - for (d in disney) { - logI(TAG,"disney name is $d") - } - disney.createHooks { + logI(TAG,"disney name is $disney") + disney!!.createHook { returnConstant(true) } } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mishare/NoAutoTurnOff.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mishare/NoAutoTurnOff.kt index db39047e87..b3fe398e70 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mishare/NoAutoTurnOff.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/mishare/NoAutoTurnOff.kt @@ -1,6 +1,8 @@ package com.sevtinge.hyperceiler.module.hook.mishare +import android.annotation.SuppressLint import com.github.kyuubiran.ezxhelper.EzXHelper.classLoader +import com.github.kyuubiran.ezxhelper.EzXHelper.safeClassLoader import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHooks import com.sevtinge.hyperceiler.module.base.BaseHook @@ -10,13 +12,14 @@ import com.sevtinge.hyperceiler.utils.api.BlurDraw.getValueByFields import de.robv.android.xposed.XposedHelpers import java.lang.reflect.Modifier +@SuppressLint("StaticFieldLeak") object NoAutoTurnOff : BaseHook() { private val nullMethod by lazy { dexKitBridge.findMethod { matcher { addUsingStringsEquals("EnabledState", "mishare_enabled") } - }.map { it.getMethodInstance(classLoader) }.toList() + }.firstOrNull()?.getMethodInstance(safeClassLoader) } private val null2Method by lazy { @@ -28,7 +31,7 @@ object NoAutoTurnOff : BaseHook() { paramCount = 2 modifiers = Modifier.STATIC } - }.map { it.getMethodInstance(classLoader) }.first() + }.firstOrNull()?.getMethodInstance(safeClassLoader) } private val null3Method by lazy { @@ -74,14 +77,20 @@ object NoAutoTurnOff : BaseHook() { val nullField = dexKitBridge.findField { matcher { - declaredClass(nullClass) - modifiers = Modifier.STATIC + addReadMethod { + addUsingStringsEquals("NfcShareTaskManager") + returnType = "void" + paramCount = 1 + modifiers = Modifier.PRIVATE + } + modifiers = Modifier.STATIC or Modifier.FINAL + type = "int" } - }.map { it.getFieldInstance(classLoader) }.first() + }.firstOrNull()?.getFieldInstance(safeClassLoader) // 禁用小米互传功能自动关闭部分 try { - nullMethod.createHooks { + nullMethod!!.createHook { returnConstant(null) } } catch (t: Throwable) { @@ -89,7 +98,7 @@ object NoAutoTurnOff : BaseHook() { } try { - null2Method.createHook { + null2Method!!.createHook { returnConstant(null) } } catch (t: Throwable) { @@ -115,7 +124,7 @@ object NoAutoTurnOff : BaseHook() { try { findAndHookConstructor(nullClass, object : MethodHook() { override fun after(param: MethodHookParam) { - XposedHelpers.setObjectField(param.thisObject, nullField.name, 999999999) + XposedHelpers.setObjectField(param.thisObject, nullField!!.name, 999999999) logI(nullField.name) } }) } catch (t: Throwable) { diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/screenrecorder/UnlockMoreVolumeFromNew.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/screenrecorder/UnlockMoreVolumeFromNew.kt index 3d53809248..bf54d14990 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/screenrecorder/UnlockMoreVolumeFromNew.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/screenrecorder/UnlockMoreVolumeFromNew.kt @@ -1,26 +1,28 @@ package com.sevtinge.hyperceiler.module.hook.screenrecorder +import android.annotation.SuppressLint import com.github.kyuubiran.ezxhelper.EzXHelper +import com.github.kyuubiran.ezxhelper.EzXHelper.safeClassLoader import com.sevtinge.hyperceiler.module.base.BaseHook import com.sevtinge.hyperceiler.utils.DexKit.addUsingStringsEquals import com.sevtinge.hyperceiler.utils.DexKit.dexKitBridge import de.robv.android.xposed.XposedHelpers +@SuppressLint("StaticFieldLeak") object UnlockMoreVolumeFromNew : BaseHook() { private val getClass by lazy { dexKitBridge.findClass { matcher { addUsingStringsEquals("support_a2dp_inner_record") } - }.map { it.getInstance(EzXHelper.classLoader) }.first() + }.firstOrNull()?.getInstance(safeClassLoader) } override fun init() { val fieldData = dexKitBridge.findField { matcher { - declaredClass(getClass) + getClass?.let { declaredClass(it) } type = "boolean" - } }.map { it.getFieldInstance(EzXHelper.classLoader) }.toList() diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/screenshot/UnlockMinimumCropLimit.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/screenshot/UnlockMinimumCropLimit.kt index 1e701431ec..7960f8ea41 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/screenshot/UnlockMinimumCropLimit.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/screenshot/UnlockMinimumCropLimit.kt @@ -1,37 +1,29 @@ package com.sevtinge.hyperceiler.module.hook.screenshot +import android.annotation.SuppressLint import com.github.kyuubiran.ezxhelper.EzXHelper import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook import com.sevtinge.hyperceiler.module.base.BaseHook -import com.sevtinge.hyperceiler.utils.DexKit.addUsingStringsEquals import com.sevtinge.hyperceiler.utils.DexKit.dexKitBridge import java.lang.reflect.Modifier +@SuppressLint("StaticFieldLeak") object UnlockMinimumCropLimit : BaseHook() { private val mScreenCropViewMethod by lazy { dexKitBridge.findMethod { matcher { - declaredClass { - addUsingStringsEquals("fixImageBounds %f,%f") - } usingNumbers(0.5f, 200) returnType = "int" + paramCount = 0 modifiers = Modifier.PRIVATE } - }.map { it.getMethodInstance(EzXHelper.classLoader) }.first() + }.firstOrNull()?.getMethodInstance(EzXHelper.safeClassLoader) } + override fun init() { - mScreenCropViewMethod.createHook { + mScreenCropViewMethod!!.createHook { returnConstant(0) } - - /*val mScreenCropView = - findClassIfExists("com.miui.gallery.editor.photo.screen.crop.ScreenCropView\$h") - returnIntConstant(mScreenCropView, "a")*/ } - - /*private fun returnIntConstant(cls: Class<*>?, methodName: String) { - findAndHookMethod(cls, methodName, XC_MethodReplacement.returnConstant(0)) - }*/ } diff --git a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/BlurSecurity.kt b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/BlurSecurity.kt index 37a73a775b..94468ab937 100644 --- a/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/BlurSecurity.kt +++ b/app/src/main/java/com/sevtinge/hyperceiler/module/hook/securitycenter/BlurSecurity.kt @@ -1,5 +1,6 @@ package com.sevtinge.hyperceiler.module.hook.securitycenter +import android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.graphics.ColorMatrixColorFilter @@ -14,6 +15,7 @@ import android.widget.ImageView import android.widget.ListView import android.widget.TextView import androidx.annotation.RequiresApi +import com.github.kyuubiran.ezxhelper.EzXHelper.safeClassLoader import com.github.kyuubiran.ezxhelper.HookFactory.`-Static`.createHook import com.sevtinge.hyperceiler.module.base.BaseHook import com.sevtinge.hyperceiler.utils.ColorUtils @@ -24,6 +26,7 @@ import de.robv.android.xposed.XC_MethodReplacement import de.robv.android.xposed.XposedBridge import de.robv.android.xposed.XposedHelpers +@SuppressLint("StaticFieldLeak") object BlurSecurity : BaseHook() { val blurRadius = mPrefsMap.getInt("security_center_blurradius", 60) val backgroundColor = mPrefsMap.getInt("security_center_color", -1) @@ -51,8 +54,8 @@ object BlurSecurity : BaseHook() { // keepList 列表内元素及其子元素不会反色 private val keepColorList = arrayOf("rv_information") + @RequiresApi(Build.VERSION_CODES.S) override fun init() { - // if (getPackageVersionCode(lpparam) >= 40000790) return //暂时屏蔽高版本启用模糊,待修复后移除 //我觉得更像是傻逼miui的反色炸了 val turboLayoutClass = findClassIfExists( "com.miui.gamebooster.windowmanager.newbox.TurboLayout" ) ?: return @@ -103,7 +106,6 @@ object BlurSecurity : BaseHook() { view.addOnAttachStateChangeListener( object : View.OnAttachStateChangeListener { - @RequiresApi(Build.VERSION_CODES.S) override fun onViewAttachedToWindow(view: View) { val viewPaernt = view.parent as ViewGroup val gameContentLayout = viewPaernt.parent as ViewGroup @@ -167,14 +169,11 @@ object BlurSecurity : BaseHook() { returnType = "android.view.View" paramTypes = listOf("android.content.Context", "boolean", "boolean") } - /* methodReturnType = "Landroid/view/View;" - methodParamTypes = arrayOf("Landroid/content/Context;", "Z", "Z")*/ }.firstOrNull()?.getMethodInstance(lpparam.classLoader)?.createHook { after { param -> val mainContent = HookUtils.getValueByField(param.thisObject, "b") as ViewGroup mainContent.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener { - @RequiresApi(Build.VERSION_CODES.S) override fun onViewAttachedToWindow(view: View) { if (view.background != null) { if (HookUtils.isBlurDrawable(view.background)) return @@ -192,81 +191,6 @@ object BlurSecurity : BaseHook() { } } - /* - - XposedHelpers.findAndHookMethod( - videoBoxViewClass, - videoBoxViewMethodName, - Context::class.java, - Boolean::class.java, - Boolean::class.java, - object : XC_MethodHook() { - override fun afterHookedMethod(param: MethodHookParam) { - val mainContent = HookUtils.getValueByField(param.thisObject, "b") as ViewGroup - mainContent.addOnAttachStateChangeListener( - object : - View.OnAttachStateChangeListener { - @RequiresApi(Build.VERSION_CODES.S) - override fun onViewAttachedToWindow(view: View) { - if (view.background != null) { - if (HookUtils.isBlurDrawable(view.background)) { - return - } - } - - view.background = - HookUtils.createBlurDrawable(view, blurRadius, 40, backgroundColor) - - if (shouldInvertColor) { - invertViewColor(mainContent) - } - } - - override fun onViewDetachedFromWindow(view: View) { - view.background = null - } - }) - } - }) - } else { - - XposedHelpers.findAndHookMethod( - videoBoxViewClass, - videoBoxViewMethodName, - Context::class.java, - Boolean::class.java, - object : XC_MethodHook() { - override fun afterHookedMethod(param: MethodHookParam) { - val mainContent = HookUtils.getValueByField(param.thisObject, "b") as ViewGroup - mainContent.addOnAttachStateChangeListener( - object : - View.OnAttachStateChangeListener { - @RequiresApi(Build.VERSION_CODES.S) - override fun onViewAttachedToWindow(view: View) { - if (view.background != null) { - if (HookUtils.isBlurDrawable(view.background)) { - return - } - } - - view.background = - HookUtils.createBlurDrawable(view, blurRadius, 40, backgroundColor) - - if (shouldInvertColor) { - invertViewColor(mainContent) - } - } - - override fun onViewDetachedFromWindow(view: View) { - view.background = null - } - }) - } - }) - } - */ - - if (shouldInvertColor) { val detailSettingsLayoutClass = findClassIfExists( "com.miui.gamebooster.videobox.view.DetailSettingsLayout" @@ -309,16 +233,20 @@ object BlurSecurity : BaseHook() { "seekbar_text_speed" ) - var secondViewClass = - findClassIfExists("com.miui.gamebooster.windowmanager.newbox.n") - var secondViewMethodName = "b" + val gameManagerMethod = dexKitBridge.findMethod { + searchPackages = listOf("com.miui.gamebooster.windowmanager.newbox") + matcher { + usingStrings = listOf("addView error") + } + }.firstOrNull()?.getMethodInstance(safeClassLoader) - if (appVersionCode >= 40000749) { - secondViewClass = findClassIfExists( - "com.miui.gamebooster.windowmanager.newbox.j" - ) ?: return - secondViewMethodName = "B" + gameManagerMethod!!.createHook { + after { + val view = it.args[0] as View + invertViewColor(view, gameBoxWhiteList, gameBoxKeepList) + } } + val auditionViewClass = findClassIfExists("com.miui.gamebooster.customview.AuditionView") ?: return @@ -342,7 +270,6 @@ object BlurSecurity : BaseHook() { listViewAdapterInnerClass, "a", object : XC_MethodHook() { - @RequiresApi(Build.VERSION_CODES.S) override fun afterHookedMethod(param: MethodHookParam) { val isSetupFunction = param.args[0].toString().contains("BaseModel") @@ -426,18 +353,6 @@ object BlurSecurity : BaseHook() { } ) - XposedHelpers.findAndHookMethod( - secondViewClass, - secondViewMethodName, - View::class.java, - object : XC_MethodHook() { - @RequiresApi(Build.VERSION_CODES.S) - override fun afterHookedMethod(param: MethodHookParam) { - val view = param.args[0] as View - invertViewColor(view, gameBoxWhiteList, gameBoxKeepList) - } - }) - // 让图标颜色更深一点 XposedHelpers.findAndHookMethod( auditionViewClass, diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 7705a7fb68..aee2828a3b 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -657,10 +657,10 @@ @string/log_level_none - @string/log_level_error - @string/log_level_warn - @string/log_level_info - @string/log_level_debug + Error + Warn + Info + Debug diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e37db84e8a..5613fee9e0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -361,6 +361,7 @@ Browser Unlock developer options 17.5.xxxxx and above are no entry + Disable URL Blacklist Camera Custom device watermark @@ -679,6 +680,11 @@ Carrier name customization Only dividers are hidden Hide all names + Bluetooth tile style + Move the bluetooth tile near the network tile + Extended notification menu + Open app info, force close app and open in floating window from notification menu (swipe notification to the left to open it) + Unlock Super Volume New control center Legacy control center Unlock control center styles @@ -688,13 +694,10 @@ Landscape orientation will have one additional column Number of columns in collapsed panel Number of columns in collapsed panel (Landscape) - Bluetooth tile style - Move the bluetooth tile near the network tile - Extended notification menu - Open app info, force close app and open in floating window from notification menu (swipe notification to the left to open it) - App info - Floating window - Force close + Show Card Tiles + None + More + Most Other Charge animation @@ -789,6 +792,7 @@ Interconnectivity Services Unlock Device interconnection Unlock Xiaomi HyperMind + Forced support for camera streaming Always-on display Always-on Display And Lock Screen Editor @@ -1015,6 +1019,7 @@ Add freeform menu to the shortcut menu More tasks mode Add new tasks menu to the shortcut menu + Allow share app Optimize unlock animation Always blur launcher wallpaper Perfect Icon Priority @@ -1194,6 +1199,8 @@ Hide sidebar Leave the slide unfolded Disable show suggest apps + Unlock New Video-box + Unlock Game Performance Wild Mode Smart cards Manage NFC automatically @@ -1357,6 +1364,9 @@ Notification Notification floating window Share to third-party apps + App info + Floating window + Force close Mark new module Ring Media @@ -1377,24 +1387,10 @@ Close Source Projects Exit Ignore - Disable URL Blacklist Log level Disable log - Error - Warn - Info - Debug - Show Card Tiles - None - More - Most - Allow share app - Unlock Super Volume - Unlock New Video-box - Unlock Game Performance Wild Mode Disable Suggest Enable Suggest - Forced support for camera streaming Tip: Here\'s a tip! Tip: You can support us by donating in \"About - Support\".