Don't handle key events given to DocHolders of Message type.

This also fixed an issue regarding toggling focus between roots and
dirList.

Bug: 33740063
Change-Id: I020c3a1c02cdc74b3ba3a13ff0455aff393303e9
diff --git a/src/com/android/documentsui/FocusManager.java b/src/com/android/documentsui/FocusManager.java
index 1b8567e..85f7f74 100644
--- a/src/com/android/documentsui/FocusManager.java
+++ b/src/com/android/documentsui/FocusManager.java
@@ -84,7 +84,7 @@
         boolean focusChanged = false;
         if (mNavDrawerHasFocus) {
             mDrawer.setOpen(false);
-            focusDirectoryList();
+            focusChanged = focusDirectoryList();
         } else {
             mDrawer.setOpen(true);
             focusChanged = mRootsFocuser.run();
diff --git a/src/com/android/documentsui/dirlist/DirectoryAddonsAdapter.java b/src/com/android/documentsui/dirlist/DirectoryAddonsAdapter.java
index d99e168..0437361 100644
--- a/src/com/android/documentsui/dirlist/DirectoryAddonsAdapter.java
+++ b/src/com/android/documentsui/dirlist/DirectoryAddonsAdapter.java
@@ -83,17 +83,25 @@
 
     @Override
     public DocumentHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        DocumentHolder holder = null;
         switch (viewType) {
             case ITEM_TYPE_SECTION_BREAK:
-                return new TransparentDividerDocumentHolder(mEnv.getContext());
+                holder = new TransparentDividerDocumentHolder(mEnv.getContext());
+                mEnv.initDocumentHolder(holder);
+                break;
             case ITEM_TYPE_HEADER_MESSAGE:
-                return new HeaderMessageDocumentHolder(mEnv.getContext(), parent,
+                holder = new HeaderMessageDocumentHolder(mEnv.getContext(), parent,
                         this::onDismissHeaderMessage);
+                mEnv.initDocumentHolder(holder);
+                break;
             case ITEM_TYPE_INFLATED_MESSAGE:
-                return new InflateMessageDocumentHolder(mEnv.getContext(), parent);
+                holder = new InflateMessageDocumentHolder(mEnv.getContext(), parent);
+                mEnv.initDocumentHolder(holder);
+                break;
             default:
-                return mDelegate.createViewHolder(parent, viewType);
+                holder = mDelegate.createViewHolder(parent, viewType);
         }
+        return holder;
     }
 
     private void onDismissHeaderMessage() {
diff --git a/src/com/android/documentsui/dirlist/HeaderMessageDocumentHolder.java b/src/com/android/documentsui/dirlist/HeaderMessageDocumentHolder.java
index be2ce4c..8c8fbdc 100644
--- a/src/com/android/documentsui/dirlist/HeaderMessageDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/HeaderMessageDocumentHolder.java
@@ -31,7 +31,7 @@
  * are more information from the Provider.
  * Used by {@link DirectoryAddonsAdapter}.
  */
-final class HeaderMessageDocumentHolder extends DocumentHolder {
+final class HeaderMessageDocumentHolder extends MessageHolder {
     private Message mMessage;
     private ImageView mIcon;
     private TextView mTextView;
diff --git a/src/com/android/documentsui/dirlist/InflateMessageDocumentHolder.java b/src/com/android/documentsui/dirlist/InflateMessageDocumentHolder.java
index d0c4ba0..d0709cb 100644
--- a/src/com/android/documentsui/dirlist/InflateMessageDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/InflateMessageDocumentHolder.java
@@ -29,7 +29,7 @@
  * in the directory, whether due to no items, no search results or an error.
  * Used by {@link DirectoryAddonsAdapter}.
  */
-final class InflateMessageDocumentHolder extends DocumentHolder {
+final class InflateMessageDocumentHolder extends MessageHolder {
     private Message mMessage;
     private TextView mMsgView;
     private ImageView mImageView;
diff --git a/src/com/android/documentsui/dirlist/MessageHolder.java b/src/com/android/documentsui/dirlist/MessageHolder.java
new file mode 100644
index 0000000..a9a722d
--- /dev/null
+++ b/src/com/android/documentsui/dirlist/MessageHolder.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.documentsui.dirlist;
+
+import android.content.Context;
+import android.view.ViewGroup;
+import android.widget.Space;
+
+import com.android.documentsui.base.DocumentInfo;
+import com.android.documentsui.base.Events.InputEvent;
+
+/**
+ * Base class for all non-Document Holder classes.
+ */
+abstract class MessageHolder extends DocumentHolder {
+    public MessageHolder(Context context, Space space) {
+        super(context, space);
+    }
+
+    public MessageHolder(Context context, ViewGroup parent, int layout) {
+        super(context, parent, layout);
+    }
+
+    @Override
+    public boolean isInSelectionHotspot(InputEvent event) {
+        return false;
+    }
+
+    @Override
+    public boolean isInDragHotspot(InputEvent event) {
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/documentsui/dirlist/TransparentDividerDocumentHolder.java b/src/com/android/documentsui/dirlist/TransparentDividerDocumentHolder.java
index 2cf8b3e..44efd80 100644
--- a/src/com/android/documentsui/dirlist/TransparentDividerDocumentHolder.java
+++ b/src/com/android/documentsui/dirlist/TransparentDividerDocumentHolder.java
@@ -16,6 +16,7 @@
 
 package com.android.documentsui.dirlist;
 
+
 import android.content.Context;
 import android.database.Cursor;
 import android.widget.Space;
@@ -27,7 +28,7 @@
  * The most elegant transparent blank box that spans N rows ever conceived.
  * Used by {@link DirectoryAddonsAdapter}.
  */
-final class TransparentDividerDocumentHolder extends DocumentHolder {
+final class TransparentDividerDocumentHolder extends MessageHolder {
     private final int mVisibleHeight;
     private State mState;
 
diff --git a/src/com/android/documentsui/dirlist/UserInputHandler.java b/src/com/android/documentsui/dirlist/UserInputHandler.java
index 00912cd..6a05624 100644
--- a/src/com/android/documentsui/dirlist/UserInputHandler.java
+++ b/src/com/android/documentsui/dirlist/UserInputHandler.java
@@ -441,6 +441,14 @@
                 return false;
             }
 
+            int itemType = doc.getItemViewType();
+            // Ignore events sent to Addon Holders.
+            if (itemType == DocumentsAdapter.ITEM_TYPE_HEADER_MESSAGE
+                    || itemType == DocumentsAdapter.ITEM_TYPE_INFLATED_MESSAGE
+                    || itemType == DocumentsAdapter.ITEM_TYPE_SECTION_BREAK) {
+                return false;
+            }
+
             if (mFocusHandler.handleKey(doc, keyCode, event)) {
                 // Handle range selection adjustments. Extending the selection will adjust the
                 // bounds of the in-progress range selection. Each time an unshifted navigation