Convert RecyclerView to ListView

- To make drawer dragment work with account switcher easier

Bug: 34062530

Test: quick sanity check

Change-Id: I653ec656cd423c413c2aaa23244776ce697a5904
diff --git a/res/layout/drawer_fragment.xml b/res/layout/drawer_fragment.xml
index eeb792e..907fb92 100644
--- a/res/layout/drawer_fragment.xml
+++ b/res/layout/drawer_fragment.xml
@@ -24,7 +24,7 @@
     android:layout_height="match_parent"
     android:fitsSystemWindows="true">
 
-    <android.support.v7.widget.RecyclerView
+    <ListView
         android:id="@+id/list"
         android:background="@color/navigation_drawer_background_color"
         android:layout_width="match_parent"
diff --git a/res/layout/drawer_header.xml b/res/layout/drawer_header.xml
index 1f0151b..9810f34 100644
--- a/res/layout/drawer_header.xml
+++ b/res/layout/drawer_header.xml
@@ -17,7 +17,6 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/label_header"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_gravity="center_vertical"
diff --git a/src/com/android/contacts/drawer/DrawerAdapter.java b/src/com/android/contacts/drawer/DrawerAdapter.java
index c6d3c4d..984bba3 100644
--- a/src/com/android/contacts/drawer/DrawerAdapter.java
+++ b/src/com/android/contacts/drawer/DrawerAdapter.java
@@ -19,11 +19,11 @@
 import android.app.Activity;
 import android.graphics.PorterDuff;
 import android.support.annotation.LayoutRes;
-import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
+import android.widget.BaseAdapter;
 import android.widget.ImageView;
 import android.widget.TextView;
 
