Skip to content

Commit

Permalink
feat: 可匹配未知应用
Browse files Browse the repository at this point in the history
  • Loading branch information
lisonge committed Nov 29, 2023
1 parent 739cdac commit 694283a
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 16 deletions.
9 changes: 7 additions & 2 deletions app/src/main/java/li/songe/gkd/service/AbState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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) {
Expand Down
11 changes: 6 additions & 5 deletions app/src/main/java/li/songe/gkd/service/ManageService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down
8 changes: 4 additions & 4 deletions app/src/main/java/li/songe/gkd/ui/ControlVm.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down
13 changes: 13 additions & 0 deletions app/src/main/java/li/songe/gkd/ui/DebugPage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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服务",
Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/li/songe/gkd/util/Store.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
32 changes: 27 additions & 5 deletions app/src/main/java/li/songe/gkd/util/SubsState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, MutableList<Rule>>()
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 ->
Expand Down Expand Up @@ -159,6 +158,29 @@ val appIdToRulesFlow by lazy {
}.stateIn<Map<String, List<Rule>>>(appScope, SharingStarted.Eagerly, emptyMap())
}

data class AppRule(
val visibleMap: Map<String, List<Rule>> = emptyMap(),
val unVisibleMap: Map<String, List<Rule>> = emptyMap(),
val allMap: Map<String, List<Rule>> = emptyMap(),
)

val appRuleFlow by lazy {
combine(appIdToRulesFlow, appInfoCacheFlow) { appIdToRules, appInfoCache ->
val visibleMap = mutableMapOf<String, List<Rule>>()
val unVisibleMap = mutableMapOf<String, List<Rule>>()
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
Expand Down

0 comments on commit 694283a

Please sign in to comment.