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

Commit 84e99020 authored by Gavin Corkery's avatar Gavin Corkery
Browse files

Allow registration of observers without specifying packages

This is a prerequisite for integrating RescueParty into PackageWatchdog.
Currently, an observer may only be registered for an existing
ObserverInternal, and the only way to add an ObserverInternal to
mAllObservers is to supply a set of packages.

Observers are pruned if they do not contain any packages. Change this
by adding a method to the PackageHealthObserver interface to indicate
whether an observer may process failures without an explicit set of
packages to monitor.

Test: atest PackageWatchdogTest
Bug: 136135457
Change-Id: Ic97f5d9892af949fe5bbc71ecf4b429f569964e9
parent b3913509
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -200,7 +200,8 @@ public class PackageWatchdog {
    }

    /**
     * Registers {@code observer} to listen for package failures
     * Registers {@code observer} to listen for package failures. Add a new ObserverInternal for
     * this observer if it does not already exist.
     *
     * <p>Observers are expected to call this on boot. It does not specify any packages but
     * it will resume observing any packages requested from a previous boot.
@@ -210,6 +211,11 @@ public class PackageWatchdog {
            ObserverInternal internalObserver = mAllObservers.get(observer.getName());
            if (internalObserver != null) {
                internalObserver.registeredObserver = observer;
            } else {
                internalObserver = new ObserverInternal(observer.getName(), new ArrayList<>());
                internalObserver.registeredObserver = observer;
                mAllObservers.put(observer.getName(), internalObserver);
                syncState("added new observer");
            }
        }
    }
@@ -415,6 +421,14 @@ public class PackageWatchdog {
         * watchdog may drop observing packages with the old name.
         */
        String getName();

        /**
         * An observer will not be pruned if this is set, even if the observer is not explicitly
         * monitoring any packages.
         */
        default boolean isPersistent() {
            return false;
        }
    }

    long getTriggerFailureCount() {
@@ -626,7 +640,8 @@ public class PackageWatchdog {
            if (!failedPackages.isEmpty()) {
                onHealthCheckFailed(observer, failedPackages);
            }
            if (observer.packages.isEmpty()) {
            if (observer.packages.isEmpty() && (observer.registeredObserver == null
                    || !observer.registeredObserver.isPersistent())) {
                Slog.i(TAG, "Discarding observer " + observer.name + ". All packages expired");
                it.remove();
            }