diff options
author | 2017-01-17 22:58:18 +0000 | |
---|---|---|
committer | 2017-01-17 22:58:18 +0000 | |
commit | a7ff8fbe74cc2c35fe2d5d3f9917ee13a38341e8 (patch) | |
tree | b4303a7d1bbbaca035db9c4d8cfb046166c7e009 | |
parent | 4518d0be1623c8d1925db9d480618f6c46ff1461 (diff) | |
parent | 016c9c8cb58c6940ae8296291ee33148a17ede65 (diff) |
[DO NOT MERGE] Prevent crash from early Toast surface destruction.
am: 016c9c8cb5
Change-Id: Ib33d75a050a1b79de9590f2dbe03609c6e2b4463
-rw-r--r-- | core/java/android/widget/Toast.java | 61 |
1 files changed, 43 insertions, 18 deletions
diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java index a400d90c64c5..4d9192ba8d24 100644 --- a/core/java/android/widget/Toast.java +++ b/core/java/android/widget/Toast.java @@ -100,13 +100,13 @@ public class Toast { */ public Toast(Context context) { mContext = context; - mTN = new TN(); + mTN = new TN(context.getPackageName()); mTN.mY = context.getResources().getDimensionPixelSize( com.android.internal.R.dimen.toast_y_offset); mTN.mGravity = context.getResources().getInteger( com.android.internal.R.integer.config_toastDefaultGravity); } - + /** * Show the view for the specified duration. */ @@ -133,15 +133,9 @@ public class Toast { * after the appropriate duration. */ public void cancel() { - mTN.hide(); - - try { - getService().cancelToast(mContext.getPackageName(), mTN); - } catch (RemoteException e) { - // Empty - } + mTN.cancel(); } - + /** * Set the view to show. * @see #getView @@ -331,18 +325,40 @@ public class Toast { final Runnable mHide = new Runnable() { @Override public void run() { - handleHide(); - // Don't do this in handleHide() because it is also invoked by handleShow() - mNextView = null; } }; private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); + + private static final int SHOW = 0; + private static final int HIDE = 1; + private static final int CANCEL = 2; final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { - IBinder token = (IBinder) msg.obj; - handleShow(token); + switch (msg.what) { + case SHOW: { + IBinder token = (IBinder) msg.obj; + handleShow(token); + break; + } + case HIDE: { + handleHide(); + // Don't do this in handleHide() because it is also invoked by handleShow() + mNextView = null; + break; + } + case CANCEL: { + handleHide(); + // Don't do this in handleHide() because it is also invoked by handleShow() + mNextView = null; + try { + getService().cancelToast(mPackageName, TN.this); + } catch (RemoteException e) { + } + break; + } + } } }; @@ -358,10 +374,12 @@ public class Toast { WindowManager mWM; + String mPackageName; + static final long SHORT_DURATION_TIMEOUT = 5000; static final long LONG_DURATION_TIMEOUT = 1000; - TN() { + TN(String packageName) { // XXX This should be changed to use a Dialog, with a Theme.Toast // defined that sets up the layout params appropriately. final WindowManager.LayoutParams params = mParams; @@ -374,6 +392,8 @@ public class Toast { params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; + + mPackageName = packageName; } /** @@ -382,7 +402,7 @@ public class Toast { @Override public void show(IBinder windowToken) { if (localLOGV) Log.v(TAG, "SHOW: " + this); - mHandler.obtainMessage(0, windowToken).sendToTarget(); + mHandler.obtainMessage(SHOW, windowToken).sendToTarget(); } /** @@ -391,7 +411,12 @@ public class Toast { @Override public void hide() { if (localLOGV) Log.v(TAG, "HIDE: " + this); - mHandler.post(mHide); + mHandler.obtainMessage(HIDE).sendToTarget(); + } + + public void cancel() { + if (localLOGV) Log.v(TAG, "CANCEL: " + this); + mHandler.obtainMessage(CANCEL).sendToTarget(); } public void handleShow(IBinder windowToken) { |