From 78e476b46d1a87839fe75fa5374686c56378119f Mon Sep 17 00:00:00 2001 From: Taesu Lee Date: Tue, 31 Mar 2020 17:56:38 +0900 Subject: Dismiss SnackBar when detached SnackBarManager state is not cleared when SnackBar is detached from a window without dismiss(). After then it is remained as dismissing state forever. Test: 1) Long-press a conversation and click archive action. 2) Press back key before the snackbar is dismissed. 3) Repeat 1) and check the snackbar is shown or not. Change-Id: Icf2cdcd30aea42685db68e5ac36436a34c9c94ae Signed-off-by: Taesu Lee --- src/com/android/messaging/ui/SnackBarManager.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/com/android/messaging/ui/SnackBarManager.java b/src/com/android/messaging/ui/SnackBarManager.java index e107999..d5ca870 100644 --- a/src/com/android/messaging/ui/SnackBarManager.java +++ b/src/com/android/messaging/ui/SnackBarManager.java @@ -25,6 +25,7 @@ import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.MeasureSpec; +import android.view.View.OnAttachStateChangeListener; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; @@ -86,6 +87,23 @@ public class SnackBarManager { } }; + private final OnAttachStateChangeListener mAttachStateChangeListener = + new OnAttachStateChangeListener() { + @Override + public void onViewDetachedFromWindow(View v) { + // Dismiss the PopupWindow and clear SnackBarManager state. + mHideHandler.removeCallbacks(mDismissRunnable); + mPopupWindow.dismiss(); + + mCurrentSnackBar = null; + mNextSnackBar = null; + mIsCurrentlyDismissing = false; + } + + @Override + public void onViewAttachedToWindow(View v) {} + }; + private final int mTranslationDurationMs; private final Handler mHideHandler; @@ -181,6 +199,7 @@ public class SnackBarManager { mPopupWindow.showAsDropDown(anchorView, 0, getRelativeOffset(snackBar)); } + snackBar.getParentView().addOnAttachStateChangeListener(mAttachStateChangeListener); // Animate the toast bar into view. placeSnackBarOffScreen(snackBar); @@ -238,6 +257,8 @@ public class SnackBarManager { // PopupWindow.dismiss() will fire an IllegalArgumentException if the activity // has already ended while we were animating } + snackBar.getParentView() + .removeOnAttachStateChangeListener(mAttachStateChangeListener); mCurrentSnackBar = null; mIsCurrentlyDismissing = false; -- cgit v1.2.3