From 694283aa8bf77a83516363041ebe4a11201172ba Mon Sep 17 00:00:00 2001 From: lisonge Date: Wed, 29 Nov 2023 10:32:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8F=AF=E5=8C=B9=E9=85=8D=E6=9C=AA?= =?UTF-8?q?=E7=9F=A5=E5=BA=94=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/li/songe/gkd/service/AbState.kt | 9 ++++-- .../li/songe/gkd/service/ManageService.kt | 11 ++++--- .../main/java/li/songe/gkd/ui/ControlVm.kt | 8 ++--- .../main/java/li/songe/gkd/ui/DebugPage.kt | 13 ++++++++ app/src/main/java/li/songe/gkd/util/Store.kt | 1 + .../main/java/li/songe/gkd/util/SubsState.kt | 32 ++++++++++++++++--- 6 files changed, 58 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/li/songe/gkd/service/AbState.kt b/app/src/main/java/li/songe/gkd/service/AbState.kt index 98843678c..48d5e19ed 100644 --- a/app/src/main/java/li/songe/gkd/service/AbState.kt +++ b/app/src/main/java/li/songe/gkd/service/AbState.kt @@ -6,10 +6,11 @@ import li.songe.gkd.appScope import li.songe.gkd.data.ClickLog import li.songe.gkd.data.Rule import li.songe.gkd.db.DbSet -import li.songe.gkd.util.appIdToRulesFlow +import li.songe.gkd.util.appRuleFlow import li.songe.gkd.util.increaseClickCount import li.songe.gkd.util.launchTry import li.songe.gkd.util.recordStoreFlow +import li.songe.gkd.util.storeFlow data class TopActivity( val appId: String, @@ -47,7 +48,11 @@ private fun getFixTopActivity(): TopActivity? { fun getCurrentRules(): ActivityRule { val topActivity = getFixTopActivity() val activityRule = activityRuleFlow.value - val appIdToRules = appIdToRulesFlow.value + val appIdToRules = if (storeFlow.value.matchUnknownApp) { + appRuleFlow.value.allMap + } else { + appRuleFlow.value.visibleMap + } val idChanged = topActivity?.appId != activityRule.topActivity?.appId val topChanged = activityRule.topActivity != topActivity if (topChanged || activityRule.appIdToRules !== appIdToRules) { diff --git a/app/src/main/java/li/songe/gkd/service/ManageService.kt b/app/src/main/java/li/songe/gkd/service/ManageService.kt index 91463825e..c7a059290 100644 --- a/app/src/main/java/li/songe/gkd/service/ManageService.kt +++ b/app/src/main/java/li/songe/gkd/service/ManageService.kt @@ -21,7 +21,7 @@ import li.songe.gkd.notif.abNotif import li.songe.gkd.notif.createNotif import li.songe.gkd.notif.defaultChannel import li.songe.gkd.util.VOLUME_CHANGED_ACTION -import li.songe.gkd.util.appIdToRulesFlow +import li.songe.gkd.util.appRuleFlow import li.songe.gkd.util.clickCountFlow import li.songe.gkd.util.launchTry import li.songe.gkd.util.map @@ -79,11 +79,12 @@ class ManageService : CompositionService({ } scope.launch { - combine(appIdToRulesFlow, clickCountFlow, storeFlow) { appIdToRules, clickCount, store -> + combine(appRuleFlow, clickCountFlow, storeFlow) { appRule, clickCount, store -> if (!store.enableService) return@combine "服务已暂停" - val appSize = appIdToRules.keys.size - val groupSize = - appIdToRules.values.sumOf { rules -> rules.map { r -> r.group.key }.toSet().size } + val appSize = appRule.visibleMap.keys.size + val groupSize = appRule.visibleMap.values.sumOf { rules -> + rules.map { r -> r.group.key }.toSet().size + } (if (groupSize > 0) { "${appSize}应用/${groupSize}规则组" } else { diff --git a/app/src/main/java/li/songe/gkd/ui/ControlVm.kt b/app/src/main/java/li/songe/gkd/ui/ControlVm.kt index 36f6498d0..388f8e6dc 100644 --- a/app/src/main/java/li/songe/gkd/ui/ControlVm.kt +++ b/app/src/main/java/li/songe/gkd/ui/ControlVm.kt @@ -7,8 +7,8 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.stateIn import li.songe.gkd.db.DbSet -import li.songe.gkd.util.appIdToRulesFlow import li.songe.gkd.util.appInfoCacheFlow +import li.songe.gkd.util.appRuleFlow import li.songe.gkd.util.clickCountFlow import li.songe.gkd.util.subsIdToRawFlow import javax.inject.Inject @@ -37,10 +37,10 @@ class ControlVm @Inject constructor() : ViewModel() { } }.stateIn(viewModelScope, SharingStarted.Eagerly, null) - val subsStatusFlow = combine(appIdToRulesFlow, clickCountFlow) { appIdToRules, clickCount -> - val appSize = appIdToRules.keys.size + val subsStatusFlow = combine(appRuleFlow, clickCountFlow) { appRule, clickCount -> + val appSize = appRule.visibleMap.keys.size val groupSize = - appIdToRules.values.sumOf { rules -> rules.map { r -> r.group.key }.toSet().size } + appRule.visibleMap.values.sumOf { rules -> rules.map { r -> r.group.key }.toSet().size } (if (groupSize > 0) { "${appSize}应用/${groupSize}规则组" } else { diff --git a/app/src/main/java/li/songe/gkd/ui/DebugPage.kt b/app/src/main/java/li/songe/gkd/ui/DebugPage.kt index 88207439b..f8860633c 100644 --- a/app/src/main/java/li/songe/gkd/ui/DebugPage.kt +++ b/app/src/main/java/li/songe/gkd/ui/DebugPage.kt @@ -142,6 +142,19 @@ fun DebugPage() { Divider() } + TextSwitch( + name = "匹配未知应用", + desc = "匹配不在安装列表中(其它用户空间)的应用", + checked = store.matchUnknownApp + ) { + updateStorage( + storeFlow, store.copy( + matchUnknownApp = it + ) + ) + } + Divider() + val httpServerRunning by usePollState { HttpService.isRunning() } TextSwitch( name = "HTTP服务", diff --git a/app/src/main/java/li/songe/gkd/util/Store.kt b/app/src/main/java/li/songe/gkd/util/Store.kt index 13b57ef71..86619ca0c 100644 --- a/app/src/main/java/li/songe/gkd/util/Store.kt +++ b/app/src/main/java/li/songe/gkd/util/Store.kt @@ -60,6 +60,7 @@ data class Store( val enableDarkTheme: Boolean? = null, val enableAbFloatWindow: Boolean = true, val enableGroup: Boolean? = null, + val matchUnknownApp: Boolean = false, ) val storeFlow by lazy { diff --git a/app/src/main/java/li/songe/gkd/util/SubsState.kt b/app/src/main/java/li/songe/gkd/util/SubsState.kt index 139a5c736..949d7e554 100644 --- a/app/src/main/java/li/songe/gkd/util/SubsState.kt +++ b/app/src/main/java/li/songe/gkd/util/SubsState.kt @@ -37,19 +37,18 @@ val subsConfigsFlow by lazy { DbSet.subsConfigDao.query().stateIn(appScope, SharingStarted.Eagerly, emptyList()) } -val appIdToRulesFlow by lazy { +private val appIdToRulesFlow by lazy { combine(subsItemsFlow, subsIdToRawFlow, subsConfigsFlow, - appInfoCacheFlow, - storeFlow.map(appScope) { s -> s.enableGroup }) { subsItems, subsIdToRaw, subsConfigs, appInfoCache, enableGroup -> + storeFlow.map(appScope) { s -> s.enableGroup }) { subsItems, subsIdToRaw, subsConfigs, enableGroup -> val appSubsConfigs = subsConfigs.filter { it.type == SubsConfig.AppType } val groupSubsConfigs = subsConfigs.filter { it.type == SubsConfig.GroupType } val appIdToRules = mutableMapOf>() subsItems.filter { it.enable }.forEach { subsItem -> (subsIdToRaw[subsItem.id]?.apps ?: emptyList()).filter { appRaw -> - // 筛选 已经安装的 APP 和 当前启用的 app 订阅规则 - appInfoCache.containsKey(appRaw.id) && (appSubsConfigs.find { subsConfig -> + // 筛选 当前启用的 app 订阅规则 + (appSubsConfigs.find { subsConfig -> subsConfig.subsItemId == subsItem.id && subsConfig.appId == appRaw.id }?.enable ?: true) }.forEach { appRaw -> @@ -159,6 +158,29 @@ val appIdToRulesFlow by lazy { }.stateIn>>(appScope, SharingStarted.Eagerly, emptyMap()) } +data class AppRule( + val visibleMap: Map> = emptyMap(), + val unVisibleMap: Map> = emptyMap(), + val allMap: Map> = emptyMap(), +) + +val appRuleFlow by lazy { + combine(appIdToRulesFlow, appInfoCacheFlow) { appIdToRules, appInfoCache -> + val visibleMap = mutableMapOf>() + val unVisibleMap = mutableMapOf>() + appIdToRules.forEach { (appId, rules) -> + if (appInfoCache.containsKey(appId)) { + visibleMap[appId] = rules + } else { + unVisibleMap[appId] = rules + } + } + AppRule( + visibleMap = visibleMap, unVisibleMap = unVisibleMap, allMap = appIdToRules + ) + }.stateIn(appScope, SharingStarted.Eagerly, AppRule()) +} + fun initSubsState() { subsItemsFlow.value