Merge "Let Phone UI reload filter on onStart()"
diff --git a/res/layout-sw580dp-w1000dp/contact_detail_updates_fragment.xml b/res/layout-sw580dp-w1000dp/contact_detail_updates_fragment.xml
index 71c2267..5daf555 100644
--- a/res/layout-sw580dp-w1000dp/contact_detail_updates_fragment.xml
+++ b/res/layout-sw580dp-w1000dp/contact_detail_updates_fragment.xml
@@ -20,4 +20,6 @@
     android:layout_height="match_parent"
     android:background="@color/background_social_updates"
     android:fadingEdge="none"
-    android:divider="@null"/>
+    android:divider="@null"
+    android:paddingTop="@dimen/contact_detail_list_top_padding"
+    android:clipToPadding="false"/>
diff --git a/res/layout-sw580dp/contact_detail_updates_fragment.xml b/res/layout-sw580dp/contact_detail_updates_fragment.xml
index 3bcb01c..513254e 100644
--- a/res/layout-sw580dp/contact_detail_updates_fragment.xml
+++ b/res/layout-sw580dp/contact_detail_updates_fragment.xml
@@ -25,7 +25,8 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:fadingEdge="none"
-        android:divider="@null"/>
+        android:divider="@null"
+        android:paddingTop="32dip"/>
 
     <View
         android:id="@+id/alpha_overlay"
diff --git a/res/layout/stream_item_container.xml b/res/layout/stream_item_container.xml
index a88dd9a..6a65357 100644
--- a/res/layout/stream_item_container.xml
+++ b/res/layout/stream_item_container.xml
@@ -17,14 +17,16 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    android:paddingLeft="@dimen/detail_update_section_side_padding"
+    android:paddingRight="@dimen/detail_update_section_side_padding">
 
     <TableLayout
         android:id="@+id/stream_item_content"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:paddingTop="@dimen/detail_update_section_item_vertical_padding"
-        android:paddingBottom="@dimen/detail_update_section_item_last_row_extra_vertical_padding"
+        android:paddingBottom="@dimen/detail_update_section_item_vertical_padding"
         android:paddingLeft="@dimen/detail_update_section_item_horizontal_padding"
         android:paddingRight="@dimen/detail_update_section_item_horizontal_padding"
         android:background="?android:attr/selectableItemBackground"
@@ -34,8 +36,6 @@
         android:id="@+id/horizontal_divider"
         android:layout_width="match_parent"
         android:layout_height="1px"
-        android:layout_marginLeft="@dimen/detail_update_section_side_padding"
-        android:layout_marginRight="@dimen/detail_update_section_side_padding"
         android:background="?android:attr/dividerHorizontal" />
 
 </LinearLayout>
diff --git a/res/layout/stream_item_row_image_and_text.xml b/res/layout/stream_item_row_image_and_text.xml
index 8c67ce1..ea87ff0 100644
--- a/res/layout/stream_item_row_image_and_text.xml
+++ b/res/layout/stream_item_row_image_and_text.xml
@@ -17,7 +17,8 @@
 <TableRow
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:ex="http://schemas.android.com/apk/res/com.android.contacts"
-    android:paddingBottom="@dimen/detail_update_section_between_items_vertical_padding">
+    android:paddingBottom="@dimen/detail_update_section_between_items_vertical_padding"
+    android:paddingTop="@dimen/detail_update_section_between_items_vertical_padding">
 
     <view
         class="com.android.contacts.widget.ProportionalLayout"
@@ -45,12 +46,11 @@
             android:id="@+id/stream_item_second_text"
             android:orientation="vertical"
             android:layout_width="match_parent"
-            android:layout_height="match_parent">
+            android:layout_height="wrap_content">
 
             <TextView android:id="@+id/stream_item_html"
                 android:layout_width="match_parent"
-                android:layout_height="0dip"
-                android:layout_weight="1"
+                android:layout_height="wrap_content"
                 android:textSize="16sp"
                 android:textColor="?android:attr/textColorPrimary" />
 
@@ -69,7 +69,8 @@
                     android:layout_height="wrap_content"
                     android:layout_marginLeft="@dimen/detail_update_section_attribution_comments_padding"
                     android:textAppearance="?android:attr/textAppearanceSmall"
