From af1f42be96a6ffa7a9b63e199e1614281ea3282d Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Fri, 20 Nov 2009 16:27:27 -0800 Subject: Fix issue #2271668: Live Wallpaper Force-Close when changing from live wallpaper to picasa wallpaper The detach of the wallpaper engine was coming in after the containing service was destroyed. This was possible because these are different IPC interfaces so will not be serialized. The fix is to keep track of all of the active engines in the serice, and detach any remaining ones when the service is destroyed. Change-Id: I8810786a777dd4f7b15cfbd2e0da25866a4f3ec5 --- .../service/wallpaper/WallpaperService.java | 30 ++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'core/java/android/service') diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index ccb8f1c..45719e4 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -44,6 +44,8 @@ import android.view.ViewRoot; import android.view.WindowManager; import android.view.WindowManagerImpl; +import java.util.ArrayList; + /** * A wallpaper service is responsible for showing a live wallpaper behind * applications that would like to sit on top of it. This service object @@ -83,6 +85,8 @@ public abstract class WallpaperService extends Service { private static final int MSG_TOUCH_EVENT = 10040; private Looper mCallbackLooper; + private final ArrayList mActiveEngines + = new ArrayList(); static final class WallpaperCommand { String action; @@ -596,8 +600,10 @@ public abstract class WallpaperService extends Service { } void doVisibilityChanged(boolean visible) { - mVisible = visible; - reportVisibility(); + if (!mDestroyed) { + mVisible = visible; + reportVisibility(); + } } void reportVisibility() { @@ -666,6 +672,10 @@ public abstract class WallpaperService extends Service { } void detach() { + if (mDestroyed) { + return; + } + mDestroyed = true; if (mVisible) { @@ -773,10 +783,12 @@ public abstract class WallpaperService extends Service { } Engine engine = onCreateEngine(); mEngine = engine; + mActiveEngines.add(engine); engine.attach(this); return; } case DO_DETACH: { + mActiveEngines.remove(mEngine); mEngine.detach(); return; } @@ -844,6 +856,20 @@ public abstract class WallpaperService extends Service { } } + @Override + public void onCreate() { + super.onCreate(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + for (int i=0; i