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

Commit 281103e6 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Refactor PackageWatchdog to use VersionedPackage"

parents ea935407 71d931e9
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;
        }