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

Commit 43b21f61 authored by Roman Birg's avatar Roman Birg Committed by Gerrit Code Review
Browse files

WallpaperManagerService: use a single file observer



In order to clean up logic, 2a80ec9a split up to have two separate file
observers, since there are two separate objects, one for kg, one for
regular wallpaper. However, there can only be one file observer
registered for a directory. This was causing the keyguard observer
getting all the inotify events since it was the last one registered,
which stopped regular wallpaper change detections until a reboot.

Move the file observer logic out of the wallpaper info and make it
work for both.

Change-Id: I8fd4976fb4731abe52dfcc8064af2edc42b274f9
Signed-off-by: default avatarRoman Birg <roman@cyngn.com>
parent 6e430b6c
Loading
Loading
Loading
Loading
+28 −64
Original line number Diff line number Diff line
@@ -107,6 +107,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
    static final String KEYGUARD_WALLPAPER = "keyguard_wallpaper";
    static final String KEYGUARD_WALLPAPER_INFO = "keyguard_wallpaper_info.xml";

    private WallpaperObserver mWallpaperObserver;

    /**
     * Observes the wallpaper for changes and notifies all IWallpaperServiceCallbacks
     * that the wallpaper has changed. The CREATE is triggered when there is no
@@ -120,13 +122,22 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
        final File mWallpaperFile;
        final File mWallpaperInfoFile;

        public WallpaperObserver(WallpaperData wallpaper) {
        final KeyguardWallpaperData mKeyguardWallpaper;
        final File mKeyguardWallpaperFile;
        final File mKeyguardWallpaperInfoFile;

        public WallpaperObserver(WallpaperData wallpaper,
                                 KeyguardWallpaperData keyguardWallpaperData) {
            super(getWallpaperDir(wallpaper.userId).getAbsolutePath(),
                    CLOSE_WRITE | MOVED_TO | DELETE | DELETE_SELF);
            mWallpaperDir = getWallpaperDir(wallpaper.userId);
            mWallpaper = wallpaper;
            mWallpaperFile = new File(mWallpaperDir, WALLPAPER);
            mWallpaperInfoFile = new File(mWallpaperDir, WALLPAPER_INFO);

            mKeyguardWallpaper = keyguardWallpaperData;
            mKeyguardWallpaperFile = new File(mWallpaperDir, KEYGUARD_WALLPAPER);
            mKeyguardWallpaperInfoFile = new File(mWallpaperDir, KEYGUARD_WALLPAPER_INFO);
        }

        @Override
@@ -144,9 +155,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
                    bm.dataChanged();
                    Binder.restoreCallingIdentity(origId);
                }
                final boolean written = (event == CLOSE_WRITE || event == MOVED_TO);
                if (mWallpaperFile.equals(changedFile)) {
                    notifyCallbacksLocked(mWallpaper);
                    final boolean written = (event == CLOSE_WRITE || event == MOVED_TO);
                    if (mWallpaper.wallpaperComponent == null
                            || event != CLOSE_WRITE // includes the MOVED_TO case
                            || mWallpaper.imageWallpaperPending) {
@@ -157,34 +168,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
                                false, mWallpaper, null);
                        saveSettingsLocked(mWallpaper);
                    }
                }
            }
        }
    }

    private class KeyguardWallpaperObserver extends FileObserver {

        final KeyguardWallpaperData mKeyguardWallpaper;
        final File mWallpaperDir;
        final File mKeyguardWallpaperFile;

        public KeyguardWallpaperObserver(KeyguardWallpaperData keyguardWallpaper) {
            super(getWallpaperDir(keyguardWallpaper.userId).getAbsolutePath(),
                    CLOSE_WRITE | MOVED_TO | DELETE | DELETE_SELF);
            mWallpaperDir = getWallpaperDir(keyguardWallpaper.userId);
            mKeyguardWallpaper = keyguardWallpaper;
            mKeyguardWallpaperFile = new File(mWallpaperDir, KEYGUARD_WALLPAPER);
        }

        @Override
        public void onEvent(int event, String path) {
            if (path == null) {
                return;
            }
            synchronized (mLock) {
                File changedFile = new File(mWallpaperDir, path);
                final boolean written = (event == CLOSE_WRITE || event == MOVED_TO);
                if (mKeyguardWallpaperFile.equals(changedFile)) {
                } else if (mKeyguardWallpaperFile.equals(changedFile)) {
                    notifyCallbacksLocked(mKeyguardWallpaper);
                    if (written
                            || mKeyguardWallpaper.imageWallpaperPending) {
@@ -245,7 +229,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
        WallpaperConnection connection;
        long lastDiedTime;
        boolean wallpaperUpdating;
        WallpaperObserver wallpaperObserver;

        /**
         * List of callbacks registered they should each be notified when the wallpaper is changed.
@@ -280,8 +263,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
         */
        String name = "";

        KeyguardWallpaperObserver keyguardWallpaperObserver;

        /**
         * List of callbacks registered they should each be notified when the wallpaper is changed.
         */