@@ -38,7 +38,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class DrawerAdapter extends RecyclerView.Adapter {
+public class DrawerAdapter extends BaseAdapter {
 
     private static final int VIEW_TYPE_PRIMARY_ITEM = 0;
     private static final int VIEW_TYPE_MISC_ITEM = 1;
@@ -50,6 +50,9 @@
     private static final int VIEW_TYPE_STATUS_SPACER = 7;
     private static final int VIEW_TYPE_NAV_DIVIDER = 8;
 
+    // This count must be updated if we add more view types.
+    private static final int VIEW_TYPE_COUNT = 9;
+
     private static final int TYPEFACE_STYLE_ACTIVATE = R.style.DrawerItemTextActiveStyle;
     private static final int TYPEFACE_STYLE_INACTIVE = R.style.DrawerItemTextInactiveStyle;
 
@@ -168,7 +171,7 @@
     }
 
     @Override
-    public int getItemCount() {
+    public int getCount() {
         return  mItemsList.size();
     }
 
@@ -182,148 +185,153 @@
     }
 
     @Override
+    public int getViewTypeCount() {
+        return VIEW_TYPE_COUNT;
+    }
+
+    @Override
+    public View getView(int position, View view, ViewGroup viewGroup) {
+        final BaseDrawerItem drawerItem = getItem(position);
+        switch (drawerItem.viewType) {
+            case VIEW_TYPE_STATUS_SPACER:
+                return getBaseItemView(R.layout.nav_header_main, view, viewGroup);
+            case VIEW_TYPE_PRIMARY_ITEM:
+                return getPrimaryItemView((PrimaryItem) drawerItem, view, viewGroup);
+            case VIEW_TYPE_HEADER_ITEM:
+                return getHeaderItemView((HeaderItem) drawerItem, view, viewGroup);
+            case VIEW_TYPE_CREATE_LABEL:
+                return getDrawerItemView(drawerItem, view, viewGroup);
+            case VIEW_TYPE_GROUP_ENTRY:
+                return getGroupEntryView((GroupEntryItem) drawerItem, view, viewGroup);
+            case VIEW_TYPE_ACCOUNT_ENTRY:
+                return getAccountItemView((AccountEntryItem) drawerItem, view, viewGroup);
+            case VIEW_TYPE_MISC_ITEM:
+                return getDrawerItemView(drawerItem, view, viewGroup);
+            case VIEW_TYPE_NAV_SPACER:
+                return getBaseItemView(R.layout.nav_drawer_spacer, view, viewGroup);
+            case VIEW_TYPE_NAV_DIVIDER:
+                return getBaseItemView(R.layout.drawer_horizontal_divider, view, viewGroup);
+        }
+        throw new IllegalStateException("Unknown drawer item " + drawerItem);
+    }
+
+    private View getBaseItemView(@LayoutRes int layoutResID, View result,ViewGroup parent) {
+        if (result == null) {
+            result = mInflater.inflate(layoutResID, parent, false);
+        }
+        return result;
+    }
+
+    private View getPrimaryItemView(PrimaryItem item, View result, ViewGroup parent) {
+        if (result == null) {
+            result = mInflater.inflate(R.layout.drawer_primary_item, parent, false);
+            result.setOnClickListener(mListener);
+        }
+        final TextView titleView = (TextView) result.findViewById(R.id.title);
+        titleView.setText(item.text);
+        final ImageView iconView = (ImageView) result.findViewById(R.id.icon);
+        iconView.setImageResource(item.icon);
+        final TextView newBadge = (TextView) result.findViewById(R.id.assistant_new_badge);
+        final boolean showWelcomeBadge = !SharedPreferenceUtil.isWelcomeCardDismissed(mActivity);
+        newBadge.setVisibility(item.contactsView == ContactsView.ASSISTANT && showWelcomeBadge
+                ? View.VISIBLE : View.GONE);
+        result.setActivated(item.contactsView == mSelectedView);
+        updateSelectedStatus(titleView, iconView, item.contactsView == mSelectedView);
+        result.setId(item.id);
+        return result;
+    }
+
+    private View getHeaderItemView(HeaderItem item, View result, ViewGroup parent) {
+        if (result == null) {
+            result = mInflater.inflate(R.layout.drawer_header, parent, false);
+        }
+        final TextView textView = (TextView) result.findViewById(R.id.title);
+        textView.setText(item.text);
+        result.setId(item.id);
+        return result;
+    }
+
+    private View getGroupEntryView(GroupEntryItem item, View result, ViewGroup parent) {
+        if (result == null || !(result.getTag() instanceof GroupEntryItem)) {
+            result = mInflater.inflate(R.layout.drawer_item, parent, false);
+            result.setId(item.id);
+            result.setOnClickListener(mListener);
+        }
+
+        final GroupListItem groupListItem = item.group;
+        final TextView title = (TextView) result.findViewById(R.id.title);
+        title.setText(groupListItem.getTitle());
+        final ImageView icon = (ImageView) result.findViewById(R.id.icon);
+        icon.setImageResource(R.drawable.quantum_ic_label_vd_theme_24);
+        final boolean activated = groupListItem.getGroupId() == mSelectedGroupId &&
+                mSelectedView == ContactsView.GROUP_VIEW;
+        updateSelectedStatus(title, icon, activated);
+        result.setActivated(activated);
+
+        result.setTag(groupListItem);
+        result.setContentDescription(
+                mActivity.getString(R.string.navigation_drawer_label, groupListItem.getTitle()));
+        return result;
+    }
+
+    private View getAccountItemView(AccountEntryItem item, View result, ViewGroup parent) {
+        if (result == null || !(result.getTag() instanceof ContactListFilter)) {
+            result = mInflater.inflate(R.layout.drawer_item, parent, false);
+            result.setId(item.id);
+            result.setOnClickListener(mListener);
+        }
+        final ContactListFilter account = item.account;
+        final TextView textView = ((TextView) result.findViewById(R.id.title));
+        textView.setText(account.accountName);
+        final boolean activated = account.equals(mSelectedAccount)
+                && mSelectedView == ContactsView.ACCOUNT_VIEW;
+        textView.setTextAppearance(mActivity, activated
+                ? TYPEFACE_STYLE_ACTIVATE : TYPEFACE_STYLE_INACTIVE);
+
+        final ImageView icon = (ImageView) result.findViewById(R.id.icon);
+        final AccountDisplayInfo displayableAccount =
+                mAccountDisplayFactory.getAccountDisplayInfoFor(item.account);
+        icon.setScaleType(ImageView.ScaleType.FIT_CENTER);
+        icon.setImageDrawable(displayableAccount.getIcon());
+
+        result.setTag(account);
+        result.setActivated(activated);
+        result.setContentDescription(
+                displayableAccount.getTypeLabel() + " " + item.account.accountName);
+        return result;
+    }
+
+    private View getDrawerItemView(BaseDrawerItem item, View result, ViewGroup parent) {
+        if (result == null) {
+            result = mInflater.inflate(R.layout.drawer_item, parent, false);
+            result.setOnClickListener(mListener);
+        }
+
+        final TextView textView = (TextView) result.findViewById(R.id.title);
+        textView.setText(item.text);
+        final ImageView iconView = (ImageView) result.findViewById(R.id.icon);
+        iconView.setImageResource(item.icon);
+        result.setId(item.id);
+        updateSelectedStatus(textView, iconView, false);
+        return result;
+    }
+
+    @Override
     public int getItemViewType(int position) {
         return getItem(position).viewType;
     }
 
-    @Override
-    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        switch (viewType) {
-            case VIEW_TYPE_STATUS_SPACER:
-                return getBaseViewHolder(R.layout.nav_header_main, parent);
-            case VIEW_TYPE_NAV_SPACER:
-                return getBaseViewHolder(R.layout.nav_drawer_spacer, parent);
-            case VIEW_TYPE_PRIMARY_ITEM:
-                return getPrimaryItemView(parent);
-            case VIEW_TYPE_HEADER_ITEM:
-                return getHeaderItemViewHolder(parent);
-            case VIEW_TYPE_GROUP_ENTRY:
-            case VIEW_TYPE_CREATE_LABEL:
-            case VIEW_TYPE_ACCOUNT_ENTRY:
-            case VIEW_TYPE_MISC_ITEM:
-                return getDrawerItemViewHolder(parent);
-            case VIEW_TYPE_NAV_DIVIDER:
-                return getBaseViewHolder(R.layout.drawer_horizontal_divider, parent);
-        }
-        throw new IllegalStateException("Unknown view type " + viewType);
-    }
-
-    @Override
-    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
-        final BaseDrawerItem item = getItem(position);
-        switch (item.viewType) {
-            case VIEW_TYPE_PRIMARY_ITEM:
-                bindPrimaryItemViewHolder((PrimaryItemViewHolder) holder, (PrimaryItem) item);
-                break;
-            case VIEW_TYPE_HEADER_ITEM:
-                bindHeaderItemViewHolder((HeaderItemViewHolder) holder, (HeaderItem) item);
-                break;
-            case VIEW_TYPE_GROUP_ENTRY:
-                bindGroupItemViewHolder((DrawerItemViewHolder) holder, (GroupEntryItem) item);
-                break;
-            case VIEW_TYPE_ACCOUNT_ENTRY:
-                bindAccountViewHolder((DrawerItemViewHolder) holder, (AccountEntryItem) item);
-                break;
-            case VIEW_TYPE_CREATE_LABEL:
-            case VIEW_TYPE_MISC_ITEM:
-                bindDrawerItemViewHolder((DrawerItemViewHolder) holder, item);
-                break;
-        }
-    }
-
-    private void bindPrimaryItemViewHolder(PrimaryItemViewHolder viewHolder, PrimaryItem item) {
-        viewHolder.titleView.setText(item.text);
-        viewHolder.iconView.setImageResource(item.icon);
-        viewHolder.itemView.setId(item.id);
-        viewHolder.itemView.setOnClickListener(mListener);
-        final boolean showWelcomeBadge = !SharedPreferenceUtil.isWelcomeCardDismissed(mActivity);
-        if (item.contactsView == ContactsView.ASSISTANT && showWelcomeBadge) {
-            viewHolder.newBadge.setVisibility(View.VISIBLE);
-        } else {
-            viewHolder.newBadge.setVisibility(View.GONE);
-        }
-        viewHolder.itemView.setActivated(item.contactsView == mSelectedView);
-        updateSelectedStatus(viewHolder);
-    }
-
-    private void bindHeaderItemViewHolder(HeaderItemViewHolder viewHolder, HeaderItem item) {
-        viewHolder.titleView.setText(item.text);
-        viewHolder.itemView.setId(item.id);
-    }
-
-    private void bindGroupItemViewHolder(DrawerItemViewHolder viewHolder, GroupEntryItem item) {
-        final GroupListItem group = item.group;
-        viewHolder.titleView.setText(group.getTitle());
-        viewHolder.iconView.setImageResource(R.drawable.quantum_ic_label_vd_theme_24);
-        viewHolder.itemView.setId(item.id);
-        viewHolder.itemView.setTag(group);
-        viewHolder.itemView.setOnClickListener(mListener);
-        viewHolder.itemView.setContentDescription(
-                mActivity.getString(R.string.navigation_drawer_label, group.getTitle()));
-        viewHolder.itemView.setActivated(group.getGroupId() == mSelectedGroupId
-                && mSelectedView == ContactsView.GROUP_VIEW);
-        updateSelectedStatus(viewHolder);
-    }
-
-    private void bindAccountViewHolder(DrawerItemViewHolder viewHolder, AccountEntryItem item) {
-        final ContactListFilter account = item.account;
-        viewHolder.titleView.setText(account.accountName);
-        final AccountDisplayInfo displayableAccount =
-                mAccountDisplayFactory.getAccountDisplayInfoFor(item.account);
-        viewHolder.iconView.setImageDrawable(displayableAccount.getIcon());
-        viewHolder.iconView.setScaleType(ImageView.ScaleType.FIT_CENTER);
-        viewHolder.itemView.setId(item.id);
-        viewHolder.itemView.setTag(account);
-        viewHolder.itemView.setOnClickListener(mListener);
-        viewHolder.itemView.setContentDescription(
-                displayableAccount.getTypeLabel() + " " + account.accountName);
-        viewHolder.itemView.setActivated(account.equals(mSelectedAccount)
-                && mSelectedView == ContactsView.ACCOUNT_VIEW);
-        updateSelectedStatus(viewHolder);
-        viewHolder.iconView.clearColorFilter();
-    }
-
-    private void bindDrawerItemViewHolder(DrawerItemViewHolder viewHolder, BaseDrawerItem item) {
-        viewHolder.titleView.setText(item.text);
-        viewHolder.iconView.setImageResource(item.icon);
-        viewHolder.itemView.setId(item.id);
-        viewHolder.itemView.setOnClickListener(mListener);
-        viewHolder.itemView.setActivated(false);
-        updateSelectedStatus(viewHolder);
-    }
-
-    private void updateSelectedStatus(DrawerItemViewHolder viewHolder) {
-        final boolean activated = viewHolder.itemView.isActivated();
-        viewHolder.titleView.setTextAppearance(mActivity, activated
+    private void updateSelectedStatus(TextView textView, ImageView imageView, boolean activated) {
+        textView.setTextAppearance(mActivity, activated
                 ? TYPEFACE_STYLE_ACTIVATE : TYPEFACE_STYLE_INACTIVE);
         if (activated) {
-            viewHolder.iconView.setColorFilter(mActivity.getResources().getColor(R.color
-                    .primary_color), PorterDuff.Mode.SRC_ATOP);
+            imageView.setColorFilter(mActivity.getResources().getColor(R.color.primary_color),
+                    PorterDuff.Mode.SRC_ATOP);
         } else {
-            viewHolder.iconView.clearColorFilter();
+            imageView.clearColorFilter();
         }
     }
 
-    private BaseViewHolder getBaseViewHolder(@LayoutRes int layoutResID, ViewGroup parent) {
-        final View view = mInflater.inflate(layoutResID, parent, false);
-        return new BaseViewHolder(view);
-    }
-
-    private HeaderItemViewHolder getHeaderItemViewHolder(ViewGroup parent) {
-        final View view = mInflater.inflate(R.layout.drawer_header, parent, false);
-        return new HeaderItemViewHolder(view);
-    }
-
-    private DrawerItemViewHolder getDrawerItemViewHolder(ViewGroup parent) {
-        final View view = mInflater.inflate(R.layout.drawer_item, parent, false);
-        return new DrawerItemViewHolder(view);
-    }
-
-    private PrimaryItemViewHolder getPrimaryItemView(ViewGroup parent) {
-        final View view = mInflater.inflate(R.layout.drawer_primary_item, parent, false);
-        return new PrimaryItemViewHolder(view);
-    }
-
     private void notifyChangeAndRebuildList() {
         notifyDataSetChanged();
         rebuildItemsList();
@@ -443,40 +451,4 @@
             this.account = account;
         }
     }
-
-    /**
-     * ViewHolder classes
-     */
-    public static class BaseViewHolder extends RecyclerView.ViewHolder {
-        public BaseViewHolder(View itemView) {
-            super(itemView);
-        }
-    }
-
-    public static class HeaderItemViewHolder extends BaseViewHolder {
-        public final TextView titleView;
-
-        public HeaderItemViewHolder(View itemView) {
-            super(itemView);
-            titleView = (TextView) itemView.findViewById(R.id.title);
-        }
-    }
-
-    public class DrawerItemViewHolder extends HeaderItemViewHolder {
-        public final ImageView iconView;
-
-        public DrawerItemViewHolder(View itemView) {
-            super(itemView);
-            iconView = (ImageView) itemView.findViewById(R.id.icon);
-        }
-    }
-
-    public class PrimaryItemViewHolder extends DrawerItemViewHolder {
-        public final TextView newBadge;
-
-        public PrimaryItemViewHolder(View itemView) {
-            super(itemView);
-            newBadge = (TextView) itemView.findViewById(R.id.assistant_new_badge);
-        }
-    }
 }
