@@ -22,6 +22,7 @@ import li.songe.gkd.app
2222import li.songe.gkd.appScope
2323import li.songe.gkd.data.AppInfo
2424import li.songe.gkd.data.toAppInfo
25+ import li.songe.gkd.permission.canQueryPkgState
2526
2627val userAppInfoMapFlow = MutableStateFlow (emptyMap<String , AppInfo >())
2728val allPackageInfoMapFlow = MutableStateFlow (emptyMap<Int , List <PackageInfo >>())
@@ -47,13 +48,15 @@ val orderedAppInfosFlow by lazy {
4748 }
4849}
4950
51+ private fun Map <String , AppInfo >.getMayQueryPkgNoAccess (): Boolean {
52+ return values.count { a -> ! a.isSystem && ! a.hidden && a.id != META .appId } < MINIMUM_NORMAL_APP_SIZE
53+ }
54+
5055// https://github.com/orgs/gkd-kit/discussions/761
5156// 某些设备在应用更新后出现权限错乱/缓存错乱
5257private const val MINIMUM_NORMAL_APP_SIZE = 8
5358val mayQueryPkgNoAccessFlow by lazy {
54- userAppInfoMapFlow.map(appScope) { c ->
55- c.values.count { a -> ! a.isSystem && ! a.hidden && a.id != META .appId } < MINIMUM_NORMAL_APP_SIZE
56- }
59+ userAppInfoMapFlow.map(appScope) { it.getMayQueryPkgNoAccess() }
5760}
5861
5962private val willUpdateAppIds by lazy { MutableStateFlow (emptySet<String >()) }
@@ -131,14 +134,27 @@ suspend fun initOrResetAppInfoCache() = updateAppMutex.withLock {
131134 }
132135 }
133136 }
137+ if (! canQueryPkgState.updateAndGet() || appMap.getMayQueryPkgNoAccess()) {
138+ withContext(Dispatchers .IO ) {
139+ app.packageManager.queryIntentActivities(
140+ Intent (Intent .ACTION_MAIN ),
141+ 0
142+ ).map { it.activityInfo.packageName }.toSet().forEach { appId ->
143+ if (! appMap.contains(appId)) {
144+ getAppInfo(appId)?.let {
145+ appMap[appId] = it
146+ }
147+ }
148+ }
149+ }
150+ }
134151 userAppInfoMapFlow.value = appMap
135152 LogUtils .d(" initOrResetAppInfoCache end ${oldAppIds.size} ->${appMap.size} " )
136153}
137154
138155fun initAppState () {
139156 packageReceiver
140157 appScope.launchTry(Dispatchers .IO ) {
141- initOrResetAppInfoCache()
142158 willUpdateAppIds.debounce(1000 )
143159 .filter { it.isNotEmpty() }
144160 .collect { updateAppInfo(it) }
0 commit comments