Fix WeChat SettingsUI's top right TSBattery icon lost problem when version >= 8.0.28

This commit is contained in:
2023-01-12 03:17:01 +08:00
parent 69a68999a5
commit 5f13e203f0

View File

@@ -22,8 +22,10 @@
package com.fankes.tsbattery.hook.entity package com.fankes.tsbattery.hook.entity
import android.app.Activity import android.app.Activity
import android.content.Context
import android.os.Build import android.os.Build
import android.view.Gravity import android.view.Gravity
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
@@ -35,16 +37,16 @@ import com.fankes.tsbattery.hook.factory.hookSystemWakeLock
import com.fankes.tsbattery.hook.factory.jumpToModuleSettings import com.fankes.tsbattery.hook.factory.jumpToModuleSettings
import com.fankes.tsbattery.hook.factory.startModuleSettings import com.fankes.tsbattery.hook.factory.startModuleSettings
import com.fankes.tsbattery.utils.factory.absoluteStatusBarHeight import com.fankes.tsbattery.utils.factory.absoluteStatusBarHeight
import com.fankes.tsbattery.utils.factory.dp
import com.fankes.tsbattery.utils.factory.appVersionCode import com.fankes.tsbattery.utils.factory.appVersionCode
import com.fankes.tsbattery.utils.factory.appVersionName import com.fankes.tsbattery.utils.factory.appVersionName
import com.fankes.tsbattery.utils.factory.dp
import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker
import com.highcapable.yukihookapi.hook.factory.current import com.highcapable.yukihookapi.hook.factory.current
import com.highcapable.yukihookapi.hook.factory.injectModuleAppResources import com.highcapable.yukihookapi.hook.factory.injectModuleAppResources
import com.highcapable.yukihookapi.hook.factory.processName import com.highcapable.yukihookapi.hook.factory.processName
import com.highcapable.yukihookapi.hook.factory.registerModuleAppActivities import com.highcapable.yukihookapi.hook.factory.registerModuleAppActivities
import com.highcapable.yukihookapi.hook.log.loggerI import com.highcapable.yukihookapi.hook.log.loggerI
import com.highcapable.yukihookapi.hook.type.android.BundleClass import com.highcapable.yukihookapi.hook.type.android.ViewClass
/** /**
* Hook 微信 * Hook 微信
@@ -65,6 +67,30 @@ object WeChatHooker : YukiBaseHooker() {
/** 微信存在的类 - 未测试每个版本是否都存在 */ /** 微信存在的类 - 未测试每个版本是否都存在 */
private const val SettingsUIClass = "${PackageName.WECHAT}.plugin.setting.ui.setting.SettingsUI" private const val SettingsUIClass = "${PackageName.WECHAT}.plugin.setting.ui.setting.SettingsUI"
/** TSBattery 图标 TAG 名称 */
private const val TSBARRERY_ICON_TAG = "tsbattery_icon"
/**
* 创建 TSBattery 图标
* @param context 当前实例
* @return [LinearLayout]
*/
private fun createPreferenceIcon(context: Context) = LinearLayout(context).apply {
tag = TSBARRERY_ICON_TAG
gravity = Gravity.END or Gravity.BOTTOM
layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
addView(ImageView(context).apply {
layoutParams = ViewGroup.MarginLayoutParams(20.dp(context), 20.dp(context)).apply {
topMargin = context.absoluteStatusBarHeight + 15.dp(context)
rightMargin = 20.dp(context)
}
setColorFilter(ResourcesCompat.getColor(resources, R.color.colorTextGray, null))
setImageResource(R.drawable.ic_icon)
if (Build.VERSION.SDK_INT >= 26) tooltipText = "TSBattery 设置"
setOnClickListener { context.startModuleSettings() }
})
}
override fun onHook() { override fun onHook() {
onAppLifecycle { onAppLifecycle {
onCreate { onCreate {
@@ -97,32 +123,26 @@ object WeChatHooker : YukiBaseHooker() {
SettingsUIClass.hook { SettingsUIClass.hook {
injectMember { injectMember {
method { method {
name = "onCreate" name = "onResume"
param(BundleClass) emptyParam()
} }
afterHook { afterHook {
method { method {
name = "get_fragment" name = "get_fragment"
emptyParam() emptyParam()
superClass(isOnlySuperClass = true) superClass(isOnlySuperClass = true)
}.get(instance).call()?.current() }.get(instance).call()?.current()?.method {
?.field { name = "mController" } name = "getView"
?.current()?.method { name = "getContentView" } emptyParam()
?.invoke<ViewGroup>()?.addView(LinearLayout(instance()).apply { returnType = ViewClass
context.injectModuleAppResources() superClass(isOnlySuperClass = true)
gravity = Gravity.END or Gravity.BOTTOM }?.invoke<ViewGroup?>()?.also {
layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) it.context?.injectModuleAppResources()
addView(ImageView(context).apply { runCatching { it.getChildAt(0) as? ViewGroup? }.getOrNull()?.also { rootView ->
layoutParams = ViewGroup.MarginLayoutParams(20.dp(context), 20.dp(context)).apply { if (rootView.findViewWithTag<View>(TSBARRERY_ICON_TAG) == null)
topMargin = context.absoluteStatusBarHeight + 15.dp(context) rootView.addView(createPreferenceIcon(it.context))
rightMargin = 20.dp(context) }
} }
setColorFilter(ResourcesCompat.getColor(resources, R.color.colorTextGray, null))
setImageResource(R.drawable.ic_icon)
if (Build.VERSION.SDK_INT >= 26) tooltipText = "TSBattery 设置"
setOnClickListener { context.startModuleSettings() }
})
})
} }
} }
} }