diff --git a/res/layout/call_detail.xml b/res/layout/call_detail.xml
index fde1de5..591ba5c 100644
--- a/res/layout/call_detail.xml
+++ b/res/layout/call_detail.xml
@@ -60,7 +60,8 @@
                 android:textColor="?attr/call_log_primary_text_color"
                 android:textSize="@dimen/call_log_primary_text_size"
                 android:includeFontPadding="false"
-                android:layout_marginBottom="5dp"
+                android:layout_marginTop="2dp"
+                android:layout_marginBottom="3dp"
                 android:singleLine="true" />
 
             <TextView
diff --git a/res/layout/call_detail_history_header.xml b/res/layout/call_detail_history_header.xml
deleted file mode 100644
index def1fd8..0000000
--- a/res/layout/call_detail_history_header.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<TextView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:ex="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingTop="@dimen/call_detail_header_top_margin"
-    android:paddingBottom="@dimen/call_detail_header_bottom_margin"
-    android:paddingStart="@dimen/call_detail_horizontal_margin"
-    android:textColor="?attr/call_log_secondary_text_color"
-    android:textSize="@dimen/call_log_secondary_text_size"
-    android:fontFamily="sans-serif-medium"
-    android:singleLine="true"
-    android:text="@string/call_detail_list_header"
-    />
diff --git a/res/menu/call_details_options.xml b/res/menu/call_details_options.xml
index 0e9e5c9..414b671 100644
--- a/res/menu/call_details_options.xml
+++ b/res/menu/call_details_options.xml
@@ -16,16 +16,6 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/call_details_menu">
 
-    <item android:id="@+id/menu_trash"
-        android:icon="@drawable/ic_delete_24dp"
-        android:showAsAction="ifRoom"
-        android:title="@string/call_log_trash_voicemail" />
-
-    <item android:id="@+id/menu_remove_from_call_log"
-        android:icon="@drawable/ic_delete_24dp"
-        android:showAsAction="ifRoom"
-        android:title="@string/call_log_remove_from_call_log" />
-
     <item android:id="@+id/menu_edit_number_before_call"
         android:title="@string/call_log_edit_number_before_call" />
 
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 0a330d8..d35a78d 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -39,9 +39,9 @@
     <!-- Size of contact photos in the call log and call details. -->
     <dimen name="contact_photo_size">40dp</dimen>
     <dimen name="call_detail_button_spacing">2dip</dimen>
-    <dimen name="call_detail_horizontal_margin">16dp</dimen>
-    <dimen name="call_detail_top_margin">36dp</dimen>
-    <dimen name="call_detail_bottom_margin">32dp</dimen>
+    <dimen name="call_detail_horizontal_margin">20dp</dimen>
+    <dimen name="call_detail_top_margin">16dp</dimen>
+    <dimen name="call_detail_bottom_margin">16dp</dimen>
     <dimen name="call_detail_header_top_margin">20dp</dimen>
     <dimen name="call_detail_header_bottom_margin">9dp</dimen>
     <dimen name="call_detail_translation_z">0.5dp</dimen>
diff --git a/res/values/ids.xml b/res/values/ids.xml
index 0034fe3..14a2e59 100644
--- a/res/values/ids.xml
+++ b/res/values/ids.xml
@@ -15,6 +15,7 @@
 -->
 
 <resources>
+    <item type="id" name="call_detail_delete_menu_item" />
     <item type="id" name="context_menu_copy_to_clipboard" />
     <item type="id" name="context_menu_copy_transcript_to_clipboard" />
     <item type="id" name="context_menu_edit_before_call" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e9bf1f4..b2621cd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -70,6 +70,9 @@
     <!-- Text for undo button in snackbar for blocking/unblocking number. [CHAR LIMIT=10] -->
     <string name="block_number_undo">UNDO</string>
 
+    <!-- Menu item in call details used to remove a call or voicemail from the call log. -->
+    <string name="call_details_delete">Delete</string>
+
     <!-- Menu item used to copy a number from the call log to the dialer so it can be edited before calling it -->
     <string name="call_log_edit_number_before_call">Edit number before call</string>
 
@@ -309,13 +312,13 @@
          is already in progress.) -->
     <string name="dialer_addAnotherCall">Add call</string>
 
-    <!-- Title for incoming call details screen -->
+    <!-- Title for incoming call type. [CHAR LIMIT=40] -->
     <string name="type_incoming">Incoming call</string>
 
-    <!-- Title for outgoing call details screen -->
+    <!-- Title for outgoing call type. [CHAR LIMIT=40] -->
     <string name="type_outgoing">Outgoing call</string>
 
-    <!-- Title for missed call details screen -->
+    <!-- Title for missed call type. [CHAR LIMIT=40] -->
     <string name="type_missed">Missed call</string>
 
     <!-- Title for incoming video call in call details screen [CHAR LIMIT=60] -->
@@ -330,6 +333,12 @@
     <!-- Title for voicemail details screen -->
     <string name="type_voicemail">Voicemail</string>
 
+    <!-- Title for rejected call type. [CHAR LIMIT=40] -->
+    <string name="type_rejected">Declined call</string>
+
+    <!-- Title for blocked call type. [CHAR LIMIT=40] -->
+    <string name="type_blocked">Blocked call</string>
+
     <!-- Description for incoming calls going to voice mail vs. not -->
     <string name="actionIncomingCall">Incoming calls</string>
 
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index d95b55e..7cb517b 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -321,23 +321,24 @@
 
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
+        final MenuItem deleteMenuItem = menu.add(
+                Menu.NONE,
+                R.id.call_detail_delete_menu_item,
+                Menu.NONE,
+                R.string.call_details_delete);
+        deleteMenuItem.setIcon(R.drawable.ic_delete_24dp);
+        deleteMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+        deleteMenuItem.setOnMenuItemClickListener(this);
+
         getMenuInflater().inflate(R.menu.call_details_options, menu);
         return super.onCreateOptionsMenu(menu);
     }
 
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
-        // This action deletes all elements in the group from the call log.
-        // We don't have this action for voicemails, because you can just use the trash button.
-        menu.findItem(R.id.menu_remove_from_call_log)
-                .setVisible(!hasVoicemail())
-                .setOnMenuItemClickListener(this);
         menu.findItem(R.id.menu_edit_number_before_call)
                 .setVisible(mHasEditNumberBeforeCallOption)
                 .setOnMenuItemClickListener(this);
-        menu.findItem(R.id.menu_trash)
-                .setVisible(hasVoicemail())
-                .setOnMenuItemClickListener(this);
         menu.findItem(R.id.menu_report)
                 .setVisible(mHasReportMenuOption)
                 .setOnMenuItemClickListener(this);
