Close CAB when scrolled or back pressed

Bug: 33106791
Bug: 33106962
Test: manual - long press to display context menu on formula and
result, then drag to open history fragment. Long press on a
history result to display the context menu, then begin scrolling
or close history. CAB should close automatically in all cases.

Change-Id: Ibe3ceee2d06c5e15335a6938dbbd0ebbf444ce68
diff --git a/src/com/android/calculator2/Calculator.java b/src/com/android/calculator2/Calculator.java
index b877ed6..2f68f99 100644
--- a/src/com/android/calculator2/Calculator.java
+++ b/src/com/android/calculator2/Calculator.java
@@ -553,13 +553,8 @@
      * Return true if there was one.
      */
     private boolean stopActionModeOrContextMenu() {
-        if (mResultText.stopActionModeOrContextMenu()) {
-            return true;
-        }
-        if (mFormulaText.stopActionModeOrContextMenu()) {
-            return true;
-        }
-        return false;
+        return mResultText.stopActionModeOrContextMenu()
+                || mFormulaText.stopActionModeOrContextMenu();
     }
 
     @Override
@@ -577,8 +572,10 @@
     public void onBackPressed() {
         if (!stopActionModeOrContextMenu()) {
             if (mDragLayout.isOpen()) {
-                mDragLayout.setClosed();
-                popFragmentBackstack();
+                if (!mHistoryFragment.stopActionModeOrContextMenu()) {
+                    mDragLayout.setClosed();
+                    popFragmentBackstack();
+                }
                 return;
             }
             if (mPadViewPager != null && mPadViewPager.getCurrentItem() != 0) {
@@ -1271,6 +1268,8 @@
             return;
         }
         if (!mDragLayout.isOpen()) {
+            stopActionModeOrContextMenu();
+
             manager.beginTransaction()
                     .replace(R.id.history_frame, mHistoryFragment, HistoryFragment.TAG)
                     .setTransition(transit)
diff --git a/src/com/android/calculator2/CalculatorResult.java b/src/com/android/calculator2/CalculatorResult.java
index c1750ef..3e42963 100644
--- a/src/com/android/calculator2/CalculatorResult.java
+++ b/src/com/android/calculator2/CalculatorResult.java
@@ -964,7 +964,7 @@
             @Override
             public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                 final MenuInflater inflater = mode.getMenuInflater();
-                return createCopyMenu(inflater, menu);
+                return createContextMenu(inflater, menu);
             }
 
             @Override
@@ -1038,7 +1038,7 @@
             public void onCreateContextMenu(ContextMenu contextMenu, View view,
                     ContextMenu.ContextMenuInfo contextMenuInfo) {
                 final MenuInflater inflater = new MenuInflater(getContext());
-                createCopyMenu(inflater, contextMenu);
+                createContextMenu(inflater, contextMenu);
                 mContextMenu = contextMenu;
                 for(int i = 0; i < contextMenu.size(); i ++) {
                     contextMenu.getItem(i).setOnMenuItemClickListener(CalculatorResult.this);
@@ -1056,7 +1056,7 @@
         });
     }
 
-    private boolean createCopyMenu(MenuInflater inflater, Menu menu) {
+    private boolean createContextMenu(MenuInflater inflater, Menu menu) {
         inflater.inflate(R.menu.menu_result, menu);
         final boolean displayMemory = mEvaluator.getMemoryIndex() != 0;
         final MenuItem memoryAddItem = menu.findItem(R.id.memory_add);
@@ -1134,4 +1134,10 @@
                 return false;
         }
     }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        stopActionModeOrContextMenu();
+        super.onDetachedFromWindow();
+    }
 }
diff --git a/src/com/android/calculator2/HistoryFragment.java b/src/com/android/calculator2/HistoryFragment.java
index 22adcd3..480eb67 100644
--- a/src/com/android/calculator2/HistoryFragment.java
+++ b/src/com/android/calculator2/HistoryFragment.java
@@ -31,6 +31,8 @@
 
 import java.util.ArrayList;
 
+import static android.support.v7.widget.RecyclerView.SCROLL_STATE_DRAGGING;
+
 public class HistoryFragment extends Fragment {
 
     public static final String TAG = "HistoryFragment";
@@ -94,6 +96,15 @@
                 R.layout.fragment_history, container, false /* attachToRoot */);
 
         mRecyclerView = (RecyclerView) view.findViewById(R.id.history_recycler_view);
+        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
+                if (newState == SCROLL_STATE_DRAGGING) {
+                    stopActionModeOrContextMenu();
+                }
+                super.onScrollStateChanged(recyclerView, newState);
+            }
+        });
 
         // The size of the RecyclerView is not affected by the adapter's contents.
         mRecyclerView.setAdapter(mAdapter);
@@ -227,4 +238,16 @@
         calculator.onClearAnimationEnd();
         calculator.onBackPressed();
     }
+
+    public boolean stopActionModeOrContextMenu() {
+        for (int i = 0; i < mRecyclerView.getChildCount(); i++) {
+            final View view = mRecyclerView.getChildAt(i);
+            final HistoryAdapter.ViewHolder viewHolder =
+                    (HistoryAdapter.ViewHolder) mRecyclerView.getChildViewHolder(view);
+            if (viewHolder != null && viewHolder.getResult().stopActionModeOrContextMenu()) {
+                return true;
+            }
+        }
+        return false;
+    }
 }