diff options
author | Roman Birg <roman@cyngn.com> | 2015-07-09 12:21:55 -0700 |
---|---|---|
committer | Gerrit Code Review <gerrit@cyanogenmod.org> | 2015-07-09 17:11:28 -0700 |
commit | 43b21f616154133e641abaf309058d5abf070a7c (patch) | |
tree | 3ef7f81065bfee47126695932555dc3b544fe22c | |
parent | 6e430b6c121978796064fe33d11e0b7af41abafe (diff) | |
download | android_frameworks_base-43b21f616154133e641abaf309058d5abf070a7c.tar.gz android_frameworks_base-43b21f616154133e641abaf309058d5abf070a7c.tar.bz2 android_frameworks_base-43b21f616154133e641abaf309058d5abf070a7c.zip |
WallpaperManagerService: use a single file observer
In order to clean up logic, 2a80ec9 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: Roman Birg <roman@cyngn.com>
-rw-r--r-- | services/core/java/com/android/server/wallpaper/WallpaperManagerService.java | 92 |
1 files changed, 28 insertions, 64 deletions
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 1cd8030d4f8..e4530c4137b 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -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(); } } |