[DO NOT MERGE] Prevent crash from early Toast surface destruction.
am: 016c9c8cb5
Change-Id: Ib33d75a050a1b79de9590f2dbe03609c6e2b4463
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user