From 7b1f2a3ef7fc62ff6f7f806ddb6e1f14e50f4d07 Mon Sep 17 00:00:00 2001 From: Henrique Velloso Date: Fri, 20 Feb 2026 15:25:11 -0300 Subject: [PATCH] hotfix: fallback to retry when install confirmation stays pending When Android remains in pendingUserAction without progressing, the app could stay stuck in Requesting installation. Add a minimal timeout fallback in the Android package manager flow: after 10s in pending confirmation, transition to InstallCancelled and release the install slot so users can immediately retry. --- .../android_package_manager.dart | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/services/package_manager/android_package_manager.dart b/lib/services/package_manager/android_package_manager.dart index b2c8749..abe899e 100644 --- a/lib/services/package_manager/android_package_manager.dart +++ b/lib/services/package_manager/android_package_manager.dart @@ -69,6 +69,7 @@ final class AndroidPackageManager extends PackageManager { static const _methodChannel = MethodChannel('android_package_manager'); static const _eventChannel = EventChannel('android_package_manager/events'); + static const _pendingUserActionTimeout = Duration(seconds: 10); bool _supportsSilentInstall = false; int _syncGeneration = 0; @@ -227,6 +228,24 @@ final class AndroidPackageManager extends PackageManager { break; case InstallStatus.pendingUserAction: + // If pending user action lingers too long, treat it like dismiss/cancel + // and surface "Install (retry)" instead of staying stuck requesting. + if (existingOp is Installing && + !existingOp.isSilent && + DateTime.now().difference(existingOp.startedAt) >= + _pendingUserActionTimeout) { + if (filePath != null) { + setOperation( + appId, + InstallCancelled(target: target, filePath: filePath), + ); + } else { + clearOperation(appId); + } + clearInstallSlot(appId); + break; + } + // User action required. Ensure we don't get stuck in Verifying if the // STARTED event was missed; show Installing state. // Skip if already in Installing or SystemProcessing to preserve the