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

Commit e5371006 authored by Lee Shombert's avatar Lee Shombert
Browse files

Support for Watchable verification

Bug: 161323622

Add support to automate verification of Watched attributes.  It is now
possible to verify that all Watched attributes of class Watchable are
being observed.  It is also possible to know that Watched attributes
of class Snappable have been copied properly into a snapshot.

Tested on Settings by commenting-out a registerObserver() call and
verifying that an exception was thrown.

Test: atest
 * FrameworksServicesTests:WatcherTest
 * FrameworksServicesTests:PackageManagerSettingsTests
 * FrameworksServicesTests:AppsFilterTest

Change-Id: Ia2bff16bec7bff0b8b8e401ad5377bad8297b527
parent a1779c1e
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -39,28 +39,45 @@ public abstract class WatchableIntentResolver<F, R extends Object>
     * Watchable machinery
     */
    private final Watchable mWatchable = new WatchableImpl();

    /**
     * Register an observer to receive change notifications.
     * @param observer The observer to register.
     */
    @Override
    public void registerObserver(@NonNull Watcher observer) {
        mWatchable.registerObserver(observer);
    }

    /**
     * Unregister the observer, which will no longer receive change notifications.
     * @param observer The observer to unregister.
     */
    @Override
    public void unregisterObserver(@NonNull Watcher observer) {
        mWatchable.unregisterObserver(observer);
    }

    /**
     * Return true if the {@link Watcher) is a registered observer.
     * @param observer A {@link Watcher} that might be registered
     * @return true if the observer is registered with this {@link Watchable}.
     */
    @Override
    public boolean isRegisteredObserver(@NonNull Watcher observer) {
        return mWatchable.isRegisteredObserver(observer);
    }

    /**
     * Notify listeners that the object has changd.  The argument is a hint as to the
     * source of the change.
     * @param what The attribute or sub-object that changed, if not null.
     */
    @Override
    public void dispatchChange(@Nullable Watchable what) {
        mWatchable.dispatchChange(what);
    }

    /**
     * Notify listeners that this object has changed.
     */
+13 −0
Original line number Diff line number Diff line
@@ -167,6 +167,7 @@ public class AppsFilter implements Watchable, Snappable {
     *
     * @param observer The {@link Watcher} to be notified when the {@link Watchable} changes.
     */
    @Override
    public void registerObserver(@NonNull Watcher observer) {
        mWatchable.registerObserver(observer);
    }
@@ -177,10 +178,21 @@ public class AppsFilter implements Watchable, Snappable {
     *
     * @param observer The {@link Watcher} that should not be in the notification list.
     */
    @Override
    public void unregisterObserver(@NonNull Watcher observer) {
        mWatchable.unregisterObserver(observer);
    }

    /**
     * Return true if the {@link Watcher) is a registered observer.
     * @param observer A {@link Watcher} that might be registered
     * @return true if the observer is registered with this {@link Watchable}.
     */
    @Override
    public boolean isRegisteredObserver(@NonNull Watcher observer) {
        return mWatchable.isRegisteredObserver(observer);
    }

    /**
     * Invokes {@link Watcher#onChange} on each registered observer.  The method can be called
     * with the {@link Watchable} that generated the event.  In a tree of {@link Watchable}s, this
@@ -188,6 +200,7 @@ public class AppsFilter implements Watchable, Snappable {
     *
     * @param what The {@link Watchable} that generated the event.
     */
    @Override
    public void dispatchChange(@Nullable Watchable what) {
        mSnapshot = null;
        mWatchable.dispatchChange(what);
+3 −0
Original line number Diff line number Diff line
@@ -154,6 +154,9 @@ class InstantAppRegistry implements Watchable, Snappable {
    public void unregisterObserver(@NonNull Watcher observer) {
        mWatchable.unregisterObserver(observer);
    }
    public boolean isRegisteredObserver(@NonNull Watcher observer) {
        return mWatchable.isRegisteredObserver(observer);
    }
    public void dispatchChange(@Nullable Watchable what) {
        mSnapshot = null;
        mWatchable.dispatchChange(what);
+14 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ public abstract class SettingBase implements Watchable {
     *
     * @param observer The {@link Watcher} to be notified when the {@link Watchable} changes.
     */
    @Override
    public void registerObserver(@NonNull Watcher observer) {
        mWatchable.registerObserver(observer);
    }
@@ -59,10 +60,21 @@ public abstract class SettingBase implements Watchable {
     *
     * @param observer The {@link Watcher} that should not be in the notification list.
     */
    @Override
    public void unregisterObserver(@NonNull Watcher observer) {
        mWatchable.unregisterObserver(observer);
    }

    /**
     * Return true if the {@link Watcher) is a registered observer.
     * @param observer A {@link Watcher} that might be registered
     * @return true if the observer is registered with this {@link Watchable}.
     */
    @Override
    public boolean isRegisteredObserver(@NonNull Watcher observer) {
        return mWatchable.isRegisteredObserver(observer);
    }

    /**
     * Invokes {@link Watcher#onChange} on each registered observer.  The method can be called
     * with the {@link Watchable} that generated the event.  In a tree of {@link Watchable}s, this
@@ -70,9 +82,11 @@ public abstract class SettingBase implements Watchable {
     *
     * @param what The {@link Watchable} that generated the event.
     */
    @Override
    public void dispatchChange(@Nullable Watchable what) {
        mWatchable.dispatchChange(what);
    }

    /**
     * Notify listeners that this object has changed.
     */
+14 −1
Original line number Diff line number Diff line
@@ -191,6 +191,16 @@ public final class Settings implements Watchable, Snappable {
        mWatchable.unregisterObserver(observer);
    }

    /**
     * Return true if the {@link Watcher) is a registered observer.
     * @param observer A {@link Watcher} that might be registered
     * @return true if the observer is registered with this {@link Watchable}.
     */
    @Override
    public boolean isRegisteredObserver(@NonNull Watcher observer) {
        return mWatchable.isRegisteredObserver(observer);
    }

    /**
     * Invokes {@link Watcher#onChange} on each registered observer.  The method can be called
     * with the {@link Watchable} that generated the event.  In a tree of {@link Watchable}s, this
@@ -544,6 +554,8 @@ public final class Settings implements Watchable, Snappable {
        mRenamedPackages.registerObserver(mObserver);
        mDefaultBrowserApp.registerObserver(mObserver);
        mNextAppLinkGeneration.registerObserver(mObserver);

        Watchable.verifyWatchedAttributes(this, mObserver);
    }

    Settings(File dataDir, RuntimePermissionsPersistence runtimePermissionsPersistence,
@@ -574,7 +586,6 @@ public final class Settings implements Watchable, Snappable {
        mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml");
        mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml");


        mPackages.registerObserver(mObserver);
        mInstallerPackages.registerObserver(mObserver);
        mKernelMapping.registerObserver(mObserver);
@@ -591,6 +602,8 @@ public final class Settings implements Watchable, Snappable {
        mRenamedPackages.registerObserver(mObserver);
        mDefaultBrowserApp.registerObserver(mObserver);
        mNextAppLinkGeneration.registerObserver(mObserver);

        Watchable.verifyWatchedAttributes(this, mObserver);
    }

    /**
Loading