Merge "Refactor PackageWatchdog to use VersionedPackage"
diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java
index 4507193..ec40971 100644
--- a/services/core/java/com/android/server/PackageWatchdog.java
+++ b/services/core/java/com/android/server/PackageWatchdog.java
@@ -247,9 +247,8 @@
                 }
 
                 for (int pIndex = 0; pIndex < packages.size(); pIndex++) {
-                    String packageToReport = packages.get(pIndex).getPackageName();
-                    long packageVersionCode = packages.get(pIndex).getVersionCode();
-                    // Observer that will receive failure for packageToReport
+                    VersionedPackage versionedPackage = packages.get(pIndex);
+                    // Observer that will receive failure for versionedPackage
                     PackageHealthObserver currentObserverToNotify = null;
                     int currentObserverImpact = Integer.MAX_VALUE;
 
@@ -258,9 +257,8 @@
                         ObserverInternal observer = mAllObservers.valueAt(oIndex);
                         PackageHealthObserver registeredObserver = observer.mRegisteredObserver;
                         if (registeredObserver != null
-                                && observer.onPackageFailure(packageToReport)) {
-                            int impact = registeredObserver.onHealthCheckFailed(packageToReport,
-                                    packageVersionCode);
+                                && observer.onPackageFailure(versionedPackage.getPackageName())) {
+                            int impact = registeredObserver.onHealthCheckFailed(versionedPackage);
                             if (impact != PackageHealthObserverImpact.USER_IMPACT_NONE
                                     && impact < currentObserverImpact) {
                                 currentObserverToNotify = registeredObserver;
@@ -271,7 +269,7 @@
 
                     // Execute action with least user impact
                     if (currentObserverToNotify != null) {
-                        currentObserverToNotify.execute(packageToReport, packageVersionCode);
+                        currentObserverToNotify.execute(versionedPackage);
                     }
                 }
             }
@@ -310,19 +308,19 @@
     /** Register instances of this interface to receive notifications on package failure. */
     public interface PackageHealthObserver {
         /**
-         * Called when health check fails for the {@code packageName}.
+         * Called when health check fails for the {@code versionedPackage}.
          *
          * @return any one of {@link PackageHealthObserverImpact} to express the impact
          * to the user on {@link #execute}
          */
-        @PackageHealthObserverImpact int onHealthCheckFailed(String packageName, long versionCdoe);
+        @PackageHealthObserverImpact int onHealthCheckFailed(VersionedPackage versionedPackage);
 
         /**
          * Executes mitigation for {@link #onHealthCheckFailed}.
          *
          * @return {@code true} if action was executed successfully, {@code false} otherwise
          */
-        boolean execute(String packageName, long versionCode);
+        boolean execute(VersionedPackage versionedPackage);
 
         // TODO(zezeozue): Ensure uniqueness?
         /**
diff --git a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
index d00817f..8e04160 100644
--- a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
+++ b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
@@ -57,7 +57,7 @@
     }
 
     @Override
-    public int onHealthCheckFailed(String packageName, long versionCode) {
+    public int onHealthCheckFailed(VersionedPackage failedPackage) {
         VersionedPackage moduleMetadataPackage = getModuleMetadataPackage();
         if (moduleMetadataPackage == null) {
             // Ignore failure, no mainline update available
@@ -66,7 +66,7 @@
 
         RollbackInfo rollback =
                 getAvailableMainlineRollback(mContext.getSystemService(RollbackManager.class),
-                    packageName, versionCode, moduleMetadataPackage);
+                        failedPackage, moduleMetadataPackage);
         if (rollback == null) {
             // Don't handle the notification, no rollbacks available for the package
             return PackageHealthObserverImpact.USER_IMPACT_NONE;
@@ -76,7 +76,7 @@
     }
 
     @Override
-    public boolean execute(String packageName, long versionCode) {
+    public boolean execute(VersionedPackage failedPackage) {
         VersionedPackage moduleMetadataPackage = getModuleMetadataPackage();
         if (moduleMetadataPackage == null) {
             // Ignore failure, no mainline update available
@@ -85,10 +85,11 @@
 
         RollbackManager rollbackManager = mContext.getSystemService(RollbackManager.class);
         RollbackInfo rollback = getAvailableMainlineRollback(rollbackManager,
-                packageName, versionCode, moduleMetadataPackage);
+                failedPackage, moduleMetadataPackage);
         if (rollback == null) {
-            Slog.w(TAG, "Expected rollback but no rollback found for package: [ "
-                    + packageName + "] with versionCode: [" + versionCode + "]");
+            Slog.w(TAG, "Expected rollback but no mainline rollback found for package: [ "
+                    + failedPackage.getPackageName() + "] with versionCode: ["
+                    + failedPackage.getVersionCode() + "]");
             return false;
         }
 
@@ -114,7 +115,7 @@
 
         mHandler.post(() ->
                 rollbackManager.commitRollback(rollback.getRollbackId(),
-                    Collections.singletonList(new VersionedPackage(packageName, versionCode)),
+                    Collections.singletonList(moduleMetadataPackage),
                     rollbackReceiver.getIntentSender()));
         // Assume rollback executed successfully
         return true;
@@ -134,7 +135,7 @@
     }
 
     private RollbackInfo getAvailableMainlineRollback(RollbackManager rollbackManager,
-            String packageName, long versionCode, VersionedPackage moduleMetadataPackage) {
+            VersionedPackage failedPackage, VersionedPackage moduleMetadataPackage) {
         for (RollbackInfo rollback : rollbackManager.getAvailableRollbacks()) {
             // We only rollback mainline packages, so check if rollback contains the
             // module metadata provider, if it does, the rollback is a mainline rollback
@@ -142,10 +143,11 @@
             boolean hasFailedPackage = false;
             for (PackageRollbackInfo packageRollback : rollback.getPackages()) {
                 hasModuleMetadataPackage |= packageRollback.getPackageName().equals(
-                                moduleMetadataPackage.getPackageName());
-                hasFailedPackage |= packageRollback.getPackageName().equals(packageName)
+                        moduleMetadataPackage.getPackageName());
+                hasFailedPackage |= packageRollback.getPackageName().equals(
+                        failedPackage.getPackageName())
                         && packageRollback.getVersionRolledBackFrom().getVersionCode()
-                        == versionCode;
+                        == failedPackage.getVersionCode();
             }
             if (hasModuleMetadataPackage && hasFailedPackage) {
                 return rollback;
diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
index c1c598d..77cd62e 100644
--- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
+++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java
@@ -242,8 +242,9 @@
         PackageWatchdog watchdog = createWatchdog();
         long differentVersionCode = 2L;
         TestObserver observer = new TestObserver(OBSERVER_NAME_1) {
-                public int onHealthCheckFailed(String packageName, long versionCode) {
-                    if (versionCode == VERSION_CODE) {
+                @Override
+                public int onHealthCheckFailed(VersionedPackage versionedPackage) {
+                    if (versionedPackage.getVersionCode() == VERSION_CODE) {
                         // Only rollback for specific versionCode
                         return PackageHealthObserverImpact.USER_IMPACT_MEDIUM;
                     }
@@ -457,12 +458,12 @@
             mImpact = impact;
         }
 
-        public int onHealthCheckFailed(String packageName, long versionCode) {
+        public int onHealthCheckFailed(VersionedPackage versionedPackage) {
             return mImpact;
         }
 
-        public boolean execute(String packageName, long versionCode) {
-            mFailedPackages.add(packageName);
+        public boolean execute(VersionedPackage versionedPackage) {
+            mFailedPackages.add(versionedPackage.getPackageName());
             return true;
         }