-                    android:textColor="?android:attr/textColorSecondary" />
+                    android:textColor="?android:attr/textColorSecondary"
+                    android:visibility="gone" />
             </LinearLayout>
 
         </LinearLayout>
diff --git a/res/layout/updates_title.xml b/res/layout/updates_title.xml
index 78fe178..995a3b9 100644
--- a/res/layout/updates_title.xml
+++ b/res/layout/updates_title.xml
@@ -34,9 +34,7 @@
         android:textAllCaps="true"
         android:singleLine="true"
         android:ellipsize="end"
-        android:paddingLeft="8dip"
-        android:paddingTop="5dip"
-        android:paddingBottom="2dip" />
+        style="@style/UpdatesTitleStyle"/>
 
     <View
         android:layout_width="match_parent"
diff --git a/res/values-sw580dp-w1000dp/dimens.xml b/res/values-sw580dp-w1000dp/dimens.xml
index 34c89fc..fe03b0d 100644
--- a/res/values-sw580dp-w1000dp/dimens.xml
+++ b/res/values-sw580dp-w1000dp/dimens.xml
@@ -22,4 +22,5 @@
     <dimen name="detail_header_view_margin">16dip</dimen>
     <dimen name="detail_header_attribution_height">56dip</dimen>
     <dimen name="detail_update_section_top_padding">48dip</dimen>
+    <dimen name="contact_detail_list_top_padding">32dip</dimen>
 </resources>
diff --git a/res/values-sw580dp/dimens.xml b/res/values-sw580dp/dimens.xml
index 0a7bb6b..ef0e04f 100644
--- a/res/values-sw580dp/dimens.xml
+++ b/res/values-sw580dp/dimens.xml
@@ -21,7 +21,7 @@
     <dimen name="editor_round_button_padding_right">16dip</dimen>
     <dimen name="editor_kind_title_left_padding">16dip</dimen>
     <dimen name="editor_add_field_label_left_padding">24dip</dimen>
-    <dimen name="detail_item_side_margin">0dip</dimen>
+    <dimen name="detail_item_side_margin">16dip</dimen>
     <dimen name="detail_item_vertical_margin">16dip</dimen>
     <dimen name="detail_item_icon_margin">8dip</dimen>
     <dimen name="contact_name_text_size">26sp</dimen>
@@ -32,10 +32,11 @@
     <dimen name="shortcut_icon_size">64dip</dimen>
     <dimen name="list_section_height">37dip</dimen>
     <dimen name="group_detail_border_padding">16dip</dimen>
-    <dimen name="detail_update_section_side_padding">0dip</dimen>
+    <dimen name="detail_update_section_side_padding">16dip</dimen>
     <dimen name="detail_update_section_item_horizontal_padding">8dip</dimen>
-    <dimen name="detail_update_section_item_vertical_padding">32dip</dimen>
-    <dimen name="detail_update_section_item_last_row_extra_vertical_padding">16dip</dimen>
+    <dimen name="detail_update_section_item_vertical_padding">16dip</dimen>
+    <dimen name="detail_update_section_between_items_vertical_padding">16dip</dimen>
+    <dimen name="detail_update_section_item_last_row_extra_vertical_padding">8dip</dimen>
     <dimen name="search_view_width">400dip</dimen>
     <!-- Center vertically -->
     <dimen name="quick_contact_top_position">-1px</dimen>
@@ -63,4 +64,5 @@
     <dimen name="account_container_left_padding">16dip</dimen>
     <!-- Left padding of the auto complete field to line hint text up with member list -->
     <dimen name="group_editor_autocomplete_left_padding">16dip</dimen>
+    <dimen name="contact_detail_list_top_padding">8dip</dimen>
 </resources>
diff --git a/res/values-sw580dp/styles.xml b/res/values-sw580dp/styles.xml
index 4029401..5f18d22 100644
--- a/res/values-sw580dp/styles.xml
+++ b/res/values-sw580dp/styles.xml
@@ -121,4 +121,11 @@
         <item name="android:windowNoDisplay">true</item>
         <item name="android:windowIsFloating">true</item>
     </style>
+
+    <style name="UpdatesTitleStyle">
+        <item name="android:paddingLeft">8dip</item>
+        <item name="android:layout_height">16dip</item>
+        <item name="android:layout_gravity">center_vertical</item>
+        <item name="android:gravity">center_vertical</item>
+    </style>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index aa421f1..90cb071 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -265,4 +265,10 @@
         <item name="android:displayOptions"></item>
     </style>
 
