From ebebadb56d6b3eab6e11dae9d48d639f0af4946d Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Wed, 5 Mar 2014 22:17:26 +0100 Subject: Fixed a bug where the current wallpaper could be reset on an update There is a race condition which caused the wallpaper to be reset on an app update since the broadcast notifying the service is async. This CL corrects this behaviour by enforcing that we only reset the wallpaper if its service was shut down twice in a certain timeframe. Before, the condition falsely was checking whether the service was started in the last couple of millis instead of killed. Bug: 11901821 Change-Id: Icfbc7a5df63215079a83805c5187a3182b192757 --- .../server/wallpaper/WallpaperManagerService.java | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'services/core/java') diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 97ea52c..87953fe 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -230,7 +230,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { public void onServiceConnected(ComponentName name, IBinder service) { synchronized (mLock) { if (mWallpaper.connection == this) { - mWallpaper.lastDiedTime = SystemClock.uptimeMillis(); mService = IWallpaperService.Stub.asInterface(service); attachServiceLocked(this, mWallpaper); // XXX should probably do saveSettingsLocked() later @@ -250,11 +249,21 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { if (mWallpaper.connection == this) { Slog.w(TAG, "Wallpaper service gone: " + mWallpaper.wallpaperComponent); if (!mWallpaper.wallpaperUpdating - && (mWallpaper.lastDiedTime + MIN_WALLPAPER_CRASH_TIME) - > SystemClock.uptimeMillis() && mWallpaper.userId == mCurrentUserId) { - Slog.w(TAG, "Reverting to built-in wallpaper!"); - clearWallpaperLocked(true, mWallpaper.userId, null); + // There is a race condition which causes + // {@link #mWallpaper.wallpaperUpdating} to be false even if it is + // currently updating since the broadcast notifying us is async. + // This race is overcome by the general rule that we only reset the + // wallpaper if its service was shut down twice + // during {@link #MIN_WALLPAPER_CRASH_TIME} millis. + if (mWallpaper.lastDiedTime != 0 + && mWallpaper.lastDiedTime + MIN_WALLPAPER_CRASH_TIME + > SystemClock.uptimeMillis()) { + Slog.w(TAG, "Reverting to built-in wallpaper!"); + clearWallpaperLocked(true, mWallpaper.userId, null); + } else { + mWallpaper.lastDiedTime = SystemClock.uptimeMillis(); + } } } } @@ -938,7 +947,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } wallpaper.wallpaperComponent = componentName; wallpaper.connection = newConn; - wallpaper.lastDiedTime = SystemClock.uptimeMillis(); newConn.mReply = reply; try { if (wallpaper.userId == mCurrentUserId) { -- cgit v1.1