Merge "Add a smoke test for ImportProcessor."
diff --git a/res/drawable-mdpi/edit_focused.png b/res/drawable-mdpi/edit_focused.png
new file mode 100644
index 0000000..cf65d88
--- /dev/null
+++ b/res/drawable-mdpi/edit_focused.png
Binary files differ
diff --git a/res/drawable-mdpi/edit_normal.png b/res/drawable-mdpi/edit_normal.png
new file mode 100644
index 0000000..4e66379
--- /dev/null
+++ b/res/drawable-mdpi/edit_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/edit_pressed.png b/res/drawable-mdpi/edit_pressed.png
new file mode 100644
index 0000000..537795d
--- /dev/null
+++ b/res/drawable-mdpi/edit_pressed.png
Binary files differ
diff --git a/res/layout/contact_editor_fragment.xml b/res/layout/contact_editor_fragment.xml
index 0055956..32ac464 100644
--- a/res/layout/contact_editor_fragment.xml
+++ b/res/layout/contact_editor_fragment.xml
@@ -29,9 +29,10 @@
             android:layout_width="match_parent"
             android:layout_height="0px"
             android:layout_weight="1">
-        <com.android.contacts.views.editor.MyListView android:id="@android:id/list"
+        <LinearLayout android:id="@+id/field_container"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:orientation="vertical"
             android:background="@drawable/title_bar_shadow"
         />
     </ScrollView>
diff --git a/src/com/android/contacts/views/editor/ContactEditorFragment.java b/src/com/android/contacts/views/editor/ContactEditorFragment.java
index 4f65f6d..823c033 100644
--- a/src/com/android/contacts/views/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/views/editor/ContactEditorFragment.java
@@ -78,6 +78,7 @@
 import android.view.View.OnCreateContextMenuListener;
 import android.widget.AdapterView;
 import android.widget.BaseAdapter;
+import android.widget.LinearLayout;
 import android.widget.ListView;
 import android.widget.Toast;
 
@@ -89,8 +90,6 @@
 
     private static final String BUNDLE_RAW_CONTACT_ID = "rawContactId";
 
-    private static final int MENU_ITEM_MAKE_DEFAULT = 3;
-
     private static final int LOADER_DETAILS = 1;
 
     private Context mContext;
@@ -101,8 +100,7 @@
 
     private ContactLoader.Result mContactData;
     private ContactEditorHeaderView mHeaderView;
-    private MyListView mListView;
-    private ViewAdapter mAdapter;
+    private LinearLayout mFieldContainer;
 
     private int mReadOnlySourcesCnt;
     private int mWritableSourcesCnt;
@@ -135,11 +133,9 @@
 
         mHeaderView = (ContactEditorHeaderView) view.findViewById(R.id.contact_header_widget);
 
-        mListView = (MyListView) view.findViewById(android.R.id.list);
-        mListView.setOnCreateContextMenuListener(this);
-        mListView.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
-        mListView.setOnItemClickListener(this);
-        mListView.setItemsCanFocus(true);
+        mFieldContainer = (LinearLayout) view.findViewById(R.id.field_container);
+        mFieldContainer.setOnCreateContextMenuListener(this);
+        mFieldContainer.setScrollBarStyle(ListView.SCROLLBARS_OUTSIDE_OVERLAY);
 
         return view;
     }
@@ -205,12 +201,7 @@
 
         mHeaderView.setMergeInfo(mRawContacts.size());
 