@@ -347,24 +348,25 @@
     @Override
     public boolean onMenuItemClick(MenuItem item) {
         switch (item.getItemId()) {
-            case R.id.menu_remove_from_call_log:
-                final StringBuilder callIds = new StringBuilder();
-                for (Uri callUri : getCallLogEntryUris()) {
-                    if (callIds.length() != 0) {
-                        callIds.append(",");
+            case R.id.call_detail_delete_menu_item:
+                if (hasVoicemail()) {
+                    CallLogAsyncTaskUtil.deleteVoicemail(
+                            this, mVoicemailUri, mCallLogAsyncTaskListener);
+                } else {
+                    final StringBuilder callIds = new StringBuilder();
+                    for (Uri callUri : getCallLogEntryUris()) {
+                        if (callIds.length() != 0) {
+                            callIds.append(",");
+                        }
+                        callIds.append(ContentUris.parseId(callUri));
                     }
-                    callIds.append(ContentUris.parseId(callUri));
+                    CallLogAsyncTaskUtil.deleteCalls(
+                            this, callIds.toString(), mCallLogAsyncTaskListener);
                 }
-                CallLogAsyncTaskUtil.deleteCalls(
-                        this, callIds.toString(), mCallLogAsyncTaskListener);
                 break;
             case R.id.menu_edit_number_before_call:
                 startActivity(new Intent(Intent.ACTION_DIAL, CallUtil.getCallUri(mNumber)));
                 break;
-            case R.id.menu_trash:
-                CallLogAsyncTaskUtil.deleteVoicemail(
-                        this, mVoicemailUri, mCallLogAsyncTaskListener);
-                break;
         }
         return true;
     }
diff --git a/src/com/android/dialer/calllog/CallDetailHistoryAdapter.java b/src/com/android/dialer/calllog/CallDetailHistoryAdapter.java
index 3b488a8..ac56332 100644
--- a/src/com/android/dialer/calllog/CallDetailHistoryAdapter.java
+++ b/src/com/android/dialer/calllog/CallDetailHistoryAdapter.java
@@ -38,8 +38,6 @@
  * Adapter for a ListView containing history items from the details of a call.
  */
 public class CallDetailHistoryAdapter extends BaseAdapter {
-    /** The top element is a blank header, which is hidden under the rest of the UI. */
-    private static final int VIEW_TYPE_HEADER = 0;
     /** Each history item shows the detail of a call. */
     private static final int VIEW_TYPE_HISTORY_ITEM = 1;
 
@@ -69,53 +67,37 @@
 
     @Override
     public int getCount() {
-        return mPhoneCallDetails.length + 1;
+        return mPhoneCallDetails.length;
     }
 
     @Override
     public Object getItem(int position) {
-        if (position == 0) {
-            return null;
-        }
-        return mPhoneCallDetails[position - 1];
+        return mPhoneCallDetails[position];
     }
 
     @Override
     public long getItemId(int position) {
-        if (position == 0) {
-            return -1;
-        }
-        return position - 1;
+        return position;
     }
 
     @Override
     public int getViewTypeCount() {
-        return 2;
+        return 1;
     }
 
     @Override
     public int getItemViewType(int position) {
-        if (position == 0) {
-            return VIEW_TYPE_HEADER;
-        }
         return VIEW_TYPE_HISTORY_ITEM;
     }
 
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
-        if (position == 0) {
-            final View header = convertView == null
-                    ? mLayoutInflater.inflate(R.layout.call_detail_history_header, parent, false)
-                    : convertView;
-            return header;
-        }
-
         // Make sure we have a valid convertView to start with
         final View result  = convertView == null
                 ? mLayoutInflater.inflate(R.layout.call_detail_history_item, parent, false)
                 : convertView;
 
-        PhoneCallDetails details = mPhoneCallDetails[position - 1];
+        PhoneCallDetails details = mPhoneCallDetails[position];
         CallTypeIconsView callTypeIconView =
                 (CallTypeIconsView) result.findViewById(R.id.call_type_icon);
         TextView callTypeTextView = (TextView) result.findViewById(R.id.call_type_text);
diff --git a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
index aa994d2..89932ff 100644
--- a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
+++ b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
@@ -31,6 +31,7 @@
 import com.android.contacts.common.GeoUtil;
 import com.android.dialer.DialtactsActivity;
 import com.android.dialer.PhoneCallDetails;
+import com.android.dialer.util.AppCompatConstants;
 import com.android.dialer.util.AsyncTaskExecutor;
 import com.android.dialer.util.AsyncTaskExecutors;
 import com.android.dialer.util.PhoneNumberUtil;
@@ -45,6 +46,7 @@
     public enum Tasks {
         DELETE_VOICEMAIL,
         DELETE_CALL,
+        MARK_BLOCKED,
         MARK_VOICEMAIL_READ,
         GET_CALL_DETAILS,
     }
@@ -79,12 +81,31 @@
         static final int TRANSCRIPTION_COLUMN_INDEX = 11;
     }
 
+    private static class CallLogMarkBlockedQuery {
+        static final String[] PROJECTION = new String[] {
+            CallLog.Calls._ID,
+            CallLog.Calls.DATE
+        };
+
+        static final int ID_COLUMN_INDEX = 0;
+        static final int DATE_COLUMN_INDEX = 1;
+    }
+
     public interface CallLogAsyncTaskListener {
         public void onDeleteCall();
         public void onDeleteVoicemail();
         public void onGetCallDetails(PhoneCallDetails[] details);
     }
 
+    public interface OnCallLogQueryFinishedListener {
+        public void onQueryFinished(boolean hasEntry);
+    }
+
+    // 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 AsyncTaskExecutor sAsyncTaskExecutor;
 
     private static void initTaskExecutor() {
@@ -156,8 +177,8 @@
             boolean isVoicemail = PhoneNumberUtil.isVoicemailNumber(context, accountHandle, number);
             boolean shouldLookupNumber =
                     PhoneNumberUtil.canPlaceCallsTo(number, numberPresentation) && !isVoicemail;
-
             ContactInfo info = ContactInfo.EMPTY;
+
             if (shouldLookupNumber) {
                 ContactInfo lookupInfo = contactInfoHelper.lookupNumber(number, countryIso);
                 info = lookupInfo != null ? lookupInfo : ContactInfo.EMPTY;
@@ -205,7 +226,7 @@
      *
      * @param context The context.
      * @param callIds String of the callIds to delete from the call log, delimited by commas (",").
-     * @param callLogAsyncTaskListenerg The listener to invoke after the entries have been deleted.
+     * @param callLogAsyncTaskListener The listener to invoke after the entries have been deleted.
      */
     public static void deleteCalls(
             final Context context,
@@ -215,26 +236,88 @@
             initTaskExecutor();
         }
 
-        sAsyncTaskExecutor.submit(Tasks.DELETE_CALL,
-                new AsyncTask<Void, Void, Void>() {
-                    @Override
-                    public Void doInBackground(Void... params) {
-                        context.getContentResolver().delete(
-                                TelecomUtil.getCallLogUri(context),
-                                CallLog.Calls._ID + " IN (" + callIds + ")", null);
-                        return null;
-                    }
+        sAsyncTaskExecutor.submit(Tasks.DELETE_CALL, new AsyncTask<Void, Void, Void>() {
+            @Override
+            public Void doInBackground(Void... params) {
+                context.getContentResolver().delete(
+                        TelecomUtil.getCallLogUri(context),
+                        CallLog.Calls._ID + " IN (" + callIds + ")", null);
+                return null;
+            }
 
-                    @Override
-                    public void onPostExecute(Void result) {
-                        if (callLogAsyncTaskListener != null) {
-                            callLogAsyncTaskListener.onDeleteCall();
-                        }
-                    }
-                });
-
+            @Override
+            public void onPostExecute(Void result) {
+                if (callLogAsyncTaskListener != null) {
+                    callLogAsyncTaskListener.onDeleteCall();
+                }
+            }
+        });
     }
 
+    /**
+     * Marks last call made by the number the call type of the specified call as BLOCKED in the call log.
+     *
+     * @param context The context.
+     * @param number Number of which to mark the most recent call as BLOCKED.
+     * @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(
+            final Context context,
+            final String number,
+            final long timeAddedMs,
+            final OnCallLogQueryFinishedListener listener) {
+        if (sAsyncTaskExecutor == null) {
+            initTaskExecutor();
+        }
+
+        sAsyncTaskExecutor.submit(Tasks.MARK_BLOCKED, 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,
+                        CallLog.Calls.NUMBER + "= ?",
+                        new String[] { number },
+                        CallLog.Calls.DATE + " DESC LIMIT 1");
+
+                // If found, return the call log entry id.
+                if (cursor.moveToFirst()) {
+                    long creationTime = cursor.getLong(CallLogMarkBlockedQuery.DATE_COLUMN_INDEX);
+                    if (timeAddedMs > creationTime
+                            && timeAddedMs - creationTime < MATCH_BLOCKED_CALL_THRESHOLD_MS) {
+                        return cursor.getLong(CallLogMarkBlockedQuery.ID_COLUMN_INDEX);
+                    }
+                }
+                return (long) -1;
+            }
+
+            @Override
+            public void onPostExecute(Long callLogEntryId) {
+                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) });
+            }
+        });
+    }
+
+
     public static void markVoicemailAsRead(final Context context, final Uri voicemailUri) {
         if (sAsyncTaskExecutor == null) {
             initTaskExecutor();
@@ -266,21 +349,20 @@
             initTaskExecutor();
         }
 
-        sAsyncTaskExecutor.submit(Tasks.DELETE_VOICEMAIL,
-                new AsyncTask<Void, Void, Void>() {
-                    @Override
-                    public Void doInBackground(Void... params) {
-                        context.getContentResolver().delete(voicemailUri, null, null);
-                        return null;
-                    }
+        sAsyncTaskExecutor.submit(Tasks.DELETE_VOICEMAIL, new AsyncTask<Void, Void, Void>() {
+            @Override
+            public Void doInBackground(Void... params) {
+                context.getContentResolver().delete(voicemailUri, null, null);
+                return null;
+            }
 
-                    @Override
-                    public void onPostExecute(Void result) {
-                        if (callLogAsyncTaskListener != null) {
-                            callLogAsyncTaskListener.onDeleteVoicemail();
-                        }
-                    }
-                });
+            @Override
+            public void onPostExecute(Void result) {
+                if (callLogAsyncTaskListener != null) {
+                    callLogAsyncTaskListener.onDeleteVoicemail();
+                }
+            }
+        });
     }
 
     @VisibleForTesting
diff --git a/src/com/android/dialer/calllog/CallLogListItemHelper.java b/src/com/android/dialer/calllog/CallLogListItemHelper.java
index d18e274..8e45dd3 100644
--- a/src/com/android/dialer/calllog/CallLogListItemHelper.java
+++ b/src/com/android/dialer/calllog/CallLogListItemHelper.java
@@ -24,6 +24,7 @@
 import android.util.Log;
 
 import com.android.dialer.PhoneCallDetails;
+import com.android.dialer.util.AppCompatConstants;
 import com.android.dialer.R;
 
 /**
@@ -220,11 +221,12 @@
         int lastCallType = getLastCallType(callTypes);
         int stringID;
 
-        if (lastCallType == Calls.VOICEMAIL_TYPE || lastCallType == Calls.MISSED_TYPE) {
+        if (lastCallType == AppCompatConstants.CALLS_VOICEMAIL_TYPE
+                || lastCallType == AppCompatConstants.CALLS_MISSED_TYPE) {
             //Message: Missed call from <NameOrNumber>, <TypeOrLocation>, <TimeOfCall>,
             //<PhoneAccount>.
             stringID = R.string.description_incoming_missed_call;
-        } else if (lastCallType == Calls.INCOMING_TYPE) {
+        } else if (lastCallType == AppCompatConstants.CALLS_INCOMING_TYPE) {
             //Message: Answered call from <NameOrNumber>, <TypeOrLocation>, <TimeOfCall>,
             //<PhoneAccount>.
             stringID = R.string.description_incoming_answered_call;
diff --git a/src/com/android/dialer/calllog/CallLogQueryHandler.java b/src/com/android/dialer/calllog/CallLogQueryHandler.java
index 771df99..81e49d2 100644
--- a/src/com/android/dialer/calllog/CallLogQueryHandler.java
+++ b/src/com/android/dialer/calllog/CallLogQueryHandler.java
@@ -36,6 +36,7 @@
 
 import com.android.contacts.common.database.NoNullCursorAsyncQueryHandler;
 import com.android.contacts.common.util.PermissionsUtil;
+import com.android.dialer.util.AppCompatConstants;
 import com.android.dialer.util.TelecomUtil;
 import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
 
@@ -180,7 +181,7 @@
             selectionArgs.add(Integer.toString(callType));
         } else {
             where.append(" AND NOT ");
-            where.append("(" + Calls.TYPE + " = " + Calls.VOICEMAIL_TYPE + ")");
+            where.append("(" + Calls.TYPE + " = " + AppCompatConstants.CALLS_VOICEMAIL_TYPE + ")");
         }
 
         if (newerThan > 0) {
diff --git a/src/com/android/dialer/calllog/CallTypeHelper.java b/src/com/android/dialer/calllog/CallTypeHelper.java
index 36c0975..acc114c 100644
--- a/src/com/android/dialer/calllog/CallTypeHelper.java
+++ b/src/com/android/dialer/calllog/CallTypeHelper.java
@@ -17,9 +17,9 @@
 package com.android.dialer.calllog;
 
 import android.content.res.Resources;
-import android.provider.CallLog.Calls;
 
 import com.android.dialer.R;
+import com.android.dialer.util.AppCompatConstants;
 
 /**
  * Helper class to perform operations related to call types.
@@ -39,6 +39,10 @@
     private final CharSequence mMissedVideoName;
     /** Name used to identify voicemail calls. */
     private final CharSequence mVoicemailName;
+    /** Name used to identify rejected calls. */
+    private final CharSequence mRejectedName;
+    /** Name used to identify blocked calls. */
+    private final CharSequence mBlockedName;
     /** Color used to identify new missed calls. */
     private final int mNewMissedColor;
     /** Color used to identify new voicemail calls. */
@@ -53,6 +57,8 @@
         mOutgoingVideoName = resources.getString(R.string.type_outgoing_video);
         mMissedVideoName = resources.getString(R.string.type_missed_video);
         mVoicemailName = resources.getString(R.string.type_voicemail);
+        mRejectedName = resources.getString(R.string.type_rejected);
+        mBlockedName = resources.getString(R.string.type_blocked);
         mNewMissedColor = resources.getColor(R.color.call_log_missed_call_highlight_color);
         mNewVoicemailColor = resources.getColor(R.color.call_log_voicemail_highlight_color);
     }
@@ -60,30 +66,36 @@
     /** Returns the text used to represent the given call type. */
     public CharSequence getCallTypeText(int callType, boolean isVideoCall) {
         switch (callType) {
-            case Calls.INCOMING_TYPE:
+            case AppCompatConstants.CALLS_INCOMING_TYPE:
                 if (isVideoCall) {
                     return mIncomingVideoName;
                 } else {
                     return mIncomingName;
                 }
 
-            case Calls.OUTGOING_TYPE:
+            case AppCompatConstants.CALLS_OUTGOING_TYPE:
                 if (isVideoCall) {
                     return mOutgoingVideoName;
                 } else {
                     return mOutgoingName;
                 }
 
-            case Calls.MISSED_TYPE:
+            case AppCompatConstants.CALLS_MISSED_TYPE:
                 if (isVideoCall) {
                     return mMissedVideoName;
                 } else {
                     return mMissedName;
                 }
 
-            case Calls.VOICEMAIL_TYPE:
+            case AppCompatConstants.CALLS_VOICEMAIL_TYPE:
                 return mVoicemailName;
 
+            case AppCompatConstants.CALLS_REJECTED_TYPE:
+                return mRejectedName;
+
+            case AppCompatConstants.CALLS_BLOCKED_TYPE:
+                return mBlockedName;
+
             default:
                 return mMissedName;
         }
@@ -92,18 +104,18 @@
     /** Returns the color used to highlight the given call type, null if not highlight is needed. */
     public Integer getHighlightedColor(int callType) {
         switch (callType) {
-            case Calls.INCOMING_TYPE:
+            case AppCompatConstants.CALLS_INCOMING_TYPE:
                 // New incoming calls are not highlighted.
                 return null;
 
-            case Calls.OUTGOING_TYPE:
+            case AppCompatConstants.CALLS_OUTGOING_TYPE:
                 // New outgoing calls are not highlighted.
                 return null;
 
-            case Calls.MISSED_TYPE:
+            case AppCompatConstants.CALLS_MISSED_TYPE:
                 return mNewMissedColor;
 
-            case Calls.VOICEMAIL_TYPE:
+            case AppCompatConstants.CALLS_VOICEMAIL_TYPE:
                 return mNewVoicemailColor;
 
             default:
@@ -115,7 +127,8 @@
     }
 
     public static boolean isMissedCallType(int callType) {
-        return (callType != Calls.INCOMING_TYPE && callType != Calls.OUTGOING_TYPE &&
-                callType != Calls.VOICEMAIL_TYPE);
+        return (callType != AppCompatConstants.CALLS_INCOMING_TYPE
+                && callType != AppCompatConstants.CALLS_OUTGOING_TYPE
+                && callType != AppCompatConstants.CALLS_VOICEMAIL_TYPE);
     }
 }
diff --git a/src/com/android/dialer/calllog/CallTypeIconsView.java b/src/com/android/dialer/calllog/CallTypeIconsView.java
index 31d4f4b..d680cfe 100644
--- a/src/com/android/dialer/calllog/CallTypeIconsView.java
+++ b/src/com/android/dialer/calllog/CallTypeIconsView.java
@@ -23,13 +23,13 @@
 import android.graphics.PorterDuff;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
-import android.provider.CallLog.Calls;
 import android.util.AttributeSet;
 import android.view.View;
 
 import com.android.contacts.common.testing.NeededForTesting;
 import com.android.contacts.common.util.BitmapUtil;
 import com.android.dialer.R;
+import com.android.dialer.util.AppCompatConstants;
 import com.google.common.collect.Lists;
 
 import java.util.List;
@@ -106,13 +106,13 @@
 
     private Drawable getCallTypeDrawable(int callType) {
         switch (callType) {
-            case Calls.INCOMING_TYPE:
+            case AppCompatConstants.CALLS_INCOMING_TYPE:
                 return mResources.incoming;
-            case Calls.OUTGOING_TYPE:
+            case AppCompatConstants.CALLS_OUTGOING_TYPE:
                 return mResources.outgoing;
-            case Calls.MISSED_TYPE:
+            case AppCompatConstants.CALLS_MISSED_TYPE:
                 return mResources.missed;
-            case Calls.VOICEMAIL_TYPE:
+            case AppCompatConstants.CALLS_VOICEMAIL_TYPE:
                 return mResources.voicemail;
             default:
                 // It is possible for users to end up with calls with unknown call types in their
diff --git a/src/com/android/dialer/util/AppCompatConstants.java b/src/com/android/dialer/util/AppCompatConstants.java
new file mode 100644
index 0000000..1d52eee
--- /dev/null
+++ b/src/com/android/dialer/util/AppCompatConstants.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.util;
+
+import android.provider.CallLog.Calls;
+
+public final class AppCompatConstants {
+
+    public static final int CALLS_INCOMING_TYPE = Calls.INCOMING_TYPE;
+    public static final int CALLS_OUTGOING_TYPE = Calls.OUTGOING_TYPE;
+    public static final int CALLS_MISSED_TYPE = Calls.MISSED_TYPE;
+    public static final int CALLS_VOICEMAIL_TYPE = Calls.VOICEMAIL_TYPE;
+    // Added to android.provider.CallLog.Calls in N+.
+    public static final int CALLS_REJECTED_TYPE = 5;
+    // Added to android.provider.CallLog.Calls in N+.
+    public static final int CALLS_BLOCKED_TYPE = 6;
+}
diff --git a/tests/src/com/android/dialer/CallDetailActivityTest.java b/tests/src/com/android/dialer/CallDetailActivityTest.java
index 59c2434..27fbc30 100644
--- a/tests/src/com/android/dialer/CallDetailActivityTest.java
+++ b/tests/src/com/android/dialer/CallDetailActivityTest.java
@@ -33,6 +33,7 @@
 import android.widget.TextView;
 
 import com.android.dialer.calllog.CallLogAsyncTaskUtil;
+import com.android.dialer.util.AppCompatConstants;
 import com.android.dialer.util.AsyncTaskExecutors;
 import com.android.dialer.util.FakeAsyncTaskExecutor;
 
@@ -121,7 +122,7 @@
         ContentValues values = new ContentValues();
         values.put(CallLog.Calls.NUMBER, CONTACT_NUMBER);
         values.put(CallLog.Calls.NUMBER_PRESENTATION, CallLog.Calls.PRESENTATION_ALLOWED);
-        values.put(CallLog.Calls.TYPE, CallLog.Calls.INCOMING_TYPE);
+        values.put(CallLog.Calls.TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
         mCallLogUri = contentResolver.insert(CallLog.Calls.CONTENT_URI, values);
         setActivityIntent(new Intent(Intent.ACTION_VIEW, mCallLogUri));
     }
diff --git a/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java b/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java
index 83d098f..3a79695 100644
--- a/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java
+++ b/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java
@@ -35,6 +35,7 @@
 
 import com.android.dialer.contactinfo.ContactInfoCache;
 import com.android.dialer.contactinfo.ContactInfoCache.OnContactInfoChangedListener;
+import com.android.dialer.util.AppCompatConstants;
 import com.android.dialer.util.TestConstants;
 import com.google.common.collect.Lists;
 
@@ -344,7 +345,7 @@
     public void testBindView_UriNumber() {
         createCallLogEntryWithCachedValues(
                 "sip:johndoe@gmail.com",
-                Calls.INCOMING_TYPE,
+                AppCompatConstants.CALLS_INCOMING_TYPE,
                 "John Doe",
                 Phone.TYPE_HOME,
                 TEST_DEFAULT_CUSTOM_LABEL,
@@ -404,7 +405,7 @@
     public void testBindView_NumberOnlyDbCachedFormattedNumber() {
         createCallLogEntryWithCachedValues(
                 TEST_NUMBER,
-                Calls.INCOMING_TYPE,
+                AppCompatConstants.CALLS_INCOMING_TYPE,
                 EMPTY_STRING,
                 TEST_CACHED_NUMBER_TYPE,
                 TEST_CACHED_NUMBER_LABEL,
@@ -454,11 +455,17 @@
     }
 
     private void createPrivateCallLogEntry() {
-        createCallLogEntry(EMPTY_STRING, Calls.PRESENTATION_RESTRICTED, Calls.INCOMING_TYPE);
+        createCallLogEntry(
+                EMPTY_STRING,
+                Calls.PRESENTATION_RESTRICTED,
+                AppCompatConstants.CALLS_INCOMING_TYPE);
     }
 
     private void createUnknownCallLogEntry() {
-        createCallLogEntry(EMPTY_STRING, Calls.PRESENTATION_UNKNOWN, Calls.INCOMING_TYPE);
+        createCallLogEntry(
+                EMPTY_STRING,
+                Calls.PRESENTATION_UNKNOWN,
+                AppCompatConstants.CALLS_INCOMING_TYPE);
     }
 
     private void createVoicemailCallLogEntry() {
@@ -499,7 +506,7 @@
      * It includes the values for the cached contact associated with the number.
      *
      * @param number The phone number.
-     * @param type Either Call.OUTGOING_TYPE or Call.INCOMING_TYPE or Call.MISSED_TYPE.
+     * @param type Valid value of {@code Calls.TYPE}.
      * @param cachedName The name of the contact with this number
      * @param cachedNumberType The type of the number, from the contact with this number.
      * @param cachedNumberLabel The label of the number, from the contact with this number.
@@ -555,7 +562,7 @@
         if (type != NO_VALUE_SET) {
             values[CallLogQuery.CALL_TYPE] = type;
         }
-        if (type == Calls.VOICEMAIL_TYPE) {
+        if (type == AppCompatConstants.CALLS_VOICEMAIL_TYPE) {
             values[CallLogQuery.VOICEMAIL_URI] = ContentUris.withAppendedId(
                     VoicemailContract.Voicemails.CONTENT_URI, mCursor.getCount());
         }
diff --git a/tests/src/com/android/dialer/calllog/CallLogGroupBuilderTest.java b/tests/src/com/android/dialer/calllog/CallLogGroupBuilderTest.java
index 9bdcd40..f5a9fe6 100644
--- a/tests/src/com/android/dialer/calllog/CallLogGroupBuilderTest.java
+++ b/tests/src/com/android/dialer/calllog/CallLogGroupBuilderTest.java
@@ -19,10 +19,11 @@
 import static com.google.common.collect.Lists.newArrayList;
 
 import android.database.MatrixCursor;
-import android.provider.CallLog.Calls;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 
+import com.android.dialer.util.AppCompatConstants;
+
 import java.util.List;
 
 /**
@@ -64,31 +65,31 @@
     }
 
     public void testAddGroups_OneCall() {
-        addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
+        addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
         mBuilder.addGroups(mCursor);
         assertEquals(1, mFakeGroupCreator.groups.size());
     }
 
     public void testAddGroups_TwoCallsNotMatching() {
-        addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
-        addCallLogEntry(TEST_NUMBER2, Calls.INCOMING_TYPE);
+        addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
+        addCallLogEntry(TEST_NUMBER2, AppCompatConstants.CALLS_INCOMING_TYPE);
         mBuilder.addGroups(mCursor);
         assertEquals(2, mFakeGroupCreator.groups.size());
     }
 
     public void testAddGroups_ThreeCallsMatching() {
-        addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
-        addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
-        addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
+        addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
+        addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
+        addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
         mBuilder.addGroups(mCursor);
         assertEquals(1, mFakeGroupCreator.groups.size());
         assertGroupIs(0, 3, mFakeGroupCreator.groups.get(0));
     }
 
     public void testAddGroups_MatchingIncomingAndOutgoing() {
-        addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
-        addCallLogEntry(TEST_NUMBER1, Calls.OUTGOING_TYPE);
-        addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
+        addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
+        addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_OUTGOING_TYPE);
+        addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
         mBuilder.addGroups(mCursor);
         assertEquals(1, mFakeGroupCreator.groups.size());
         assertGroupIs(0, 3, mFakeGroupCreator.groups.get(0));
@@ -96,57 +97,88 @@
 
     public void testAddGroups_Voicemail() {
         // Does not group with other types of calls, include voicemail themselves.
-        assertCallsAreNotGrouped(Calls.VOICEMAIL_TYPE, Calls.MISSED_TYPE);
-        assertCallsAreNotGrouped(Calls.VOICEMAIL_TYPE, Calls.VOICEMAIL_TYPE);
-        assertCallsAreNotGrouped(Calls.VOICEMAIL_TYPE, Calls.INCOMING_TYPE);
-        assertCallsAreNotGrouped(Calls.VOICEMAIL_TYPE, Calls.OUTGOING_TYPE);
+        assertCallsAreNotGrouped(
+                AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_MISSED_TYPE);
+        assertCallsAreNotGrouped(
+                AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_VOICEMAIL_TYPE);
+        assertCallsAreNotGrouped(
+                AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
+        assertCallsAreNotGrouped(
+                AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
     }
 
     public void testAddGroups_Missed() {
         // Groups with one or more missed calls.
-        assertCallsAreGrouped(Calls.MISSED_TYPE, Calls.MISSED_TYPE);
-        assertCallsAreGrouped(Calls.MISSED_TYPE, Calls.MISSED_TYPE, Calls.MISSED_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_MISSED_TYPE, AppCompatConstants.CALLS_MISSED_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_MISSED_TYPE,
+                AppCompatConstants.CALLS_MISSED_TYPE,
+                AppCompatConstants.CALLS_MISSED_TYPE);
         // Does not group with other types of calls.
-        assertCallsAreNotGrouped(Calls.MISSED_TYPE, Calls.VOICEMAIL_TYPE);
-        assertCallsAreGrouped(Calls.MISSED_TYPE, Calls.INCOMING_TYPE);
-        assertCallsAreGrouped(Calls.MISSED_TYPE, Calls.OUTGOING_TYPE);
+        assertCallsAreNotGrouped(
+                AppCompatConstants.CALLS_MISSED_TYPE, AppCompatConstants.CALLS_VOICEMAIL_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_MISSED_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_MISSED_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
     }
 
     public void testAddGroups_Incoming() {
         // Groups with one or more incoming or outgoing.
-        assertCallsAreGrouped(Calls.INCOMING_TYPE, Calls.INCOMING_TYPE);
-        assertCallsAreGrouped(Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
-        assertCallsAreGrouped(Calls.INCOMING_TYPE, Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
-        assertCallsAreGrouped(Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE, Calls.INCOMING_TYPE);
-        assertCallsAreGrouped(Calls.INCOMING_TYPE, Calls.MISSED_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_INCOMING_TYPE,
+                AppCompatConstants.CALLS_INCOMING_TYPE,
+                AppCompatConstants.CALLS_OUTGOING_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_INCOMING_TYPE,
+                AppCompatConstants.CALLS_OUTGOING_TYPE,
+                AppCompatConstants.CALLS_INCOMING_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_MISSED_TYPE);
         // Does not group with voicemail and missed calls.
-        assertCallsAreNotGrouped(Calls.INCOMING_TYPE, Calls.VOICEMAIL_TYPE);
+        assertCallsAreNotGrouped(
+                AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_VOICEMAIL_TYPE);
     }
 
     public void testAddGroups_Outgoing() {
         // Groups with one or more incoming or outgoing.
-        assertCallsAreGrouped(Calls.OUTGOING_TYPE, Calls.INCOMING_TYPE);
-        assertCallsAreGrouped(Calls.OUTGOING_TYPE, Calls.OUTGOING_TYPE);
-        assertCallsAreGrouped(Calls.OUTGOING_TYPE, Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
-        assertCallsAreGrouped(Calls.OUTGOING_TYPE, Calls.OUTGOING_TYPE, Calls.INCOMING_TYPE);
-        assertCallsAreGrouped(Calls.INCOMING_TYPE, Calls.MISSED_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_OUTGOING_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_OUTGOING_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_OUTGOING_TYPE,
+                AppCompatConstants.CALLS_INCOMING_TYPE,
+                AppCompatConstants.CALLS_OUTGOING_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_OUTGOING_TYPE,
+                AppCompatConstants.CALLS_OUTGOING_TYPE,
+                AppCompatConstants.CALLS_INCOMING_TYPE);
+        assertCallsAreGrouped(
+                AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_MISSED_TYPE);
         // Does not group with voicemail and missed calls.
-        assertCallsAreNotGrouped(Calls.INCOMING_TYPE, Calls.VOICEMAIL_TYPE);
+        assertCallsAreNotGrouped(
+                AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_VOICEMAIL_TYPE);
     }
 
     public void testAddGroups_Mixed() {
         addMultipleCallLogEntries(TEST_NUMBER1,
-                Calls.VOICEMAIL_TYPE,   // Group 1:Stand-alone
-                Calls.INCOMING_TYPE,    // Group 2: 1-4
-                Calls.OUTGOING_TYPE,
-                Calls.MISSED_TYPE,
-                Calls.MISSED_TYPE,
-                Calls.VOICEMAIL_TYPE,   // Group 3: Stand-alone
-                Calls.INCOMING_TYPE,    // Group 4: Stand-alone
-                Calls.VOICEMAIL_TYPE,   // Group 5: Stand-alone
-                Calls.MISSED_TYPE,      // Group 6: 8-10
-                Calls.MISSED_TYPE,
-                Calls.OUTGOING_TYPE);
+                AppCompatConstants.CALLS_VOICEMAIL_TYPE,   // Group 1:Stand-alone
+                AppCompatConstants.CALLS_INCOMING_TYPE,    // Group 2: 1-4
+                AppCompatConstants.CALLS_OUTGOING_TYPE,
+                AppCompatConstants.CALLS_MISSED_TYPE,
+                AppCompatConstants.CALLS_MISSED_TYPE,
+                AppCompatConstants.CALLS_VOICEMAIL_TYPE,   // Group 3: Stand-alone
+                AppCompatConstants.CALLS_INCOMING_TYPE,    // Group 4: Stand-alone
+                AppCompatConstants.CALLS_VOICEMAIL_TYPE,   // Group 5: Stand-alone
+                AppCompatConstants.CALLS_MISSED_TYPE,      // Group 6: 8-10
+                AppCompatConstants.CALLS_MISSED_TYPE,
+                AppCompatConstants.CALLS_OUTGOING_TYPE);
         mBuilder.addGroups(mCursor);
         assertEquals(6, mFakeGroupCreator.groups.size());
         assertGroupIs(0, 1, mFakeGroupCreator.groups.get(0));
diff --git a/tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java b/tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java
index 8c2d8e4..d554ad4 100644
--- a/tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java
+++ b/tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java
@@ -25,6 +25,7 @@
 import com.android.contacts.common.CallUtil;
 import com.android.dialer.PhoneCallDetails;
 import com.android.dialer.R;
+import com.android.dialer.util.AppCompatConstants;
 
 /**
  * Unit tests for {@link CallLogListItemHelper}.
@@ -103,20 +104,22 @@
     }
 
     public void testSetPhoneCallDetails_ReadVoicemail() {
-        PhoneCallDetails details = getPhoneCallDetailsWithTypes(Calls.VOICEMAIL_TYPE);
+        PhoneCallDetails details =
+                getPhoneCallDetailsWithTypes(AppCompatConstants.CALLS_VOICEMAIL_TYPE);
         mHelper.setPhoneCallDetails(mViewHolder, details);
         assertEquals(View.VISIBLE, mViewHolder.voicemailPlaybackView.getVisibility());
     }
 
     public void testSetPhoneCallDetails_UnreadVoicemail() {
-        PhoneCallDetails details = getPhoneCallDetailsWithTypes(Calls.VOICEMAIL_TYPE);
+        PhoneCallDetails details =
+                getPhoneCallDetailsWithTypes(AppCompatConstants.CALLS_VOICEMAIL_TYPE);
         mHelper.setPhoneCallDetails(mViewHolder, details);
         assertEquals(View.VISIBLE, mViewHolder.voicemailPlaybackView.getVisibility());
     }
 
     public void testSetPhoneCallDetails_VoicemailFromUnknown() {
         setPhoneCallDetailsWithNumberAndType("", Calls.PRESENTATION_UNKNOWN,
-                "", Calls.VOICEMAIL_TYPE);
+                "", AppCompatConstants.CALLS_VOICEMAIL_TYPE);
         assertEquals(View.VISIBLE, mViewHolder.voicemailPlaybackView.getVisibility());
     }
 
@@ -124,7 +127,7 @@
      * Test getCallDescriptionID method used to get the accessibility description for calls.
      */
     public void testGetCallDescriptionID_Answered() {
-        int[] callTypes = new int[]{ Calls.INCOMING_TYPE };
+        int[] callTypes = new int[]{ AppCompatConstants.CALLS_INCOMING_TYPE };
         assertEquals(R.string.description_incoming_answered_call,
                 mHelper.getCallDescriptionStringID(callTypes));
     }
@@ -133,7 +136,7 @@
      * Test getCallDescriptionID method used to get the accessibility description for calls.
      */
     public void testGetCallDescriptionID_Missed() {
-        int[] callTypes = new int[]{ Calls.MISSED_TYPE };
+        int[] callTypes = new int[]{ AppCompatConstants.CALLS_MISSED_TYPE };
         assertEquals(R.string.description_incoming_missed_call,
                 mHelper.getCallDescriptionStringID(callTypes));
     }
@@ -142,7 +145,7 @@
      * Test getCallDescriptionID method used to get the accessibility description for calls.
      */
     public void testGetCallDescriptionID_Voicemail() {
-        int[] callTypes = new int[]{ Calls.VOICEMAIL_TYPE };
+        int[] callTypes = new int[]{ AppCompatConstants.CALLS_VOICEMAIL_TYPE };
         assertEquals(R.string.description_incoming_missed_call,
                 mHelper.getCallDescriptionStringID(callTypes));
     }
@@ -153,7 +156,7 @@
      * only a single call for this caller.
      */
     public void testGetCallDescriptionID_OutgoingSingle() {
-        int[] callTypes = new int[]{ Calls.OUTGOING_TYPE };
+        int[] callTypes = new int[]{ AppCompatConstants.CALLS_OUTGOING_TYPE };
         assertEquals(R.string.description_outgoing_call,
                 mHelper.getCallDescriptionStringID(callTypes));
     }
@@ -164,7 +167,10 @@
      * many calls for this caller.
      */
     public void testGetCallDescriptionID_OutgoingMultiple() {
-        int[] callTypes = new int[]{ Calls.OUTGOING_TYPE, Calls.OUTGOING_TYPE };
+        int[] callTypes = new int[]{
+            AppCompatConstants.CALLS_OUTGOING_TYPE,
+            AppCompatConstants.CALLS_OUTGOING_TYPE
+        };
         assertEquals(R.string.description_outgoing_call,
                 mHelper.getCallDescriptionStringID(callTypes));
     }
@@ -174,8 +180,8 @@
      * For outgoing calls, we should NOT have "New Voicemail" in the description.
      */
     public void testGetCallDescription_NoVoicemailOutgoing() {
-        PhoneCallDetails details =
-                getPhoneCallDetailsWithTypes(Calls.OUTGOING_TYPE, Calls.OUTGOING_TYPE);
+        PhoneCallDetails details = getPhoneCallDetailsWithTypes(
+                AppCompatConstants.CALLS_OUTGOING_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
         CharSequence description = mHelper.getCallDescription(details);
         assertFalse(description.toString()
                 .contains(this.mResources.getString(R.string.description_new_voicemail)));
@@ -186,8 +192,8 @@
      * For regular incoming calls, we should NOT have "New Voicemail" in the description.
      */
     public void testGetCallDescription_NoVoicemailIncoming() {
-        PhoneCallDetails details =
-                getPhoneCallDetailsWithTypes(Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
+        PhoneCallDetails details = getPhoneCallDetailsWithTypes(
+                AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
         CharSequence description = mHelper.getCallDescription(details);
         assertFalse(description.toString()
                 .contains(this.mResources.getString(R.string.description_new_voicemail)));
@@ -198,8 +204,8 @@
      * For regular missed calls, we should NOT have "New Voicemail" in the description.
      */
     public void testGetCallDescription_NoVoicemailMissed() {
-        PhoneCallDetails details =
-                getPhoneCallDetailsWithTypes(Calls.MISSED_TYPE, Calls.OUTGOING_TYPE);
+        PhoneCallDetails details = getPhoneCallDetailsWithTypes(
+                AppCompatConstants.CALLS_MISSED_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
         CharSequence description = mHelper.getCallDescription(details);
         assertFalse(description.toString()
                 .contains(this.mResources.getString(R.string.description_new_voicemail)));
@@ -210,8 +216,8 @@
      * For voicemail calls, we should have "New Voicemail" in the description.
      */
     public void testGetCallDescription_Voicemail() {
-        PhoneCallDetails details =
-                getPhoneCallDetailsWithTypes(Calls.VOICEMAIL_TYPE, Calls.OUTGOING_TYPE);
+        PhoneCallDetails details = getPhoneCallDetailsWithTypes(
+                AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
         CharSequence description = mHelper.getCallDescription(details);
         assertTrue(description.toString()
                 .contains(this.mResources.getString(R.string.description_new_voicemail)));
@@ -222,7 +228,8 @@
      * Test that the "X calls" message is not present if there is only a single call.
      */
     public void testGetCallDescription_NumCallsSingle() {
-        PhoneCallDetails details = getPhoneCallDetailsWithTypes(Calls.VOICEMAIL_TYPE);
+        PhoneCallDetails details =
+                getPhoneCallDetailsWithTypes(AppCompatConstants.CALLS_VOICEMAIL_TYPE);
         CharSequence description = mHelper.getCallDescription(details);
 
         // Rather than hard coding the "X calls" string message, we'll generate it with an empty
@@ -238,8 +245,8 @@
      * Test that the "X calls" message is present if there are many calls.
      */
     public void testGetCallDescription_NumCallsMultiple() {
-        PhoneCallDetails details =
-                getPhoneCallDetailsWithTypes(Calls.VOICEMAIL_TYPE, Calls.INCOMING_TYPE);
+        PhoneCallDetails details = getPhoneCallDetailsWithTypes(
+                AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
         CharSequence description = mHelper.getCallDescription(details);
         assertTrue(description.toString()
                 .contains(this.mResources.getString(R.string.description_num_calls, 2)));
@@ -250,8 +257,8 @@
      * Test that the "Video call." message is present if the call had video capability.
      */
     public void testGetCallDescription_Video() {
-        PhoneCallDetails details =
-                getPhoneCallDetailsWithTypes(Calls.INCOMING_TYPE, Calls.INCOMING_TYPE);
+        PhoneCallDetails details = getPhoneCallDetailsWithTypes(
+                AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
         details.features = Calls.FEATURES_VIDEO;
 
         CharSequence description = mHelper.getCallDescription(details);
diff --git a/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java b/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
index be35ad0..263642c 100644
--- a/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
+++ b/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
@@ -27,6 +27,7 @@
 
 import com.android.dialer.PhoneCallDetails;
 import com.android.dialer.R;
+import com.android.dialer.util.AppCompatConstants;
 import com.android.dialer.util.LocaleTestUtils;
 
 import java.util.GregorianCalendar;
@@ -165,17 +166,17 @@
     }
 
     public void testSetPhoneCallDetails_CallTypeIcons() {
-        setPhoneCallDetailsWithCallTypeIcons(Calls.INCOMING_TYPE);
-        assertCallTypeIconsEquals(Calls.INCOMING_TYPE);
+        setPhoneCallDetailsWithCallTypeIcons(AppCompatConstants.CALLS_INCOMING_TYPE);
+        assertCallTypeIconsEquals(AppCompatConstants.CALLS_INCOMING_TYPE);
 
-        setPhoneCallDetailsWithCallTypeIcons(Calls.OUTGOING_TYPE);
-        assertCallTypeIconsEquals(Calls.OUTGOING_TYPE);
+        setPhoneCallDetailsWithCallTypeIcons(AppCompatConstants.CALLS_OUTGOING_TYPE);
+        assertCallTypeIconsEquals(AppCompatConstants.CALLS_OUTGOING_TYPE);
 
-        setPhoneCallDetailsWithCallTypeIcons(Calls.MISSED_TYPE);
-        assertCallTypeIconsEquals(Calls.MISSED_TYPE);
+        setPhoneCallDetailsWithCallTypeIcons(AppCompatConstants.CALLS_MISSED_TYPE);
+        assertCallTypeIconsEquals(AppCompatConstants.CALLS_MISSED_TYPE);
 
-        setPhoneCallDetailsWithCallTypeIcons(Calls.VOICEMAIL_TYPE);
-        assertCallTypeIconsEquals(Calls.VOICEMAIL_TYPE);
+        setPhoneCallDetailsWithCallTypeIcons(AppCompatConstants.CALLS_VOICEMAIL_TYPE);
+        assertCallTypeIconsEquals(AppCompatConstants.CALLS_VOICEMAIL_TYPE);
     }
 
     /**
@@ -201,18 +202,31 @@
     }
 
     public void testSetPhoneCallDetails_MultipleCallTypeIcons() {
-        setPhoneCallDetailsWithCallTypeIcons(Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
-        assertCallTypeIconsEquals(Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
+        setPhoneCallDetailsWithCallTypeIcons(
+                AppCompatConstants.CALLS_INCOMING_TYPE,
+                AppCompatConstants.CALLS_OUTGOING_TYPE);
+        assertCallTypeIconsEquals(
+                AppCompatConstants.CALLS_INCOMING_TYPE,
+                AppCompatConstants.CALLS_OUTGOING_TYPE);
 
-        setPhoneCallDetailsWithCallTypeIcons(Calls.MISSED_TYPE, Calls.MISSED_TYPE);
-        assertCallTypeIconsEquals(Calls.MISSED_TYPE, Calls.MISSED_TYPE);
+        setPhoneCallDetailsWithCallTypeIcons(
+                AppCompatConstants.CALLS_MISSED_TYPE,
+                AppCompatConstants.CALLS_MISSED_TYPE);
+        assertCallTypeIconsEquals(
+                AppCompatConstants.CALLS_MISSED_TYPE,
+                AppCompatConstants.CALLS_MISSED_TYPE);
     }
 
     public void testSetPhoneCallDetails_MultipleCallTypeIconsLastOneDropped() {
-        setPhoneCallDetailsWithCallTypeIcons(Calls.MISSED_TYPE, Calls.MISSED_TYPE,
-                Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
+        setPhoneCallDetailsWithCallTypeIcons(
+                AppCompatConstants.CALLS_MISSED_TYPE,
+                AppCompatConstants.CALLS_MISSED_TYPE,
+                AppCompatConstants.CALLS_INCOMING_TYPE,
+                AppCompatConstants.CALLS_OUTGOING_TYPE);
         assertCallTypeIconsEqualsPlusOverflow("(4)",
-                Calls.MISSED_TYPE, Calls.MISSED_TYPE, Calls.INCOMING_TYPE);
+                AppCompatConstants.CALLS_MISSED_TYPE,
+                AppCompatConstants.CALLS_MISSED_TYPE,
+                AppCompatConstants.CALLS_INCOMING_TYPE);
     }
 
     public void testSetPhoneCallDetails_Geocode() {
@@ -337,7 +351,7 @@
     private void setPhoneCallDetailsWithNumber(String number, int presentation,
             String formattedNumber) {
         PhoneCallDetails details = getPhoneCallDetails(number, presentation, formattedNumber);
-        details.callTypes = new int[]{ Calls.VOICEMAIL_TYPE };
+        details.callTypes = new int[]{ AppCompatConstants.CALLS_VOICEMAIL_TYPE };
         mHelper.setPhoneCallDetails(mViews, details);
     }
 
@@ -406,7 +420,7 @@
     }
 
     private void setDefaultDetails(PhoneCallDetails details) {
-        details.callTypes = new int[]{ Calls.INCOMING_TYPE };
+        details.callTypes = new int[]{ AppCompatConstants.CALLS_INCOMING_TYPE };
         details.countryIso = TEST_COUNTRY_ISO;
         details.date = TEST_DATE;
         details.duration = TEST_DURATION;
diff --git a/tests/src/com/android/dialer/onboard/OnboardingControllerTest.java b/tests/src/com/android/dialer/onboard/OnboardingControllerTest.java
index d9c8ce5..3ca39a7 100644
--- a/tests/src/com/android/dialer/onboard/OnboardingControllerTest.java
+++ b/tests/src/com/android/dialer/onboard/OnboardingControllerTest.java
@@ -17,6 +17,7 @@
 
 import android.app.Activity;
 import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.Suppress;
 
 public class OnboardingControllerTest extends AndroidTestCase {
     private MockOnboardUi mOnboardUi;
@@ -68,12 +69,14 @@
         mController = new OnboardingController(mOnboardUi);
     }
 
+    @Suppress
     public void testNoScreensToDisplay_OnboardingFlowImmediatelyCompleted() {
         mController.showNextScreen();
         assertEquals(-1, mOnboardUi.currentScreen);
         assertTrue(mOnboardUi.completedOnboardingFlow);
     }
 
+    @Suppress
     public void testSkipAllScreens_OnboardingFlowImmediatelyCompleted() {
         mController.addScreen(new MockScreen(false /* shouldShowScreen */,
                 true /* canSkipScreen */));
@@ -86,6 +89,7 @@
         assertTrue(mOnboardUi.completedOnboardingFlow);
     }
 
+    @Suppress
     public void testFirstScreenNotNeeded_ShowsSecondScreen() {
         mController.addScreen(new MockScreen(false /* shouldShowScreen */,
                 false /* canSkipScreen */));
@@ -95,6 +99,7 @@
         assertEquals(1, mOnboardUi.currentScreen);
     }
 
+    @Suppress
     public void testScreenRequired() {
         final MockScreen mockScreen =
                 new MockScreen(true /* shouldShowScreen */, false /* canSkipScreen */);
@@ -128,6 +133,7 @@
      * For example, setting the default dialer in the first screen will automatically grant
      * permissions such that the second permissions screen is no longer needed.
      */
+    @Suppress
     public void testFirstScreenCompleted_SkipsSecondScreen() {
         final MockScreen mockScreen1 =
                 new MockScreen(true /* shouldShowScreen */, true /* canSkipScreen */);
@@ -151,6 +157,7 @@
      * Verifies the use case where skipping the first screen will proceed to show the second screen
      * since the necessary conditions to skip the second screen have not been met.
      */
+    @Suppress
     public void testFirstScreenSkipped_ShowsSecondScreen() {
         final MockScreen mockScreen1 =
                 new MockScreen(true /* shouldShowScreen */, true /* canSkipScreen */);
diff --git a/tests/src/com/android/dialer/tests/calllog/FillCallLogTestActivity.java b/tests/src/com/android/dialer/tests/calllog/FillCallLogTestActivity.java
index e499e55..ae0dba8 100644
--- a/tests/src/com/android/dialer/tests/calllog/FillCallLogTestActivity.java
+++ b/tests/src/com/android/dialer/tests/calllog/FillCallLogTestActivity.java
@@ -57,6 +57,7 @@
 import android.widget.Toast;
 
 import com.android.dialer.tests.R;
+import com.android.dialer.util.AppCompatConstants;
 
 import java.util.Calendar;
 import java.util.List;
@@ -72,7 +73,9 @@
 
     private static final Random RNG = new Random();
     private static final int[] CALL_TYPES = new int[] {
-        Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE, Calls.MISSED_TYPE,
+        AppCompatConstants.CALLS_INCOMING_TYPE,
+        AppCompatConstants.CALLS_OUTGOING_TYPE,
+        AppCompatConstants.CALLS_MISSED_TYPE
     };
 
     private TextView mNumberTextView;
@@ -406,15 +409,15 @@
      */
     private int getManualCallType() {
         if (mCallTypeIncoming.isChecked()) {
-            return Calls.INCOMING_TYPE;
+            return AppCompatConstants.CALLS_INCOMING_TYPE;
         } else if (mCallTypeOutgoing.isChecked()) {
-            return Calls.OUTGOING_TYPE;
+            return AppCompatConstants.CALLS_OUTGOING_TYPE;
         } else if (mCallTypeVoicemail.isChecked()) {
-            return Calls.VOICEMAIL_TYPE;
+            return AppCompatConstants.CALLS_VOICEMAIL_TYPE;
         } else if (mCallTypeCustom.isChecked()) {
             return Integer.parseInt(mCustomCallTypeTextView.getText().toString());
         } else {
-            return Calls.MISSED_TYPE;
+            return AppCompatConstants.CALLS_MISSED_TYPE;
         }
     }
 
@@ -536,7 +539,7 @@
             dataUsage = (long) RNG.nextInt(52428800);
         }
 
-        if (getManualCallType() == Calls.VOICEMAIL_TYPE) {
+        if (getManualCallType() == AppCompatConstants.CALLS_VOICEMAIL_TYPE) {
             addManualVoicemail(dateTime.getTimeInMillis());
         } else {
             addCall(mPhoneNumber.getText().toString(), getManualPresentation(),
@@ -606,7 +609,7 @@
         values.put("phone_account_address", accountAddress);
         values.put(Calls.NEW, Integer.valueOf(1));
 
-        if (callType == Calls.MISSED_TYPE) {
+        if (callType == AppCompatConstants.CALLS_MISSED_TYPE) {
             values.put(Calls.IS_READ, 0);
         }
 
