From b6ee2a24292120f95bb5da4539a0672280544be3 Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Mon, 27 Aug 2012 16:55:04 -0700 Subject: [PATCH] Use correct WindowManager for Toast. The WindowManager retrieved from the activity Context with getSystemService is incorrect for a Toast. Because it contains a parent window when addView is called its LayoutParams.token is set to the value of the parent window. Then when an Activity is dismissed WindowManagerGlobal.closeAll() sees the incorrect token and incorrectly closes the Toast. This fix uses the application Context instead of the activity Context to retrieve a WindowManager with no parent window. This leaves the token unchanged and keeps from dismissing the toast when the activity is closed. Fixes bug 7048792. Change-Id: I92c3095d8fabd6e9e4206e9bc8e917885ab322a9 --- core/java/android/widget/Toast.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java index 053ade7ced7c7..e8bf9d958f695 100644 --- a/core/java/android/widget/Toast.java +++ b/core/java/android/widget/Toast.java @@ -305,12 +305,14 @@ public class Toast { private static class TN extends ITransientNotification.Stub { final Runnable mShow = new Runnable() { + @Override public void run() { handleShow(); } }; final Runnable mHide = new Runnable() { + @Override public void run() { handleHide(); // Don't do this in handleHide() because it is also invoked by handleShow() @@ -329,7 +331,7 @@ public class Toast { View mView; View mNextView; - + WindowManager mWM; TN() { @@ -350,6 +352,7 @@ public class Toast { /** * schedule handleShow into the right thread */ + @Override public void show() { if (localLOGV) Log.v(TAG, "SHOW: " + this); mHandler.post(mShow); @@ -358,6 +361,7 @@ public class Toast { /** * schedule handleHide into the right thread */ + @Override public void hide() { if (localLOGV) Log.v(TAG, "HIDE: " + this); mHandler.post(mHide); @@ -370,7 +374,8 @@ public class Toast { // remove the old view if necessary handleHide(); mView = mNextView; - mWM = (WindowManager)mView.getContext().getSystemService(Context.WINDOW_SERVICE); + mWM = (WindowManager)mView.getContext().getApplicationContext() + .getSystemService(Context.WINDOW_SERVICE); // We can resolve the Gravity here by using the Locale for getting // the layout direction final Configuration config = mView.getContext().getResources().getConfiguration();