-        if (mAdapter == null) {
-            mAdapter = new ViewAdapter();
-            mListView.setAdapter(mAdapter);
-        } else {
-            mAdapter.notifyDataSetChanged();
-        }
+        createFieldViews();
     }
 
     /**
@@ -348,72 +339,25 @@
         }
     }
 
-    private final class ViewAdapter extends BaseAdapter {
-        public View getView(int position, View convertView, ViewGroup parent) {
-            final View result;
+    private void createFieldViews() {
+        mFieldContainer.removeAllViews();
 
-            final BaseViewModel viewEntry = getEntry(position);
-            return viewEntry.getView(mInflater, convertView, parent);
-        }
+        for (int i = 0; i < mRawContacts.size(); i++) {
+            final DisplayRawContact rawContact = mRawContacts.get(i);
+            // Header
+            mFieldContainer.addView(
+                            rawContact.getHeader().getView(mInflater, mFieldContainer));
 
-        public Object getItem(int position) {
-            return getEntry(position);
-        }
-
-        public long getItemId(int position) {
-            // TODO Get a unique Id. Use negative numbers for Headers/Footers
-            return position;
-        }
-
-        private BaseViewModel getEntry(int position) {
-            for (int i = 0; i < mRawContacts.size(); i++) {
-                final DisplayRawContact rawContact = mRawContacts.get(i);
-                if (position == 0) return rawContact.getHeader();
-
-                // Collapsed header? Count one item and continue
-                if (rawContact.getHeader().isCollapsed()) {
-                    position--;
-                    continue;
-                }
-
-                final ArrayList<BaseViewModel> fields = rawContact.getFields();
-                // +1 for header, +1 for footer
-                final int fieldCount = fields.size() + 2;
-                if (position == fieldCount - 1) {
-                    return rawContact.getFooter();
-                }
-                if (position < fieldCount) {
-                    // -1 for header
-                    return fields.get(position - 1);
-                }
-                position -= fieldCount;
+            // Data items
+            final ArrayList<BaseViewModel> fields = rawContact.getFields();
+            for (int j = 0; j < fields.size(); j++) {
+                final BaseViewModel field = fields.get(j);
+                mFieldContainer.addView(field.getView(mInflater, mFieldContainer));
             }
-            return null;
-        }
 
-        @Override
-        public int getViewTypeCount() {
-            return ViewTypes._COUNT;
-        }
-
-        @Override
-        public int getItemViewType(int position) {
-            return getEntry(position).getEntryType();
-        }
-
-        public int getCount() {
-            int result = 0;
-            for (int i = 0; i < mRawContacts.size(); i++) {
-                final DisplayRawContact rawContact = mRawContacts.get(i);
-                if (rawContact.getHeader().isCollapsed()) {
-                    // just one header item
-                    result++;
-                } else {
-                    // +1 for header, +1 for footer
-                    result += rawContact.getFields().size() + 2;
-                }
-            }
-            return result;
+            // Footer
+            mFieldContainer.addView(
+                    rawContact.getFooter().getView(mInflater, mFieldContainer));
         }
     }
 
diff --git a/src/com/android/contacts/views/editor/MyListView.java b/src/com/android/contacts/views/editor/MyListView.java
deleted file mode 100644
index 12651c1..0000000
--- a/src/com/android/contacts/views/editor/MyListView.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2010 Google Inc.
- *
- * 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.contacts.views.editor;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.BaseAdapter;
-import android.widget.LinearLayout;
-
-/**
- * Compatibility pseudo-ListView. This just renders everything into a LinearLayout using a ListView
- * adapter. If this turns out to be fast enough, we can keep using this. This view will be removed
- * once the decision has been made
- */
-public class MyListView extends LinearLayout {
-    public MyListView(Context context) {
-        super(context);
-    }
-
-    public MyListView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public MyListView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
-        setOrientation(VERTICAL);
-    }
-
-    public void setOnItemClickListener(ContactEditorFragment contactEditorFragment) {
-        // Keep compatibility with ListView
-    }
-
-    public void setItemsCanFocus(boolean value) {
-        // Keep compatibility with ListView
-    }
-
-    public void setAdapter(BaseAdapter adapter) {
-        removeAllViews();
-        for (int i = 0; i < adapter.getCount(); i++) {
-            final View childView = adapter.getView(i, null, this);
-            addView(childView);
-        }
-    }
-}
diff --git a/src/com/android/contacts/views/editor/viewModel/BaseViewModel.java b/src/com/android/contacts/views/editor/viewModel/BaseViewModel.java
index 6bef3ca..8a2f78a 100644
--- a/src/com/android/contacts/views/editor/viewModel/BaseViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/BaseViewModel.java
@@ -43,5 +43,5 @@
     }
 
     public abstract int getEntryType();
-    public abstract View getView(LayoutInflater inflater, View convertView, ViewGroup parent);
+    public abstract View getView(LayoutInflater inflater, ViewGroup parent);
 }
diff --git a/src/com/android/contacts/views/editor/viewModel/FieldAndTypeViewModel.java b/src/com/android/contacts/views/editor/viewModel/FieldAndTypeViewModel.java
index c754e92..c4cc931 100644
--- a/src/com/android/contacts/views/editor/viewModel/FieldAndTypeViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/FieldAndTypeViewModel.java
@@ -54,10 +54,8 @@
     }
 
     @Override
-    public FieldAndTypeView getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
-        final FieldAndTypeView result = convertView != null
-                ? (FieldAndTypeView) convertView
-                : FieldAndTypeView.inflate(inflater, parent, false);
+    public FieldAndTypeView getView(LayoutInflater inflater, ViewGroup parent) {
+        final FieldAndTypeView result = FieldAndTypeView.inflate(inflater, parent, false);
 
         result.setListener(mViewListener);
         result.setLabelText(mLabelResId);
diff --git a/src/com/android/contacts/views/editor/viewModel/FooterViewModel.java b/src/com/android/contacts/views/editor/viewModel/FooterViewModel.java
index 9277a8b..28610ef 100644
--- a/src/com/android/contacts/views/editor/viewModel/FooterViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/FooterViewModel.java
@@ -40,10 +40,8 @@
     }
 
     @Override
-    public View getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
-        final FooterView result = convertView != null
-                ? (FooterView) convertView
-                : FooterView.inflate(inflater, parent, false);
+    public View getView(LayoutInflater inflater, ViewGroup parent) {
+        final FooterView result = FooterView.inflate(inflater, parent, false);
 
         result.setListener(mViewListener);
         return result;
diff --git a/src/com/android/contacts/views/editor/viewModel/HeaderViewModel.java b/src/com/android/contacts/views/editor/viewModel/HeaderViewModel.java
index dca3a06..15b5226 100644
--- a/src/com/android/contacts/views/editor/viewModel/HeaderViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/HeaderViewModel.java
@@ -48,10 +48,8 @@
     }
 
     @Override
