diff --git a/app/src/main/java/com/fankes/tsbattery/hook/HookEntry.kt b/app/src/main/java/com/fankes/tsbattery/hook/HookEntry.kt index e92fca7..18b0442 100644 --- a/app/src/main/java/com/fankes/tsbattery/hook/HookEntry.kt +++ b/app/src/main/java/com/fankes/tsbattery/hook/HookEntry.kt @@ -183,20 +183,19 @@ class HookEntry : YukiHookXposedInitProxy { */ private fun PackageParam.hookModuleRunningInfo(isQQTIM: Boolean) = when { - !prefs.getBoolean(ENABLE_RUN_INFO) -> {} - isQQTIM -> - SplashActivityClass.hook { - /** - * Hook 启动界面的第一个 [Activity] - * QQ 和 TIM 都是一样的类 - * 在里面加入提示运行信息的对话框测试模块是否激活 - */ - injectMember { - method { - name = "doOnCreate" - param(BundleClass) - } - afterHook { + isQQTIM -> SplashActivityClass.hook { + /** + * Hook 启动界面的第一个 [Activity] + * QQ 和 TIM 都是一样的类 + * 在里面加入提示运行信息的对话框测试模块是否激活 + */ + injectMember { + method { + name = "doOnCreate" + param(BundleClass) + } + afterHook { + if (prefs.getBoolean(ENABLE_RUN_INFO)) instance().apply { showDialog { title = "TSBattery 已激活" @@ -215,21 +214,21 @@ class HookEntry : YukiHookXposedInitProxy { noCancelable() } } - } } } - else -> - LauncherUIClass.hook { - /** - * Hook 启动界面的第一个 [Activity] - * 在里面加入提示运行信息的对话框测试模块是否激活 - */ - injectMember { - method { - name = "onCreate" - param(BundleClass) - } - afterHook { + } + else -> LauncherUIClass.hook { + /** + * Hook 启动界面的第一个 [Activity] + * 在里面加入提示运行信息的对话框测试模块是否激活 + */ + injectMember { + method { + name = "onCreate" + param(BundleClass) + } + afterHook { + if (prefs.getBoolean(ENABLE_RUN_INFO)) instance().apply { showDialog(isUseBlackTheme = true) { title = "TSBattery 已激活" @@ -247,9 +246,9 @@ class HookEntry : YukiHookXposedInitProxy { noCancelable() } } - } } } + } } /** @@ -281,23 +280,25 @@ class HookEntry : YukiHookXposedInitProxy { injectMember { method { name = "onCreate" } afterHook { - instance().apply { - stopForeground(true) - stopService(Intent(applicationContext, javaClass)) - loggerD(msg = "Shutdown CoreService OK!") - } + if (prefs.getBoolean(ENABLE_QQTIM_CORESERVICE_BAN)) + instance().apply { + stopForeground(true) + stopService(Intent(applicationContext, javaClass)) + loggerD(msg = "Shutdown CoreService OK!") + } } } - }.by { prefs.getBoolean(ENABLE_QQTIM_CORESERVICE_BAN) } + } CoreService_KernelServiceClass.hook { injectMember { method { name = "onCreate" } afterHook { - instance().apply { - stopForeground(true) - stopService(Intent(applicationContext, javaClass)) - loggerD(msg = "Shutdown CoreService\$KernelService OK!") - } + if (prefs.getBoolean(ENABLE_QQTIM_CORESERVICE_CHILD_BAN)) + instance().apply { + stopForeground(true) + stopService(Intent(applicationContext, javaClass)) + loggerD(msg = "Shutdown CoreService\$KernelService OK!") + } } } injectMember { @@ -307,7 +308,7 @@ class HookEntry : YukiHookXposedInitProxy { } replaceTo(any = 2) } - }.by { prefs.getBoolean(ENABLE_QQTIM_CORESERVICE_CHILD_BAN) } + } } override fun onInit() = configs { @@ -323,7 +324,7 @@ class HookEntry : YukiHookXposedInitProxy { hookCoreService(isQQ = true) hookModuleRunningInfo(isQQTIM = true) if (prefs.getBoolean(ENABLE_QQTIM_WHITE_MODE)) return@loadApp - /** 通过在 SplashActivity 里取到应用的版本号 */ + /** 通过在 [SplashActivityClass] 里取到应用的版本号 */ SplashActivityClass.hook { injectMember { method { diff --git a/app/src/main/java/com/fankes/tsbattery/ui/activity/MainActivity.kt b/app/src/main/java/com/fankes/tsbattery/ui/activity/MainActivity.kt index 5d475a8..89c6c8b 100644 --- a/app/src/main/java/com/fankes/tsbattery/ui/activity/MainActivity.kt +++ b/app/src/main/java/com/fankes/tsbattery/ui/activity/MainActivity.kt @@ -25,7 +25,7 @@ package com.fankes.tsbattery.ui.activity import android.content.ComponentName import android.content.pm.PackageManager -import androidx.core.view.isGone +import android.view.HapticFeedbackConstants import androidx.core.view.isVisible import com.fankes.tsbattery.BuildConfig import com.fankes.tsbattery.R @@ -42,14 +42,12 @@ import com.fankes.tsbattery.hook.HookConst.QQ_PACKAGE_NAME import com.fankes.tsbattery.hook.HookConst.TIM_PACKAGE_NAME import com.fankes.tsbattery.hook.HookConst.WECHAT_PACKAGE_NAME import com.fankes.tsbattery.ui.activity.base.BaseActivity -import com.fankes.tsbattery.utils.factory.isInstall -import com.fankes.tsbattery.utils.factory.openBrowser -import com.fankes.tsbattery.utils.factory.openSelfSetting -import com.fankes.tsbattery.utils.factory.showDialog +import com.fankes.tsbattery.utils.factory.* import com.fankes.tsbattery.utils.tool.GithubReleaseTool import com.highcapable.yukihookapi.hook.factory.isModuleActive import com.highcapable.yukihookapi.hook.factory.isTaiChiModuleActive import com.highcapable.yukihookapi.hook.factory.modulePrefs +import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus class MainActivity : BaseActivity() { @@ -79,6 +77,8 @@ class MainActivity : BaseActivity() { binding.mainLinStatus.setBackgroundResource(R.drawable.bg_green_round) binding.mainImgStatus.setImageResource(R.mipmap.ic_success) binding.mainTextStatus.text = "模块已激活" + binding.mainTextApiWay.isVisible = true + refreshActivateExecutor() /** 写入激活的模块版本 */ modulePrefs.putString(ENABLE_MODULE_VERSION, moduleVersion) } else @@ -89,9 +89,9 @@ class MainActivity : BaseActivity() { "请自行查看本页面使用帮助与说明第三条。\n" + "太极和第三方 Xposed 激活后" + "可能不会提示激活,若想验证是否激活请打开“提示模块运行信息”自行检查," + - "或观察 QQ、TIM 的常驻通知是否有“TSBattery 守护中”字样”," + - "如果生效就代表模块运行正常,这里的激活状态只是一个显示意义上的存在。\n" + - "太极(无极)在 MIUI 设备上会提示打开授权,请进行允许,然后再次打开本应用查看激活状态。" + "或观察 QQ、TIM 的常驻通知是否有“TSBattery 守护中”字样”。\n\n" + + "如果生效就代表模块运行正常,若你在未 Root 情况下激活模块,这里的激活状态只是一个显示意义上的存在。\n" + + "太极(无极)在 MIUI 设备上会提示打开授权,请进行允许,然后再次打开本模块查看激活状态。" confirmButton(text = "我知道了") noCancelable() } @@ -111,40 +111,37 @@ class MainActivity : BaseActivity() { noCancelable() } /** 设置安装状态 */ - binding.mainTextQqNoinstall.isGone = QQ_PACKAGE_NAME.isInstall - binding.mainTextTimNoinstall.isGone = TIM_PACKAGE_NAME.isInstall - binding.mainTextWechatNoinstall.isGone = WECHAT_PACKAGE_NAME.isInstall + binding.mainTextQqVer.text = if (QQ_PACKAGE_NAME.isInstall) version(QQ_PACKAGE_NAME) else "未安装" + binding.mainTextTimVer.text = if (TIM_PACKAGE_NAME.isInstall) version(TIM_PACKAGE_NAME) else "未安装" + binding.mainTextWechatVer.text = if (WECHAT_PACKAGE_NAME.isInstall) version(WECHAT_PACKAGE_NAME) else "未安装" /** 设置文本 */ binding.mainTextVersion.text = "模块版本:$moduleVersion $pendingFlag" - binding.mainTextSupportQq.apply { - text = qqSupportVersion - setOnClickListener { - showDialog { - title = "兼容的 QQ 版本" - msg = qqSupportVersion - confirmButton(text = "我知道了") - } + binding.mainQqItem.setOnClickListener { + showDialog { + title = "兼容的 QQ 版本" + msg = qqSupportVersion + confirmButton(text = "我知道了") } + /** 振动提醒 */ + it.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP) } - binding.mainTextSupportTim.apply { - text = timSupportVersion - setOnClickListener { - showDialog { - title = "兼容的 TIM 版本" - msg = timSupportVersion - confirmButton(text = "我知道了") - } + binding.mainTimItem.setOnClickListener { + showDialog { + title = "兼容的 TIM 版本" + msg = timSupportVersion + confirmButton(text = "我知道了") } + /** 振动提醒 */ + it.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP) } - binding.mainTextSupportWechat.apply { - text = wechatSupportVersion - setOnClickListener { - showDialog { - title = "兼容的微信版本" - msg = wechatSupportVersion - confirmButton(text = "我知道了") - } + binding.mainWechatItem.setOnClickListener { + showDialog { + title = "兼容的微信版本" + msg = wechatSupportVersion + confirmButton(text = "我知道了") } + /** 振动提醒 */ + it.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP) } /** 获取 Sp 存储的信息 */ binding.qqtimProtectModeSwitch.isChecked = modulePrefs.getBoolean(ENABLE_QQTIM_WHITE_MODE) @@ -157,6 +154,7 @@ class MainActivity : BaseActivity() { binding.qqtimProtectModeSwitch.setOnCheckedChangeListener { btn, b -> if (!btn.isPressed) return@setOnCheckedChangeListener modulePrefs.putBoolean(ENABLE_QQTIM_WHITE_MODE, b) + snake(msg = "修改需要重启 QQ 以生效") } binding.qqTimCoreServiceSwitch.setOnCheckedChangeListener { btn, b -> if (!btn.isPressed) return@setOnCheckedChangeListener @@ -169,6 +167,7 @@ class MainActivity : BaseActivity() { binding.wechatDisableHookSwitch.setOnCheckedChangeListener { btn, b -> if (!btn.isPressed) return@setOnCheckedChangeListener modulePrefs.putBoolean(DISABLE_WECHAT_HOOK, b) + snake(msg = "修改需要重启微信以生效") } binding.hideIconInLauncherSwitch.setOnCheckedChangeListener { btn, b -> if (!btn.isPressed) return@setOnCheckedChangeListener @@ -200,4 +199,15 @@ class MainActivity : BaseActivity() { openBrowser(url = "https://www.coolapk.com/u/876977", packageName = "com.coolapk.market") } } + + /** 刷新模块激活使用的方式 */ + private fun refreshActivateExecutor() { + when { + YukiHookModuleStatus.executorVersion > 0 -> + binding.mainTextApiWay.text = + "Activated by ${YukiHookModuleStatus.executorName} API ${YukiHookModuleStatus.executorVersion}" + isTaiChiModuleActive -> binding.mainTextApiWay.text = "Activated by TaiChi" + else -> binding.mainTextApiWay.text = "Activated by anonymous" + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/fankes/tsbattery/utils/factory/FunctionFactory.kt b/app/src/main/java/com/fankes/tsbattery/utils/factory/FunctionFactory.kt index 6e935cd..43d0622 100644 --- a/app/src/main/java/com/fankes/tsbattery/utils/factory/FunctionFactory.kt +++ b/app/src/main/java/com/fankes/tsbattery/utils/factory/FunctionFactory.kt @@ -84,6 +84,17 @@ val Context.versionName get() = packageInfo.versionName ?: "" */ val Context.versionCode get() = packageInfo.versionCode +/** + * 得到版本信息与版本号 + * @param packageName 包名 + * @return [String] + */ +fun Context.version(packageName: String) = safeOfNothing { + packageManager?.getPackageInfo(packageName, 0)?.let { + "${it.versionName}(${it.versionCode})" + } ?: "" +} + /** * 网络连接是否正常 * @return [Boolean] 网络是否连接 diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 075bd07..56c91ea 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -111,154 +111,111 @@ android:visibility="gone" /> - + android:fadingEdgeLength="10dp" + android:fillViewport="true" + android:requiresFadingEdge="horizontal" + android:scrollbars="none"> - - - + android:gravity="center|start" + android:orientation="horizontal"> - + - - + - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + android:layout_marginTop="10dp" + android:alpha="0.6" + android:ellipsize="end" + android:singleLine="true" + android:text="%1" + android:textColor="@color/white" + android:textSize="11sp" + android:visibility="gone" /> @@ -300,7 +257,7 @@ android:layout_height="wrap_content" android:alpha="0.6" android:lineSpacingExtra="5dp" - android:text="上述列出的版本号为最佳兼容版本,你可以点击进行查看。\n没有标注的版本在适配范围内的 APP 适用性都将有效,但可能不能达到最佳使用效果。\n如果当前版本失效请看下方的联系方式。" + android:text="你可以点击上述每个图标查看最佳兼容的 APP 版本。\n没有标注的版本在适配范围内的 APP 适用性都将有效,但可能不能达到最佳使用效果,建议保持使用适配内的版本。" android:textColor="@color/colorTextGray" android:textSize="10sp" tools:ignore="SmallSp" /> diff --git a/app/src/main/res/mipmap-xxhdpi/ic_tim_icon.png b/app/src/main/res/mipmap-xxhdpi/ic_tim_icon.png index 2a282a8..6de2153 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_tim_icon.png and b/app/src/main/res/mipmap-xxhdpi/ic_tim_icon.png differ