Skip to content

Commit 7d0f4ed

Browse files
committed
cleanup: wire Rust renew_all to UpdateWorker; merge renewAllFromCloud; remove dead Kotlin code
- Task 1: UpdateWorker now calls managerRenewAll() via Rust RPC; onManagerEvent wired in core/Init.kt to route renew_progress and app_status_changed events to AppManager.notifyRenewProgress / notifyAppStatusChanged; deleted batch renewApp(renewStatusFun) + renewAppList() from AppManager - Task 2: merge renewAllAppConfigFromCloud + renewAllHubConfigFromCloud into renewAllFromCloud(); delete HubManager.checkInvalidApplications() (zero call sites); delete dead import android.util.Log from DiscoverList{Item,ViewHolder} - Task 3: CloudConfigGetter.downloadCloudHubConfig() calls managerCheckInvalidApplications() on success; Rust fires AppStatusChanged for each invalid app so Kotlin UI updates automatically - Update getter submodule pointer to a4a5f18
1 parent 6cbcee8 commit 7d0f4ed

File tree

9 files changed

+52
-148
lines changed

9 files changed

+52
-148
lines changed

app/src/main/java/net/xzos/upgradeall/application/Init.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,7 @@ private fun initContext() {
2727
}
2828

2929
private suspend fun renewData() {
30-
if (PreferencesMap.auto_update_hub_config) {
31-
CloudConfigGetter.renewAllHubConfigFromCloud()
32-
}
33-
if (PreferencesMap.auto_update_app_config) {
34-
CloudConfigGetter.renewAllAppConfigFromCloud()
30+
if (PreferencesMap.auto_update_hub_config || PreferencesMap.auto_update_app_config) {
31+
CloudConfigGetter.renewAllFromCloud()
3532
}
3633
}

app/src/main/java/net/xzos/upgradeall/server/update/UpdateWorker.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.work.WorkerParameters
1010
import kotlinx.coroutines.Dispatchers
1111
import kotlinx.coroutines.withContext
1212
import net.xzos.upgradeall.core.manager.AppManager
13+
import net.xzos.upgradeall.core.websdk.getterPort
1314

1415
class UpdateWorker(context: Context, workerParameters: WorkerParameters) :
1516
CoroutineWorker(context, workerParameters) {
@@ -52,10 +53,9 @@ class UpdateWorker(context: Context, workerParameters: WorkerParameters) :
5253
}
5354

5455
suspend fun doUpdateWork(updateNotification: UpdateNotification) {
55-
AppManager.renewApp(
56-
updateNotification.renewStatusFun,
57-
updateNotification.recheckStatusFun
58-
)
56+
AppManager.setRenewProgressFun(updateNotification.renewStatusFun)
57+
getterPort.getService().managerRenewAll()
58+
AppManager.setRenewProgressFun(null)
5959
}
6060

6161
fun finishNotify(updateNotification: UpdateNotification) {

app/src/main/java/net/xzos/upgradeall/ui/discover/DiscoverListItemView.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package net.xzos.upgradeall.ui.discover
33
import android.content.Context
44
import android.content.res.ColorStateList
55
import android.graphics.drawable.Drawable
6-
import android.util.Log
76
import android.view.View
87
import androidx.databinding.ObservableField
98
import net.xzos.upgradeall.R

app/src/main/java/net/xzos/upgradeall/ui/discover/DiscoverListViewHolder.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package net.xzos.upgradeall.ui.discover
22

3-
import android.util.Log
43
import android.view.LayoutInflater
54
import android.view.ViewGroup
65
import com.google.android.material.chip.Chip

core/src/main/java/net/xzos/upgradeall/core/Init.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package net.xzos.upgradeall.core
22

33
import android.annotation.SuppressLint
44
import android.content.Context
5+
import com.google.gson.JsonObject
56
import kotlinx.coroutines.CoroutineScope
67
import kotlinx.coroutines.Dispatchers
78
import kotlinx.coroutines.SupervisorJob
@@ -38,7 +39,24 @@ fun initCore(
3839
)
3940
initObject(context)
4041
CoroutineScope(SupervisorJob() + Dispatchers.IO).launch {
41-
runGetterService(context)
42+
runGetterService(
43+
context,
44+
onManagerEvent = { event ->
45+
when (event.get("type")?.asString) {
46+
"renew_progress" -> AppManager.notifyRenewProgress(
47+
event.get("done")?.asInt ?: return@runGetterService,
48+
event.get("total")?.asInt ?: return@runGetterService,
49+
)
50+
"app_status_changed" -> {
51+
val appIdObj = event.getAsJsonObject("app_id") ?: return@runGetterService
52+
val appId: Map<String, String?> = appIdObj.entrySet().associate { (k, v) ->
53+
k to if (v.isJsonNull) null else v.asString
54+
}
55+
AppManager.notifyAppStatusChanged(appId)
56+
}
57+
}
58+
}
59+
)
4260
// Migrate Room data to Rust JSONL on first launch after upgrade.
4361
// runGetterService() completes only after the Rust service is ready,
4462
// so the getter port is safe to use here.

core/src/main/java/net/xzos/upgradeall/core/manager/AppManager.kt

Lines changed: 22 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,7 @@ package net.xzos.upgradeall.core.manager
22

33
import android.content.Context
44
import android.database.sqlite.SQLiteConstraintException
5-
import kotlinx.coroutines.Dispatchers
6-
import kotlinx.coroutines.coroutineScope
7-
import kotlinx.coroutines.launch
85
import kotlinx.coroutines.runBlocking
9-
import kotlinx.coroutines.sync.Semaphore
10-
import kotlinx.coroutines.sync.withPermit
116
import net.xzos.upgradeall.core.coreConfig
127
import net.xzos.upgradeall.core.database.metaDatabase
138
import net.xzos.upgradeall.core.database.table.AppEntity
@@ -17,9 +12,7 @@ import net.xzos.upgradeall.core.module.AppStatus
1712
import net.xzos.upgradeall.core.module.Hub
1813
import net.xzos.upgradeall.core.module.app.App
1914
import net.xzos.upgradeall.core.module.app.data.DataGetter
20-
import net.xzos.upgradeall.core.utils.coroutines.CoroutinesCount
2115
import net.xzos.upgradeall.core.utils.coroutines.coroutinesMutableListOf
22-
import net.xzos.upgradeall.core.utils.coroutines.coroutinesMutableMapOf
2316
import net.xzos.upgradeall.core.utils.getInstalledAppList
2417
import net.xzos.upgradeall.core.utils.log.Log
2518
import net.xzos.upgradeall.core.utils.log.ObjectTag
@@ -48,6 +41,28 @@ object AppManager : Informer<UpdateStatus, App>() {
4841
*/
4942
private val allAppList = coroutinesMutableListOf<App>(true)
5043

44+
// -------------------------------------------------------------------------
45+
// Rust renew pipeline callbacks
46+
// -------------------------------------------------------------------------
47+
48+
@Volatile private var currentRenewProgressFun: ((done: Int, total: Int) -> Unit)? = null
49+
50+
fun setRenewProgressFun(f: ((Int, Int) -> Unit)?) {
51+
currentRenewProgressFun = f
52+
}
53+
54+
/** Called by core/Init.kt when Rust fires a renew_progress event. */
55+
fun notifyRenewProgress(done: Int, total: Int) {
56+
currentRenewProgressFun?.invoke(done, total)
57+
}
58+
59+
/** Called by core/Init.kt when Rust fires an app_status_changed event. */
60+
fun notifyAppStatusChanged(appId: Map<String, String?>) {
61+
val app = allAppList.firstOrNull { it.appId == appId } ?: return
62+
notifyChanged(UpdateStatus.APP_FINISH_UPDATE_NOTIFY, app)
63+
notifyChanged(UpdateStatus.APP_UPDATE_STATUS_CHANGED_NOTIFY, app)
64+
}
65+
5166
private val inactiveAppList: Set<App>
5267
get() = getAppList(AppStatus.APP_INACTIVE)
5368

@@ -109,114 +124,6 @@ object AppManager : Informer<UpdateStatus, App>() {
109124
*/
110125
fun getAppList(appType: String): Set<App> = allAppList.filter { it.appId.containsKey(appType) }.toSet()
111126

112-
/**
113-
* 刷新 App 的版本数据
114-
* @param renewStatusFun 每刷新一个 App 数据,回调一次,以返回正在刷新中的 App 数量
115-
*/
116-
suspend fun renewApp(
117-
renewStatusFun: ((renewingAppNum: Int, totalAppNum: Int) -> Unit)? = null,
118-
renewInactiveStatusFun: ((renewingAppNum: Int, totalAppNum: Int) -> Unit)? = null,
119-
): Int {
120-
val appList = getUnsortedAppList()
121-
renewAppList(appList, renewStatusFun)
122-
renewAppList(inactiveAppList, renewInactiveStatusFun)
123-
return appList.size
124-
}
125-
126-
private suspend fun renewAppList(
127-
appList: Collection<App>,
128-
statusFun: ((renewingAppNum: Int, totalAppNum: Int) -> Unit)? = null,
129-
): Collection<App> {
130-
val count = CoroutinesCount(appList.size)
131-
val totalAppNum = appList.size
132-
Log.d(logObjectTag, TAG, "renew start: $totalAppNum apps")
133-
val simpleMap = coroutinesMutableMapOf<Hub, MutableList<App>>(true)
134-
val completeMap = coroutinesMutableMapOf<Hub, MutableList<App>>(true)
135-
val appMap = coroutinesMutableMapOf<App, MutableList<Hub>>(true)
136-
val appStatusMap = coroutinesMutableMapOf<App, AppStatus>(true)
137-
coroutineScope {
138-
appList.forEach {
139-
launch {
140-
notifyChanged(UpdateStatus.APP_START_UPDATE_NOTIFY, it)
141-
appStatusMap[it] = it.releaseStatus
142-
it.hubEnableList.forEach { hub ->
143-
val map = if (it.needCompleteVersion) completeMap else simpleMap
144-
map.getOrPut(hub) { mutableListOf() }.add(it)
145-
}
146-
appMap[it] = it.hubEnableList.toMutableList()
147-
}
148-
}
149-
}
150-
val semaphore = Semaphore(10)
151-
coroutineScope {
152-
simpleMap.forEach { i ->
153-
val (hub, list) = i
154-
semaphore.withPermit {
155-
launch {
156-
val flashApp = DataGetter.getLatestUpdate(hub, list)
157-
if (flashApp.isEmpty()) {
158-
completeMap.getOrPut(hub) { mutableListOf() }.addAll(list)
159-
} else {
160-
flashApp.forEach {
161-
checkUpdated(
162-
it,
163-
hub,
164-
appMap,
165-
appStatusMap,
166-
count,
167-
totalAppNum,
168-
statusFun,
169-
)
170-
list.remove(it)
171-
}
172-
list.forEach { completeMap.getOrPut(hub) { mutableListOf() }.add(it) }
173-
}
174-
}
175-
}
176-
}
177-
}
178-
179-
coroutineScope {
180-
completeMap.forEach { i ->
181-
val (hub, list) = i
182-
list.forEach {
183-
launch(Dispatchers.IO) {
184-
renewApp(it, hub)
185-
checkUpdated(it, hub, appMap, appStatusMap, count, totalAppNum, statusFun)
186-
}
187-
}
188-
}
189-
}
190-
Log.d(logObjectTag, TAG, "renew finish: $totalAppNum apps")
191-
return appList
192-
}
193-
194-
private fun checkUpdated(
195-
app: App,
196-
hub: Hub,
197-
map: MutableMap<App, MutableList<Hub>>,
198-
appStatusMap: MutableMap<App, AppStatus>,
199-
count: CoroutinesCount,
200-
totalAppNum: Int,
201-
statusFun: ((renewingAppNum: Int, totalAppNum: Int) -> Unit)?,
202-
) {
203-
val list = map[app] ?: return
204-
if (list.contains(hub)) {
205-
if (list.size == 1) {
206-
map.remove(app)
207-
notifyChanged(UpdateStatus.APP_FINISH_UPDATE_NOTIFY, app)
208-
if (appStatusMap[app] != app.releaseStatus) {
209-
notifyChanged(UpdateStatus.APP_UPDATE_STATUS_CHANGED_NOTIFY, app)
210-
}
211-
count.down()
212-
Log.d(logObjectTag, TAG, "app done: ${app.appId}, remaining: ${count.count}/$totalAppNum")
213-
statusFun?.run { this(count.count, totalAppNum) }
214-
} else {
215-
list.remove(hub)
216-
}
217-
}
218-
}
219-
220127
/**
221128
* 刷新指定 App 项的版本数据
222129
* @param app 需要重新刷新的 App 项

core/src/main/java/net/xzos/upgradeall/core/manager/CloudConfigGetter.kt

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ object CloudConfigGetter {
9292
if (ok) {
9393
notifyFun(GetStatus.SUCCESS_SAVE_HUB_DATA)
9494
notifyFun(GetStatus.SUCCESS)
95+
// Recheck apps that may have become invalid after hub config change.
96+
service().managerCheckInvalidApplications()
9597
} else {
9698
notifyFun(GetStatus.FAILED_SAVE_HUB_DATA)
9799
notifyFun(GetStatus.FAILED)
@@ -138,20 +140,11 @@ object CloudConfigGetter {
138140
}
139141

140142
/** Bulk-update all installed apps and hubs whose cloud config version has increased. */
141-
suspend fun renewAllAppConfigFromCloud() {
143+
suspend fun renewAllFromCloud() {
142144
try {
143145
service().cloudConfigRenewAll()
144146
} catch (e: Exception) {
145-
Log.e(logObjectTag, TAG, "renewAllAppConfigFromCloud failed: $e")
146-
}
147-
}
148-
149-
/** Bulk-update all installed hub configs from cloud. */
150-
suspend fun renewAllHubConfigFromCloud() {
151-
try {
152-
service().cloudConfigRenewAll()
153-
} catch (e: Exception) {
154-
Log.e(logObjectTag, TAG, "renewAllHubConfigFromCloud failed: $e")
147+
Log.e(logObjectTag, TAG, "renewAllFromCloud failed: $e")
155148
}
156149
}
157150
}

core/src/main/java/net/xzos/upgradeall/core/manager/HubManager.kt

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,6 @@ object HubManager {
3535
ExtraHubEntityManager.deleteExtraHub(hubUuid)
3636
}
3737

38-
suspend fun checkInvalidApplications() {
39-
hubMap.values.forEach { hub ->
40-
val available = hub.applicationsModeAvailable()
41-
if (hub.isEnableApplicationsMode() && !available) {
42-
hub.setApplicationsMode(available)
43-
}
44-
}
45-
}
46-
4738
fun isEnableApplicationsMode(): Boolean {
4839
return hubMap.values.any {
4940
it.isEnableApplicationsMode()

0 commit comments

Comments
 (0)