summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Daniel Sandler <dsandler@android.com> 2012-10-10 22:58:58 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2012-10-10 22:58:59 -0700
commit6918d9f970989f1e5ca5a03b04d10a4c890721e9 (patch)
treee2b723eae93fcc7a95d3e86790c665a6d10238f1
parent6c179ad82d45a33389e65d89305ed0919042674f (diff)
parentc13107046acfcda7e3402a56a617818b7e77e1b8 (diff)
Merge "Remove Dream windows immediately." into jb-mr1-dev
-rw-r--r--core/java/android/service/dreams/DreamService.java17
1 files changed, 13 insertions, 4 deletions
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index f86545546eaa..c72b714bf374 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -37,6 +37,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
+import android.view.WindowManagerGlobal;
import android.view.WindowManager.LayoutParams;
import android.view.accessibility.AccessibilityEvent;
@@ -510,8 +511,12 @@ public class DreamService extends Service implements Window.Callback {
@Override
public void onDestroy() {
if (mDebug) Slog.v(TAG, "onDestroy()");
- super.onDestroy();
// hook for subclasses
+
+ // Just in case destroy came in before detach, let's take care of that now
+ detach();
+
+ super.onDestroy();
}
// end public api
@@ -521,13 +526,13 @@ public class DreamService extends Service implements Window.Callback {
}
/**
- * Called when the Dream is about to be unbound and destroyed.
+ * Called by DreamController.stopDream() when the Dream is about to be unbound and destroyed.
*
* Must run on mHandler.
*/
private final void detach() {
if (mWindow == null) {
- Slog.e(TAG, "detach() called when not attached");
+ // already detached!
return;
}
@@ -540,7 +545,11 @@ public class DreamService extends Service implements Window.Callback {
if (mDebug) Slog.v(TAG, "detach(): Removing window from window manager");
try {
- mWindowManager.removeView(mWindow.getDecorView());
+ // force our window to be removed synchronously
+ mWindowManager.removeViewImmediate(mWindow.getDecorView());
+ // the following will print a log message if it finds any other leaked windows
+ WindowManagerGlobal.getInstance().closeAll(mWindowToken,
+ this.getClass().getName(), "Dream");
} catch (Throwable t) {
Slog.w(TAG, "Crashed removing window view", t);
}