Show organization in header-view; Allow only one organization per contact

Change-Id: I89b99dbdf2148b3628b82b52bbbabea25052b10e
diff --git a/res/layout-xlarge/contact_detail_header_view.xml b/res/layout-xlarge/contact_detail_header_view.xml
index 529bdf7..f2ddd52 100644
--- a/res/layout-xlarge/contact_detail_header_view.xml
+++ b/res/layout-xlarge/contact_detail_header_view.xml
@@ -61,6 +61,17 @@
                 android:visibility="gone"
             />
 
+            <TextView android:id="@+id/organization"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:ellipsize="end"
+                android:layout_marginTop="-2dip"
+                android:visibility="gone"
+                android:textColor="#999999"
+                android:textAppearance="?android:attr/textAppearanceLarge"
+            />
+
             <TextView android:id="@+id/directory_name"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
diff --git a/res/layout/contact_detail_header_view.xml b/res/layout/contact_detail_header_view.xml
index 2417e45..6273c8a 100644
--- a/res/layout/contact_detail_header_view.xml
+++ b/res/layout/contact_detail_header_view.xml
@@ -57,6 +57,16 @@
             android:visibility="gone"
         />
 
+        <TextView android:id="@+id/organization"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:layout_marginTop="-2dip"
+            android:visibility="gone"
+        />
+
         <TextView android:id="@+id/directory_name"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 378cc38..7267d62 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1364,4 +1364,8 @@
 
     <!-- The preference section title for contact display options [CHAR LIMIT=128] -->
     <string name="preference_displayOptions">Display options</string>
+
+    <!-- Text used to show a organization that has both a company and title. This is used in the Detail-View
+    of a Contact. This is mostly about the formatting of the two elements, so it should be kept small [CHAR LIMIT=79] -->
+    <string name="organization_company_and_title"><xliff:g id="company" example="Technical Program Manager">%2$s</xliff:g>, <xliff:g id="company" example="Google Inc.">%1$s</xliff:g></string>
 </resources>
