@@ -11,8 +11,12 @@ import app.morphe.manager.di.*
1111import app.morphe.manager.domain.manager.PreferencesManager
1212import app.morphe.manager.domain.repository.PatchBundleRepository
1313import app.morphe.manager.domain.repository.PatchBundleRepository.Companion.DEFAULT_SOURCE_UID
14+ import app.morphe.manager.domain.bundles.PatchBundleSource.Extensions.bundleAvatarUrl
15+ import app.morphe.manager.domain.bundles.PatchBundleSource.Extensions.githubAvatarUrl
16+ import app.morphe.manager.domain.bundles.PatchBundleSource.Extensions.gitlabAvatarUrl
1417import app.morphe.manager.util.UpdateNotificationManager
1518import app.morphe.manager.util.applyAppLanguage
19+ import app.morphe.manager.util.loadRemoteAvatar
1620import app.morphe.manager.util.readLanguageFromPrefs
1721import app.morphe.manager.util.saveLanguageToPrefs
1822import app.morphe.manager.util.syncFcmTopics
@@ -25,6 +29,7 @@ import coil.ImageLoader
2529import com.topjohnwu.superuser.Shell
2630import kotlinx.coroutines.Dispatchers
2731import kotlinx.coroutines.MainScope
32+ import kotlinx.coroutines.flow.first
2833import kotlinx.coroutines.launch
2934import me.zhanghai.android.appiconloader.coil.AppIconFetcher
3035import me.zhanghai.android.appiconloader.coil.AppIconKeyer
@@ -124,6 +129,23 @@ class ManagerApplication : Application() {
124129 }
125130 }
126131
132+ // Preload bundle avatar images into AvatarCache while the user hasn't opened the sheet yet.
133+ // Suspends until sources are ready, then fetches all URLs in parallel on IO threads.
134+ scope.launch(Dispatchers .IO ) {
135+ patchBundleRepository.sources.first { it.isNotEmpty() }.forEach { bundle ->
136+ launch {
137+ val primary = bundle.bundleAvatarUrl ? : bundle.githubAvatarUrl ? : bundle.gitlabAvatarUrl
138+ val fallback = when {
139+ bundle.bundleAvatarUrl != null -> bundle.githubAvatarUrl ? : bundle.gitlabAvatarUrl
140+ bundle.githubAvatarUrl != null -> bundle.gitlabAvatarUrl
141+ else -> null
142+ }
143+ primary?.let { loadRemoteAvatar(it) }
144+ fallback?.let { loadRemoteAvatar(it) }
145+ }
146+ }
147+ }
148+
127149 // Clean temp dir on fresh start
128150 registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
129151 private var firstActivityCreated = false
0 commit comments