@@ -565,13 +546,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        for (int i = 0; i < mWallpaperMap.size(); i++) {
            WallpaperData wallpaper = mWallpaperMap.valueAt(i);
            wallpaper.wallpaperObserver.stopWatching();
        }
        for (int i = 0; i < mKeyguardWallpaperMap.size(); i++) {
            KeyguardWallpaperData wallpaper = mKeyguardWallpaperMap.valueAt(i);
            wallpaper.keyguardWallpaperObserver.stopWatching();
        if (mWallpaperObserver != null) {
            mWallpaperObserver.stopWatching();
            mWallpaperObserver = null;
        }
    }

@@ -580,12 +557,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
        WallpaperData wallpaper = mWallpaperMap.get(UserHandle.USER_OWNER);
        KeyguardWallpaperData keyguardWallpaper = mKeyguardWallpaperMap.get(UserHandle.USER_OWNER);
        switchWallpaper(wallpaper, null);
        wallpaper.wallpaperObserver = new WallpaperObserver(wallpaper);
        wallpaper.wallpaperObserver.startWatching();

        keyguardWallpaper.keyguardWallpaperObserver
                = new KeyguardWallpaperObserver(keyguardWallpaper);
        keyguardWallpaper.keyguardWallpaperObserver.startWatching();
        mWallpaperObserver = new WallpaperObserver(wallpaper, keyguardWallpaper);
        mWallpaperObserver.startWatching();

        IntentFilter userFilter = new IntentFilter();
        userFilter.addAction(Intent.ACTION_USER_REMOVED);
@@ -639,20 +613,17 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
    void onStoppingUser(int userId) {
        if (userId < 1) return;
        synchronized (mLock) {
            if (mWallpaperObserver != null) {
                mWallpaperObserver.stopWatching();
                mWallpaperObserver = null;
            }

            WallpaperData wallpaper = mWallpaperMap.get(userId);
            if (wallpaper != null) {
                if (wallpaper.wallpaperObserver != null) {
                    wallpaper.wallpaperObserver.stopWatching();
                    wallpaper.wallpaperObserver = null;
                }
                mWallpaperMap.remove(userId);
            }
            KeyguardWallpaperData kgwallpaper = mKeyguardWallpaperMap.get(userId);
            if (kgwallpaper != null) {
                if (kgwallpaper.keyguardWallpaperObserver != null) {
                    kgwallpaper.keyguardWallpaperObserver.stopWatching();
                    kgwallpaper.keyguardWallpaperObserver = null;
                }
                mKeyguardWallpaperMap.remove(userId);
            }
        }
@@ -689,15 +660,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
                mKeyguardWallpaperMap.put(userId, keygaurdWallpaper);
                loadKeyguardSettingsLocked(userId);
            }
            // Not started watching yet, in case wallpaper data was loaded for other reasons.
            if (wallpaper.wallpaperObserver == null) {
                wallpaper.wallpaperObserver = new WallpaperObserver(wallpaper);
                wallpaper.wallpaperObserver.startWatching();
            }
            if (keygaurdWallpaper.keyguardWallpaperObserver == null) {
                keygaurdWallpaper.keyguardWallpaperObserver
                        = new KeyguardWallpaperObserver(keygaurdWallpaper);
                keygaurdWallpaper.keyguardWallpaperObserver.startWatching();
            if (mWallpaperObserver == null) {
                mWallpaperObserver = new WallpaperObserver(wallpaper, keygaurdWallpaper);
                mWallpaperObserver.startWatching();
            }
            switchWallpaper(wallpaper, reply);
        }
@@ -983,9 +948,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {

    /** @hide */
    public boolean isKeyguardWallpaperSet() {
        int userId = UserHandle.getCallingUserId();
        synchronized (mLock) {
            KeyguardWallpaperData data = mKeyguardWallpaperMap.get(userId);
            KeyguardWallpaperData data = mKeyguardWallpaperMap.get(mCurrentUserId);
            return data.wallpaperFile.exists();
        }
    }