Notify RollbackManager of the apk session for a staged install.

The rollback manager needs to know the apk session to avoid doing an
extra backup of the apks when the apk session is applied post-reboot.

Bug: 112431924
Test: atest RollbackTest

Change-Id: Ie84969760b9b1fd3949a7241f23e52cfb403e294
diff --git a/core/java/android/content/rollback/IRollbackManager.aidl b/core/java/android/content/rollback/IRollbackManager.aidl
index d951756..db9fcb6 100644
--- a/core/java/android/content/rollback/IRollbackManager.aidl
+++ b/core/java/android/content/rollback/IRollbackManager.aidl
@@ -47,4 +47,8 @@
     //
     // NOTE: This call is synchronous.
     boolean notifyStagedSession(int sessionId);
+
+    // Used by the staging manager to notify the RollbackManager of the apk
+    // session for a staged session.
+    void notifyStagedApkSession(int originalSessionId, int apkSessionId);
 }
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index 55eb7ea..89aea36 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -380,6 +380,19 @@
 
     private boolean commitApkSession(@NonNull PackageInstallerSession apkSession,
                                      int originalSessionId) {
+
+        if ((apkSession.params.installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) != 0) {
+            // If rollback is available for this session, notify the rollback
+            // manager of the apk session so it can properly enable rollback.
+            final IRollbackManager rm = IRollbackManager.Stub.asInterface(
+                    ServiceManager.getService(Context.ROLLBACK_SERVICE));
+            try {
+                rm.notifyStagedApkSession(originalSessionId, apkSession.sessionId);
+            } catch (RemoteException re) {
+                // Cannot happen, the rollback manager is in the same process.
+            }
+        }
+
         final LocalIntentReceiver receiver = new LocalIntentReceiver();
         apkSession.commit(receiver.getIntentSender(), false);
         final Intent result = receiver.getResult();
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index 438e479..7445c00 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -928,6 +928,11 @@
         }
     }
 
+    @Override
+    public void notifyStagedApkSession(int originalSessionId, int apkSessionId) {
+        // TODO: Handle this callback.
+    }
+
     /**
      * Gets the version of the package currently installed.
      * Returns null if the package is not currently installed.