Allow StagingManager to abort individual staged session

Now that apexd can stage multiple sessions, we need to be able to abort
specific staged session during pre-reboot verification. The only need to
abort activated session while resuming staged session during boot.

Bug: 141843321
Test: atest StagedInstallTest
Change-Id: I97d4216e1fe9ec6c98474ec12f4046b002d9edda
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java
index 44c36ee0..4f9b396 100644
--- a/services/core/java/com/android/server/pm/ApexManager.java
+++ b/services/core/java/com/android/server/pm/ApexManager.java
@@ -209,6 +209,13 @@
     abstract boolean abortActiveSession();
 
     /**
+     * Abandons the staged session with the given sessionId.
+     *
+     * @return {@code true} upon success, {@code false} if any remote exception occurs
+     */
+    abstract boolean abortStagedSession(int sessionId) throws PackageManagerException;
+
+    /**
      * Uninstalls given {@code apexPackage}.
      *
      * <p>NOTE. Device must be rebooted in order for uninstall to take effect.
@@ -496,6 +503,21 @@
         }
 
         @Override
+        boolean abortStagedSession(int sessionId) throws PackageManagerException {
+            try {
+                mApexService.abortStagedSession(sessionId);
+                return true;
+            } catch (RemoteException re) {
+                Slog.e(TAG, "Unable to contact apexservice", re);
+                return false;
+            } catch (Exception e) {
+                throw new PackageManagerException(
+                        PackageInstaller.SessionInfo.STAGED_SESSION_VERIFICATION_FAILED,
+                        "Failed to abort staged session : " + e.getMessage());
+            }
+        }
+
+        @Override
         boolean uninstallApex(String apexPackagePath) {
             try {
                 mApexService.unstagePackages(Collections.singletonList(apexPackagePath));
@@ -683,6 +705,11 @@
         }
 
         @Override
+        boolean abortStagedSession(int sessionId) throws PackageManagerException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
         boolean uninstallApex(String apexPackagePath) {
             throw new UnsupportedOperationException();
         }