Merge "Fix some proguard rules to fix tests" into ub-contactsdialer-a-dev
diff --git a/Android.mk b/Android.mk
index 0d7754c..bd0c9de 100644
--- a/Android.mk
+++ b/Android.mk
@@ -7,6 +7,12 @@
 contacts_common_dir := ../ContactsCommon
 phone_common_dir := ../PhoneCommon
 
+ifeq ($(TARGET_BUILD_APPS),)
+support_library_root_dir := frameworks/support
+else
+support_library_root_dir := prebuilts/sdk/current/support
+endif
+
 src_dirs := src \
     $(incallui_dir)/src \
     $(contacts_common_dir)/src \
@@ -19,10 +25,10 @@
 
 LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
 LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs)) \
-    frameworks/support/v7/appcompat/res \
-    frameworks/support/v7/cardview/res \
-    frameworks/support/v7/recyclerview/res \
-    frameworks/support/design/res
+    $(support_library_root_dir)/v7/cardview/res \
+    $(support_library_root_dir)/v7/recyclerview/res \
+    $(support_library_root_dir)/v7/appcompat/res \
+    $(support_library_root_dir)/design/res
 
 LOCAL_AAPT_FLAGS := \
     --auto-add-overlay \
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7d6e505..9267d06 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -17,8 +17,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.dialer"
     coreApp="true"
-    android:versionCode="20302"
-    android:versionName="2.3.02">
+    android:versionCode="20303"
+    android:versionName="2.3.03">
 
     <uses-sdk
         android:minSdkVersion="23"
@@ -148,7 +148,7 @@
               android:exported="false">
         </activity>
 
-        <activity android:name="com.android.dialer.filterednumber.ManageBlockedNumbersActivity"
+        <activity android:name="com.android.dialer.filterednumber.BlockedNumbersSettingsActivity"
             android:label="@string/manage_blocked_numbers_label"
             android:parentActivityName="com.android.dialer.settings.DialerSettingsActivity"
             android:theme="@style/ManageBlockedNumbersStyle"
diff --git a/res/drawable/blocked_number_item_background.xml b/res/drawable/ic_blocked_numbers_settings_add.xml
similarity index 63%
rename from res/drawable/blocked_number_item_background.xml
rename to res/drawable/ic_blocked_numbers_settings_add.xml
index acfea20..adcf906 100644
--- a/res/drawable/blocked_number_item_background.xml
+++ b/res/drawable/ic_blocked_numbers_settings_add.xml
@@ -15,15 +15,6 @@
      limitations under the License.
 -->
 
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-    <item>
-        <shape android:shape="rectangle">
-            <solid android:color="@color/divider_line_color" />
-        </shape>
-    </item>
-    <item android:bottom="1dp">
-        <shape android:shape="rectangle">
-            <solid android:color="@android:color/white" />
-        </shape>
-    </item>
-</layer-list>
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+    android:src="@drawable/ic_add_24dp"
+    android:tint="@color/blocked_number_icon_tint" />
diff --git a/res/layout/blocked_number_fragment.xml b/res/layout/blocked_number_fragment.xml
index 7aff06e..4bc2085 100644
--- a/res/layout/blocked_number_fragment.xml
+++ b/res/layout/blocked_number_fragment.xml
@@ -18,7 +18,6 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
-    android:paddingTop="?android:attr/actionBarSize"
     android:background="@color/blocked_number_background">
 
     <ListView android:id="@id/android:list"
diff --git a/res/layout/blocked_number_header.xml b/res/layout/blocked_number_header.xml
index ce1d4fe..50a3dc8 100644
--- a/res/layout/blocked_number_header.xml
+++ b/res/layout/blocked_number_header.xml
@@ -17,7 +17,8 @@
     xmlns:card_view="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    android:focusable="false">
 
     <LinearLayout android:id="@+id/blocked_numbers_disabled_for_emergency"
         android:layout_width="match_parent"
@@ -25,6 +26,7 @@
         android:orientation="vertical"
         android:layout_marginBottom="8dp"
         android:padding="16dp"
+        android:focusable="true"
         android:visibility="gone">
 
         <TextView
@@ -43,39 +45,6 @@
 
     </LinearLayout>
 
-
-    <android.support.v7.widget.CardView
-        android:id="@+id/hide_blocked_calls_setting"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="8dp"
-        card_view:cardCornerRadius="0dp">
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            android:gravity="center_vertical"
-            android:padding="16dp"
-            android:paddingEnd="8dp"
-            android:background="@android:color/white">
-
-            <TextView
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:text="@string/blocked_call_settings_hide_setting"
-                style="@style/BlockedNumbersDescriptionTextStyle" />
-
-            <Switch android:id="@+id/hide_blocked_calls_switch"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginLeft="40dp" />
-
-        </LinearLayout>
-
-    </android.support.v7.widget.CardView>
-
     <android.support.v7.widget.CardView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
@@ -85,7 +54,8 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical"
-            android:background="@android:color/white">
+            android:background="@android:color/white"
+            android:focusable="true">
 
             <TextView android:id="@+id/textView"
                 android:layout_width="wrap_content"
@@ -131,18 +101,29 @@
                     android:layout_height="1dp"
                     android:layout_below="@id/import_button"
                     android:background="@color/divider_line_color"
-                    android:layout_marginTop="8dp"
-                    android:layout_marginBottom="8dp" />
+                    android:layout_marginTop="8dp" />
 
             </RelativeLayout>
 
-            <Button android:id="@+id/add_number_button"
-                android:layout_width="wrap_content"
+            <TextView android:id="@+id/add_number_textview"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_gravity="end"
-                android:layout_marginEnd="@dimen/blocked_number_container_padding"
-                android:layout_marginBottom="8dp"
-                android:text="@string/blockNumber" />
+                android:background="?android:attr/selectableItemBackground"
+                android:textColor="@color/blocked_number_primary_text_color"
+                android:textSize="@dimen/blocked_number_primary_text_size"
+                android:paddingTop="24dp"
+                android:paddingBottom="24dp"
+                android:paddingEnd="@dimen/blocked_number_container_padding"
+                android:paddingStart="24dp"
+                android:drawableStart="@drawable/ic_blocked_numbers_settings_add"
+                android:drawablePadding="24dp"
+                android:text="@string/addBlockedNumber" />
+
+            <View
+                android:layout_width="match_parent"
+                android:layout_height="1dp"
+                android:layout_marginStart="72dp"
+                android:background="@color/divider_line_color" />
 
         </LinearLayout>
 
diff --git a/res/layout/blocked_number_item.xml b/res/layout/blocked_number_item.xml
index 79ca42e..82e2207 100644
--- a/res/layout/blocked_number_item.xml
+++ b/res/layout/blocked_number_item.xml
@@ -25,7 +25,7 @@
     android:gravity="center_vertical"
     android:orientation="horizontal"
     android:focusable="true"
-    android:background="@drawable/blocked_number_item_background">
+    android:background="@android:color/white">
 
     <QuickContactBadge
         android:id="@+id/quick_contact_photo"
@@ -69,7 +69,7 @@
         android:background="?android:attr/selectableItemBackgroundBorderless"
         android:src="@drawable/ic_remove"
         android:scaleType="center"
-        android:tint="@color/delete_icon_tint"
+        android:tint="@color/blocked_number_icon_tint"
         android:contentDescription="@string/description_blocked_number_list_delete" />
 
 </LinearLayout>
diff --git a/res/layout/blocked_numbers_activity.xml b/res/layout/blocked_numbers_activity.xml
index b5810b7..d28eaf8 100644
--- a/res/layout/blocked_numbers_activity.xml
+++ b/res/layout/blocked_numbers_activity.xml
@@ -17,5 +17,6 @@
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/blocked_numbers_activity_container"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:layout_marginTop="@dimen/action_bar_height">
 </FrameLayout>
diff --git a/res/layout/call_log_list_item_actions.xml b/res/layout/call_log_list_item_actions.xml
index 262a176..ca00405 100644
--- a/res/layout/call_log_list_item_actions.xml
+++ b/res/layout/call_log_list_item_actions.xml
@@ -19,7 +19,6 @@
     android:gravity="center_vertical"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingBottom="@dimen/call_log_actions_bottom_padding"
     android:orientation="vertical"
     android:visibility="visible"
     android:importantForAccessibility="1">
diff --git a/res/layout/view_numbers_to_import_fragment.xml b/res/layout/view_numbers_to_import_fragment.xml
index c79e69a..1836f8d 100644
--- a/res/layout/view_numbers_to_import_fragment.xml
+++ b/res/layout/view_numbers_to_import_fragment.xml
@@ -18,7 +18,6 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
-    android:paddingTop="?android:attr/actionBarSize"
     android:background="@color/blocked_number_background">
 
     <ListView android:id="@id/android:list"
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 76bc093..2ca697f 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -127,7 +127,7 @@
     <color name="blocked_contact_background">#afafaf</color>
     <color name="blocked_number_primary_text_color">@color/dialtacts_primary_text_color</color>
     <color name="blocked_number_secondary_text_color">@color/dialtacts_secondary_text_color</color>
-    <color name="delete_icon_tint">#6D6D6D</color>
+    <color name="blocked_number_icon_tint">#616161</color>
     <color name="blocked_number_background">#E0E0E0</color>
     <color name="blocked_number_accent_color">#42A5F5</color>
     <color name="blocked_number_block_color">#F44336</color>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b5703c6..4d4fb1e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -855,12 +855,6 @@
         You previously marked some callers to be automatically sent to voicemail via other apps.
     </string>
 
-    <!-- Text for a setting to hide blocked calls and automatically delete new voicemail from block
-         numbers. [CHAR LIMIT=NONE] -->
-    <string name="blocked_call_settings_hide_setting">
-        Hide calls and automatically delete new voicemails from blocked numbers.
-    </string>
-
     <!-- Label for button to view numbers of contacts previous marked to be sent to voicemail.
          [CHAR_LIMIT=20] -->
     <string name="blocked_call_settings_view_numbers_button">View Numbers</string>
@@ -878,17 +872,11 @@
     <string name="description_blocked_number_list_delete">Unblock number</string>
 
     <!-- Button to bring up UI to add a number to the blocked call list. [CHAR LIMIT=40] -->
