From 684cd544efef976e88afa485e509af621f4248b1 Mon Sep 17 00:00:00 2001 From: Rohit Goyal Date: Tue, 19 Mar 2024 15:53:27 +0000 Subject: In case unarchival confirmation compat option is used, open app details page during ongoing unarchival. Test: verified bugfixes locally. Bug: 322021865 Change-Id: I789438949af04ac8cfd5692d6010617100cb2487 --- .../com/android/server/pm/PackageArchiver.java | 44 ++++++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageArchiver.java b/services/core/java/com/android/server/pm/PackageArchiver.java index ec98fff25af7..e2f4d18bbd6d 100644 --- a/services/core/java/com/android/server/pm/PackageArchiver.java +++ b/services/core/java/com/android/server/pm/PackageArchiver.java @@ -293,9 +293,26 @@ public class PackageArchiver { return START_PERMISSION_DENIED; } - Slog.i(TAG, TextUtils.formatSimple("Unarchival is starting for: %s", packageName)); - try { + boolean openAppDetailsIfOngoingUnarchival = getAppOpsManager().checkOp( + AppOpsManager.OP_UNARCHIVAL_CONFIRMATION, callingUid, callerPackageName) + == MODE_ALLOWED; + if (openAppDetailsIfOngoingUnarchival) { + PackageInstaller.SessionInfo activeUnarchivalSession = getActiveUnarchivalSession( + packageName, userId); + if (activeUnarchivalSession != null) { + mPm.mHandler.post(() -> { + Slog.i(TAG, "Opening app details page for ongoing unarchival of: " + + packageName); + getLauncherApps().startPackageInstallerSessionDetailsActivity( + activeUnarchivalSession, null, null); + }); + return START_ABORTED; + } + } + + Slog.i(TAG, TextUtils.formatSimple("Unarchival is starting for: %s", packageName)); + requestUnarchive(packageName, callerPackageName, getOrCreateLauncherListener(userId, packageName), UserHandle.of(userId), @@ -793,8 +810,27 @@ public class PackageArchiver { } } - mPm.mHandler.post( - () -> unarchiveInternal(packageName, userHandle, installerPackage, draftSessionId)); + mPm.mHandler.post(() -> { + Slog.i(TAG, "Starting app unarchival for: " + packageName); + unarchiveInternal(packageName, userHandle, installerPackage, + draftSessionId); + }); + } + + @Nullable + private PackageInstaller.SessionInfo getActiveUnarchivalSession(String packageName, + int userId) { + List activeSessions = + mPm.mInstallerService.getAllSessions(userId).getList(); + for (int idx = 0; idx < activeSessions.size(); idx++) { + PackageInstaller.SessionInfo activeSession = activeSessions.get(idx); + if (activeSession.appPackageName.equals(packageName) + && activeSession.userId == userId && activeSession.active + && activeSession.isUnarchival()) { + return activeSession; + } + } + return null; } private void requestUnarchiveConfirmation(String packageName, IntentSender statusReceiver, -- cgit v1.2.3-59-g8ed1b