+    <style name="UpdatesTitleStyle">
+        <item name="android:paddingLeft">8dip</item>
+        <item name="android:paddingTop">5dip</item>
+        <item name="android:paddingBottom">2dip</item>
+    </style>
+
 </resources>
diff --git a/src/com/android/contacts/CallDetailActivity.java b/src/com/android/contacts/CallDetailActivity.java
index d7881a2..6ab4b68 100644
--- a/src/com/android/contacts/CallDetailActivity.java
+++ b/src/com/android/contacts/CallDetailActivity.java
@@ -220,7 +220,7 @@
             playbackFragment.setArguments(fragmentArguments);
             voicemailContainer.setVisibility(View.VISIBLE);
             getFragmentManager().beginTransaction()
-                    .add(R.id.voicemail_container, playbackFragment).commit();
+                    .add(R.id.voicemail_container, playbackFragment).commitAllowingStateLoss();
             mAsyncQueryHandler.startVoicemailStatusQuery(getVoicemailUri());
             markVoicemailAsRead(getVoicemailUri());
         } else {
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 9c6e243..fbb9b66 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -284,7 +284,7 @@
 
         getFragmentManager().beginTransaction()
                 .replace(R.id.list_container, mListFragment)
-                .commit();
+                .commitAllowingStateLoss();
     }
 
     public void setupActionListener() {
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index 276a06b..7d96973 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -490,7 +490,7 @@
             } else {
                 transaction.hide(mSearchFragment);
             }
-            transaction.commit();
+            transaction.commitAllowingStateLoss();
         }
     }
 
@@ -807,7 +807,7 @@
         // Show the search fragment and hide everything else.
         final FragmentTransaction transaction = getFragmentManager().beginTransaction();
         transaction.show(mSearchFragment);
-        transaction.commit();
+        transaction.commitAllowingStateLoss();
         mViewPager.setVisibility(View.GONE);
 
         // We need to call this and onActionViewCollapsed() manually, since we are using a custom
@@ -844,7 +844,7 @@
 
         final FragmentTransaction transaction = getFragmentManager().beginTransaction();
         transaction.hide(mSearchFragment);
-        transaction.commit();
+        transaction.commitAllowingStateLoss();
 
         // We want to hide SearchView and show Tabs. Also focus on previously selected one.
         actionBar.setDisplayShowCustomEnabled(false);
diff --git a/src/com/android/contacts/activities/JoinContactActivity.java b/src/com/android/contacts/activities/JoinContactActivity.java
index 5ee6de2..7f22b18 100644
--- a/src/com/android/contacts/activities/JoinContactActivity.java
+++ b/src/com/android/contacts/activities/JoinContactActivity.java
@@ -95,7 +95,7 @@
 
             getFragmentManager().beginTransaction()
                     .replace(R.id.list_container, mListFragment)
-                    .commit();
+                    .commitAllowingStateLoss();
         }
     }
 
diff --git a/src/com/android/contacts/activities/NonPhoneActivity.java b/src/com/android/contacts/activities/NonPhoneActivity.java
index 26eed7c..922be47 100644
--- a/src/com/android/contacts/activities/NonPhoneActivity.java
+++ b/src/com/android/contacts/activities/NonPhoneActivity.java
@@ -48,7 +48,7 @@
 
         final NonPhoneDialogFragment fragment = new NonPhoneDialogFragment();
         fragment.setArguments(Bundle.forPair("PHONE_NUMBER", phoneNumber));
-        getFragmentManager().beginTransaction().add(fragment, "Fragment").commit();
+        getFragmentManager().beginTransaction().add(fragment, "Fragment").commitAllowingStateLoss();
     }
 
     private String getPhoneNumber() {
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 66bc5f5..1d3fda4 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -388,7 +388,7 @@
                     getFragmentManager(), findViewById(R.id.contact_detail_container),
                     new ContactDetailFragmentListener());
         }
-        transaction.commit();
+        transaction.commitAllowingStateLoss();
         fragmentManager.executePendingTransactions();
 
         // Setting Properties after fragment is created
