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) {