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 <taesu82.lee@samsung.com>
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.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 @@
         }
     };
 
+    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 @@
             mPopupWindow.showAsDropDown(anchorView, 0, getRelativeOffset(snackBar));
         }
 
+        snackBar.getParentView().addOnAttachStateChangeListener(mAttachStateChangeListener);
 
         // Animate the toast bar into view.
         placeSnackBarOffScreen(snackBar);
@@ -238,6 +257,8 @@
                     // PopupWindow.dismiss() will fire an IllegalArgumentException if the activity
                     // has already ended while we were animating
                 }
+                snackBar.getParentView()
+                        .removeOnAttachStateChangeListener(mAttachStateChangeListener);
 
                 mCurrentSnackBar = null;
                 mIsCurrentlyDismissing = false;