@@ -665,7 +665,7 @@
                 break;
         }
         if (!ft.isEmpty()) {
-            ft.commit();
+            ft.commitAllowingStateLoss();
             fragmentManager.executePendingTransactions();
             // When switching tabs, we need to invalidate options menu, but executing a
             // fragment transaction does it implicitly.  We don't have to call invalidateOptionsMenu
@@ -816,7 +816,7 @@
         @Override
         public void finishUpdate(View container) {
             if (mCurTransaction != null) {
-                mCurTransaction.commit();
+                mCurTransaction.commitAllowingStateLoss();
                 mCurTransaction = null;
                 mFragmentManager.executePendingTransactions();
             }
@@ -926,7 +926,7 @@
                         new ContactsUnavailableFragmentListener());
                 getFragmentManager().beginTransaction()
                         .replace(R.id.contacts_unavailable_container, mContactsUnavailableFragment)
-                        .commit();
+                        .commitAllowingStateLoss();
             } else {
                 mContactsUnavailableFragment.update();
             }
diff --git a/src/com/android/contacts/detail/ContactDetailLayoutController.java b/src/com/android/contacts/detail/ContactDetailLayoutController.java
index f9d6443..b26f8eb 100644
--- a/src/com/android/contacts/detail/ContactDetailLayoutController.java
+++ b/src/com/android/contacts/detail/ContactDetailLayoutController.java
@@ -168,7 +168,7 @@
                             ContactDetailViewPagerAdapter.ABOUT_FRAGMENT_TAG);
                     transaction.add(R.id.updates_fragment_container, mUpdatesFragment,
                             ContactDetailViewPagerAdapter.UPDTES_FRAGMENT_TAG);
-                    transaction.commit();
+                    transaction.commitAllowingStateLoss();
                     mFragmentManager.executePendingTransactions();
                 }
 
@@ -187,7 +187,7 @@
                             ContactDetailViewPagerAdapter.ABOUT_FRAGMENT_TAG);
                     transaction.add(R.id.updates_fragment_container, mUpdatesFragment,
                             ContactDetailViewPagerAdapter.UPDTES_FRAGMENT_TAG);
-                    transaction.commit();
+                    transaction.commitAllowingStateLoss();
                     mFragmentManager.executePendingTransactions();
                 }
                 break;
@@ -202,7 +202,7 @@
                             ContactDetailViewPagerAdapter.ABOUT_FRAGMENT_TAG);
                     transaction.add(R.id.updates_fragment_container, mUpdatesFragment,
                             ContactDetailViewPagerAdapter.UPDTES_FRAGMENT_TAG);
-                    transaction.commit();
+                    transaction.commitAllowingStateLoss();
                     mFragmentManager.executePendingTransactions();
                 }
 
diff --git a/src/com/android/contacts/interactions/ContactDeletionInteraction.java b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
index 93bd10e..86f4eda 100644
--- a/src/com/android/contacts/interactions/ContactDeletionInteraction.java
+++ b/src/com/android/contacts/interactions/ContactDeletionInteraction.java
@@ -123,7 +123,8 @@
             fragment.setTestLoaderManager(testLoaderManager);
             fragment.setContactUri(contactUri);
             fragment.setFinishActivityWhenDone(finishActivityWhenDone);
