From 0df08a6054f25f354f4c8506c6abc4a20cb89819 Mon Sep 17 00:00:00 2001 From: Ilya Fomichev Date: Fri, 1 May 2026 00:23:44 +0500 Subject: [PATCH 1/4] don't trigger session abort on install confirmation dismiss unconditionally --- .../activity/SessionBasedInstallConfirmationActivity.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/ackpine-core/src/main/kotlin/ru/solrudev/ackpine/impl/installer/activity/SessionBasedInstallConfirmationActivity.kt b/ackpine-core/src/main/kotlin/ru/solrudev/ackpine/impl/installer/activity/SessionBasedInstallConfirmationActivity.kt index 58ddc2daf..948b88dfe 100644 --- a/ackpine-core/src/main/kotlin/ru/solrudev/ackpine/impl/installer/activity/SessionBasedInstallConfirmationActivity.kt +++ b/ackpine-core/src/main/kotlin/ru/solrudev/ackpine/impl/installer/activity/SessionBasedInstallConfirmationActivity.kt @@ -196,15 +196,14 @@ internal class SessionBasedInstallConfirmationActivity : InstallActivity(TAG) { logger.warn("Install permission denied for session %s", ackpineSessionId) abortSession("Install permission denied") } - // User has dismissed confirmation activity. - isSessionAlive && isActivityCancelled -> { - logger.warn("Install confirmation was dismissed for session %s", ackpineSessionId) - abortSession() - } // There was some error while installing which is not handled in PackageInstallerStatusReceiver, // or session's progress may have been delayed by Play Protect, or session may have completed // too quickly. else -> { + if (isSessionAlive && isActivityCancelled) { + // User may have dismissed confirmation activity. + logger.warn("Install confirmation dismiss heuristics for session %s", ackpineSessionId) + } // Wait for possible progress/result from PackageInstallerStatusReceiver before completing with failure. logger.info("Waiting for delayed dead-session fallback for session %s", ackpineSessionId) setLoading(isLoading = true, delayMillis = 100) From cbe41b835ef1e7da89dc96771f05654c9e92ca47 Mon Sep 17 00:00:00 2001 From: Ilya Fomichev Date: Fri, 1 May 2026 00:24:22 +0500 Subject: [PATCH 2/4] increment version --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 9a7f10bee..dddfdadfe 100644 --- a/version.json +++ b/version.json @@ -1,7 +1,7 @@ { "majorVersion": 0, "minorVersion": 22, - "patchVersion": 7, + "patchVersion": 8, "suffix": "", "isSnapshot": false } \ No newline at end of file From fbaf705ef4e4b7a598e06c65bf46f27ebf492058 Mon Sep 17 00:00:00 2001 From: Ilya Fomichev Date: Fri, 1 May 2026 00:29:48 +0500 Subject: [PATCH 3/4] add version 0.22.8 to changelog --- docs/changelog.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/changelog.md b/docs/changelog.md index b39490d67..0f90dc1c4 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -6,6 +6,13 @@ hide: Change Log ========== +Version 0.22.8 (2026-05-01) +--------------------------- + +### Bug fixes and improvements + +- Fix "SessionBasedInstallConfirmationActivity was finished by user" install error on some devices. + Version 0.22.7 (2026-04-24) --------------------------- From e2d4f2d0c7be3ba947a2e7dd8b08d845cf0798f1 Mon Sep 17 00:00:00 2001 From: Ilya Fomichev Date: Fri, 1 May 2026 00:42:14 +0500 Subject: [PATCH 4/4] remove stale test --- ...edInstallConfirmationActivityResultTest.kt | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/ackpine-core/src/test/kotlin/ru/solrudev/ackpine/impl/installer/activity/SessionBasedInstallConfirmationActivityResultTest.kt b/ackpine-core/src/test/kotlin/ru/solrudev/ackpine/impl/installer/activity/SessionBasedInstallConfirmationActivityResultTest.kt index 4b42edd62..ccac044f9 100644 --- a/ackpine-core/src/test/kotlin/ru/solrudev/ackpine/impl/installer/activity/SessionBasedInstallConfirmationActivityResultTest.kt +++ b/ackpine-core/src/test/kotlin/ru/solrudev/ackpine/impl/installer/activity/SessionBasedInstallConfirmationActivityResultTest.kt @@ -54,26 +54,6 @@ class SessionBasedInstallConfirmationActivityResultTest { CommitProgressValueHolder.clear(context) } - @Test - fun activityCancelledAbortsSession() { - ensureCommitProgressValueCached() - val sessionId = UUID.randomUUID() - val session = TestPreapprovalSession(sessionId) - PackageInstallerImpl.getInstance(context).addSession(sessionId, session) - val intent = Intent(context, SessionBasedInstallConfirmationActivity::class.java) - .putExtra(Intent.EXTRA_INTENT, Intent()) - .putExtra(PackageInstaller.EXTRA_SESSION_ID, 1) - SessionIdIntents.putSessionId(intent, sessionId) - ActivityScenario.launch(intent).use { scenario -> - scenario.onActivity { it.onActivityResult(Activity.RESULT_CANCELED) } - drainMainThread() - val completedState = session.completedState - assertNotNull(completedState) - assertIs>(completedState) - assertIs(completedState.failure) - } - } - @Test fun preapprovalResultDoesNotAbortSession() { ensureCommitProgressValueCached()