diff --git a/src/com/android/contacts/drawer/DrawerFragment.java b/src/com/android/contacts/drawer/DrawerFragment.java
index 2c8bfba..6acd170 100644
--- a/src/com/android/contacts/drawer/DrawerFragment.java
+++ b/src/com/android/contacts/drawer/DrawerFragment.java
@@ -26,14 +26,13 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowInsets;
 import android.widget.FrameLayout;
+import android.widget.ListView;
 
 import com.android.contacts.GroupListLoader;
 import com.android.contacts.R;
@@ -52,7 +51,7 @@
 import java.util.Iterator;
 import java.util.List;
 
-public class DrawerFragment extends Fragment implements AccountsListener{
+public class DrawerFragment extends Fragment implements AccountsListener {
 
     private static final int LOADER_GROUPS = 1;
     private static final int LOADER_ACCOUNTS = 2;
@@ -63,7 +62,7 @@
     private static final String KEY_SELECTED_ACCOUNT = "selectedAccount";
 
     private WelcomeContentObserver mObserver;
-    private RecyclerView mDrawerRecyclerView;
+    private ListView mDrawerListView;
     private DrawerAdapter mDrawerAdapter;
     private ContactsView mCurrentContactsView;
     private DrawerFragmentListener mListener;
@@ -152,13 +151,12 @@
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
         final View contentView = inflater.inflate(R.layout.drawer_fragment, null);
-        mDrawerRecyclerView = (RecyclerView) contentView.findViewById(R.id.list);
-        mDrawerRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
+        mDrawerListView = (ListView) contentView.findViewById(R.id.list);
         mDrawerAdapter = new DrawerAdapter(getActivity());
         mDrawerAdapter.setSelectedContactsView(mCurrentContactsView);
         mDrawerAdapter.setItemOnClickListener(mOnDrawerItemClickListener);
         loadGroupsAndFilters();
-        mDrawerRecyclerView.setAdapter(mDrawerAdapter);
+        mDrawerListView.setAdapter(mDrawerAdapter);
 
         if (savedInstanceState != null) {
             final ContactsView contactsView =