SessionInstaller: Clear enqueued installs properly

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2024-05-15 16:05:05 +05:30
parent 2bd872c5eb
commit 38c6c704d7

View File

@@ -57,6 +57,28 @@ class SessionInstaller @Inject constructor(
private val packageInstaller = context.packageManager.packageInstaller private val packageInstaller = context.packageManager.packageInstaller
private val sessionIdMap = mutableMapOf<Int, String>() private val sessionIdMap = mutableMapOf<Int, String>()
val callback = object : PackageInstaller.SessionCallback() {
override fun onCreated(sessionId: Int) {}
override fun onBadgingChanged(sessionId: Int) {}
override fun onActiveChanged(sessionId: Int, active: Boolean) {}
override fun onProgressChanged(sessionId: Int, progress: Float) {}
override fun onFinished(sessionId: Int, success: Boolean) {
if (sessionId in sessionIdMap.keys) {
sessionIdMap.remove(sessionId)
if (sessionIdMap.isNotEmpty() && success) {
val nextSession = sessionIdMap.keys.first()
commitInstall(sessionIdMap.getValue(nextSession), nextSession)
} else {
packageInstaller.unregisterSessionCallback(this)
}
}
}
}
companion object { companion object {
fun getInstallerInfo(context: Context): InstallerInfo { fun getInstallerInfo(context: Context): InstallerInfo {
@@ -69,6 +91,10 @@ class SessionInstaller @Inject constructor(
} }
} }
init {
runOnUiThread { packageInstaller.registerSessionCallback(callback) }
}
override fun install(download: Download) { override fun install(download: Download) {
super.install(download) super.install(download)
@@ -77,28 +103,6 @@ class SessionInstaller @Inject constructor(
} else { } else {
Log.i("Received session install request for ${download.packageName}") Log.i("Received session install request for ${download.packageName}")
val callback = object : PackageInstaller.SessionCallback() {
override fun onCreated(sessionId: Int) {}
override fun onBadgingChanged(sessionId: Int) {}
override fun onActiveChanged(sessionId: Int, active: Boolean) {}
override fun onProgressChanged(sessionId: Int, progress: Float) {}
override fun onFinished(sessionId: Int, success: Boolean) {
if (sessionId in sessionIdMap.keys && success) {
sessionIdMap.remove(sessionId)
if (sessionIdMap.isNotEmpty()) {
val nextSession = sessionIdMap.keys.first()
commitInstall(sessionIdMap.getValue(nextSession), nextSession)
} else {
packageInstaller.unregisterSessionCallback(this)
}
}
}
}
download.sharedLibs.forEach { download.sharedLibs.forEach {
// Shared library packages cannot be updated // Shared library packages cannot be updated
if (!isSharedLibraryInstalled(context, it.packageName, it.versionCode)) { if (!isSharedLibraryInstalled(context, it.packageName, it.versionCode)) {
@@ -107,10 +111,6 @@ class SessionInstaller @Inject constructor(
} }
stageInstall(download.packageName, download.versionCode) stageInstall(download.packageName, download.versionCode)
if (sessionIdMap.size > 1) {
runOnUiThread { packageInstaller.registerSessionCallback(callback) }
}
commitInstall( commitInstall(
sessionIdMap.getValue(sessionIdMap.keys.first()), sessionIdMap.getValue(sessionIdMap.keys.first()),
sessionIdMap.keys.first() sessionIdMap.keys.first()