Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<SessionBasedInstallConfirmationActivity>(intent).use { scenario ->
scenario.onActivity { it.onActivityResult(Activity.RESULT_CANCELED) }
drainMainThread()
val completedState = session.completedState
assertNotNull(completedState)
assertIs<Session.State.Failed<InstallFailure>>(completedState)
assertIs<InstallFailure.Aborted>(completedState.failure)
}
}

@Test
fun preapprovalResultDoesNotAbortSession() {
ensureCommitProgressValueCached()
Expand Down
7 changes: 7 additions & 0 deletions docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
---------------------------

Expand Down
2 changes: 1 addition & 1 deletion version.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"majorVersion": 0,
"minorVersion": 22,
"patchVersion": 7,
"patchVersion": 8,
"suffix": "",
"isSnapshot": false
}