Modify add ChannelPriority class and add "priority" param in wait, checkingVersionEquals, obtainLoggerInMemoryData function in YukiHookDataChannel

This commit is contained in:
2023-01-03 20:41:09 +08:00
parent 904a23e770
commit 1ec5a02db2
7 changed files with 156 additions and 24 deletions

View File

@@ -34,6 +34,7 @@ const navigationLinks = {
baseApiPath + 'hook/xposed/prefs/data/PrefsData', baseApiPath + 'hook/xposed/prefs/data/PrefsData',
baseApiPath + 'hook/xposed/channel/YukiHookDataChannel', baseApiPath + 'hook/xposed/channel/YukiHookDataChannel',
baseApiPath + 'hook/xposed/channel/data/ChannelData', baseApiPath + 'hook/xposed/channel/data/ChannelData',
baseApiPath + 'hook/xposed/channel/priority/ChannelPriority',
baseApiPath + 'hook/xposed/application/ModuleApplication', baseApiPath + 'hook/xposed/application/ModuleApplication',
baseApiPath + 'hook/xposed/parasitic/activity/base/ModuleAppActivity', baseApiPath + 'hook/xposed/parasitic/activity/base/ModuleAppActivity',
baseApiPath + 'hook/xposed/parasitic/activity/base/ModuleAppCompatActivity', baseApiPath + 'hook/xposed/parasitic/activity/base/ModuleAppCompatActivity',

View File

@@ -105,11 +105,11 @@ fun put(key: String)
### wait <span class="symbol">- method</span> ### wait <span class="symbol">- method</span>
```kotlin:no-line-numbers ```kotlin:no-line-numbers
fun <T> wait(key: String, result: (value: T) -> Unit) fun <T> wait(key: String, priority: ChannelPriority?, result: (value: T) -> Unit)
``` ```
```kotlin:no-line-numbers ```kotlin:no-line-numbers
fun <T> wait(data: ChannelData<T>, result: (value: T) -> Unit) fun <T> wait(data: ChannelData<T>, priority: ChannelPriority?, result: (value: T) -> Unit)
``` ```
**Change Records** **Change Records**
@@ -120,6 +120,10 @@ fun <T> wait(data: ChannelData<T>, result: (value: T) -> Unit)
移除默认值 `value` 移除默认值 `value`
`v1.1.5` `modified`
新增 `priority` 参数
**Function Illustrate** **Function Illustrate**
> 获取键值数据。 > 获取键值数据。
@@ -127,13 +131,17 @@ fun <T> wait(data: ChannelData<T>, result: (value: T) -> Unit)
### wait <span class="symbol">- method</span> ### wait <span class="symbol">- method</span>
```kotlin:no-line-numbers ```kotlin:no-line-numbers
fun wait(key: String, callback: () -> Unit) fun wait(key: String, priority: ChannelPriority?, callback: () -> Unit)
``` ```
**Change Records** **Change Records**
`v1.0.88` `added` `v1.0.88` `added`
`v1.1.5` `modified`
新增 `priority` 参数
**Function Illustrate** **Function Illustrate**
> 仅获取监听结果,不获取键值数据。 > 仅获取监听结果,不获取键值数据。
@@ -147,13 +155,17 @@ fun wait(key: String, callback: () -> Unit)
### checkingVersionEquals <span class="symbol">- method</span> ### checkingVersionEquals <span class="symbol">- method</span>
```kotlin:no-line-numbers ```kotlin:no-line-numbers
fun checkingVersionEquals(result: (Boolean) -> Unit) fun checkingVersionEquals(priority: ChannelPriority?, result: (Boolean) -> Unit)
``` ```
**Change Records** **Change Records**
`v1.0.88` `added` `v1.0.88` `added`
`v1.1.5` `modified`
新增 `priority` 参数
**Function Illustrate** **Function Illustrate**
> 获取模块与宿主的版本是否匹配。 > 获取模块与宿主的版本是否匹配。
@@ -163,13 +175,17 @@ fun checkingVersionEquals(result: (Boolean) -> Unit)
### obtainLoggerInMemoryData <span class="symbol">- method</span> ### obtainLoggerInMemoryData <span class="symbol">- method</span>
```kotlin:no-line-numbers ```kotlin:no-line-numbers
fun obtainLoggerInMemoryData(result: (ArrayList<YukiLoggerData>) -> Unit) fun obtainLoggerInMemoryData(priority: ChannelPriority?, result: (ArrayList<YukiLoggerData>) -> Unit)
``` ```
**Change Records** **Change Records**
`v1.1.4` `added` `v1.1.4` `added`
`v1.1.5` `modified`
新增 `priority` 参数
**Function Illustrate** **Function Illustrate**
> 获取模块与宿主之间的 `ArrayList<YukiLoggerData>` 数据。 > 获取模块与宿主之间的 `ArrayList<YukiLoggerData>` 数据。

View File

@@ -0,0 +1,27 @@
---
pageClass: code-page
---
::: warning
The English translation of this page has not been completed, you are welcome to contribute translations to us.
You can use the **Chrome Translation Plugin** to translate entire pages for reference.
:::
# ChannelPriority <span class="symbol">- class</span>
```kotlin:no-line-numbers
class ChannelPriority(private val conditions: () -> Boolean)
```
**Change Records**
`v1.1.5` `added`
**Function Illustrate**
> 数据通讯桥响应优先级构造类。
这个类是对 `YukiHookDataChannel` 的一个扩展用法。

View File

@@ -97,11 +97,11 @@ fun put(key: String)
### wait <span class="symbol">- method</span> ### wait <span class="symbol">- method</span>
```kotlin:no-line-numbers ```kotlin:no-line-numbers
fun <T> wait(key: String, result: (value: T) -> Unit) fun <T> wait(key: String, priority: ChannelPriority?, result: (value: T) -> Unit)
``` ```
```kotlin:no-line-numbers ```kotlin:no-line-numbers
fun <T> wait(data: ChannelData<T>, result: (value: T) -> Unit) fun <T> wait(data: ChannelData<T>, priority: ChannelPriority?, result: (value: T) -> Unit)
``` ```
**变更记录** **变更记录**
@@ -112,6 +112,10 @@ fun <T> wait(data: ChannelData<T>, result: (value: T) -> Unit)
移除默认值 `value` 移除默认值 `value`
`v1.1.5` `修改`
新增 `priority` 参数
**功能描述** **功能描述**
> 获取键值数据。 > 获取键值数据。
@@ -119,13 +123,17 @@ fun <T> wait(data: ChannelData<T>, result: (value: T) -> Unit)
### wait <span class="symbol">- method</span> ### wait <span class="symbol">- method</span>
```kotlin:no-line-numbers ```kotlin:no-line-numbers
fun wait(key: String, callback: () -> Unit) fun wait(key: String, priority: ChannelPriority?, callback: () -> Unit)
``` ```
**变更记录** **变更记录**
`v1.0.88` `新增` `v1.0.88` `新增`
`v1.1.5` `修改`
新增 `priority` 参数
**功能描述** **功能描述**
> 仅获取监听结果,不获取键值数据。 > 仅获取监听结果,不获取键值数据。
@@ -139,13 +147,17 @@ fun wait(key: String, callback: () -> Unit)
### checkingVersionEquals <span class="symbol">- method</span> ### checkingVersionEquals <span class="symbol">- method</span>
```kotlin:no-line-numbers ```kotlin:no-line-numbers
fun checkingVersionEquals(result: (Boolean) -> Unit) fun checkingVersionEquals(priority: ChannelPriority?, result: (Boolean) -> Unit)
``` ```
**变更记录** **变更记录**
`v1.0.88` `新增` `v1.0.88` `新增`
`v1.1.5` `修改`
新增 `priority` 参数
**功能描述** **功能描述**
> 获取模块与宿主的版本是否匹配。 > 获取模块与宿主的版本是否匹配。
@@ -155,13 +167,17 @@ fun checkingVersionEquals(result: (Boolean) -> Unit)
### obtainLoggerInMemoryData <span class="symbol">- method</span> ### obtainLoggerInMemoryData <span class="symbol">- method</span>
```kotlin:no-line-numbers ```kotlin:no-line-numbers
fun obtainLoggerInMemoryData(result: (ArrayList<YukiLoggerData>) -> Unit) fun obtainLoggerInMemoryData(priority: ChannelPriority?, result: (ArrayList<YukiLoggerData>) -> Unit)
``` ```
**变更记录** **变更记录**
`v1.1.4` `新增` `v1.1.4` `新增`
`v1.1.5` `修改`
新增 `priority` 参数
**功能描述** **功能描述**
> 获取模块与宿主之间的 `ArrayList<YukiLoggerData>` 数据。 > 获取模块与宿主之间的 `ArrayList<YukiLoggerData>` 数据。

View File

@@ -0,0 +1,19 @@
---
pageClass: code-page
---
# ChannelPriority <span class="symbol">- class</span>
```kotlin:no-line-numbers
class ChannelPriority(private val conditions: () -> Boolean)
```
**变更记录**
`v1.1.5` `新增`
**功能描述**
> 数据通讯桥响应优先级构造类。
这个类是对 `YukiHookDataChannel` 的一个扩展用法。

View File

@@ -48,6 +48,7 @@ import com.highcapable.yukihookapi.hook.log.yLoggerW
import com.highcapable.yukihookapi.hook.xposed.application.ModuleApplication import com.highcapable.yukihookapi.hook.xposed.application.ModuleApplication
import com.highcapable.yukihookapi.hook.xposed.bridge.YukiHookBridge import com.highcapable.yukihookapi.hook.xposed.bridge.YukiHookBridge
import com.highcapable.yukihookapi.hook.xposed.channel.data.ChannelData import com.highcapable.yukihookapi.hook.xposed.channel.data.ChannelData
import com.highcapable.yukihookapi.hook.xposed.channel.priority.ChannelPriority
import com.highcapable.yukihookapi.hook.xposed.helper.YukiHookAppHelper import com.highcapable.yukihookapi.hook.xposed.helper.YukiHookAppHelper
import java.io.Serializable import java.io.Serializable
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
@@ -265,25 +266,28 @@ class YukiHookDataChannel private constructor() {
/** /**
* 获取键值数据 * 获取键值数据
* @param key 键值名称 * @param key 键值名称
* @param priority 响应优先级 - 默认不设置
* @param result 回调结果数据 * @param result 回调结果数据
*/ */
fun <T> wait(key: String, result: (value: T) -> Unit) { fun <T> wait(key: String, priority: ChannelPriority? = null, result: (value: T) -> Unit) {
receiverCallbacks[key + keyShortName(CallbackKeyType.SINGLE)] = Pair(context) { action, intent -> receiverCallbacks[key + keyShortName(CallbackKeyType.SINGLE)] = Pair(context) { action, intent ->
if (action == if (isXposedEnvironment) hostActionName(packageName) else moduleActionName(context)) { if (priority == null || priority.result)
(intent.extras?.get(key + keyNonRepeatName) as? T?)?.let { result(it) } if (action == if (isXposedEnvironment) hostActionName(packageName) else moduleActionName(context))
} (intent.extras?.get(key + keyNonRepeatName) as? T?)?.let { result(it) }
} }
} }
/** /**
* 获取键值数据 * 获取键值数据
* @param data 键值实例 * @param data 键值实例
* @param priority 响应优先级 - 默认不设置
* @param result 回调结果数据 * @param result 回调结果数据
*/ */
fun <T> wait(data: ChannelData<T>, result: (value: T) -> Unit) { fun <T> wait(data: ChannelData<T>, priority: ChannelPriority? = null, result: (value: T) -> Unit) {
receiverCallbacks[data.key + keyShortName(CallbackKeyType.CDATA)] = Pair(context) { action, intent -> receiverCallbacks[data.key + keyShortName(CallbackKeyType.CDATA)] = Pair(context) { action, intent ->
if (action == if (isXposedEnvironment) hostActionName(packageName) else moduleActionName(context)) if (priority == null || priority.result)
(intent.extras?.get(data.key + keyNonRepeatName) as? T?)?.let { result(it) } if (action == if (isXposedEnvironment) hostActionName(packageName) else moduleActionName(context))
(intent.extras?.get(data.key + keyNonRepeatName) as? T?)?.let { result(it) }
} }
} }
@@ -292,12 +296,14 @@ class YukiHookDataChannel private constructor() {
* *
* - ❗仅限使用 [VALUE_WAIT_FOR_LISTENER] 发送的监听才能被接收 * - ❗仅限使用 [VALUE_WAIT_FOR_LISTENER] 发送的监听才能被接收
* @param key 键值名称 * @param key 键值名称
* @param priority 响应优先级 - 默认不设置
* @param callback 回调结果 * @param callback 回调结果
*/ */
fun wait(key: String, callback: () -> Unit) { fun wait(key: String, priority: ChannelPriority? = null, callback: () -> Unit) {
receiverCallbacks[key + keyShortName(CallbackKeyType.VMFL)] = Pair(context) { action, intent -> receiverCallbacks[key + keyShortName(CallbackKeyType.VMFL)] = Pair(context) { action, intent ->
if (action == if (isXposedEnvironment) hostActionName(packageName) else moduleActionName(context)) if (priority == null || priority.result)
if (intent.getStringExtra(key + keyNonRepeatName) == VALUE_WAIT_FOR_LISTENER) callback() if (action == if (isXposedEnvironment) hostActionName(packageName) else moduleActionName(context))
if (intent.getStringExtra(key + keyNonRepeatName) == VALUE_WAIT_FOR_LISTENER) callback()
} }
} }
@@ -305,10 +311,11 @@ class YukiHookDataChannel private constructor() {
* 获取模块与宿主的版本是否匹配 * 获取模块与宿主的版本是否匹配
* *
* 通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况 * 通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况
* @param priority 响应优先级 - 默认不设置
* @param result 回调是否匹配 * @param result 回调是否匹配
*/ */
fun checkingVersionEquals(result: (Boolean) -> Unit) { fun checkingVersionEquals(priority: ChannelPriority? = null, result: (Boolean) -> Unit) {
wait<String>(RESULT_MODULE_GENERATED_VERSION) { result(it == YukiHookBridge.moduleGeneratedVersion) } wait<String>(RESULT_MODULE_GENERATED_VERSION, priority) { result(it == YukiHookBridge.moduleGeneratedVersion) }
put(GET_MODULE_GENERATED_VERSION, packageName) put(GET_MODULE_GENERATED_VERSION, packageName)
} }
@@ -320,10 +327,11 @@ class YukiHookDataChannel private constructor() {
* - ❗模块与宿主必须启用 [YukiHookLogger.Configs.isRecord] 才能获取到调试日志数据 * - ❗模块与宿主必须启用 [YukiHookLogger.Configs.isRecord] 才能获取到调试日志数据
* *
* - ❗由于 Android 限制了数据传输大小的最大值 - 如果调试日志过多可能会造成 [TransactionTooLargeException] 异常 * - ❗由于 Android 限制了数据传输大小的最大值 - 如果调试日志过多可能会造成 [TransactionTooLargeException] 异常
* @param priority 响应优先级 - 默认不设置
* @param result 回调 [ArrayList]<[YukiLoggerData]> * @param result 回调 [ArrayList]<[YukiLoggerData]>
*/ */
fun obtainLoggerInMemoryData(result: (ArrayList<YukiLoggerData>) -> Unit) { fun obtainLoggerInMemoryData(priority: ChannelPriority? = null, result: (ArrayList<YukiLoggerData>) -> Unit) {
wait(RESULT_YUKI_LOGGER_INMEMORY_DATA) { result(it) } wait(RESULT_YUKI_LOGGER_INMEMORY_DATA, priority) { result(it) }
put(GET_YUKI_LOGGER_INMEMORY_DATA, packageName) put(GET_YUKI_LOGGER_INMEMORY_DATA, packageName)
} }

View File

@@ -0,0 +1,45 @@
/*
* YukiHookAPI - An efficient Kotlin version of the Xposed Hook API.
* Copyright (C) 2019-2022 HighCapable
* https://github.com/fankes/YukiHookAPI
*
* MIT License
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* This file is Created by fankes on 2023/1/3.
*/
package com.highcapable.yukihookapi.hook.xposed.channel.priority
import com.highcapable.yukihookapi.hook.xposed.channel.YukiHookDataChannel
/**
* 数据通讯桥响应优先级构造类
*
* 这个类是对 [YukiHookDataChannel] 的一个扩展用法
* @param conditions 条件方法体
*/
class ChannelPriority(private val conditions: () -> Boolean) {
/**
* 获取条件方法体结果
* @return [Boolean]
*/
internal val result get() = conditions()
}