Loading core/java/android/widget/Toast.java +78 −81 Original line number Diff line number Diff line Loading @@ -33,8 +33,6 @@ import android.view.WindowManagerImpl; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import java.lang.ref.WeakReference; /** * A toast is a view containing a quick little message for the user. The toast class * helps you create and show those. Loading Loading @@ -72,11 +70,6 @@ public class Toast { final Context mContext; final TN mTN; int mDuration; int mGravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; int mX, mY; float mHorizontalMargin; float mVerticalMargin; View mView; View mNextView; /** Loading @@ -88,8 +81,8 @@ public class Toast { */ public Toast(Context context) { mContext = context; mTN = new TN(this); mY = context.getResources().getDimensionPixelSize( mTN = new TN(); mTN.mY = context.getResources().getDimensionPixelSize( com.android.internal.R.dimen.toast_y_offset); } Loading @@ -103,9 +96,11 @@ public class Toast { INotificationManager service = getService(); String pkg = mContext.getPackageName(); TN tn = mTN; tn.mNextView = mNextView; try { service.enqueueToast(pkg, mTN, mDuration); service.enqueueToast(pkg, tn, mDuration); } catch (RemoteException e) { // Empty } Loading Loading @@ -165,22 +160,22 @@ public class Toast { * notification */ public void setMargin(float horizontalMargin, float verticalMargin) { mHorizontalMargin = horizontalMargin; mVerticalMargin = verticalMargin; mTN.mHorizontalMargin = horizontalMargin; mTN.mVerticalMargin = verticalMargin; } /** * Return the horizontal margin. */ public float getHorizontalMargin() { return mHorizontalMargin; return mTN.mHorizontalMargin; } /** * Return the vertical margin. */ public float getVerticalMargin() { return mVerticalMargin; return mTN.mVerticalMargin; } /** Loading @@ -189,9 +184,9 @@ public class Toast { * @see #getGravity */ public void setGravity(int gravity, int xOffset, int yOffset) { mGravity = gravity; mX = xOffset; mY = yOffset; mTN.mGravity = gravity; mTN.mX = xOffset; mTN.mY = yOffset; } /** Loading @@ -200,21 +195,21 @@ public class Toast { * @see #getGravity */ public int getGravity() { return mGravity; return mTN.mGravity; } /** * Return the X offset in pixels to apply to the gravity's location. */ public int getXOffset() { return mX; return mTN.mX; } /** * Return the Y offset in pixels to apply to the gravity's location. */ public int getYOffset() { return mY; return mTN.mY; } /** Loading Loading @@ -281,21 +276,6 @@ public class Toast { tv.setText(s); } private void trySendAccessibilityEvent() { AccessibilityManager accessibilityManager = AccessibilityManager.getInstance(mContext); if (!accessibilityManager.isEnabled()) { return; } // treat toasts as notifications since they are used to // announce a transient piece of information to the user AccessibilityEvent event = AccessibilityEvent.obtain( AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED); event.setClassName(getClass().getName()); event.setPackageName(mContext.getPackageName()); mView.dispatchPopulateAccessibilityEvent(event); accessibilityManager.sendAccessibilityEvent(event); } // ======================================================================================= // All the gunk below is the interaction with the Notification Service, which handles // the proper ordering of these system-wide. Loading @@ -312,8 +292,6 @@ public class Toast { } private static class TN extends ITransientNotification.Stub { final Handler mHandler = new Handler(); final Runnable mShow = new Runnable() { public void run() { handleShow(); Loading @@ -327,12 +305,20 @@ public class Toast { }; private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); private final WeakReference<Toast> mToast; final Handler mHandler = new Handler(); int mGravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; int mX, mY; float mHorizontalMargin; float mVerticalMargin; View mView; View mNextView; WindowManagerImpl mWM; TN(Toast toast) { mToast = new WeakReference<Toast>(toast); TN() { // 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; Loading Loading @@ -364,16 +350,14 @@ public class Toast { } public void handleShow() { final Toast toast = mToast.get(); if (toast != null) { if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + toast.mView + " mNextView=" + toast.mNextView); if (toast.mView != toast.mNextView) { if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView + " mNextView=" + mNextView); if (mView != mNextView) { // remove the old view if necessary handleHide(); toast.mView = toast.mNextView; mView = mNextView; mWM = WindowManagerImpl.getDefault(); final int gravity = toast.mGravity; final int gravity = mGravity; mParams.gravity = gravity; if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) { mParams.horizontalWeight = 1.0f; Loading @@ -381,36 +365,49 @@ public class Toast { if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) { mParams.verticalWeight = 1.0f; } mParams.x = toast.mX; mParams.y = toast.mY; mParams.verticalMargin = toast.mVerticalMargin; mParams.horizontalMargin = toast.mHorizontalMargin; if (toast.mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + toast.mView + " in " + this); mWM.removeView(toast.mView); mParams.x = mX; mParams.y = mY; mParams.verticalMargin = mVerticalMargin; mParams.horizontalMargin = mHorizontalMargin; if (mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this); mWM.removeView(mView); } if (localLOGV) Log.v(TAG, "ADD! " + toast.mView + " in " + this); mWM.addView(toast.mView, mParams); toast.trySendAccessibilityEvent(); if (localLOGV) Log.v(TAG, "ADD! " + mView + " in " + this); mWM.addView(mView, mParams); trySendAccessibilityEvent(); } } private void trySendAccessibilityEvent() { AccessibilityManager accessibilityManager = AccessibilityManager.getInstance(mView.getContext()); if (!accessibilityManager.isEnabled()) { return; } // treat toasts as notifications since they are used to // announce a transient piece of information to the user AccessibilityEvent event = AccessibilityEvent.obtain( AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED); event.setClassName(getClass().getName()); event.setPackageName(mView.getContext().getPackageName()); mView.dispatchPopulateAccessibilityEvent(event); accessibilityManager.sendAccessibilityEvent(event); } public void handleHide() { final Toast toast = mToast.get(); if (toast != null) { if (localLOGV) Log.v(TAG, "HANDLE HIDE: " + this + " mView=" + toast.mView); if (toast.mView != null) { if (localLOGV) Log.v(TAG, "HANDLE HIDE: " + this + " mView=" + mView); if (mView != null) { // note: checking parent() just to make sure the view has // been added... i have seen cases where we get here when // the view isn't yet added, so let's try not to crash. if (toast.mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + toast.mView + " in " + this); mWM.removeView(toast.mView); if (mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this); mWM.removeView(mView); } toast.mView = null; } mView = null; mNextView = null; } } } Loading Loading
core/java/android/widget/Toast.java +78 −81 Original line number Diff line number Diff line Loading @@ -33,8 +33,6 @@ import android.view.WindowManagerImpl; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import java.lang.ref.WeakReference; /** * A toast is a view containing a quick little message for the user. The toast class * helps you create and show those. Loading Loading @@ -72,11 +70,6 @@ public class Toast { final Context mContext; final TN mTN; int mDuration; int mGravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; int mX, mY; float mHorizontalMargin; float mVerticalMargin; View mView; View mNextView; /** Loading @@ -88,8 +81,8 @@ public class Toast { */ public Toast(Context context) { mContext = context; mTN = new TN(this); mY = context.getResources().getDimensionPixelSize( mTN = new TN(); mTN.mY = context.getResources().getDimensionPixelSize( com.android.internal.R.dimen.toast_y_offset); } Loading @@ -103,9 +96,11 @@ public class Toast { INotificationManager service = getService(); String pkg = mContext.getPackageName(); TN tn = mTN; tn.mNextView = mNextView; try { service.enqueueToast(pkg, mTN, mDuration); service.enqueueToast(pkg, tn, mDuration); } catch (RemoteException e) { // Empty } Loading Loading @@ -165,22 +160,22 @@ public class Toast { * notification */ public void setMargin(float horizontalMargin, float verticalMargin) { mHorizontalMargin = horizontalMargin; mVerticalMargin = verticalMargin; mTN.mHorizontalMargin = horizontalMargin; mTN.mVerticalMargin = verticalMargin; } /** * Return the horizontal margin. */ public float getHorizontalMargin() { return mHorizontalMargin; return mTN.mHorizontalMargin; } /** * Return the vertical margin. */ public float getVerticalMargin() { return mVerticalMargin; return mTN.mVerticalMargin; } /** Loading @@ -189,9 +184,9 @@ public class Toast { * @see #getGravity */ public void setGravity(int gravity, int xOffset, int yOffset) { mGravity = gravity; mX = xOffset; mY = yOffset; mTN.mGravity = gravity; mTN.mX = xOffset; mTN.mY = yOffset; } /** Loading @@ -200,21 +195,21 @@ public class Toast { * @see #getGravity */ public int getGravity() { return mGravity; return mTN.mGravity; } /** * Return the X offset in pixels to apply to the gravity's location. */ public int getXOffset() { return mX; return mTN.mX; } /** * Return the Y offset in pixels to apply to the gravity's location. */ public int getYOffset() { return mY; return mTN.mY; } /** Loading Loading @@ -281,21 +276,6 @@ public class Toast { tv.setText(s); } private void trySendAccessibilityEvent() { AccessibilityManager accessibilityManager = AccessibilityManager.getInstance(mContext); if (!accessibilityManager.isEnabled()) { return; } // treat toasts as notifications since they are used to // announce a transient piece of information to the user AccessibilityEvent event = AccessibilityEvent.obtain( AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED); event.setClassName(getClass().getName()); event.setPackageName(mContext.getPackageName()); mView.dispatchPopulateAccessibilityEvent(event); accessibilityManager.sendAccessibilityEvent(event); } // ======================================================================================= // All the gunk below is the interaction with the Notification Service, which handles // the proper ordering of these system-wide. Loading @@ -312,8 +292,6 @@ public class Toast { } private static class TN extends ITransientNotification.Stub { final Handler mHandler = new Handler(); final Runnable mShow = new Runnable() { public void run() { handleShow(); Loading @@ -327,12 +305,20 @@ public class Toast { }; private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); private final WeakReference<Toast> mToast; final Handler mHandler = new Handler(); int mGravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; int mX, mY; float mHorizontalMargin; float mVerticalMargin; View mView; View mNextView; WindowManagerImpl mWM; TN(Toast toast) { mToast = new WeakReference<Toast>(toast); TN() { // 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; Loading Loading @@ -364,16 +350,14 @@ public class Toast { } public void handleShow() { final Toast toast = mToast.get(); if (toast != null) { if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + toast.mView + " mNextView=" + toast.mNextView); if (toast.mView != toast.mNextView) { if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView + " mNextView=" + mNextView); if (mView != mNextView) { // remove the old view if necessary handleHide(); toast.mView = toast.mNextView; mView = mNextView; mWM = WindowManagerImpl.getDefault(); final int gravity = toast.mGravity; final int gravity = mGravity; mParams.gravity = gravity; if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) { mParams.horizontalWeight = 1.0f; Loading @@ -381,36 +365,49 @@ public class Toast { if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) { mParams.verticalWeight = 1.0f; } mParams.x = toast.mX; mParams.y = toast.mY; mParams.verticalMargin = toast.mVerticalMargin; mParams.horizontalMargin = toast.mHorizontalMargin; if (toast.mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + toast.mView + " in " + this); mWM.removeView(toast.mView); mParams.x = mX; mParams.y = mY; mParams.verticalMargin = mVerticalMargin; mParams.horizontalMargin = mHorizontalMargin; if (mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this); mWM.removeView(mView); } if (localLOGV) Log.v(TAG, "ADD! " + toast.mView + " in " + this); mWM.addView(toast.mView, mParams); toast.trySendAccessibilityEvent(); if (localLOGV) Log.v(TAG, "ADD! " + mView + " in " + this); mWM.addView(mView, mParams); trySendAccessibilityEvent(); } } private void trySendAccessibilityEvent() { AccessibilityManager accessibilityManager = AccessibilityManager.getInstance(mView.getContext()); if (!accessibilityManager.isEnabled()) { return; } // treat toasts as notifications since they are used to // announce a transient piece of information to the user AccessibilityEvent event = AccessibilityEvent.obtain( AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED); event.setClassName(getClass().getName()); event.setPackageName(mView.getContext().getPackageName()); mView.dispatchPopulateAccessibilityEvent(event); accessibilityManager.sendAccessibilityEvent(event); } public void handleHide() { final Toast toast = mToast.get(); if (toast != null) { if (localLOGV) Log.v(TAG, "HANDLE HIDE: " + this + " mView=" + toast.mView); if (toast.mView != null) { if (localLOGV) Log.v(TAG, "HANDLE HIDE: " + this + " mView=" + mView); if (mView != null) { // note: checking parent() just to make sure the view has // been added... i have seen cases where we get here when // the view isn't yet added, so let's try not to crash. if (toast.mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + toast.mView + " in " + this); mWM.removeView(toast.mView); if (mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this); mWM.removeView(mView); } toast.mView = null; } mView = null; mNextView = null; } } } Loading