-    <string name="blockNumber">Add number</string>
+    <string name="addBlockedNumber">Add number</string>
 
     <!-- Heading for the block list in the "Spam and blocked cal)ls" settings. [CHAR LIMIT=64] -->
     <string name="blockList">Block list</string>
 
-    <!-- Label for progress dialog when validating a number to be added to the block list.
-        [CHAR LIMIT=64] -->
-    <string name="checkingNumber">Checking
-        <xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>
-    </string>
-
     <!-- Error message shown when user tries to add invalid number to the block list.
         [CHAR LIMIT=64] -->
     <string name="invalidNumber"><xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>
@@ -899,6 +887,19 @@
     <string name="alreadyBlocked"><xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>
         is already blocked.</string>
 
+    <!-- Title of notification telling the user that call blocking has been temporarily disabled.
+         [CHAR LIMIT=56] -->
+    <string name="call_blocking_disabled_notification_title">
+        Call blocking disabled for 48 hours
+    </string>
+
+    <!-- Text for notification which provides the reason that call blocking has been temporarily
+         disabled. Namely, we disable call blocking after an emergency call in case of return
+         phone calls made by emergency services. [CHAR LIMIT=64] -->
+    <string name="call_blocking_disabled_notification_text">
+        Disabled because an emergency call was made.
+    </string>
+
     <!-- Label for the phone account settings [CHAR LIMIT=30] -->
     <string name="phone_account_settings_label">Calling accounts</string>
 
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index 2121e98..ab63ddc 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -55,7 +55,7 @@
 import com.android.dialer.calllog.PhoneAccountUtils;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
-import com.android.dialer.filterednumber.FilterNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
 import com.android.dialer.filterednumber.FilteredNumbersUtil;
 import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.IntentUtil.CallIntentBuilder;
@@ -71,7 +71,7 @@
  */
 public class CallDetailActivity extends AppCompatActivity
         implements MenuItem.OnMenuItemClickListener, View.OnClickListener,
