Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 71d931e9 authored by Zimuzo's avatar Zimuzo
Browse files

Refactor PackageWatchdog to use VersionedPackage

We now pass a VersionedPackage argument instead of passing separate
method arguments for packageName and versionCode.

Test: atest PackageWatchdogtest
Bug: 120598832
Change-Id: I8dd7e6d1e144251830108c58f4a752c411d7295b
parent 2c135398
Loading
Loading
Loading
Loading
+8 −10
Original line number Diff line number Diff line
@@ -247,9 +247,8 @@ public class PackageWatchdog {
                }

                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 @@ public class PackageWatchdog {
                        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 @@ public class PackageWatchdog {

                    // Execute action with least user impact
                    if (currentObserverToNotify != null) {
                        currentObserverToNotify.execute(packageToReport, packageVersionCode);
                        currentObserverToNotify.execute(versionedPackage);
                    }
                }
            }
@@ -310,19 +308,19 @@ public class PackageWatchdog {
    /** 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?
        /**
+13 −11
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
    }

    @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 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve

        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 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
    }

    @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 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve

        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 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve

        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 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
    }

    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
@@ -143,9 +144,10 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
            for (PackageRollbackInfo packageRollback : rollback.getPackages()) {
                hasModuleMetadataPackage |= packageRollback.getPackageName().equals(
                        moduleMetadataPackage.getPackageName());
                hasFailedPackage |= packageRollback.getPackageName().equals(packageName)
                hasFailedPackage |= packageRollback.getPackageName().equals(
                        failedPackage.getPackageName())
                        && packageRollback.getVersionRolledBackFrom().getVersionCode()
                        == versionCode;
                        == failedPackage.getVersionCode();
            }
            if (hasModuleMetadataPackage && hasFailedPackage) {
                return rollback;
+6 −5
Original line number Diff line number Diff line
@@ -242,8 +242,9 @@ public class PackageWatchdogTest {
        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 @@ public class PackageWatchdogTest {
            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;
        }