[DO NOT MERGE] Prevent crash from early Toast surface destruction. am: 016c9c8cb5

am: a7ff8fbe74

Change-Id: Id672b82ddba7aee6e3c2748a7fae1e9f879538aa
This commit is contained in:
Svetoslav Ganov
2017-01-17 23:02:56 +00:00
committed by android-build-merger

View File

@@ -100,7 +100,7 @@ public class Toast {
*/ */
public Toast(Context context) { public Toast(Context context) {
mContext = context; mContext = context;
mTN = new TN(); mTN = new TN(context.getPackageName());
mTN.mY = context.getResources().getDimensionPixelSize( mTN.mY = context.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.toast_y_offset); com.android.internal.R.dimen.toast_y_offset);
mTN.mGravity = context.getResources().getInteger( mTN.mGravity = context.getResources().getInteger(
@@ -133,13 +133,7 @@ public class Toast {
* after the appropriate duration. * after the appropriate duration.
*/ */
public void cancel() { public void cancel() {
mTN.hide(); mTN.cancel();
try {
getService().cancelToast(mContext.getPackageName(), mTN);
} catch (RemoteException e) {
// Empty
}
} }
/** /**
@@ -331,18 +325,40 @@ public class Toast {
final Runnable mHide = new Runnable() { final Runnable mHide = new Runnable() {
@Override @Override
public void run() { 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 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() { final Handler mHandler = new Handler() {
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
switch (msg.what) {
case SHOW: {
IBinder token = (IBinder) msg.obj; IBinder token = (IBinder) msg.obj;
handleShow(token); 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; WindowManager mWM;
String mPackageName;
static final long SHORT_DURATION_TIMEOUT = 5000; static final long SHORT_DURATION_TIMEOUT = 5000;
static final long LONG_DURATION_TIMEOUT = 1000; static final long LONG_DURATION_TIMEOUT = 1000;
TN() { TN(String packageName) {
// XXX This should be changed to use a Dialog, with a Theme.Toast // XXX This should be changed to use a Dialog, with a Theme.Toast
// defined that sets up the layout params appropriately. // defined that sets up the layout params appropriately.
final WindowManager.LayoutParams params = mParams; final WindowManager.LayoutParams params = mParams;
@@ -374,6 +392,8 @@ public class Toast {
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
mPackageName = packageName;
} }
/** /**
@@ -382,7 +402,7 @@ public class Toast {
@Override @Override
public void show(IBinder windowToken) { public void show(IBinder windowToken) {
if (localLOGV) Log.v(TAG, "SHOW: " + this); 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 @Override
public void hide() { public void hide() {
if (localLOGV) Log.v(TAG, "HIDE: " + this); 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) { public void handleShow(IBinder windowToken) {