-                FilterNumberDialogFragment.Callback {
+                BlockNumberDialogFragment.Callback {
     private static final String TAG = CallDetailActivity.class.getSimpleName();
 
      /** A long array extra containing ids of call log entries to display. */
@@ -196,7 +196,6 @@
     private PhoneCallDetails mDetails;
     protected String mNumber;
     private Uri mVoicemailUri;
-    private String mDefaultCountryIso;
     private String mDisplayNumber;
 
     private ListView mHistoryList;
@@ -242,7 +241,6 @@
         mCallerName = (TextView) findViewById(R.id.caller_name);
         mCallerNumber = (TextView) findViewById(R.id.caller_number);
         mAccountLabel = (TextView) findViewById(R.id.phone_account_label);
-        mDefaultCountryIso = GeoUtil.getCurrentCountryIso(this);
         mContactPhotoManager = ContactPhotoManager.getInstance(this);
 
         mCallButton = findViewById(R.id.call_back_button);
@@ -358,9 +356,8 @@
     public void onClick(View view) {
         switch(view.getId()) {
             case R.id.call_detail_action_block:
-                FilterNumberDialogFragment.show(
+                BlockNumberDialogFragment.show(
                         mBlockedNumberId,
-                        null /* normalizedNumber */,
                         mNumber,
                         mDetails.countryIso,
                         mDisplayNumber,
@@ -392,11 +389,12 @@
     }
 
     private void updatePhotoAndBlockActionItem() {
-        if (mDetails == null || !FilteredNumbersUtil.canBlockNumber(this, mNumber)) {
+        if (mDetails == null ||
+                !FilteredNumbersUtil.canBlockNumber(this, mNumber, mDetails.countryIso)) {
             return;
         }
 
-        boolean failed = mFilteredNumberAsyncQueryHandler.startBlockedQuery(
+        final boolean success = mFilteredNumberAsyncQueryHandler.isBlockedNumber(
                 new OnCheckBlockedListener() {
                     @Override
                     public void onCheckComplete(Integer id) {
@@ -405,9 +403,9 @@
                         updateContactPhoto();
                         updateBlockActionItem();
                     }
-                }, null, mNumber, mDetails.countryIso);
+                }, mNumber, mDetails.countryIso);
 
-        if (failed) {
+        if (!success) {
             updateContactPhoto();
             updateBlockActionItem();
         }
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index b395723..9f1af83 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -50,12 +50,13 @@
 import com.android.dialer.contactinfo.NumberWithCountryIso;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
-import com.android.dialer.filterednumber.FilterNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
 import com.android.dialer.util.PhoneNumberUtil;
 import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Adapter class to fill in data for the Call Log.
@@ -63,7 +64,7 @@
 public class CallLogAdapter extends GroupingListAdapter
         implements CallLogGroupBuilder.GroupCreator,
                 VoicemailPlaybackPresenter.OnVoicemailDeletedListener,
-                FilterNumberDialogFragment.Callback {
+                BlockNumberDialogFragment.Callback {
 
     /** Interface used to initiate a refresh of the content. */
     public interface CallFetcher {
@@ -71,6 +72,8 @@
     }
 
     private static final int NO_EXPANDED_LIST_ITEM = -1;
+    // ConcurrentHashMap doesn't store null values. Use this value for numbers which aren't blocked.
+    private static final int NOT_BLOCKED = -1;
 
     private static final int VOICEMAIL_PROMO_CARD_POSITION = 0;
 
@@ -91,7 +94,10 @@
     private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
 
     protected ContactInfoCache mContactInfoCache;
-    protected final Map<NumberWithCountryIso, Integer> mBlockedIdCache;
+    // Declaring static, since this can be shared across different instances, such as history and
+    // voicemail, so when the cache is cleared in one instance, it propagates across all instances.
+    private static final Map<NumberWithCountryIso, Integer> mBlockedIdCache =
+            new ConcurrentHashMap<>();
 
     private boolean mIsCallLogActivity;
 
@@ -214,8 +220,7 @@
                 // Only expand if actions are not already expanded, because triggering the expand
                 // function on clicks causes the action views to lose the focus indicator.
                 CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder) host.getTag();
-                if (mVoicemailPlaybackPresenter == null &&
-                        mCurrentlyExpandedPosition != viewHolder.getAdapterPosition()) {
+                if (mCurrentlyExpandedPosition != viewHolder.getAdapterPosition()) {
                     expandViewHolderActions((CallLogListItemViewHolder) host.getTag());
                 }
             }
@@ -258,7 +263,6 @@
         CallTypeHelper callTypeHelper = new CallTypeHelper(resources);
 
         mTelecomCallLogCache = new TelecomCallLogCache(mContext);
-        mBlockedIdCache = new HashMap<>();
         PhoneCallDetailsHelper phoneCallDetailsHelper =
                 new PhoneCallDetailsHelper(mContext, resources, mTelecomCallLogCache);
         mCallLogListItemHelper =
@@ -517,20 +521,21 @@
         // Update the photo, once we know whether the user's number is blocked or not.
         final NumberWithCountryIso blockedIdKey = new NumberWithCountryIso(number, countryIso);
         if (mBlockedIdCache.containsKey(blockedIdKey)) {
-            views.blockId = mBlockedIdCache.get(blockedIdKey);
+            int blockedId = mBlockedIdCache.get(blockedIdKey);
+            views.blockId = blockedId != NOT_BLOCKED ? blockedId : null;
             views.updatePhoto();
         } else {
             views.blockId = null;
-            boolean failed = mFilteredNumberAsyncQueryHandler.startBlockedQuery(
+            final boolean success = mFilteredNumberAsyncQueryHandler.isBlockedNumber(
                         new OnCheckBlockedListener() {
                     @Override
                     public void onCheckComplete(Integer id) {
-                        mBlockedIdCache.put(blockedIdKey, id);
+                        mBlockedIdCache.put(blockedIdKey, id != null ? id : NOT_BLOCKED);
                         views.blockId = id;
                         views.updatePhoto();
                     }
-                }, null, number, countryIso);
-            if (failed) {
+                }, number, countryIso);
+            if (!success) {
                 views.updatePhoto();
             }
         }
diff --git a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
index 2fffaff..7771563 100644
--- a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
+++ b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
@@ -46,7 +46,7 @@
     public enum Tasks {
         DELETE_VOICEMAIL,
         DELETE_CALL,
-        MARK_BLOCKED,
+        DELETE_BLOCKED_CALL,
         MARK_VOICEMAIL_READ,
         GET_CALL_DETAILS,
     }
@@ -81,7 +81,7 @@
         static final int TRANSCRIPTION_COLUMN_INDEX = 11;
     }
 
-    private static class CallLogMarkBlockedQuery {
+    private static class CallLogDeleteBlockedCallQuery {
         static final String[] PROJECTION = new String[] {
             CallLog.Calls._ID,
             CallLog.Calls.DATE
@@ -104,7 +104,7 @@
     // Try to identify if a call log entry corresponds to a number which was blocked. We match by
     // by comparing its creation time to the time it was added in the InCallUi and seeing if they
     // fall within a certain threshold.
-    private static final int MATCH_BLOCKED_CALL_THRESHOLD_MS = 1500;
+    private static final int MATCH_BLOCKED_CALL_THRESHOLD_MS = 3000;
 
     private static AsyncTaskExecutor sAsyncTaskExecutor;
 
@@ -256,15 +256,16 @@
     }
 
     /**
-     * Marks last call made by the number the call type of the specified call as BLOCKED in the call log.
+     * Deletes the last call made by the number within a threshold of the call time added in the
+     * call log, assuming it is a blocked call for which no entry should be shown.
      *
      * @param context The context.
-     * @param number Number of which to mark the most recent call as BLOCKED.
+     * @param number Number of blocked call, for which to delete the call log entry.
      * @param timeAddedMs The time the number was added to InCall, in milliseconds.
      * @param listener The listener to invoke after looking up for a call log entry matching the
      *     number and time added.
      */
-    public static void markCallAsBlocked(
+    public static void deleteBlockedCall(
             final Context context,
             final String number,
             final long timeAddedMs,
@@ -273,23 +274,30 @@
             initTaskExecutor();
         }
 
-        sAsyncTaskExecutor.submit(Tasks.MARK_BLOCKED, new AsyncTask<Void, Void, Long>() {
+        sAsyncTaskExecutor.submit(Tasks.DELETE_BLOCKED_CALL, new AsyncTask<Void, Void, Long>() {
             @Override
             public Long doInBackground(Void... params) {
                 // First, lookup the call log entry of the most recent call with this number.
                 Cursor cursor = context.getContentResolver().query(
                         TelecomUtil.getCallLogUri(context),
-                        CallLogMarkBlockedQuery.PROJECTION,
+                        CallLogDeleteBlockedCallQuery.PROJECTION,
                         CallLog.Calls.NUMBER + "= ?",
                         new String[] { number },
                         CallLog.Calls.DATE + " DESC LIMIT 1");
 
-                // If found, return the call log entry id.
+                // If match is found, delete this call log entry and return the call log entry id.
                 if (cursor.moveToFirst()) {
-                    long creationTime = cursor.getLong(CallLogMarkBlockedQuery.DATE_COLUMN_INDEX);
+                    long creationTime =
+                            cursor.getLong(CallLogDeleteBlockedCallQuery.DATE_COLUMN_INDEX);
                     if (timeAddedMs > creationTime
                             && timeAddedMs - creationTime < MATCH_BLOCKED_CALL_THRESHOLD_MS) {
-                        return cursor.getLong(CallLogMarkBlockedQuery.ID_COLUMN_INDEX);
+                        long callLogEntryId =
+                                cursor.getLong(CallLogDeleteBlockedCallQuery.ID_COLUMN_INDEX);
+                        context.getContentResolver().delete(
+                                TelecomUtil.getCallLogUri(context),
+                                CallLog.Calls._ID + " IN (" + callLogEntryId + ")",
+                                null);
+                        return callLogEntryId;
                     }
                 }
                 return (long) -1;
@@ -300,20 +308,6 @@
                 if (listener != null) {
                     listener.onQueryFinished(callLogEntryId >= 0);
                 }
-
-                if (callLogEntryId < 0) {
-                    return;
-                }
-
-                // Then, update that call log entry to have type BLOCKED.
-                final ContentValues values = new ContentValues();
-                values.put(CallLog.Calls.TYPE, AppCompatConstants.CALLS_BLOCKED_TYPE);
-
-                context.getContentResolver().update(
-                        TelecomUtil.getCallLogUri(context),
-                        values,
-                        CallLog.Calls._ID + "= ?",
-                        new String[] { Long.toString(callLogEntryId) });
             }
         });
     }
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index f84ffd5..3cf58bd 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -125,7 +125,6 @@
     private boolean mRefreshDataRequired = true;
 
     private boolean mHasReadCallLogPermission = false;
-    private boolean mShouldHideBlockedCalls = false;
 
     // Exactly same variable is in Fragment as a package private.
     private boolean mMenuVisible = true;
@@ -211,8 +210,6 @@
         resolver.registerContentObserver(Status.CONTENT_URI, true, mVoicemailStatusObserver);
         setHasOptionsMenu(true);
 
-        mShouldHideBlockedCalls = FilteredNumbersUtil.shouldHideBlockedCalls(getActivity());
-
         if (mCallTypeFilter == Calls.VOICEMAIL_TYPE) {
             mVoicemailPlaybackPresenter = VoicemailPlaybackPresenter
                     .getInstance(activity, state);
@@ -342,10 +339,6 @@
             mRefreshDataRequired = true;
             updateEmptyMessage(mCallTypeFilter);
         }
-        if (mShouldHideBlockedCalls != FilteredNumbersUtil.shouldHideBlockedCalls(getActivity())) {
-            mShouldHideBlockedCalls = !mShouldHideBlockedCalls;
-            mRefreshDataRequired = true;
-        }
 
         mHasReadCallLogPermission = hasReadCallLogPermission;
         refreshData();
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 1bc4410..afe8208 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -48,7 +48,7 @@
 import com.android.dialer.DialtactsActivity;
 import com.android.dialer.R;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
-import com.android.dialer.filterednumber.FilterNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
 import com.android.dialer.filterednumber.FilteredNumbersUtil;
 import com.android.dialer.util.DialerUtils;
 import com.android.dialer.util.PhoneNumberUtil;
@@ -184,7 +184,7 @@
     private final CallLogListItemHelper mCallLogListItemHelper;
     private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
     private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
-    private final FilterNumberDialogFragment.Callback mFilteredNumberDialogCallback;
+    private final BlockNumberDialogFragment.Callback mFilteredNumberDialogCallback;
 
     private final int mPhotoSize;
 
@@ -198,7 +198,7 @@
             CallLogListItemHelper callLogListItemHelper,
             VoicemailPlaybackPresenter voicemailPlaybackPresenter,
             FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler,
-            FilterNumberDialogFragment.Callback filteredNumberDialogCallback,
+            BlockNumberDialogFragment.Callback filteredNumberDialogCallback,
             View rootView,
             QuickContactBadge quickContactView,
             View primaryActionView,
@@ -247,7 +247,7 @@
             CallLogListItemHelper callLogListItemHelper,
             VoicemailPlaybackPresenter voicemailPlaybackPresenter,
             FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler,
-            FilterNumberDialogFragment.Callback filteredNumberDialogCallback) {
+            BlockNumberDialogFragment.Callback filteredNumberDialogCallback) {
 
         return new CallLogListItemViewHolder(
                 context,
@@ -303,8 +303,8 @@
                     .setOnMenuItemClickListener(this);
         }
 
-        if (FilteredNumbersUtil.canBlockNumber(mContext, number)) {
-            mFilteredNumberAsyncQueryHandler.startBlockedQuery(
+        if (FilteredNumbersUtil.canBlockNumber(mContext, number, countryIso)) {
+            mFilteredNumberAsyncQueryHandler.isBlockedNumber(
                     new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() {
                         @Override
                         public void onCheckComplete(Integer id) {
@@ -319,7 +319,7 @@
                             blockItem.setOnMenuItemClickListener(
                                     CallLogListItemViewHolder.this);
                         }
-                    }, info.normalizedNumber, number, countryIso);
+                    }, number, countryIso);
         }
     }
 
@@ -327,9 +327,8 @@
     public boolean onMenuItemClick(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.context_menu_block_number:
-                FilterNumberDialogFragment.show(
+                BlockNumberDialogFragment.show(
                         blockId,
-                        info.normalizedNumber,
                         number,
                         countryIso,
                         displayNumber,
diff --git a/src/com/android/dialer/calllog/CallLogQueryHandler.java b/src/com/android/dialer/calllog/CallLogQueryHandler.java
index 01489c1..3efdce7 100644
--- a/src/com/android/dialer/calllog/CallLogQueryHandler.java
+++ b/src/com/android/dialer/calllog/CallLogQueryHandler.java
@@ -191,13 +191,10 @@
             selectionArgs.add(Long.toString(newerThan));
         }
 
-        final boolean shouldHideBlockedCalls =
-                FilteredNumbersUtil.shouldHideBlockedCalls(mContext);
-        if (shouldHideBlockedCalls) {
-            where.append(" AND ");
-            where.append("(" + Calls.TYPE + " != ?)");
-            selectionArgs.add(Integer.toString(AppCompatConstants.CALLS_BLOCKED_TYPE));
-        }
+        // Always hide blocked calls.
+        where.append(" AND ");
+        where.append("(" + Calls.TYPE + " != ?)");
+        selectionArgs.add(Integer.toString(AppCompatConstants.CALLS_BLOCKED_TYPE));
 
         final int limit = (mLogLimit == -1) ? NUM_LOGS_TO_DISPLAY : mLogLimit;
         final String selection = where.length() > 0 ? where.toString() : null;
diff --git a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
index 1987b80..635e874 100644
--- a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
+++ b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
@@ -135,9 +135,8 @@
                     mContext, newCall.number, newCall.countryIso, newCall.dateMs)) {
                 itr.remove();
 
-                if (FilteredNumbersUtil.shouldHideBlockedCalls(mContext)) {
-                    mContext.getContentResolver().delete(newCall.voicemailUri, null, null);
-                }
+                // Delete the voicemail.
+                mContext.getContentResolver().delete(newCall.voicemailUri, null, null);
                 continue;
             }
 
diff --git a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
index 25613a6..06aca78 100644
--- a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
+++ b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
@@ -25,6 +25,7 @@
 import android.database.sqlite.SQLiteDatabaseCorruptException;
 import android.net.Uri;
 import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
 
 import com.android.contacts.common.util.PhoneNumberHelper;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
@@ -78,6 +79,14 @@
         public void onUnblockComplete(int rows, ContentValues values);
     }
 
+    public interface OnHasBlockedNumbersListener {
+        /**
+         * @param hasBlockedNumbers {@code true} if any blocked numbers are stored.
+         *     {@code false} otherwise.
+         */
+        public void onHasBlockedNumbers(boolean hasBlockedNumbers);
+    }
+
     @Override
     protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
         if (cookie != null) {
@@ -120,37 +129,34 @@
                 null, null, null);
     }
 
-    /**
-     * Check if the number + country iso given has been blocked.
-     * This method normalizes the number for the lookup if normalizedNumber is null.
-     * @return {@code true} if the number was invalid and couldn't be checked,
-     * {@code false} otherwise,
-     */
-    public final boolean startBlockedQuery(final OnCheckBlockedListener listener,
-                                        String normalizedNumber, String number, String countryIso) {
-        if (normalizedNumber == null) {
-            normalizedNumber = getNormalizedNumber(number, countryIso);
-            if (normalizedNumber == null) {
-                return true;
-            }
-        }
-        startBlockedQuery(listener, normalizedNumber);
-        return false;
-    }
-
-    public static String getNormalizedNumber(String number, String countryIso) {
-        if (PhoneNumberHelper.isUriNumber(number)) {
-            return number;
-        } else {
-            return PhoneNumberUtils.formatNumberToE164(number, countryIso);
-        }
+    public final void hasBlockedNumbers(final OnHasBlockedNumbersListener listener) {
+        startQuery(NO_TOKEN,
+                new Listener() {
+                    @Override
+                    protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
+                        listener.onHasBlockedNumbers(cursor.getCount() > 0);
+                    }
+                },
+                getContentUri(null),
+                new String[]{ FilteredNumberColumns._ID },
+                FilteredNumberColumns.TYPE + "=" + FilteredNumberTypes.BLOCKED_NUMBER,
+                null,
+                null);
     }
 
     /**
-     * Check if the normalized number given has been blocked.
+     * Check if this number has been blocked.
+     *
+     * @return {@code false} if the number was invalid and couldn't be checked,
+     *     {@code true} otherwise,
      */
-    public final void startBlockedQuery(final OnCheckBlockedListener listener,
-                                        String normalizedNumber) {
+    public final boolean isBlockedNumber(
+            final OnCheckBlockedListener listener, String number, String countryIso) {
+        final String normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+        if (TextUtils.isEmpty(normalizedNumber)) {
+            return false;
+        }
+
         startQuery(NO_TOKEN,
                 new Listener() {
                     @Override
@@ -170,19 +176,29 @@
                     }
                 },
                 getContentUri(null),
-                new String[]{FilteredNumberColumns._ID, FilteredNumberColumns.TYPE},
+                new String[]{ FilteredNumberColumns._ID, FilteredNumberColumns.TYPE },
                 FilteredNumberColumns.NORMALIZED_NUMBER + " = ?",
-                new String[]{normalizedNumber},
+                new String[]{ normalizedNumber },
                 null);
+
+        return true;
+    }
+
+    public final void blockNumber(
+            final OnBlockNumberListener listener, String number, String countryIso) {
+        blockNumber(listener, null, number, countryIso);
     }
 
     /**
      * Add a number manually blocked by the user.
      */
-    public final void blockNumber(final OnBlockNumberListener listener,
-                                  String normalizedNumber, String number, String countryIso) {
+    public final void blockNumber(
+            final OnBlockNumberListener listener,
+            String normalizedNumber,
+            String number,
+            String countryIso) {
         if (normalizedNumber == null) {
-            normalizedNumber = getNormalizedNumber(number, countryIso);
+            normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
         }
         ContentValues v = new ContentValues();
         v.put(FilteredNumberColumns.NORMALIZED_NUMBER, normalizedNumber);
diff --git a/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java b/src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java
similarity index 85%
rename from src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java
rename to src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java
index 8473e32..7a94eeb 100644
--- a/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java
+++ b/src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java
@@ -21,11 +21,13 @@
 import android.app.DialogFragment;
 import android.app.FragmentManager;
 import android.content.ContentValues;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Bundle;
 import android.support.design.widget.Snackbar;
+import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.Toast;
@@ -35,7 +37,11 @@
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnBlockNumberListener;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnUnblockNumberListener;
 
-public class FilterNumberDialogFragment extends DialogFragment {
+/**
+ * Fragment for confirming and enacting blocking/unblocking a number. Also invokes snackbar
+ * providing undo functionality.
+ */
+public class BlockNumberDialogFragment extends DialogFragment {
 
     /**
      * Use a callback interface to update UI after success/undo. Favor this approach over other
@@ -49,17 +55,17 @@
         public void onChangeFilteredNumberUndo();
     }
 
-    private static final String BLOCK_DIALOG_FRAGMENT = "blockUnblockNumberDialog";
+    private static final String BLOCK_DIALOG_FRAGMENT = "BlockNumberDialog";
 
     private static final String ARG_BLOCK_ID = "argBlockId";
-    private static final String ARG_NORMALIZED_NUMBER = "argNormalizedNumber";
     private static final String ARG_NUMBER = "argNumber";
     private static final String ARG_COUNTRY_ISO = "argCountryIso";
     private static final String ARG_DISPLAY_NUMBER = "argDisplayNumber";
     private static final String ARG_PARENT_VIEW_ID = "parentViewId";
 
+    private String mNumber;
     private String mDisplayNumber;
-    private String mNormalizedNumber;
+    private String mCountryIso;
 
     private FilteredNumberAsyncQueryHandler mHandler;
     private View mParentView;
@@ -67,28 +73,26 @@
 
     public static void show(
             Integer blockId,
-            String normalizedNumber,
             String number,
             String countryIso,
             String displayNumber,
             Integer parentViewId,
             FragmentManager fragmentManager,
             Callback callback) {
-        final FilterNumberDialogFragment newFragment = FilterNumberDialogFragment.newInstance(
-                blockId, normalizedNumber, number, countryIso, displayNumber, parentViewId);
+        final BlockNumberDialogFragment newFragment = BlockNumberDialogFragment.newInstance(
+                blockId, number, countryIso, displayNumber, parentViewId);
 
         newFragment.setCallback(callback);
-        newFragment.show(fragmentManager, FilterNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
+        newFragment.show(fragmentManager, BlockNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
     }
 
-    private static FilterNumberDialogFragment newInstance(
+    private static BlockNumberDialogFragment newInstance(
             Integer blockId,
-            String normalizedNumber,
             String number,
             String countryIso,
             String displayNumber,
             Integer parentViewId) {
-        final FilterNumberDialogFragment fragment = new FilterNumberDialogFragment();
+        final BlockNumberDialogFragment fragment = new BlockNumberDialogFragment();
         final Bundle args = new Bundle();
         if (blockId != null) {
             args.putInt(ARG_BLOCK_ID, blockId.intValue());
@@ -96,7 +100,6 @@
         if (parentViewId != null) {
             args.putInt(ARG_PARENT_VIEW_ID, parentViewId.intValue());
         }
-        args.putString(ARG_NORMALIZED_NUMBER, normalizedNumber);
         args.putString(ARG_NUMBER, number);
         args.putString(ARG_COUNTRY_ISO, countryIso);
         args.putString(ARG_DISPLAY_NUMBER, displayNumber);
@@ -109,12 +112,12 @@
         super.onCreateDialog(savedInstanceState);
         final boolean isBlocked = getArguments().containsKey(ARG_BLOCK_ID);
 
+        mNumber = getArguments().getString(ARG_NUMBER);
         mDisplayNumber = getArguments().getString(ARG_DISPLAY_NUMBER);
-        if (TextUtils.isEmpty(mNormalizedNumber)) {
-            String number = getArguments().getString(ARG_NUMBER);
-            String countryIso = getArguments().getString(ARG_COUNTRY_ISO);
-            mNormalizedNumber =
-                    FilteredNumberAsyncQueryHandler.getNormalizedNumber(number, countryIso);
+        mCountryIso = getArguments().getString(ARG_COUNTRY_ISO);
+
+        if (TextUtils.isEmpty(mDisplayNumber)) {
+            mDisplayNumber = mNumber;
         }
 
         mHandler = new FilteredNumberAsyncQueryHandler(getContext().getContentResolver());
@@ -148,11 +151,9 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
-        String number = getArguments().getString(ARG_NUMBER);
-        if (TextUtils.isEmpty(mNormalizedNumber) ||
-                !FilteredNumbersUtil.canBlockNumber(getActivity(), number)) {
+        if (!FilteredNumbersUtil.canBlockNumber(getActivity(), mNumber, mCountryIso)) {
             dismiss();
-            Toast.makeText(getContext(), getString(R.string.invalidNumber, number),
+            Toast.makeText(getContext(), getString(R.string.invalidNumber, mDisplayNumber),
                     Toast.LENGTH_SHORT).show();
         }
     }
@@ -187,6 +188,7 @@
         final String undoMessage = getUnblockedMessage();
         final Callback callback = mCallback;
         final int actionTextColor = getActionTextColor();
+        final Context context = getContext();
 
         final OnUnblockNumberListener onUndoListener = new OnUnblockNumberListener() {
             @Override
@@ -217,14 +219,17 @@
                 if (callback != null) {
                     callback.onChangeFilteredNumberSuccess();
                 }
+
+                if (context != null && FilteredNumbersUtil.hasRecentEmergencyCall(context)) {
+                    FilteredNumbersUtil.maybeNotifyCallBlockingDisabled(context);
+                }
             }
         };
 
         mHandler.blockNumber(
                 onBlockNumberListener,
-                getArguments().getString(ARG_NORMALIZED_NUMBER),
-                getArguments().getString(ARG_NUMBER),
-                getArguments().getString(ARG_COUNTRY_ISO));
+                mNumber,
+                mCountryIso);
     }
 
     private void unblockNumber() {
diff --git a/src/com/android/dialer/filterednumber/BlockedNumberAdapter.java b/src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java
similarity index 90%
rename from src/com/android/dialer/filterednumber/BlockedNumberAdapter.java
rename to src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java
index 7777aeb..ad9e7a6 100644
--- a/src/com/android/dialer/filterednumber/BlockedNumberAdapter.java
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java
@@ -26,9 +26,9 @@
 import com.android.dialer.calllog.ContactInfoHelper;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
 
-public class BlockedNumberAdapter extends NumberAdapter {
+public class BlockedNumbersAdapter extends NumbersAdapter {
 
-    private BlockedNumberAdapter(
+    private BlockedNumbersAdapter(
             Context context,
             FragmentManager fragmentManager,
             ContactInfoHelper contactInfoHelper,
@@ -36,9 +36,9 @@
         super(context, fragmentManager, contactInfoHelper, contactPhotoManager);
     }
 
-    public static BlockedNumberAdapter newBlockedNumberAdapter(
+    public static BlockedNumbersAdapter newBlockedNumbersAdapter(
             Context context, FragmentManager fragmentManager) {
-        return new BlockedNumberAdapter(
+        return new BlockedNumbersAdapter(
                 context,
                 fragmentManager,
                 new ContactInfoHelper(context, GeoUtil.getCurrentCountryIso(context)),
@@ -59,9 +59,8 @@
         deleteButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                FilterNumberDialogFragment.show(
+                BlockNumberDialogFragment.show(
                         id,
-                        normalizedNumber,
                         number,
                         countryIso,
                         number,
diff --git a/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java b/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java
index 7788cbe..a2a716f 100644
--- a/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java
@@ -15,6 +15,7 @@
  */
 package com.android.dialer.filterednumber;
 
+import android.app.Activity;
 import android.app.ListFragment;
 import android.app.LoaderManager;
 import android.content.Context;
@@ -35,7 +36,6 @@
 import android.widget.Switch;
 
 import com.android.dialer.R;
-import com.android.dialer.calllog.CallLogQueryHandler;
 import com.android.dialer.database.FilteredNumberContract;
 import com.android.dialer.filterednumber.FilteredNumbersUtil.CheckForSendToVoicemailContactListener;
 import com.android.dialer.filterednumber.FilteredNumbersUtil.ImportSendToVoicemailContactsListener;
@@ -43,14 +43,11 @@
 import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
 
 public class BlockedNumbersFragment extends ListFragment
-        implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener,
-                CallLogQueryHandler.Listener {
+        implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener {
 
-    private BlockedNumberAdapter mAdapter;
-    private CallLogQueryHandler mCallLogQueryHandler;
+    private BlockedNumbersAdapter mAdapter;
     private VoicemailStatusHelper mVoicemailStatusHelper;
 
-    private Switch mHideSettingSwitch;
     private View mImportSettings;
     private View mBlockedNumbersDisabledForEmergency;
 
@@ -63,30 +60,20 @@
         getListView().addHeaderView(inflater.inflate(R.layout.blocked_number_header, null));
 
         if (mAdapter == null) {
-            mAdapter = BlockedNumberAdapter.newBlockedNumberAdapter(
+            mAdapter = BlockedNumbersAdapter.newBlockedNumbersAdapter(
                     getContext(), getActivity().getFragmentManager());
         }
         setListAdapter(mAdapter);
 
-        mCallLogQueryHandler
-                = new CallLogQueryHandler(getContext(), getContext().getContentResolver(), this);
         mVoicemailStatusHelper = new VoicemailStatusHelperImpl();
 
-        mHideSettingSwitch = (Switch) getActivity().findViewById(R.id.hide_blocked_calls_switch);
-        mHideSettingSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-                FilteredNumbersUtil.setShouldHideBlockedCalls(getActivity(), isChecked);
-            }
-        });
-
         mImportSettings = getActivity().findViewById(R.id.import_settings);
         mBlockedNumbersDisabledForEmergency =
                 getActivity().findViewById(R.id.blocked_numbers_disabled_for_emergency);
 
         getActivity().findViewById(R.id.import_button).setOnClickListener(this);;
         getActivity().findViewById(R.id.view_numbers_button).setOnClickListener(this);
-        getActivity().findViewById(R.id.add_number_button).setOnClickListener(this);
+        getActivity().findViewById(R.id.add_number_textview).setOnClickListener(this);
     }
 
     @Override
@@ -109,7 +96,6 @@
         ColorDrawable backgroundDrawable =
                 new ColorDrawable(getActivity().getColor(R.color.dialer_theme_color));
         actionBar.setBackgroundDrawable(backgroundDrawable);
-        actionBar.setElevation(getResources().getDimensionPixelSize(R.dimen.action_bar_elevation));
         actionBar.setDisplayShowCustomEnabled(false);
         actionBar.setDisplayHomeAsUpEnabled(true);
         actionBar.setDisplayShowHomeEnabled(true);
@@ -125,9 +111,6 @@
                     }
                 });
 
-        mHideSettingSwitch.setChecked(FilteredNumbersUtil.shouldHideBlockedCalls(getContext()));
-        mCallLogQueryHandler.fetchVoicemailStatus();
-
         if (FilteredNumbersUtil.hasRecentEmergencyCall(getContext())) {
             mBlockedNumbersDisabledForEmergency.setVisibility(View.VISIBLE);
         } else {
@@ -138,8 +121,7 @@
     @Override
     public View onCreateView(
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        View view = inflater.inflate(R.layout.blocked_number_fragment, container, false);
-        return view;
+        return inflater.inflate(R.layout.blocked_number_fragment, container, false);
     }
 
     @Override
@@ -170,21 +152,20 @@
 
     @Override
     public void onClick(final View view) {
-        ManageBlockedNumbersActivity manageBlockedNumbersActivity =
-                (ManageBlockedNumbersActivity) getActivity();
-        if (manageBlockedNumbersActivity == null) {
+        BlockedNumbersSettingsActivity activity = (BlockedNumbersSettingsActivity) getActivity();
+        if (activity == null) {
             return;
         }
 
         switch (view.getId()) {
-            case R.id.add_number_button:
-                manageBlockedNumbersActivity.enterSearchUi();
+            case R.id.add_number_textview:
+                activity.showSearchUi();
                 break;
             case R.id.view_numbers_button:
-                manageBlockedNumbersActivity.showNumbersToImportPreviewUi();
+                activity.showNumbersToImportPreviewUi();
                 break;
             case R.id.import_button:
-                FilteredNumbersUtil.importSendToVoicemailContacts(manageBlockedNumbersActivity,
+                FilteredNumbersUtil.importSendToVoicemailContacts(activity,
                         new ImportSendToVoicemailContactsListener() {
                             @Override
                             public void onImportComplete() {
@@ -194,32 +175,4 @@
                 break;
         }
     }
-
-    @Override
-    public void onVoicemailStatusFetched(Cursor cursor) {
-        final View hideSetting = getActivity().findViewById(R.id.hide_blocked_calls_setting);
-        if (cursor == null) {
-            hideSetting.setVisibility(View.GONE);
-            return;
-        }
-
-        final boolean hasVisualVoicemailSource =
-                mVoicemailStatusHelper.getNumberActivityVoicemailSources(cursor) > 0;
-        if (hasVisualVoicemailSource) {
-            hideSetting.setVisibility(View.VISIBLE);
-        } else {
-            hideSetting.setVisibility(View.GONE);
-        }
-    }
-
-    @Override
-    public void onVoicemailUnreadCountFetched(Cursor cursor) {
-        // Do nothing.
-    }
-
-    @Override
-    public boolean onCallsFetched(Cursor cursor) {
-        // Do nothing.
-        return false;
-    }
 }
diff --git a/src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java b/src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java
similarity index 89%
rename from src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java
rename to src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java
index f785cf7..1735ce5 100644
--- a/src/com/android/dialer/filterednumber/ManageBlockedNumbersActivity.java
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java
@@ -37,7 +37,7 @@
 import com.android.dialer.list.BlockedListSearchFragment;
 import com.android.dialer.list.SearchFragment;
 
-public class ManageBlockedNumbersActivity extends AppCompatActivity
+public class BlockedNumbersSettingsActivity extends AppCompatActivity
         implements SearchFragment.HostInterface {
 
     private static final String TAG_BLOCKED_MANAGEMENT_FRAGMENT = "blocked_management";
@@ -55,6 +55,9 @@
         }
     }
 
+    /**
+     * Shows fragment with the list of currently blocked numbers and settings related to blocking.
+     */
     public void showManagementUi() {
         BlockedNumbersFragment fragment = (BlockedNumbersFragment) getFragmentManager()
                 .findFragmentByTag(TAG_BLOCKED_MANAGEMENT_FRAGMENT);
@@ -68,7 +71,10 @@
                 .commit();
     }
 
-    public void enterSearchUi() {
+    /**
+     * Shows fragment with search UI for browsing/finding numbers to block.
+     */
+    public void showSearchUi() {
         BlockedListSearchFragment fragment = (BlockedListSearchFragment) getFragmentManager()
                 .findFragmentByTag(TAG_BLOCKED_SEARCH_FRAGMENT);
         if (fragment == null) {
@@ -85,6 +91,11 @@
                 .commit();
     }
 
+    /**
+     * Shows fragment with UI to preview the numbers of contacts currently marked as
+     * send-to-voicemail in Contacts. These numbers can be imported into Dialer's blocked number
+     * list.
+     */
     public void showNumbersToImportPreviewUi() {
         ViewNumbersToImportFragment fragment = (ViewNumbersToImportFragment) getFragmentManager()
                 .findFragmentByTag(TAG_VIEW_NUMBERS_TO_IMPORT_FRAGMENT);
@@ -120,7 +131,7 @@
 
     @Override
     public boolean isActionBarShowing() {
-        return true;
+        return false;
     }
 
     @Override
@@ -135,11 +146,11 @@
 
     @Override
     public int getActionBarHideOffset() {
-        return getSupportActionBar().getHideOffset();
+        return 0;
     }
 
     @Override
     public int getActionBarHeight() {
-        return getSupportActionBar().getHeight();
+        return 0;
     }
 }
diff --git a/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java b/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java
index 45fa6b7..4cc8e75 100644
--- a/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java
+++ b/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java
@@ -15,8 +15,12 @@
  */
 package com.android.dialer.filterednumber;
 
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
 import android.content.ContentValues;
 import android.content.Context;
+import android.content.Intent;
 import android.database.Cursor;
 import android.os.AsyncTask;
 import android.preference.PreferenceManager;
@@ -35,6 +39,7 @@
 import com.android.contacts.common.testing.NeededForTesting;
 import com.android.dialer.R;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
 import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
 
@@ -43,13 +48,20 @@
  */
 public class FilteredNumbersUtil {
 
-    private static final String HIDE_BLOCKED_CALLS_PREF_KEY = "hide_blocked_calls";
-    // Pref key for storing the time, in milliseconds after epoch, of end of the last emergency call.
-    private static final String LAST_EMERGENCY_CALL_PREF_KEY = "last_emergency_call";
-
     // Disable incoming call blocking if there was a call within the past 2 days.
     private static final long RECENT_EMERGENCY_CALL_THRESHOLD_MS = 1000 * 60 * 60 * 24 * 2;
 
+    // Pref key for storing the time of end of the last emergency call in milliseconds after epoch.
+    private static final String LAST_EMERGENCY_CALL_MS_PREF_KEY = "last_emergency_call_ms";
+
+    // Pref key for storing whether a notification has been dispatched to notify the user that call
+    // blocking has been disabled because of a recent emergency call.
+    private static final String NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY =
+            "notified_call_blocking_disabled_by_emergency_call";
+
+    public static final String CALL_BLOCKING_NOTIFICATION_TAG = "call_blocking";
+    public static final int CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID = 10;
+
     /**
      * Used for testing to specify that a custom threshold should be used instead of the default.
      * This custom threshold will only be used when setting this log tag to VERBOSE:
@@ -221,7 +233,7 @@
      * Use {@code FilteredNumberAsyncQueryHandler} to asynchronously check if a number is blocked.
      */
     public static boolean shouldBlockVoicemail(
-            Context context, String number, String countryIso, long dateMs) {
+            Context context, String number, String countryIso, long voicemailDateMs) {
         final String normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
         if (TextUtils.isEmpty(normalizedNumber)) {
             return false;
@@ -239,10 +251,11 @@
         boolean shouldBlock = false;
         if (cursor != null) {
             try {
-                cursor.moveToFirst();
-
-                // Block if number is found and it was added before this voicemail was received.
-                shouldBlock = cursor.getCount() > 0 && dateMs > cursor.getLong(0);
+                if (cursor.moveToFirst()) {
+                    // Block if number is found and it was added before this voicemail was received.
+                    final long numberBlockedTimeMs = cursor.getLong(0);
+                    shouldBlock = cursor.getCount() > 0 && voicemailDateMs > numberBlockedTimeMs;
+                }
             } finally {
                 cursor.close();
             }
@@ -251,31 +264,13 @@
         return shouldBlock;
     }
 
-    public static boolean shouldHideBlockedCalls(Context context) {
-        if (context == null) {
-            return false;
-        }
-        return PreferenceManager.getDefaultSharedPreferences(context)
-                .getBoolean(FilteredNumbersUtil.HIDE_BLOCKED_CALLS_PREF_KEY, false);
-    }
-
-    public static void setShouldHideBlockedCalls(Context context, boolean shouldHide) {
-        if (context == null) {
-            return;
-        }
-        PreferenceManager.getDefaultSharedPreferences(context)
-                .edit()
-                .putBoolean(HIDE_BLOCKED_CALLS_PREF_KEY, shouldHide)
-                .apply();
-    }
-
     public static boolean hasRecentEmergencyCall(Context context) {
         if (context == null) {
             return false;
         }
 
         Long lastEmergencyCallTime = PreferenceManager.getDefaultSharedPreferences(context)
-                .getLong(LAST_EMERGENCY_CALL_PREF_KEY, 0);
+                .getLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, 0);
         if (lastEmergencyCallTime == 0) {
             return false;
         }
@@ -288,14 +283,66 @@
         if (context == null) {
             return;
         }
+
         PreferenceManager.getDefaultSharedPreferences(context)
                 .edit()
-                .putLong(LAST_EMERGENCY_CALL_PREF_KEY, System.currentTimeMillis())
+                .putLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, System.currentTimeMillis())
+                .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)
                 .apply();
+
+        maybeNotifyCallBlockingDisabled(context);
     }
 
-    public static boolean canBlockNumber(Context context, String number) {
-        return !PhoneNumberUtils.isEmergencyNumber(number) && !TextUtils.isEmpty(number);
+    public static void maybeNotifyCallBlockingDisabled(final Context context) {
+        // Skip if the user has already received a notification for the most recent emergency call.
+        if (PreferenceManager.getDefaultSharedPreferences(context)
+                .getBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)) {
+            return;
+        }
+
+        // If the user has blocked numbers, notify that call blocking is temporarily disabled.
+        FilteredNumberAsyncQueryHandler queryHandler =
+                new FilteredNumberAsyncQueryHandler(context.getContentResolver());
+        queryHandler.hasBlockedNumbers(new OnHasBlockedNumbersListener() {
+            @Override
+            public void onHasBlockedNumbers(boolean hasBlockedNumbers) {
+                if (context == null || !hasBlockedNumbers) {
+                    return;
+                }
+
+                NotificationManager notificationManager = (NotificationManager)
+                        context.getSystemService(Context.NOTIFICATION_SERVICE);
+                Notification.Builder builder = new Notification.Builder(context)
+                        .setSmallIcon(R.drawable.ic_block_24dp)
+                        .setContentTitle(context.getString(
+                                R.string.call_blocking_disabled_notification_title))
+                        .setContentText(context.getString(
+                                R.string.call_blocking_disabled_notification_text))
+                        .setAutoCancel(true);
+
+                final Intent contentIntent =
+                        new Intent(context, BlockedNumbersSettingsActivity.class);
+                builder.setContentIntent(PendingIntent.getActivity(
+                        context, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+
+                notificationManager.notify(
+                        CALL_BLOCKING_NOTIFICATION_TAG,
+                        CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID,
+                        builder.build());
+
+                // Record that the user has been notified for this emergency call.
+                PreferenceManager.getDefaultSharedPreferences(context)
+                    .edit()
+                    .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, true)
+                    .apply();
+            }
+        });
+    }
+
+    public static boolean canBlockNumber(Context context, String number, String countryIso) {
+        final String normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+        return !TextUtils.isEmpty(normalizedNumber)
+                && !PhoneNumberUtils.isEmergencyNumber(normalizedNumber);
     }
 
     private static long getRecentEmergencyCallThresholdMs(Context context) {
diff --git a/src/com/android/dialer/filterednumber/NumberAdapter.java b/src/com/android/dialer/filterednumber/NumbersAdapter.java
similarity index 98%
rename from src/com/android/dialer/filterednumber/NumberAdapter.java
rename to src/com/android/dialer/filterednumber/NumbersAdapter.java
index b212fa3..1706107 100644
--- a/src/com/android/dialer/filterednumber/NumberAdapter.java
+++ b/src/com/android/dialer/filterednumber/NumbersAdapter.java
@@ -36,7 +36,7 @@
 import com.android.dialer.calllog.ContactInfoHelper;
 import com.android.dialer.util.PhoneNumberUtil;
 
-public class NumberAdapter extends SimpleCursorAdapter {
+public class NumbersAdapter extends SimpleCursorAdapter {
 
     private Context mContext;
     private FragmentManager mFragmentManager;
@@ -45,7 +45,7 @@
     private BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
     private ContactPhotoManager mContactPhotoManager;
 
-    public NumberAdapter(
+    public NumbersAdapter(
             Context context,
             FragmentManager fragmentManager,
             ContactInfoHelper contactInfoHelper,
diff --git a/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java b/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java
index 40b81c7..58fe1d4 100644
--- a/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java
+++ b/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java
@@ -25,7 +25,7 @@
 import com.android.dialer.R;
 import com.android.dialer.calllog.ContactInfoHelper;
 
-public class ViewNumbersToImportAdapter extends NumberAdapter {
+public class ViewNumbersToImportAdapter extends NumbersAdapter {
 
     private ViewNumbersToImportAdapter(
             Context context,
diff --git a/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java b/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java
index 947dc67..9912416 100644
--- a/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java
+++ b/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java
@@ -72,6 +72,10 @@
 
         ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
         actionBar.setTitle(R.string.import_send_to_voicemail_numbers_label);
+        actionBar.setDisplayShowCustomEnabled(false);
+        actionBar.setDisplayHomeAsUpEnabled(true);
+        actionBar.setDisplayShowHomeEnabled(true);
+        actionBar.setDisplayShowTitleEnabled(true);
 
         getActivity().findViewById(R.id.cancel_button).setOnClickListener(this);
         getActivity().findViewById(R.id.import_button).setOnClickListener(this);
diff --git a/src/com/android/dialer/list/BlockedListSearchAdapter.java b/src/com/android/dialer/list/BlockedListSearchAdapter.java
index aaea40b..1618826 100644
--- a/src/com/android/dialer/list/BlockedListSearchAdapter.java
+++ b/src/com/android/dialer/list/BlockedListSearchAdapter.java
@@ -84,7 +84,7 @@
                         }
                     }
                 };
-        mFilteredNumberAsyncQueryHandler.startBlockedQuery(
-                onCheckListener, null, number, countryIso);
+        mFilteredNumberAsyncQueryHandler.isBlockedNumber(
+                onCheckListener, number, countryIso);
     }
 }
diff --git a/src/com/android/dialer/list/BlockedListSearchFragment.java b/src/com/android/dialer/list/BlockedListSearchFragment.java
index 8fc6f7a..08a9c49 100644
--- a/src/com/android/dialer/list/BlockedListSearchFragment.java
+++ b/src/com/android/dialer/list/BlockedListSearchFragment.java
@@ -15,13 +15,11 @@
  */
 package com.android.dialer.list;
 
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.net.Uri;
 import android.os.Bundle;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.AppCompatActivity;
 import android.text.Editable;
+import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.util.Log;
 import android.util.TypedValue;
@@ -31,23 +29,25 @@
 import android.widget.Toast;
 
 import com.android.contacts.common.GeoUtil;
-import com.android.contacts.common.dialog.IndeterminateProgressDialog;
 import com.android.contacts.common.list.ContactEntryListAdapter;
 import com.android.contacts.common.list.ContactListItemView;
 import com.android.dialer.R;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
-import com.android.dialer.filterednumber.FilterNumberDialogFragment;
-import com.android.dialer.filterednumber.ManageBlockedNumbersActivity;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockedNumbersSettingsActivity;
 import com.android.dialer.widget.SearchEditTextLayout;
 
 public class BlockedListSearchFragment extends RegularSearchFragment
-        implements FilterNumberDialogFragment.Callback {
+        implements BlockNumberDialogFragment.Callback {
     private static final String TAG = BlockedListSearchFragment.class.getSimpleName();
 
+    private static final String KEY_SEARCH_QUERY = "search_query";
+
     private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
 
     private EditText mSearchView;
+    private String mSearchQuery;
 
     private final TextWatcher mPhoneSearchQueryTextListener = new TextWatcher() {
         @Override
@@ -56,7 +56,8 @@
 
         @Override
         public void onTextChanged(CharSequence s, int start, int before, int count) {
-            setQueryString(s.toString(), false);
+            mSearchQuery = s.toString();
+            setQueryString(mSearchQuery, false);
         }
 
         @Override
@@ -76,7 +77,6 @@
                 }
             };
 
-
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -86,6 +86,9 @@
 
         mFilteredNumberAsyncQueryHandler = new FilteredNumberAsyncQueryHandler(
                 getContext().getContentResolver());
+        if (savedInstanceState != null) {
+            mSearchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY);
+        }
     }
 
     @Override
@@ -94,8 +97,6 @@
 
         ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
         actionBar.setCustomView(R.layout.search_edittext);
-        actionBar.setBackgroundDrawable(null);
-        actionBar.setElevation(0);
         actionBar.setDisplayShowCustomEnabled(true);
         actionBar.setDisplayHomeAsUpEnabled(false);
         actionBar.setDisplayShowHomeEnabled(false);
@@ -104,21 +105,37 @@
                 .getCustomView().findViewById(R.id.search_view_container);
         searchEditTextLayout.expand(false, true);
         searchEditTextLayout.setCallback(mSearchLayoutCallback);
+        searchEditTextLayout.setBackgroundDrawable(null);
 
         mSearchView = (EditText) searchEditTextLayout.findViewById(R.id.search_view);
         mSearchView.addTextChangedListener(mPhoneSearchQueryTextListener);
         mSearchView.setHint(R.string.block_number_search_hint);
 
+        searchEditTextLayout.findViewById(R.id.search_box_expanded)
+                .setBackgroundColor(getContext().getResources().getColor(android.R.color.white));
+
+        if (!TextUtils.isEmpty(mSearchQuery)) {
+            mSearchView.setText(mSearchQuery);
+        }
+
         // TODO: Don't set custom text size; use default search text size.
         mSearchView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                 getResources().getDimension(R.dimen.blocked_number_search_text_size));
     }
 
     @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putString(KEY_SEARCH_QUERY, getAdapter().getQueryString());
+    }
+
+    @Override
     protected ContactEntryListAdapter createListAdapter() {
         BlockedListSearchAdapter adapter = new BlockedListSearchAdapter(getActivity());
         adapter.setDisplayPhotos(true);
-        adapter.setUseCallableUri(usesCallableUri());
+        // Don't show SIP addresses.
+        adapter.setUseCallableUri(false);
+        adapter.setQueryString(mSearchQuery);
         return adapter;
     }
 
@@ -158,9 +175,8 @@
             @Override
             public void onCheckComplete(Integer id) {
                 if (id == null) {
-                    FilterNumberDialogFragment.show(
+                    BlockNumberDialogFragment.show(
                             id,
-                            null,
                             number,
                             countryIso,
                             number,
@@ -173,9 +189,9 @@
                 }
             }
         };
-        boolean failed = mFilteredNumberAsyncQueryHandler.startBlockedQuery(
-                onCheckListener, null, number, countryIso);
-        if (failed) {
+        final boolean success = mFilteredNumberAsyncQueryHandler.isBlockedNumber(
+                onCheckListener, number, countryIso);
+        if (!success) {
             Toast.makeText(getContext(), getString(R.string.invalidNumber, number),
                     Toast.LENGTH_SHORT).show();
         }
@@ -183,12 +199,11 @@
 
     @Override
     public void onChangeFilteredNumberSuccess() {
-        ManageBlockedNumbersActivity activity = (ManageBlockedNumbersActivity) getActivity();
+        BlockedNumbersSettingsActivity activity = (BlockedNumbersSettingsActivity) getActivity();
         if (activity == null) {
             return;
         }
-
-        activity.showManagementUi();
+        activity.onBackPressed();
     }
 
     @Override
@@ -207,9 +222,8 @@
             return;
         }
 
-        FilterNumberDialogFragment.show(
+        BlockNumberDialogFragment.show(
                 blockId,
-                null,
                 number,
                 GeoUtil.getCurrentCountryIso(getContext()),
                 number,
diff --git a/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java b/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java
index 05780c6..c12bed7 100644
--- a/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java
@@ -95,6 +95,11 @@
         setMeasuredDimension(width, height);
     }
 
+    @Override
+    protected String getNameForView(ContactEntry contactEntry) {
+        return contactEntry.getPreferredDisplayName();
+    }
+
     public ContactEntry getContactEntry() {
         return mContactEntry;
     }
diff --git a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
index e957c83..cd4c10b 100644
--- a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
+++ b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
@@ -38,13 +38,13 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
-import android.widget.FrameLayout;
 
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.ContactTileLoaderFactory;
 import com.android.contacts.common.list.ContactEntry;
 import com.android.contacts.common.list.ContactTileAdapter.DisplayType;
 import com.android.contacts.common.list.ContactTileView;
+import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.dialer.R;
 
 import java.util.ArrayList;
@@ -70,6 +70,7 @@
 
     private Context mContext;
     private Resources mResources;
+    private ContactsPreferences mContactsPreferences;
 
     /** Contact data stored in cache. This is used to populate the associated view. */
     protected ArrayList<ContactEntry> mContactEntries = null;
@@ -92,7 +93,8 @@
     protected int mIdIndex;
     protected int mLookupIndex;
     protected int mPhotoUriIndex;
-    protected int mNameIndex;
+    protected int mNamePrimaryIndex;
+    protected int mNameAlternativeIndex;
     protected int mPresenceIndex;
     protected int mStatusIndex;
 
@@ -124,9 +126,17 @@
         public int compare(ContactEntry lhs, ContactEntry rhs) {
             return ComparisonChain.start()
                     .compare(lhs.pinned, rhs.pinned)
-                    .compare(lhs.name, rhs.name)
+                    .compare(getPreferredSortName(lhs), getPreferredSortName(rhs))
                     .result();
         }
+
+        private String getPreferredSortName(ContactEntry contactEntry) {
+            if (mContactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY
+                    || TextUtils.isEmpty(contactEntry.nameAlternative)) {
+                return contactEntry.namePrimary;
+            }
+            return contactEntry.nameAlternative;
+        }
     };
 
     public interface OnDataSetChangedForAnimationListener {
@@ -140,6 +150,7 @@
         mListener = listener;
         mContext = context;
         mResources = context.getResources();
+        mContactsPreferences = new ContactsPreferences(mContext);
         mNumFrequents = 0;
         mContactEntries = new ArrayList<ContactEntry>();
 
@@ -172,19 +183,26 @@
      */
     protected void bindColumnIndices() {
         mIdIndex = ContactTileLoaderFactory.CONTACT_ID;
-        mLookupIndex = ContactTileLoaderFactory.LOOKUP_KEY;
-        mPhotoUriIndex = ContactTileLoaderFactory.PHOTO_URI;
-        mNameIndex = ContactTileLoaderFactory.DISPLAY_NAME;
+        mNamePrimaryIndex = ContactTileLoaderFactory.DISPLAY_NAME;
+        mNameAlternativeIndex = ContactTileLoaderFactory.DISPLAY_NAME_ALTERNATIVE;
         mStarredIndex = ContactTileLoaderFactory.STARRED;
-        mPresenceIndex = ContactTileLoaderFactory.CONTACT_PRESENCE;
-        mStatusIndex = ContactTileLoaderFactory.CONTACT_STATUS;
-
+        mPhotoUriIndex = ContactTileLoaderFactory.PHOTO_URI;
+        mLookupIndex = ContactTileLoaderFactory.LOOKUP_KEY;
         mPhoneNumberIndex = ContactTileLoaderFactory.PHONE_NUMBER;
         mPhoneNumberTypeIndex = ContactTileLoaderFactory.PHONE_NUMBER_TYPE;
         mPhoneNumberLabelIndex = ContactTileLoaderFactory.PHONE_NUMBER_LABEL;
-        mIsDefaultNumberIndex = ContactTileLoaderFactory.IS_DEFAULT_NUMBER;
         mPinnedIndex = ContactTileLoaderFactory.PINNED;
-        mContactIdIndex = ContactTileLoaderFactory.CONTACT_ID_FOR_DATA;
+        mContactIdIndex = ContactTileLoaderFactory.CONTACT_ID;
+
+
+        mPresenceIndex = ContactTileLoaderFactory.CONTACT_PRESENCE;
+        mStatusIndex = ContactTileLoaderFactory.CONTACT_STATUS;
+        mIsDefaultNumberIndex = ContactTileLoaderFactory.IS_DEFAULT_NUMBER;
+    }
+
+    public void refreshContactsPreferences() {
+        mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+        mContactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
     }
 
     /**
@@ -261,15 +279,19 @@
             final String photoUri = cursor.getString(mPhotoUriIndex);
             final String lookupKey = cursor.getString(mLookupIndex);
             final int pinned = cursor.getInt(mPinnedIndex);
-            final String name = cursor.getString(mNameIndex);
+            final String name = cursor.getString(mNamePrimaryIndex);
+            final String nameAlternative = cursor.getString(mNameAlternativeIndex);
             final boolean isStarred = cursor.getInt(mStarredIndex) > 0;
             final boolean isDefaultNumber = cursor.getInt(mIsDefaultNumberIndex) > 0;
 
             final ContactEntry contact = new ContactEntry();
 
             contact.id = id;
-            contact.name = (!TextUtils.isEmpty(name)) ? name :
+            contact.namePrimary = (!TextUtils.isEmpty(name)) ? name :
                     mResources.getString(R.string.missing_name);
+            contact.nameAlternative = (!TextUtils.isEmpty(nameAlternative)) ? nameAlternative :
+                    mResources.getString(R.string.missing_name);
+            contact.nameDisplayOrder = mContactsPreferences.getDisplayOrder();
             contact.photoUri = (photoUri != null ? Uri.parse(photoUri) : null);
             contact.lookupKey = lookupKey;
             contact.lookupUri = ContentUris.withAppendedId(
diff --git a/src/com/android/dialer/list/SpeedDialFragment.java b/src/com/android/dialer/list/SpeedDialFragment.java
index 64129cd..e30f406 100644
--- a/src/com/android/dialer/list/SpeedDialFragment.java
+++ b/src/com/android/dialer/list/SpeedDialFragment.java
@@ -202,7 +202,9 @@
     public void onResume() {
         Trace.beginSection(TAG + " onResume");
         super.onResume();
-
+        if (mContactTileAdapter != null) {
+            mContactTileAdapter.refreshContactsPreferences();
+        }
         if (PermissionsUtil.hasContactsPermissions(getActivity())) {
             if (getLoaderManager().getLoader(LOADER_ID_CONTACT_TILE) == null) {
                 getLoaderManager().initLoader(LOADER_ID_CONTACT_TILE, null,
diff --git a/src/com/android/dialer/settings/DialerSettingsActivity.java b/src/com/android/dialer/settings/DialerSettingsActivity.java
index 6fcd221..d0bfbc2 100644
--- a/src/com/android/dialer/settings/DialerSettingsActivity.java
+++ b/src/com/android/dialer/settings/DialerSettingsActivity.java
@@ -28,7 +28,7 @@
 import android.widget.Toast;
 
 import com.android.dialer.R;
-import com.android.dialer.filterednumber.ManageBlockedNumbersActivity;
+import com.android.dialer.filterednumber.BlockedNumbersSettingsActivity;
 
 import java.util.List;
 
@@ -88,7 +88,7 @@
 
             Header blockedCallsHeader = new Header();
             blockedCallsHeader.titleRes = R.string.manage_blocked_numbers_label;
-            blockedCallsHeader.intent = new Intent(this, ManageBlockedNumbersActivity.class);
+            blockedCallsHeader.intent = new Intent(this, BlockedNumbersSettingsActivity.class);
             target.add(blockedCallsHeader);
 
             if (telephonyManager.isTtyModeSupported()
diff --git a/src/com/android/dialer/widget/SearchEditTextLayout.java b/src/com/android/dialer/widget/SearchEditTextLayout.java
index 544749f..4f100dc 100644
--- a/src/com/android/dialer/widget/SearchEditTextLayout.java
+++ b/src/com/android/dialer/widget/SearchEditTextLayout.java
@@ -230,7 +230,6 @@
         setElevation(0);
         setPaddingRelative(paddingStart, paddingTop, paddingEnd, paddingBottom);
 
-        setElevation(0);
         if (requestFocus) {
             mSearchView.requestFocus();
         }
diff --git a/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java b/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java
index d0547bd..8819384 100644
--- a/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java
+++ b/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java
@@ -1,5 +1,8 @@
 package com.android.dialer.list;
 
+import com.google.common.collect.Lists;
+
+import android.content.Context;
 import android.database.Cursor;
 import android.database.MatrixCursor;
 import android.provider.ContactsContract.PinnedPositions;
@@ -8,15 +11,18 @@
 
 import com.android.contacts.common.ContactTileLoaderFactory;
 import com.android.contacts.common.list.ContactEntry;
+import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.dialer.list.PhoneFavoritesTileAdapter.OnDataSetChangedForAnimationListener;
 
+import junit.framework.Assert;
+
 import java.util.ArrayList;
 
 @SmallTest
 public class PhoneFavoritesTileAdapterTest extends AndroidTestCase {
-    private PhoneFavoritesTileAdapter mAdapter;
-    private static final OnDataSetChangedForAnimationListener
-            sOnDataSetChangedForAnimationListener = new OnDataSetChangedForAnimationListener() {
+
+    private static final OnDataSetChangedForAnimationListener NOOP_ANIMATION_LISTENER =
+            new OnDataSetChangedForAnimationListener() {
                 @Override
                 public void onDataSetChangedForAnimation(long... idsInPlace) {}
 
@@ -24,18 +30,161 @@
                 public void cacheOffsetsForDatasetChange() {}
             };
 
-    /**
-     * TODO: Add tests
-     *
-     * Test cases (various combinations of):
-     * No pinned contacts
-     * One pinned contact
-     * Multiple pinned contacts with differing pinned positions
-     * Multiple pinned contacts with conflicting pinned positions
-     * Pinned contacts with pinned positions at the start, middle, end, and outside the list
-     */
-    public void testArrangeContactsByPinnedPosition() {
+    private PhoneFavoritesTileAdapter mAdapter;
 
+    @Override
+    public void setUp() {
+        this.mAdapter = new PhoneFavoritesTileAdapter(getContext(), null, NOOP_ANIMATION_LISTENER);
+    }
+
+    /**
+     * For all arrangeContactsByPinnedPosition tests, the id for a particular ContactEntry
+     * represents the index at which it should be located after calling
+     * arrangeContactsByPinnedPosition
+     */
+
+    public void testArrangeContactsByPinnedPosition_NoPinned() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+                getTestContactEntry(1), getTestContactEntry(2));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_NoPinned_RemoveDemoted() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+                getTestContactEntry(-1, PinnedPositions.DEMOTED), getTestContactEntry(1));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 2);
+    }
+
+    public void testArrangeContactsByPinnedPosition_OnePinned_Beginning() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1),
+                getTestContactEntry(0, 1), getTestContactEntry(2));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_OnePinned_Middle() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+                getTestContactEntry(1, 2), getTestContactEntry(2));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_OnePinned_End() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+                getTestContactEntry(2, 3), getTestContactEntry(1));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_OnePinned_Outside() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+                getTestContactEntry(2, 5), getTestContactEntry(1));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_OnePinned_RemoveDemoted() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+                getTestContactEntry(-1, PinnedPositions.DEMOTED), getTestContactEntry(0));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 2);
+    }
+
+    public void testArrangeContactsByPinnedPosition_TwoPinned_Split() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0, 1),
+                getTestContactEntry(1), getTestContactEntry(2, 3));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_TwoPinned_Adjacent() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+                getTestContactEntry(0), getTestContactEntry(2, 3));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_TwoPinned_Conflict_UnpinnedBefore() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+                getTestContactEntry(0), getTestContactEntry(2, 2));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_TwoPinned_Conflict_UnpinnedAfter() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0, 1),
+                getTestContactEntry(2), getTestContactEntry(1, 1));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_TwoPinned_Conflict_RemoveDemoted() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+                getTestContactEntry(-1, PinnedPositions.DEMOTED), getTestContactEntry(0, 2));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 2);
+    }
+
+    public void testArrangeContactsByPinnedPosition_AllPinned() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+                getTestContactEntry(0, 1), getTestContactEntry(2, 3));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_AllPinned_TwoConflicts_ConflictsFirst() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+                getTestContactEntry(0, 2), getTestContactEntry(2, 3));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_AllPinned_TwoConflicts_ConflictsLast() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0, 2),
+                getTestContactEntry(1, 3), getTestContactEntry(2, 3));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_AllPinned_AllConflicts() {
+        ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(2, 3),
+                getTestContactEntry(1, 3), getTestContactEntry(0, 3));
+        mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+        assertContactEntryListPositionsMatchId(toArrange, 3);
+    }
+
+    public void testArrangeContactsByPinnedPosition_All_Pinned_AllConflicts_SortNameAlternative() {
+        Context context  = getContext();
+        context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE).edit()
+                .putInt(ContactsPreferences.SORT_ORDER_KEY,
+                        ContactsPreferences.SORT_ORDER_ALTERNATIVE)
+                .commit();
+        ArrayList<ContactEntry> actual = Lists.newArrayList(
+                getTestContactEntry(1, 3, "2", "1"),
+                getTestContactEntry(2, 3, "0", "2"),
+                getTestContactEntry(0, 3, "1", "0")
+        );
+        mAdapter.arrangeContactsByPinnedPosition(actual);
+
+        assertContactEntryListPositionsMatchId(actual, 3);
     }
 
     /**
@@ -55,6 +204,45 @@
 
     }
 
+    public void testSetContactCursor_DisplayNameOrder_Primary() {
+        setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+        Cursor testCursor = getCursorForTest(1, 0);
+        mAdapter.setContactCursor(testCursor);
+        Assert.assertEquals(1, mAdapter.mContactEntries.size());
+        Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY,
+                mAdapter.mContactEntries.get(0).nameDisplayOrder);
+    }
+
+    public void testSetContactCursor_DisplayNameOrder_Alternative() {
+        setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
+        Cursor testCursor = getCursorForTest(1, 0);
+        mAdapter.setContactCursor(testCursor);
+        Assert.assertEquals(1, mAdapter.mContactEntries.size());
+        Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE,
+                mAdapter.mContactEntries.get(0).nameDisplayOrder);
+    }
+
+    public void testSetContactCursor_DisplayNameOrder_Changed() {
+        setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+        Cursor testCursor = getCursorForTest(1, 0);
+        mAdapter.setContactCursor(testCursor);
+        Assert.assertEquals(1, mAdapter.mContactEntries.size());
+        Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY,
+                mAdapter.mContactEntries.get(0).nameDisplayOrder);
+
+        setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
+        mAdapter.refreshContactsPreferences();
+        mAdapter.setContactCursor(testCursor);
+        Assert.assertEquals(1, mAdapter.mContactEntries.size());
+        Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE,
+                mAdapter.mContactEntries.get(0).nameDisplayOrder);
+    }
+
+    private void setNameDisplayOrder(Context context, int displayOrder) {
+        context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE).edit().putInt(
+                ContactsPreferences.DISPLAY_ORDER_KEY, displayOrder).commit();
+    }
+
     /**
      * Returns a cursor containing starred and frequent contacts for test purposes.
      *
@@ -72,38 +260,42 @@
         // The only field that really matters for testing is the contact id.
         for (int i = 0; i < numStarred; i++) {
             c.addRow(new Object[] {countId, null, 1, null, null, 0, 0, null, 0,
-                    PinnedPositions.UNPINNED, countId});
+                    PinnedPositions.UNPINNED, countId, null});
             countId++;
         }
 
         // Add frequent contact entries. These entries have the starred field set to 0 (false).
         for (int i = 0; i < numFrequents; i++) {
             c.addRow(new Object[] {countId, null, 0, null, null, 0, 0, null, 0,
-                    PinnedPositions.UNPINNED, countId});
+                    PinnedPositions.UNPINNED, countId, null});
             countId++;
         }
         return c;
     }
 
-    /**
-     * Returns a ContactEntry with test data corresponding to the provided contact Id
-     *
-     * @param id Non-negative id
-     * @return ContactEntry item used for testing
-     */
-    private ContactEntry getTestContactEntry(int id, boolean isFavorite) {
+    private ContactEntry getTestContactEntry(int id) {
+        return getTestContactEntry(id, PinnedPositions.UNPINNED);
+    }
+
+    private ContactEntry getTestContactEntry(int id, int pinned) {
+        return getTestContactEntry(id, pinned, String.valueOf(id), String.valueOf(id));
+    }
+
+    private ContactEntry getTestContactEntry(int id, int pinned, String namePrimaryAppend,
+            String nameAlternativeAppend) {
         ContactEntry contactEntry = new ContactEntry();
         contactEntry.id = id;
-        contactEntry.isFavorite = isFavorite;
+        contactEntry.pinned = pinned;
+        contactEntry.namePrimary = namePrimaryAppend;
+        contactEntry.nameAlternative = nameAlternativeAppend;
         return contactEntry;
     }
 
-    private void assertContactEntryRowsEqual(ArrayList<ContactEntry> expected,
-            ArrayList<ContactEntry> actual) {
-        assertEquals(expected.size(), actual.size());
-        for (int i = 0; i < actual.size(); i++) {
-            assertEquals(expected.get(i).id, actual.get(i).id);
-            assertEquals(expected.get(i).isFavorite, actual.get(i).isFavorite);
+    private void assertContactEntryListPositionsMatchId(ArrayList<ContactEntry> contactEntries,
+            int expectedSize) {
+        Assert.assertEquals(expectedSize, contactEntries.size());
+        for (int i = 0; i < expectedSize; ++i) {
+            Assert.assertEquals(i, contactEntries.get(i).id);
         }
     }
 }