From 43b21f616154133e641abaf309058d5abf070a7c Mon Sep 17 00:00:00 2001 From: Roman Birg Date: Thu, 9 Jul 2015 12:21:55 -0700 Subject: 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 --- .../server/wallpaper/WallpaperManagerService.java | 92 +++++++--------------- 1 file 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(); } } -- cgit v1.2.3