diff --git a/src/com/android/contacts/model/ExchangeAccountType.java b/src/com/android/contacts/model/ExchangeAccountType.java
index a78354a..0e96643 100644
--- a/src/com/android/contacts/model/ExchangeAccountType.java
+++ b/src/com/android/contacts/model/ExchangeAccountType.java
@@ -249,12 +249,6 @@
 
         if (inflateLevel >= BaseAccountType.LEVEL_CONSTRAINTS) {
             kind.isList = false;
-            kind.typeColumn = Organization.TYPE;
-            kind.typeList = Lists.newArrayList();
-            kind.typeList.add(buildOrgType(Organization.TYPE_WORK).setSpecificMax(1));
-            kind.typeList.add(buildOrgType(Organization.TYPE_OTHER).setSpecificMax(1));
-            kind.typeList.add(buildOrgType(Organization.TYPE_CUSTOM).setSecondary(true)
-                    .setSpecificMax(1));
 
             kind.fieldList = Lists.newArrayList();
             kind.fieldList.add(new EditField(Organization.COMPANY, R.string.ghostData_company,
diff --git a/src/com/android/contacts/model/FallbackAccountType.java b/src/com/android/contacts/model/FallbackAccountType.java
index 2f4b8ff..ea80cbd 100644
--- a/src/com/android/contacts/model/FallbackAccountType.java
+++ b/src/com/android/contacts/model/FallbackAccountType.java
@@ -104,10 +104,6 @@
         return new EditType(type, Im.getProtocolLabelResource(type));
     }
 
-    protected EditType buildOrgType(int type) {
-        return new EditType(type, Organization.getTypeLabelResource(type));
-    }
-
     protected EditType buildEventType(int type) {
         return new EditType(type, Event.getTypeResource(type));
     }
@@ -337,12 +333,7 @@
         }
 
         if (inflateLevel >= BaseAccountType.LEVEL_CONSTRAINTS) {
-            kind.typeColumn = Organization.TYPE;
-            kind.typeList = Lists.newArrayList();
-            kind.typeList.add(buildOrgType(Organization.TYPE_WORK));
-            kind.typeList.add(buildOrgType(Organization.TYPE_OTHER));
-            kind.typeList.add(buildOrgType(Organization.TYPE_CUSTOM).setSecondary(true)
-                    .setCustomColumn(Organization.LABEL));
+            kind.isList = false;
 
             kind.fieldList = Lists.newArrayList();
             kind.fieldList.add(new EditField(Organization.COMPANY, R.string.ghostData_company,
diff --git a/src/com/android/contacts/views/ContactLoader.java b/src/com/android/contacts/views/ContactLoader.java
index fca767f..0764ecf 100644
--- a/src/com/android/contacts/views/ContactLoader.java
+++ b/src/com/android/contacts/views/ContactLoader.java
@@ -161,7 +161,7 @@
         /**
          * @param exportSupport See {@link Directory#EXPORT_SUPPORT}.
          */
-        public void setDirectoryMetaData(String displayName, String directoryType,
+        private void setDirectoryMetaData(String displayName, String directoryType,
                 String accountType, String accountName, int exportSupport) {
             mDirectoryDisplayName = displayName;
             mDirectoryType = directoryType;
@@ -272,7 +272,7 @@
             return result;
         }
 
-        public void addGroupMetaData(GroupMetaData group) {
+        private void addGroupMetaData(GroupMetaData group) {
             if (mGroups == null) {
                 mGroups = new ArrayList<GroupMetaData>();
             }
diff --git a/src/com/android/contacts/views/detail/ContactDetailFragment.java b/src/com/android/contacts/views/detail/ContactDetailFragment.java
index 6a11c1b..264a8d5 100644
--- a/src/com/android/contacts/views/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/views/detail/ContactDetailFragment.java
@@ -155,7 +155,6 @@
     private ArrayList<ViewEntry> mPostalEntries = new ArrayList<ViewEntry>();
     private ArrayList<ViewEntry> mImEntries = new ArrayList<ViewEntry>();
     private ArrayList<ViewEntry> mNicknameEntries = new ArrayList<ViewEntry>();
-    private ArrayList<ViewEntry> mOrganizationEntries = new ArrayList<ViewEntry>();
     private ArrayList<ViewEntry> mGroupEntries = new ArrayList<ViewEntry>();
     private ArrayList<ViewEntry> mOtherEntries = new ArrayList<ViewEntry>();
     private ArrayList<ArrayList<ViewEntry>> mSections = new ArrayList<ArrayList<ViewEntry>>();
@@ -172,7 +171,6 @@
         mSections.add(mImEntries);
         mSections.add(mPostalEntries);
         mSections.add(mNicknameEntries);
-        mSections.add(mOrganizationEntries);
         mSections.add(mOtherEntries);
         mSections.add(mGroupEntries);
     }
@@ -432,29 +430,9 @@
                         entry.applyStatus(status, false);
                     }
                     mImEntries.add(entry);
-                } else if (Organization.CONTENT_ITEM_TYPE.equals(mimeType) &&
-                        (hasData || !TextUtils.isEmpty(entry.typeString))) {
-                    // Build organization entries
-                    final boolean isNameRawContact =
-                            (mContactData.getNameRawContactId() == rawContactId);
-
-                    final boolean duplicatesTitle =
-                            isNameRawContact
-                            && mContactData.getDisplayNameSource()
-                                == DisplayNameSources.ORGANIZATION
-                            && (!hasData || TextUtils.isEmpty(entry.typeString));
-
-                    if (!duplicatesTitle) {
-                        entry.uri = null;
-
-                        if (TextUtils.isEmpty(entry.typeString)) {
-                            entry.kindAndType = entry.data;
-                            entry.typeString = entry.data;
-                            entry.data = "";
-                        }
-
-                        mOrganizationEntries.add(entry);
-                    }
+                } else if (Organization.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                    // Organizations are not shown. The first one is shown in the header
+                    // and subsequent ones are not supported anymore
                 } else if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType) && hasData) {
                     // Build nickname entries
                     final boolean isNameRawContact =
diff --git a/src/com/android/contacts/views/detail/ContactDetailHeaderView.java b/src/com/android/contacts/views/detail/ContactDetailHeaderView.java
index 3568c4f..5f43f02 100644
--- a/src/com/android/contacts/views/detail/ContactDetailHeaderView.java
+++ b/src/com/android/contacts/views/detail/ContactDetailHeaderView.java
@@ -19,14 +19,18 @@
 import com.android.contacts.R;
 import com.android.contacts.util.ContactBadgeUtil;
 import com.android.contacts.views.ContactLoader;
+import com.android.contacts.views.ContactLoader.Result;
 
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.Entity;
+import android.content.Entity.NamedContentValues;
 import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
 import android.net.Uri;
-import android.os.SystemClock;
+import android.provider.ContactsContract.CommonDataKinds.Organization;
 import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.DisplayNameSources;
 import android.provider.ContactsContract.StatusUpdates;
 import android.text.TextUtils;
 import android.util.AttributeSet;
@@ -47,6 +51,7 @@
 
     private TextView mDisplayNameView;
     private TextView mPhoneticNameView;
+    private TextView mOrganizationTextView;
     private CheckBox mStarredView;
     private ImageView mPhotoView;
     private ImageView mPresenceView;
@@ -85,6 +90,8 @@
 
         mPhoneticNameView = (TextView) findViewById(R.id.phonetic_name);
 
+        mOrganizationTextView = (TextView) findViewById(R.id.organization);
+
         mStarredView = (CheckBox)findViewById(R.id.star);
         mStarredView.setOnClickListener(this);
 
@@ -106,6 +113,7 @@
         mContactUri = contactData.getLookupUri();
 
         setDisplayName(contactData.getDisplayName(), contactData.getPhoneticName());
+        setCompany(contactData);
         setPhoto(ContactBadgeUtil.getPhoto(contactData));
         setStared(contactData.getStarred());
         setPresence(contactData.getPresence());
@@ -177,6 +185,54 @@
     }
 
     /**
+     * Sets the organization info. If several organizations are given, the first one is used
+     */
+    private void setCompany(Result contactData) {
+        final boolean displayNameIsOrganization =
+            contactData.getDisplayNameSource() == DisplayNameSources.ORGANIZATION;
+        for (Entity entity : contactData.getEntities()) {
+            for (NamedContentValues subValue : entity.getSubValues()) {
+                final ContentValues entryValues = subValue.values;
+                final String mimeType = entryValues.getAsString(Data.MIMETYPE);
+
+                if (Organization.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                    final String company = entryValues.getAsString(Organization.COMPANY);
+                    final String title = entryValues.getAsString(Organization.TITLE);
+                    final String combined;
+                    // We need to show company and title in a combined string. However, if the
+                    // DisplayName is already the organization, it mirrors company or (if company
+                    // is empty title). Make sure we don't show what's already shown as DisplayName
+                    if (TextUtils.isEmpty(company)) {
+                        combined = displayNameIsOrganization ? null : title;
+                    } else {
+                        if (TextUtils.isEmpty(title)) {
+                            combined = displayNameIsOrganization ? null : company;
+                        } else {
+                            if (displayNameIsOrganization) {
+                                combined = title;
+                            } else {
+                                combined = getResources().getString(
+                                        R.string.organization_company_and_title,
+                                        company, title);
+                            }
+                        }
+                    }
+
+                    if (TextUtils.isEmpty(combined)) {
+                        mOrganizationTextView.setVisibility(GONE);
+                    } else {
+                        mOrganizationTextView.setVisibility(VISIBLE);
+                        mOrganizationTextView.setText(combined);
+                    }
+
+                    return;
+                }
+            }
+        }
+        mOrganizationTextView.setVisibility(GONE);
+    }
+
+    /**
      * Set the social snippet text to display in the header.
      */
     private void setSocialSnippet(CharSequence snippet) {