-    public View getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
-        final HeaderView result = convertView != null
-                ? (HeaderView) convertView
-                : HeaderView.inflate(inflater, parent, false);
+    public View getView(LayoutInflater inflater, ViewGroup parent) {
+        final HeaderView result = HeaderView.inflate(inflater, parent, false);
 
         CharSequence accountType = getRawContact().getSource().getDisplayLabel(getContext());
         if (TextUtils.isEmpty(accountType)) {
diff --git a/src/com/android/contacts/views/editor/viewModel/OrganizationViewModel.java b/src/com/android/contacts/views/editor/viewModel/OrganizationViewModel.java
index 0f40532..1ccfb79 100644
--- a/src/com/android/contacts/views/editor/viewModel/OrganizationViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/OrganizationViewModel.java
@@ -62,10 +62,8 @@
     }
 
     @Override
-    public OrganizationView getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
-        final OrganizationView result = convertView != null
-                ? (OrganizationView) convertView
-                : OrganizationView.inflate(inflater, parent, false);
+    public OrganizationView getView(LayoutInflater inflater, ViewGroup parent) {
+        final OrganizationView result = OrganizationView.inflate(inflater, parent, false);
 
         result.setListener(mViewListener);
         result.setLabelText(mLabelResId);
diff --git a/src/com/android/contacts/views/editor/viewModel/PhotoViewModel.java b/src/com/android/contacts/views/editor/viewModel/PhotoViewModel.java
index 05adf57..ae04933 100644
--- a/src/com/android/contacts/views/editor/viewModel/PhotoViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/PhotoViewModel.java
@@ -56,10 +56,8 @@
     }
 
     @Override
-    public View getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
-        final PhotoView result = convertView != null
-                ? (PhotoView) convertView
-                : PhotoView.inflate(inflater, parent, false);
+    public View getView(LayoutInflater inflater, ViewGroup parent) {
+        final PhotoView result = PhotoView.inflate(inflater, parent, false);
 
         final byte[] binaryData = getContentValues().getAsByteArray(Photo.PHOTO);
 
diff --git a/src/com/android/contacts/views/editor/viewModel/SingleFieldViewModel.java b/src/com/android/contacts/views/editor/viewModel/SingleFieldViewModel.java
index 16a9769..a5ef528 100644
--- a/src/com/android/contacts/views/editor/viewModel/SingleFieldViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/SingleFieldViewModel.java
@@ -49,10 +49,8 @@
     }
 
     @Override
-    public SingleFieldView getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
-        final SingleFieldView result = convertView != null
-                ? (SingleFieldView) convertView
-                : SingleFieldView.inflate(inflater, parent, false);
+    public SingleFieldView getView(LayoutInflater inflater, ViewGroup parent) {
+        final SingleFieldView result = SingleFieldView.inflate(inflater, parent, false);
 
         result.setListener(mViewListener);
         result.setLabelText(mLabelResId);
diff --git a/src/com/android/contacts/views/editor/viewModel/StructuredNameViewModel.java b/src/com/android/contacts/views/editor/viewModel/StructuredNameViewModel.java
index 269bc2a..fb92b83 100644
--- a/src/com/android/contacts/views/editor/viewModel/StructuredNameViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/StructuredNameViewModel.java
@@ -69,10 +69,9 @@
     }
 
     @Override
-    public View getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
-        final SimpleOrStructuredView result = convertView != null
-                ? (SimpleOrStructuredView) convertView
-                : SimpleOrStructuredView.inflate(inflater, parent, false);
+    public View getView(LayoutInflater inflater, ViewGroup parent) {
+        final SimpleOrStructuredView result =
+                SimpleOrStructuredView.inflate(inflater, parent, false);
 
         result.setListener(mViewListener);
         result.setLabelText(mLabelResId);
diff --git a/src/com/android/contacts/views/editor/viewModel/StructuredPostalViewModel.java b/src/com/android/contacts/views/editor/viewModel/StructuredPostalViewModel.java
index 9f8fc46..ef46bdb 100644
--- a/src/com/android/contacts/views/editor/viewModel/StructuredPostalViewModel.java
+++ b/src/com/android/contacts/views/editor/viewModel/StructuredPostalViewModel.java
@@ -78,10 +78,9 @@
     }
 
     @Override
-    public View getView(LayoutInflater inflater, View convertView, ViewGroup parent) {
-        final SimpleOrStructuredView result = convertView != null
-                ? (SimpleOrStructuredView) convertView
-                : SimpleOrStructuredView.inflate(inflater, parent, false);
+    public View getView(LayoutInflater inflater, ViewGroup parent) {
+        final SimpleOrStructuredView result =
+                SimpleOrStructuredView.inflate(inflater, parent, false);
 
         result.setListener(mViewListener);
         result.setLabelText(mLabelResId);