From 84bd473415897de498b873093f9c13891b1a814a Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Tue, 3 Jan 2023 01:32:08 +0800 Subject: [PATCH] Fix add keyNonRepeatName to solve the duplicate key for different Host Apps problem in YukiHookDataChannel --- .../xposed/channel/YukiHookDataChannel.kt | 62 +++++++++++-------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.kt index fc269dac..eb57c57f 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.kt @@ -220,7 +220,14 @@ class YukiHookDataChannel private constructor() { * @param type 类型 * @return [String] */ - private fun keyShortName(type: CallbackKeyType) = "_${if (isXposedEnvironment) "X" else context?.javaClass?.name ?: "M"}_${type.ordinal}" + private fun keyShortName(type: CallbackKeyType) = + "${keyNonRepeatName}_${if (isXposedEnvironment) "X" else context?.javaClass?.name ?: "M"}_${type.ordinal}" + + /** + * 键值不重复名称 - 确保每个宿主使用的键值名称互不干扰 + * @return [String] + */ + private val keyNonRepeatName get() = "_${packageName.hashCode()}" /** * 创建一个调用空间 @@ -262,8 +269,9 @@ class YukiHookDataChannel private constructor() { */ fun wait(key: String, result: (value: T) -> Unit) { receiverCallbacks[key + keyShortName(CallbackKeyType.SINGLE)] = Pair(context) { action, intent -> - if (action == if (isXposedEnvironment) hostActionName(packageName) else moduleActionName(context)) - (intent.extras?.get(key) as? T?)?.let { result(it) } + if (action == if (isXposedEnvironment) hostActionName(packageName) else moduleActionName(context)) { + (intent.extras?.get(key + keyNonRepeatName) as? T?)?.let { result(it) } + } } } @@ -275,7 +283,7 @@ class YukiHookDataChannel private constructor() { fun wait(data: ChannelData, result: (value: T) -> Unit) { receiverCallbacks[data.key + keyShortName(CallbackKeyType.CDATA)] = Pair(context) { action, intent -> if (action == if (isXposedEnvironment) hostActionName(packageName) else moduleActionName(context)) - (intent.extras?.get(data.key) as? T?)?.let { result(it) } + (intent.extras?.get(data.key + keyNonRepeatName) as? T?)?.let { result(it) } } } @@ -289,7 +297,7 @@ class YukiHookDataChannel private constructor() { fun wait(key: String, callback: () -> Unit) { receiverCallbacks[key + keyShortName(CallbackKeyType.VMFL)] = Pair(context) { action, intent -> if (action == if (isXposedEnvironment) hostActionName(packageName) else moduleActionName(context)) - if (intent.getStringExtra(key) == VALUE_WAIT_FOR_LISTENER) callback() + if (intent.getStringExtra(key + keyNonRepeatName) == VALUE_WAIT_FOR_LISTENER) callback() } } @@ -337,28 +345,28 @@ class YukiHookDataChannel private constructor() { data.takeIf { it.isNotEmpty() }?.forEach { when (it.value) { null -> Unit - is Bundle -> putExtra(it.key, it.value as Bundle) - is Array<*> -> putExtra(it.key, it.value as Array<*>) - is Boolean -> putExtra(it.key, it.value as Boolean) - is BooleanArray -> putExtra(it.key, it.value as BooleanArray) - is Byte -> putExtra(it.key, it.value as Byte) - is ByteArray -> putExtra(it.key, it.value as ByteArray) - is Char -> putExtra(it.key, it.value as Char) - is CharArray -> putExtra(it.key, it.value as CharArray) - is Double -> putExtra(it.key, it.value as Double) - is DoubleArray -> putExtra(it.key, it.value as DoubleArray) - is Float -> putExtra(it.key, it.value as Float) - is FloatArray -> putExtra(it.key, it.value as FloatArray) - is Int -> putExtra(it.key, it.value as Int) - is IntArray -> putExtra(it.key, it.value as IntArray) - is Long -> putExtra(it.key, it.value as Long) - is LongArray -> putExtra(it.key, it.value as LongArray) - is Short -> putExtra(it.key, it.value as Short) - is ShortArray -> putExtra(it.key, it.value as ShortArray) - is String -> putExtra(it.key, it.value as String) - is CharSequence -> putExtra(it.key, it.value as CharSequence) - is Parcelable -> putExtra(it.key, it.value as CharSequence) - is Serializable -> putExtra(it.key, it.value as Serializable) + is Bundle -> putExtra(it.key + keyNonRepeatName, it.value as Bundle) + is Array<*> -> putExtra(it.key + keyNonRepeatName, it.value as Array<*>) + is Boolean -> putExtra(it.key + keyNonRepeatName, it.value as Boolean) + is BooleanArray -> putExtra(it.key + keyNonRepeatName, it.value as BooleanArray) + is Byte -> putExtra(it.key + keyNonRepeatName, it.value as Byte) + is ByteArray -> putExtra(it.key + keyNonRepeatName, it.value as ByteArray) + is Char -> putExtra(it.key + keyNonRepeatName, it.value as Char) + is CharArray -> putExtra(it.key + keyNonRepeatName, it.value as CharArray) + is Double -> putExtra(it.key + keyNonRepeatName, it.value as Double) + is DoubleArray -> putExtra(it.key + keyNonRepeatName, it.value as DoubleArray) + is Float -> putExtra(it.key + keyNonRepeatName, it.value as Float) + is FloatArray -> putExtra(it.key + keyNonRepeatName, it.value as FloatArray) + is Int -> putExtra(it.key + keyNonRepeatName, it.value as Int) + is IntArray -> putExtra(it.key + keyNonRepeatName, it.value as IntArray) + is Long -> putExtra(it.key + keyNonRepeatName, it.value as Long) + is LongArray -> putExtra(it.key + keyNonRepeatName, it.value as LongArray) + is Short -> putExtra(it.key + keyNonRepeatName, it.value as Short) + is ShortArray -> putExtra(it.key + keyNonRepeatName, it.value as ShortArray) + is String -> putExtra(it.key + keyNonRepeatName, it.value as String) + is CharSequence -> putExtra(it.key + keyNonRepeatName, it.value as CharSequence) + is Parcelable -> putExtra(it.key + keyNonRepeatName, it.value as CharSequence) + is Serializable -> putExtra(it.key + keyNonRepeatName, it.value as Serializable) else -> error("Key-Value type ${it.value?.javaClass?.name} is not allowed") } }