-            fragmentManager.beginTransaction().add(fragment, FRAGMENT_TAG).commit();
+            fragmentManager.beginTransaction().add(fragment, FRAGMENT_TAG)
+                    .commitAllowingStateLoss();
         } else {
             fragment.setTestLoaderManager(testLoaderManager);
             fragment.setContactUri(contactUri);
diff --git a/src/com/android/contacts/list/AccountFilterActivity.java b/src/com/android/contacts/list/AccountFilterActivity.java
index 02abb53..8e0f9b8 100644
--- a/src/com/android/contacts/list/AccountFilterActivity.java
+++ b/src/com/android/contacts/list/AccountFilterActivity.java
@@ -68,10 +68,6 @@
 
     private ListView mListView;
 
-    private static final String[] ID_PROJECTION = new String[] {BaseColumns._ID};
-    private static final Uri RAW_CONTACTS_URI_LIMIT_1 = RawContacts.CONTENT_URI.buildUpon()
-            .appendQueryParameter(ContactsContract.LIMIT_PARAM_KEY, "1").build();
-
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -124,7 +120,7 @@
         List<AccountWithDataSet> accounts = accountTypes.getAccounts(false);
         for (AccountWithDataSet account : accounts) {
             AccountType accountType = accountTypes.getAccountType(account.type, account.dataSet);
-            if (accountType.isExtension() && !hasAccountData(context, account)) {
+            if (accountType.isExtension() && !account.hasData(context)) {
                 // Hide extensions with no raw_contacts.
                 continue;
             }
@@ -149,29 +145,6 @@
         return result;
     }
 
-    private static boolean hasAccountData(Context context, AccountWithDataSet account) {
-        final String BASE_SELECTION =
-                RawContacts.ACCOUNT_TYPE + " = ?" + " AND " + RawContacts.ACCOUNT_NAME + " = ?";
-        final String selection;
-        final String[] args;
-        if (TextUtils.isEmpty(account.dataSet)) {
-            selection = BASE_SELECTION + " AND " + RawContacts.DATA_SET + " IS NULL";
-            args = new String[] {account.type, account.name};
-        } else {
-            selection = BASE_SELECTION + " AND " + RawContacts.DATA_SET + " = ?";
-            args = new String[] {account.type, account.name, account.dataSet};
-        }
-
-        final Cursor c = context.getContentResolver().query(RAW_CONTACTS_URI_LIMIT_1,
-                ID_PROJECTION, selection, args, null);
-        if (c == null) return false;
-        try {
-            return c.moveToFirst();
-        } finally {
-            c.close();
-        }
-    }
-
     private class MyLoaderCallbacks implements LoaderCallbacks<List<ContactListFilter>> {
         @Override
         public Loader<List<ContactListFilter>> onCreateLoader(int id, Bundle args) {
diff --git a/src/com/android/contacts/list/CustomContactListFilterActivity.java b/src/com/android/contacts/list/CustomContactListFilterActivity.java
index 26610dc..1ac1d32 100644
--- a/src/com/android/contacts/list/CustomContactListFilterActivity.java
+++ b/src/com/android/contacts/list/CustomContactListFilterActivity.java
@@ -132,6 +132,12 @@
 
             final AccountSet accounts = new AccountSet();
             for (AccountWithDataSet account : accountTypes.getAccounts(false)) {
+                final AccountType accountType = accountTypes.getAccountTypeForAccount(account);
+                if (accountType.isExtension() && !account.hasData(context)) {
+                    // Extension with no data -- skip.
+                    continue;
+                }
+
                 AccountDisplay accountDisplay =
                         new AccountDisplay(resolver, account.name, account.type, account.dataSet);
 
diff --git a/src/com/android/contacts/model/AccountTypeManager.java b/src/com/android/contacts/model/AccountTypeManager.java
index d28d5bb..d60f355 100644
--- a/src/com/android/contacts/model/AccountTypeManager.java
+++ b/src/com/android/contacts/model/AccountTypeManager.java
@@ -85,7 +85,15 @@
 
     public abstract List<AccountWithDataSet> getAccounts(boolean writableOnly);
 
-    public abstract AccountType getAccountType(String accountType, String dataSet);
+    public abstract AccountType getAccountType(AccountTypeWithDataSet accountTypeWithDataSet);
+
+    public final AccountType getAccountType(String accountType, String dataSet) {
+        return getAccountType(AccountTypeWithDataSet.get(accountType, dataSet));
+    }
+
+    public final AccountType getAccountTypeForAccount(AccountWithDataSet account) {
+        return getAccountType(account.getAccountTypeWithDataSet());
+    }
 
     /**
      * @return Unmodifiable map from {@link AccountTypeWithDataSet}s to {@link AccountType}s
@@ -482,11 +490,10 @@
      * Return {@link AccountType} for the given account type and data set.
      */
     @Override
-    public AccountType getAccountType(String accountType, String dataSet) {
+    public AccountType getAccountType(AccountTypeWithDataSet accountTypeWithDataSet) {
         ensureAccountsLoaded();
         synchronized (this) {
-            AccountType type = mAccountTypesWithDataSets.get(
-                    AccountTypeWithDataSet.get(accountType, dataSet));
+            AccountType type = mAccountTypesWithDataSets.get(accountTypeWithDataSet);
             return type != null ? type : mFallbackAccountType;
         }
     }
@@ -506,7 +513,7 @@
             Map<AccountTypeWithDataSet, AccountType> accountTypesByTypeAndDataSet) {
         HashMap<AccountTypeWithDataSet, AccountType> result = Maps.newHashMap();
         for (AccountWithDataSet account : accounts) {
-            AccountTypeWithDataSet accountTypeWithDataSet = account.getAccountTypeAndWithDataSet();
+            AccountTypeWithDataSet accountTypeWithDataSet = account.getAccountTypeWithDataSet();
             AccountType type = accountTypesByTypeAndDataSet.get(accountTypeWithDataSet);
             if (type == null) continue; // just in case
             if (result.containsKey(accountTypeWithDataSet)) continue;
diff --git a/src/com/android/contacts/model/AccountWithDataSet.java b/src/com/android/contacts/model/AccountWithDataSet.java
index f607737..55af795 100644
--- a/src/com/android/contacts/model/AccountWithDataSet.java
+++ b/src/com/android/contacts/model/AccountWithDataSet.java
@@ -19,7 +19,14 @@
 import com.android.internal.util.Objects;
 
 import android.accounts.Account;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
 import android.os.Parcel;
+import android.provider.BaseColumns;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.RawContacts;
+import android.text.TextUtils;
 
 /**
  * Wrapper for an account that includes a data set (which may be null).
@@ -29,6 +36,11 @@
     public final String dataSet;
     private final AccountTypeWithDataSet mAccountTypeWithDataSet;
 
+    private static final String[] ID_PROJECTION = new String[] {BaseColumns._ID};
+    private static final Uri RAW_CONTACTS_URI_LIMIT_1 = RawContacts.CONTENT_URI.buildUpon()
+            .appendQueryParameter(ContactsContract.LIMIT_PARAM_KEY, "1").build();
+
+
     public AccountWithDataSet(String name, String type, String dataSet) {
         super(name, type);
         this.dataSet = dataSet;
@@ -41,10 +53,37 @@
         mAccountTypeWithDataSet = AccountTypeWithDataSet.get(type, dataSet);
     }
 
-    public AccountTypeWithDataSet getAccountTypeAndWithDataSet() {
+    public AccountTypeWithDataSet getAccountTypeWithDataSet() {
         return mAccountTypeWithDataSet;
     }
 
+    /**
+     * Return {@code true} if this account has any contacts in the database.
+     * Touches DB.  Don't use in the UI thread.
+     */
+    public boolean hasData(Context context) {
+        final String BASE_SELECTION =
+                RawContacts.ACCOUNT_TYPE + " = ?" + " AND " + RawContacts.ACCOUNT_NAME + " = ?";
+        final String selection;
+        final String[] args;
+        if (TextUtils.isEmpty(dataSet)) {
+            selection = BASE_SELECTION + " AND " + RawContacts.DATA_SET + " IS NULL";
+            args = new String[] {type, name};
+        } else {
+            selection = BASE_SELECTION + " AND " + RawContacts.DATA_SET + " = ?";
+            args = new String[] {type, name, dataSet};
+        }
+
+        final Cursor c = context.getContentResolver().query(RAW_CONTACTS_URI_LIMIT_1,
+                ID_PROJECTION, selection, args, null);
+        if (c == null) return false;
+        try {
+            return c.moveToFirst();
+        } finally {
+            c.close();
+        }
+    }
+
     @Override
     public boolean equals(Object o) {
         return (o instanceof AccountWithDataSet) && super.equals(o)
diff --git a/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java b/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java
index 2be662d..7a04ae3 100644
--- a/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java
+++ b/tests/src/com/android/contacts/tests/mocks/MockAccountTypeManager.java
@@ -25,6 +25,8 @@
 import java.util.List;
 import java.util.Map;
 
+import libcore.util.Objects;
+
 /**
  * A mock {@link AccountTypeManager} class.
  */
@@ -39,9 +41,10 @@
     }
 
     @Override
-    public AccountType getAccountType(String accountType, String dataSet) {
+    public AccountType getAccountType(AccountTypeWithDataSet accountTypeWithDataSet) {
         for (AccountType type : mTypes) {
-            if (accountType.equals(type.accountType)) {
+            if (Objects.equal(accountTypeWithDataSet.accountType, type.accountType)
+                    && Objects.equal(accountTypeWithDataSet.dataSet, type.dataSet)) {
                 return type;
             }
         }