diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6243740..8b4086c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -20,7 +20,7 @@
   android:versionName="23.0">
 
   <uses-sdk
-    android:minSdkVersion="24"
+    android:minSdkVersion="27"
     android:targetSdkVersion="30"/>
 
 
diff --git a/java/com/android/contacts/common/compat/CallCompat.java b/java/com/android/contacts/common/compat/CallCompat.java
index 641f7b1..55a1df3 100644
--- a/java/com/android/contacts/common/compat/CallCompat.java
+++ b/java/com/android/contacts/common/compat/CallCompat.java
@@ -16,8 +16,6 @@
 
 package com.android.contacts.common.compat;
 
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.NonNull;
 import android.telecom.Call;
 
@@ -25,8 +23,7 @@
 public class CallCompat {
 
   public static boolean canPullExternalCall(@NonNull android.telecom.Call call) {
-    return VERSION.SDK_INT >= VERSION_CODES.N_MR1
-        && ((call.getDetails().getCallCapabilities() & Details.CAPABILITY_CAN_PULL_CALL)
+    return ((call.getDetails().getCallCapabilities() & Details.CAPABILITY_CAN_PULL_CALL)
             == Details.CAPABILITY_CAN_PULL_CALL);
   }
 
diff --git a/java/com/android/contacts/common/compat/telecom/TelecomManagerCompat.java b/java/com/android/contacts/common/compat/telecom/TelecomManagerCompat.java
deleted file mode 100644
index a1dc89d..0000000
--- a/java/com/android/contacts/common/compat/telecom/TelecomManagerCompat.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.contacts.common.compat.telecom;
-
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
-import android.support.annotation.Nullable;
-import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
-import java.lang.reflect.Field;
-
-/** Compatibility class for {@link android.telecom.TelecomManager}. */
-public class TelecomManagerCompat {
-
-  // Constants from http://cs/android/frameworks/base/telecomm/java/android/telecom/Call.java.
-  public static final String EVENT_REQUEST_HANDOVER = "android.telecom.event.REQUEST_HANDOVER";
-  public static final String EXTRA_HANDOVER_PHONE_ACCOUNT_HANDLE =
-      "android.telecom.extra.HANDOVER_PHONE_ACCOUNT_HANDLE";
-  public static final String EXTRA_HANDOVER_VIDEO_STATE =
-      "android.telecom.extra.HANDOVER_VIDEO_STATE";
-
-  // This is a hidden constant in android.telecom.DisconnectCause. Telecom sets this as a disconnect
-  // reason if it wants us to prompt the user that the video call is not available.
-  // TODO(wangqi): Reference it to constant in android.telecom.DisconnectCause.
-  public static final String REASON_IMS_ACCESS_BLOCKED = "REASON_IMS_ACCESS_BLOCKED";
-
-  /**
-   * Returns the current SIM call manager. Apps must be prepared for this method to return null,
-   * indicating that there currently exists no registered SIM call manager.
-   *
-   * @param telecomManager the {@link TelecomManager} to use to fetch the SIM call manager.
-   * @return The phone account handle of the current sim call manager.
-   */
-  @Nullable
-  public static PhoneAccountHandle getSimCallManager(TelecomManager telecomManager) {
-    if (telecomManager != null) {
-      return telecomManager.getSimCallManager();
-    }
-    return null;
-  }
-
-  /** Returns true if the Android version supports Handover. */
-  public static boolean supportsHandover() {
-    // Starting with Android P, handover is supported via a public API.
-    if (VERSION.SDK_INT >= VERSION_CODES.P) {
-      return true;
-    }
-    // Handovers are supported from Android O-DR onward. Since there is no API
-    // bump from O to O-DR, we need to use reflection to check the existence
-    // of TelecomManager.EXTRA_IS_HANDOVER in
-    // http://cs/android/frameworks/base/telecomm/java/android/telecom/TelecomManager.java.
-    try {
-      Field field = TelecomManager.class.getDeclaredField("EXTRA_IS_HANDOVER");
-      return "android.telecom.extra.IS_HANDOVER".equals(field.get(null /* obj (static field) */));
-    } catch (Exception e) {
-      // Do nothing
-    }
-    return false;
-  }
-}
diff --git a/java/com/android/dialer/app/AndroidManifest.xml b/java/com/android/dialer/app/AndroidManifest.xml
index 93dedb6..8cc8f9e 100644
--- a/java/com/android/dialer/app/AndroidManifest.xml
+++ b/java/com/android/dialer/app/AndroidManifest.xml
@@ -60,18 +60,6 @@
 
   <application>
 
-  <activity
-      android:exported="false"
-      android:label="@string/manage_blocked_numbers_label"
-      android:name="com.android.dialer.app.filterednumber.BlockedNumbersSettingsActivity"
-      android:parentActivityName="com.android.dialer.app.settings.DialerSettingsActivity"
-      android:theme="@style/ManageBlockedNumbersStyle">
-      <intent-filter>
-        <action android:name="com.android.dialer.action.BLOCKED_NUMBERS_SETTINGS"/>
-        <category android:name="android.intent.category.DEFAULT"/>
-      </intent-filter>
-    </activity>
-
     <activity
       android:label="@string/call_log_activity_title"
       android:name="com.android.dialer.app.calllog.CallLogActivity"
diff --git a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
index 865cb81..825bf8c 100644
--- a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
+++ b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
@@ -93,8 +93,7 @@
                         .logImpression(DialerImpression.Type.USER_ACTION_BLOCKED_NUMBER);
                     adapter.notifyDataSetChanged();
                   },
-                  number,
-                  countryIso);
+                  number);
 
               if (isSpamChecked) {
                 showSpamBlockingPromoDialog();
@@ -134,8 +133,7 @@
                         .logImpression(DialerImpression.Type.USER_ACTION_BLOCKED_NUMBER);
                     adapter.notifyDataSetChanged();
                   },
-                  number,
-                  countryIso);
+                  number);
               showSpamBlockingPromoDialog();
             },
             null)
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index 485683b..edea8cb 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -24,8 +24,6 @@
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.AsyncTask;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.os.Trace;
 import android.provider.CallLog;
@@ -950,10 +948,7 @@
     final String viaNumber = cursor.getString(CallLogQuery.VIA_NUMBER);
     final int numberPresentation = cursor.getInt(CallLogQuery.NUMBER_PRESENTATION);
     final ContactInfo cachedContactInfo = ContactInfoHelper.getContactInfo(cursor);
-    final int transcriptionState =
-        (VERSION.SDK_INT >= VERSION_CODES.O)
-            ? cursor.getInt(CallLogQuery.TRANSCRIPTION_STATE)
-            : VoicemailCompat.TRANSCRIPTION_NOT_STARTED;
+    final int transcriptionState = cursor.getInt(CallLogQuery.TRANSCRIPTION_STATE);
     final PhoneCallDetails details =
         new PhoneCallDetails(number, numberPresentation, postDialDigits);
     details.viaNumber = viaNumber;
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index 07e00f9..e1ffaea 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -66,8 +66,6 @@
 import com.android.dialer.app.calllog.calllogcache.CallLogCache;
 import com.android.dialer.app.voicemail.VoicemailPlaybackLayout;
 import com.android.dialer.app.voicemail.VoicemailPlaybackPresenter;
-import com.android.dialer.blocking.BlockedNumbersMigrator;
-import com.android.dialer.blocking.FilteredNumberCompat;
 import com.android.dialer.blocking.FilteredNumbersUtil;
 import com.android.dialer.callcomposer.CallComposerActivity;
 import com.android.dialer.calldetails.CallDetailsEntries;
@@ -418,24 +416,12 @@
     } else if (resId == R.id.context_menu_block_report_spam) {
       Logger.get(context)
           .logImpression(DialerImpression.Type.CALL_LOG_CONTEXT_MENU_BLOCK_REPORT_SPAM);
-      maybeShowBlockNumberMigrationDialog(
-          new BlockedNumbersMigrator.Listener() {
-            @Override
-            public void onComplete() {
-              blockReportListener.onBlockReportSpam(
-                  displayNumber, number, countryIso, callType, info.sourceType);
-            }
-          });
+      blockReportListener.onBlockReportSpam(
+              displayNumber, number, countryIso, callType, info.sourceType);
     } else if (resId == R.id.context_menu_block) {
       Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_CONTEXT_MENU_BLOCK_NUMBER);
-      maybeShowBlockNumberMigrationDialog(
-          new BlockedNumbersMigrator.Listener() {
-            @Override
-            public void onComplete() {
-              blockReportListener.onBlock(
-                  displayNumber, number, countryIso, callType, info.sourceType);
-            }
-          });
+      blockReportListener.onBlock(
+              displayNumber, number, countryIso, callType, info.sourceType);
     } else if (resId == R.id.context_menu_unblock) {
       Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_CONTEXT_MENU_UNBLOCK_NUMBER);
       blockReportListener.onUnblock(
@@ -1073,27 +1059,15 @@
 
     if (view.getId() == R.id.block_report_action) {
       Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_BLOCK_REPORT_SPAM);
-      maybeShowBlockNumberMigrationDialog(
-          new BlockedNumbersMigrator.Listener() {
-            @Override
-            public void onComplete() {
-              blockReportListener.onBlockReportSpam(
-                  displayNumber, number, countryIso, callType, info.sourceType);
-            }
-          });
+      blockReportListener.onBlockReportSpam(
+              displayNumber, number, countryIso, callType, info.sourceType);
       return;
     }
 
     if (view.getId() == R.id.block_action) {
       Logger.get(context).logImpression(DialerImpression.Type.CALL_LOG_BLOCK_NUMBER);
-      maybeShowBlockNumberMigrationDialog(
-          new BlockedNumbersMigrator.Listener() {
-            @Override
-            public void onComplete() {
-              blockReportListener.onBlock(
-                  displayNumber, number, countryIso, callType, info.sourceType);
-            }
-          });
+      blockReportListener.onBlock(
+              displayNumber, number, countryIso, callType, info.sourceType);
       return;
     }
 
@@ -1251,13 +1225,6 @@
     }
   }
 
-  private void maybeShowBlockNumberMigrationDialog(BlockedNumbersMigrator.Listener listener) {
-    if (!FilteredNumberCompat.maybeShowBlockNumberMigrationDialog(
-        context, ((Activity) context).getFragmentManager(), listener)) {
-      listener.onComplete();
-    }
-  }
-
   private void updateBlockReportActions(boolean canPlaceCallToNumber, boolean isVoicemailNumber) {
     // Set block/spam actions.
     blockReportView.setVisibility(View.GONE);
@@ -1267,8 +1234,7 @@
     String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
     if (!canPlaceCallToNumber
         || isVoicemailNumber
-        || !FilteredNumbersUtil.canBlockNumber(context, e164Number, number)
-        || !FilteredNumberCompat.canAttemptBlockOperations(context)) {
+        || !FilteredNumbersUtil.canBlockNumber(context, e164Number, number)) {
       return;
     }
     boolean isBlocked = blockId != null;
@@ -1350,8 +1316,7 @@
     boolean canPlaceCallToNumber = PhoneNumberHelper.canPlaceCallsTo(number, numberPresentation);
     if (canPlaceCallToNumber
         && !isVoicemailNumber
-        && FilteredNumbersUtil.canBlockNumber(context, e164Number, number)
-        && FilteredNumberCompat.canAttemptBlockOperations(context)) {
+        && FilteredNumbersUtil.canBlockNumber(context, e164Number, number)) {
       boolean isBlocked = blockId != null;
       if (isBlocked) {
         menu.add(
diff --git a/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java b/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java
index 03b824e..126b7a1 100644
--- a/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java
+++ b/java/com/android/dialer/app/calllog/CallLogNotificationsQueryHelper.java
@@ -389,7 +389,7 @@
       try (Cursor cursor =
           contentResolver.query(
               Calls.CONTENT_URI_WITH_VOICEMAIL,
-              (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) ? PROJECTION_O : PROJECTION,
+              PROJECTION_O,
               selection.getSelection(),
               selection.getSelectionArgs(),
               Calls.DEFAULT_SORT_ORDER)) {
@@ -428,7 +428,7 @@
       try (Cursor cursor =
           contentResolver.query(
               Calls.CONTENT_URI_WITH_VOICEMAIL,
-              (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) ? PROJECTION_O : PROJECTION,
+              PROJECTION_O,
               selection.getSelection(),
               selection.getSelectionArgs(),
               null)) {
@@ -459,9 +459,7 @@
           cursor.getString(TRANSCRIPTION_COLUMN_INDEX),
           cursor.getString(COUNTRY_ISO_COLUMN_INDEX),
           cursor.getLong(DATE_COLUMN_INDEX),
-          Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
-              ? cursor.getInt(TRANSCRIPTION_STATE_COLUMN_INDEX)
-              : VoicemailCompat.TRANSCRIPTION_NOT_STARTED);
+          cursor.getInt(TRANSCRIPTION_STATE_COLUMN_INDEX));
     }
   }
 }
diff --git a/java/com/android/dialer/app/calllog/CallLogReceiver.java b/java/com/android/dialer/app/calllog/CallLogReceiver.java
index 654436c..5d8d130 100644
--- a/java/com/android/dialer/app/calllog/CallLogReceiver.java
+++ b/java/com/android/dialer/app/calllog/CallLogReceiver.java
@@ -23,8 +23,6 @@
 import android.provider.VoicemailContract;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.database.CallLogQueryHandler;
-import com.android.dialer.voicemail.listui.error.VoicemailStatusCorruptionHandler;
-import com.android.dialer.voicemail.listui.error.VoicemailStatusCorruptionHandler.Source;
 
 /**
  * Receiver for call log events.
@@ -55,8 +53,7 @@
             new CallLogQueryHandler.Listener() {
               @Override
               public void onVoicemailStatusFetched(Cursor statusCursor) {
-                VoicemailStatusCorruptionHandler.maybeFixVoicemailStatus(
-                    context, statusCursor, Source.Notification);
+                // Do nothing
               }
 
               @Override
diff --git a/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java b/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java
index 62ae748..4925c72 100644
--- a/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java
+++ b/java/com/android/dialer/app/calllog/LegacyVoicemailNotifier.java
@@ -16,14 +16,11 @@
 
 package com.android.dialer.app.calllog;
 
-import android.annotation.TargetApi;
 import android.app.Notification;
 import android.app.PendingIntent;
 import android.content.Context;
-import android.os.Build.VERSION_CODES;
 import android.os.PersistableBundle;
 import android.support.annotation.NonNull;
-import android.support.v4.os.BuildCompat;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
@@ -41,7 +38,6 @@
 import com.android.dialer.theme.base.ThemeComponent;
 
 /** Shows a notification in the status bar for legacy vociemail. */
-@TargetApi(VERSION_CODES.O)
 public final class LegacyVoicemailNotifier {
   private static final String NOTIFICATION_TAG_PREFIX = "LegacyVoicemail_";
   private static final String NOTIFICATION_TAG = "LegacyVoicemail";
@@ -62,7 +58,6 @@
       boolean isRefresh) {
     LogUtil.enterBlock("LegacyVoicemailNotifier.showNotification");
     Assert.isNotNull(handle);
-    Assert.checkArgument(BuildCompat.isAtLeastO());
 
     TelephonyManager pinnedTelephonyManager =
         context.getSystemService(TelephonyManager.class).createForPhoneAccountHandle(handle);
@@ -159,7 +154,6 @@
   public static void cancelNotification(
       @NonNull Context context, @NonNull PhoneAccountHandle phoneAccountHandle) {
     LogUtil.enterBlock("LegacyVoicemailNotifier.cancelNotification");
-    Assert.checkArgument(BuildCompat.isAtLeastO());
     Assert.isNotNull(phoneAccountHandle);
     if ("null".equals(phoneAccountHandle.getId())) {
       // while PhoneAccountHandle itself will never be null, telephony may still construct a "null"
diff --git a/java/com/android/dialer/app/calllog/MissedCallNotifier.java b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
index 64536c8..d9d6b40 100644
--- a/java/com/android/dialer/app/calllog/MissedCallNotifier.java
+++ b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
@@ -35,7 +35,6 @@
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
 import android.support.annotation.WorkerThread;
-import android.support.v4.os.BuildCompat;
 import android.support.v4.os.UserManagerCompat;
 import android.support.v4.util.Pair;
 import android.telecom.PhoneAccount;
@@ -223,10 +222,8 @@
             CallLogNotificationsService.createCancelAllMissedCallsPendingIntent(context))
         .setGroupSummary(useCallList)
         .setOnlyAlertOnce(useCallList)
-        .setPublicVersion(publicSummaryBuilder.build());
-    if (BuildCompat.isAtLeastO()) {
-      groupSummary.setChannelId(NotificationChannelId.MISSED_CALL);
-    }
+        .setPublicVersion(publicSummaryBuilder.build())
+        .setChannelId(NotificationChannelId.MISSED_CALL);
 
     Notification notification = groupSummary.build();
     configureLedOnNotification(notification);
@@ -421,10 +418,8 @@
             .setDeleteIntent(
                 CallLogNotificationsService.createCancelSingleMissedCallPendingIntent(
                     context, call.callsUri))
-            .setContentIntent(createCallLogPendingIntent(call.callsUri));
-    if (BuildCompat.isAtLeastO()) {
-      builder.setChannelId(NotificationChannelId.MISSED_CALL);
-    }
+            .setContentIntent(createCallLogPendingIntent(call.callsUri))
+            .setChannelId(NotificationChannelId.MISSED_CALL);
 
     return builder;
   }
diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
index 9d04cb2..e6b94fc 100644
--- a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
+++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java
@@ -25,7 +25,6 @@
 import android.provider.CallLog.Calls;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.support.v4.content.ContextCompat;
-import android.support.v4.os.BuildCompat;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.PhoneNumberUtils;
@@ -173,9 +172,7 @@
     views.callTypeIcons.setShowAssistedDialed(
         (details.features & TelephonyManagerCompat.FEATURES_ASSISTED_DIALING)
             == TelephonyManagerCompat.FEATURES_ASSISTED_DIALING);
-    if (BuildCompat.isAtLeastP()) {
-      views.callTypeIcons.setShowRtt((details.features & Calls.FEATURES_RTT) == Calls.FEATURES_RTT);
-    }
+    views.callTypeIcons.setShowRtt((details.features & Calls.FEATURES_RTT) == Calls.FEATURES_RTT);
     views.callTypeIcons.requestLayout();
     views.callTypeIcons.setVisibility(View.VISIBLE);
 
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java
index 7fc104b..b0f2670 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailNotifier.java
@@ -23,8 +23,6 @@
 import android.content.Intent;
 import android.graphics.Bitmap;
 import android.net.Uri;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.app.NotificationCompat;
@@ -90,19 +88,17 @@
             .setGroupSummary(true)
             .setContentIntent(newVoicemailIntent(context, null));
 
-    if (VERSION.SDK_INT >= VERSION_CODES.O) {
-      if (shouldAlert) {
-        groupSummary.setOnlyAlertOnce(false);
-        // Group summary will alert when posted/updated
-        groupSummary.setGroupAlertBehavior(Notification.GROUP_ALERT_ALL);
-      } else {
-        // Only children will alert. but since all children are set to "only alert summary" it is
-        // effectively silenced.
-        groupSummary.setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN);
-      }
-      PhoneAccountHandle handle = getAccountForCall(context, newCalls.get(0));
-      groupSummary.setChannelId(NotificationChannelManager.getVoicemailChannelId(context, handle));
+    if (shouldAlert) {
+      groupSummary.setOnlyAlertOnce(false);
+      // Group summary will alert when posted/updated
+      groupSummary.setGroupAlertBehavior(Notification.GROUP_ALERT_ALL);
+    } else {
+      // Only children will alert. but since all children are set to "only alert summary" it is
+      // effectively silenced.
+      groupSummary.setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN);
     }
+    PhoneAccountHandle handle = getAccountForCall(context, newCalls.get(0));
+    groupSummary.setChannelId(NotificationChannelManager.getVoicemailChannelId(context, handle));
 
     DialerNotificationManager.notify(
         context, GROUP_SUMMARY_NOTIFICATION_TAG, NOTIFICATION_ID, groupSummary.build());
@@ -214,10 +210,8 @@
               context, voicemail.voicemailUri));
     }
 
-    if (VERSION.SDK_INT >= VERSION_CODES.O) {
-      builder.setChannelId(NotificationChannelManager.getVoicemailChannelId(context, handle));
-      builder.setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY);
-    }
+    builder.setChannelId(NotificationChannelManager.getVoicemailChannelId(context, handle));
+    builder.setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY);
 
     ContactPhotoLoader loader = new ContactPhotoLoader(context, contactInfo);
     Bitmap photoIcon = loader.loadPhotoIcon();
diff --git a/java/com/android/dialer/app/filterednumber/BlockedNumbersAdapter.java b/java/com/android/dialer/app/filterednumber/BlockedNumbersAdapter.java
deleted file mode 100644
index 603c06f..0000000
--- a/java/com/android/dialer/app/filterednumber/BlockedNumbersAdapter.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * 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.app.filterednumber;
-
-import android.app.FragmentManager;
-import android.content.Context;
-import android.database.Cursor;
-import android.view.View;
-import com.android.dialer.app.R;
-import com.android.dialer.blocking.BlockNumberDialogFragment;
-import com.android.dialer.contactphoto.ContactPhotoManager;
-import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
-import com.android.dialer.location.GeoUtil;
-import com.android.dialer.logging.InteractionEvent;
-import com.android.dialer.logging.Logger;
-import com.android.dialer.phonenumbercache.ContactInfoHelper;
-import com.android.dialer.phonenumberutil.PhoneNumberHelper;
-
-/** TODO(calderwoodra): documentation */
-public class BlockedNumbersAdapter extends NumbersAdapter {
-
-  private BlockedNumbersAdapter(
-      Context context,
-      FragmentManager fragmentManager,
-      ContactInfoHelper contactInfoHelper,
-      ContactPhotoManager contactPhotoManager) {
-    super(context, fragmentManager, contactInfoHelper, contactPhotoManager);
-  }
-
-  public static BlockedNumbersAdapter newBlockedNumbersAdapter(
-      Context context, FragmentManager fragmentManager) {
-    return new BlockedNumbersAdapter(
-        context,
-        fragmentManager,
-        new ContactInfoHelper(context, GeoUtil.getCurrentCountryIso(context)),
-        ContactPhotoManager.getInstance(context));
-  }
-
-  @Override
-  public void bindView(View view, final Context context, Cursor cursor) {
-    super.bindView(view, context, cursor);
-    final Integer id = cursor.getInt(cursor.getColumnIndex(FilteredNumberColumns._ID));
-    final String countryIso =
-        cursor.getString(cursor.getColumnIndex(FilteredNumberColumns.COUNTRY_ISO));
-    final String number = cursor.getString(cursor.getColumnIndex(FilteredNumberColumns.NUMBER));
-
-    final View deleteButton = view.findViewById(R.id.delete_button);
-    deleteButton.setOnClickListener(
-        new View.OnClickListener() {
-          @Override
-          public void onClick(View view) {
-            BlockNumberDialogFragment.show(
-                id,
-                number,
-                countryIso,
-                PhoneNumberHelper.formatNumber(getContext(), number, countryIso),
-                R.id.blocked_numbers_activity_container,
-                getFragmentManager(),
-                new BlockNumberDialogFragment.Callback() {
-                  @Override
-                  public void onFilterNumberSuccess() {}
-
-                  @Override
-                  public void onUnfilterNumberSuccess() {
-                    Logger.get(context)
-                        .logInteraction(InteractionEvent.Type.UNBLOCK_NUMBER_MANAGEMENT_SCREEN);
-                  }
-
-                  @Override
-                  public void onChangeFilteredNumberUndo() {}
-                });
-          }
-        });
-
-    updateView(view, number, countryIso);
-  }
-
-  @Override
-  public boolean isEmpty() {
-    // Always return false, so that the header with blocking-related options always shows.
-    return false;
-  }
-}
diff --git a/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java b/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java
deleted file mode 100644
index bf40fdf..0000000
--- a/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * 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.app.filterednumber;
-
-import android.app.ListFragment;
-import android.app.LoaderManager;
-import android.content.Context;
-import android.content.CursorLoader;
-import android.content.Loader;
-import android.database.Cursor;
-import android.graphics.drawable.ColorDrawable;
-import android.os.Bundle;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-import com.android.dialer.app.R;
-import com.android.dialer.blocking.BlockedNumbersMigrator;
-import com.android.dialer.blocking.BlockedNumbersMigrator.Listener;
-import com.android.dialer.blocking.FilteredNumberCompat;
-import com.android.dialer.blocking.FilteredNumbersUtil;
-import com.android.dialer.blocking.FilteredNumbersUtil.CheckForSendToVoicemailContactListener;
-import com.android.dialer.blocking.FilteredNumbersUtil.ImportSendToVoicemailContactsListener;
-import com.android.dialer.database.FilteredNumberContract;
-import com.android.dialer.lettertile.LetterTileDrawable;
-import com.android.dialer.theme.base.ThemeComponent;
-import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker;
-
-/** TODO(calderwoodra): documentation */
-public class BlockedNumbersFragment extends ListFragment
-    implements LoaderManager.LoaderCallbacks<Cursor>,
-        View.OnClickListener,
-        VisualVoicemailEnabledChecker.Callback {
-
-  private static final char ADD_BLOCKED_NUMBER_ICON_LETTER = '+';
-  protected View migratePromoView;
-  private BlockedNumbersMigrator blockedNumbersMigratorForTest;
-  private TextView blockedNumbersText;
-  private TextView footerText;
-  private BlockedNumbersAdapter adapter;
-  private VisualVoicemailEnabledChecker voicemailEnabledChecker;
-  private View importSettings;
-  private View blockedNumbersDisabledForEmergency;
-  private View blockedNumberListDivider;
-
-  @Override
-  public Context getContext() {
-    return getActivity();
-  }
-
-  @Override
-  public void onActivityCreated(Bundle savedInstanceState) {
-    super.onActivityCreated(savedInstanceState);
-
-    LayoutInflater inflater =
-        (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-    getListView().addHeaderView(inflater.inflate(R.layout.blocked_number_header, null));
-    getListView().addFooterView(inflater.inflate(R.layout.blocked_number_footer, null));
-    //replace the icon for add number with LetterTileDrawable(), so it will have identical style
-    LetterTileDrawable drawable = new LetterTileDrawable(getResources());
-    drawable.setLetter(ADD_BLOCKED_NUMBER_ICON_LETTER);
-    drawable.setColor(ThemeComponent.get(getContext()).theme().getColorIcon());
-    drawable.setIsCircular(true);
-
-    if (adapter == null) {
-      adapter =
-          BlockedNumbersAdapter.newBlockedNumbersAdapter(
-              getContext(), getActivity().getFragmentManager());
-    }
-    setListAdapter(adapter);
-
-    blockedNumbersText = (TextView) getListView().findViewById(R.id.blocked_number_text_view);
-    migratePromoView = getListView().findViewById(R.id.migrate_promo);
-    getListView().findViewById(R.id.migrate_promo_allow_button).setOnClickListener(this);
-    importSettings = getListView().findViewById(R.id.import_settings);
-    blockedNumbersDisabledForEmergency =
-        getListView().findViewById(R.id.blocked_numbers_disabled_for_emergency);
-    blockedNumberListDivider = getActivity().findViewById(R.id.blocked_number_list_divider);
-    getListView().findViewById(R.id.import_button).setOnClickListener(this);
-    getListView().findViewById(R.id.view_numbers_button).setOnClickListener(this);
-
-    footerText = (TextView) getActivity().findViewById(R.id.blocked_number_footer_textview);
-    voicemailEnabledChecker = new VisualVoicemailEnabledChecker(getContext(), this);
-    voicemailEnabledChecker.asyncUpdate();
-    updateActiveVoicemailProvider();
-  }
-
-  @Override
-  public void onDestroy() {
-    setListAdapter(null);
-    super.onDestroy();
-  }
-
-  @Override
-  public void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    getLoaderManager().initLoader(0, null, this);
-  }
-
-  @Override
-  public void onResume() {
-    super.onResume();
-
-    ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
-    ColorDrawable backgroundDrawable =
-        new ColorDrawable(ThemeComponent.get(getContext()).theme().getColorPrimary());
-    actionBar.setBackgroundDrawable(backgroundDrawable);
-    actionBar.setDisplayShowCustomEnabled(false);
-    actionBar.setDisplayHomeAsUpEnabled(true);
-    actionBar.setDisplayShowHomeEnabled(true);
-    actionBar.setDisplayShowTitleEnabled(true);
-    actionBar.setTitle(R.string.manage_blocked_numbers_label);
-
-    // If the device can use the framework blocking solution, users should not be able to add
-    // new blocked numbers from the Blocked Management UI. They will be shown a promo card
-    // asking them to migrate to new blocking instead.
-    if (FilteredNumberCompat.canUseNewFiltering()) {
-      migratePromoView.setVisibility(View.VISIBLE);
-      blockedNumbersText.setVisibility(View.GONE);
-      blockedNumberListDivider.setVisibility(View.GONE);
-      importSettings.setVisibility(View.GONE);
-      getListView().findViewById(R.id.import_button).setOnClickListener(null);
-      getListView().findViewById(R.id.view_numbers_button).setOnClickListener(null);
-      blockedNumbersDisabledForEmergency.setVisibility(View.GONE);
-      footerText.setVisibility(View.GONE);
-    } else {
-      FilteredNumbersUtil.checkForSendToVoicemailContact(
-          getActivity(),
-          new CheckForSendToVoicemailContactListener() {
-            @Override
-            public void onComplete(boolean hasSendToVoicemailContact) {
-              final int visibility = hasSendToVoicemailContact ? View.VISIBLE : View.GONE;
-              importSettings.setVisibility(visibility);
-            }
-          });
-    }
-
-    // All views except migrate and the block list are hidden when new filtering is available
-    if (!FilteredNumberCompat.canUseNewFiltering()
-        && FilteredNumbersUtil.hasRecentEmergencyCall(getContext())) {
-      blockedNumbersDisabledForEmergency.setVisibility(View.VISIBLE);
-    } else {
-      blockedNumbersDisabledForEmergency.setVisibility(View.GONE);
-    }
-
-    voicemailEnabledChecker.asyncUpdate();
-  }
-
-  @Override
-  public View onCreateView(
-      LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-    return inflater.inflate(R.layout.blocked_number_fragment, container, false);
-  }
-
-  @Override
-  public Loader<Cursor> onCreateLoader(int id, Bundle args) {
-    final String[] projection = {
-      FilteredNumberContract.FilteredNumberColumns._ID,
-      FilteredNumberContract.FilteredNumberColumns.COUNTRY_ISO,
-      FilteredNumberContract.FilteredNumberColumns.NUMBER,
-      FilteredNumberContract.FilteredNumberColumns.NORMALIZED_NUMBER
-    };
-    final String selection =
-        FilteredNumberContract.FilteredNumberColumns.TYPE
-            + "="
-            + FilteredNumberContract.FilteredNumberTypes.BLOCKED_NUMBER;
-    return new CursorLoader(
-        getContext(),
-        FilteredNumberContract.FilteredNumber.CONTENT_URI,
-        projection,
-        selection,
-        null,
-        null);
-  }
-
-  @Override
-  public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-    adapter.swapCursor(data);
-    if (FilteredNumberCompat.canUseNewFiltering() || data.getCount() == 0) {
-      blockedNumberListDivider.setVisibility(View.INVISIBLE);
-    } else {
-      blockedNumberListDivider.setVisibility(View.VISIBLE);
-    }
-  }
-
-  @Override
-  public void onLoaderReset(Loader<Cursor> loader) {
-    adapter.swapCursor(null);
-  }
-
-  @Override
-  public void onClick(final View view) {
-    final BlockedNumbersSettingsActivity activity = (BlockedNumbersSettingsActivity) getActivity();
-    if (activity == null) {
-      return;
-    }
-
-    int resId = view.getId();
-    if (resId == R.id.view_numbers_button) {
-      activity.showNumbersToImportPreviewUi();
-    } else if (resId == R.id.import_button) {
-      FilteredNumbersUtil.importSendToVoicemailContacts(
-          activity,
-          new ImportSendToVoicemailContactsListener() {
-            @Override
-            public void onImportComplete() {
-              importSettings.setVisibility(View.GONE);
-            }
-          });
-    } else if (resId == R.id.migrate_promo_allow_button) {
-      view.setEnabled(false);
-      (blockedNumbersMigratorForTest != null
-              ? blockedNumbersMigratorForTest
-              : new BlockedNumbersMigrator(getContext()))
-          .migrate(
-              new Listener() {
-                @Override
-                public void onComplete() {
-                  getContext()
-                      .startActivity(
-                          FilteredNumberCompat.createManageBlockedNumbersIntent(getContext()));
-                  // Remove this activity from the backstack
-                  activity.finish();
-                }
-              });
-    }
-  }
-
-  @Override
-  public void onVisualVoicemailEnabledStatusChanged(boolean newStatus) {
-    updateActiveVoicemailProvider();
-  }
-
-  private void updateActiveVoicemailProvider() {
-    if (getActivity() == null || getActivity().isFinishing()) {
-      return;
-    }
-    if (voicemailEnabledChecker.isVisualVoicemailEnabled()) {
-      footerText.setText(R.string.block_number_footer_message_vvm);
-    } else {
-      footerText.setText(R.string.block_number_footer_message_no_vvm);
-    }
-  }
-
-  void setBlockedNumbersMigratorForTest(BlockedNumbersMigrator blockedNumbersMigrator) {
-    blockedNumbersMigratorForTest = blockedNumbersMigrator;
-  }
-}
diff --git a/java/com/android/dialer/app/filterednumber/BlockedNumbersSettingsActivity.java b/java/com/android/dialer/app/filterednumber/BlockedNumbersSettingsActivity.java
deleted file mode 100644
index 5475b4e..0000000
--- a/java/com/android/dialer/app/filterednumber/BlockedNumbersSettingsActivity.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * 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.app.filterednumber;
-
-import android.os.Bundle;
-import android.support.v7.app.AppCompatActivity;
-import android.view.MenuItem;
-import com.android.dialer.app.R;
-import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.ScreenEvent;
-
-/** TODO(calderwoodra): documentation */
-public class BlockedNumbersSettingsActivity extends AppCompatActivity {
-
-  private static final String TAG_BLOCKED_MANAGEMENT_FRAGMENT = "blocked_management";
-  private static final String TAG_VIEW_NUMBERS_TO_IMPORT_FRAGMENT = "view_numbers_to_import";
-
-  @Override
-  protected void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    setContentView(R.layout.blocked_numbers_activity);
-
-    // If savedInstanceState != null, the Activity will automatically restore the last fragment.
-    if (savedInstanceState == null) {
-      showManagementUi();
-    }
-  }
-
-  /** 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);
-    if (fragment == null) {
-      fragment = new BlockedNumbersFragment();
-    }
-
-    getFragmentManager()
-        .beginTransaction()
-        .replace(R.id.blocked_numbers_activity_container, fragment, TAG_BLOCKED_MANAGEMENT_FRAGMENT)
-        .commit();
-
-    Logger.get(this).logScreenView(ScreenEvent.Type.BLOCKED_NUMBER_MANAGEMENT, this);
-  }
-
-  /**
-   * 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);
-    if (fragment == null) {
-      fragment = new ViewNumbersToImportFragment();
-    }
-
-    getFragmentManager()
-        .beginTransaction()
-        .replace(
-            R.id.blocked_numbers_activity_container, fragment, TAG_VIEW_NUMBERS_TO_IMPORT_FRAGMENT)
-        .addToBackStack(null)
-        .commit();
-  }
-
-  @Override
-  public boolean onOptionsItemSelected(MenuItem item) {
-    if (item.getItemId() == android.R.id.home) {
-      onBackPressed();
-      return true;
-    }
-    return false;
-  }
-
-  @Override
-  public void onBackPressed() {
-    // TODO: Achieve back navigation without overriding onBackPressed.
-    if (getFragmentManager().getBackStackEntryCount() > 0) {
-      getFragmentManager().popBackStack();
-    } else {
-      super.onBackPressed();
-    }
-  }
-}
diff --git a/java/com/android/dialer/app/filterednumber/NumbersAdapter.java b/java/com/android/dialer/app/filterednumber/NumbersAdapter.java
deleted file mode 100644
index 2c08558..0000000
--- a/java/com/android/dialer/app/filterednumber/NumbersAdapter.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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.app.filterednumber;
-
-import android.app.FragmentManager;
-import android.content.Context;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.text.BidiFormatter;
-import android.text.TextDirectionHeuristics;
-import android.text.TextUtils;
-import android.view.View;
-import android.widget.QuickContactBadge;
-import android.widget.SimpleCursorAdapter;
-import android.widget.TextView;
-import com.android.dialer.app.R;
-import com.android.dialer.contactphoto.ContactPhotoManager;
-import com.android.dialer.contactphoto.ContactPhotoManager.DefaultImageRequest;
-import com.android.dialer.lettertile.LetterTileDrawable;
-import com.android.dialer.phonenumbercache.ContactInfo;
-import com.android.dialer.phonenumbercache.ContactInfoHelper;
-import com.android.dialer.phonenumberutil.PhoneNumberHelper;
-import com.android.dialer.util.UriUtils;
-
-/** TODO(calderwoodra): documentation */
-public class NumbersAdapter extends SimpleCursorAdapter {
-
-  private final Context context;
-  private final FragmentManager fragmentManager;
-  private final ContactInfoHelper contactInfoHelper;
-  private final BidiFormatter bidiFormatter = BidiFormatter.getInstance();
-  private final ContactPhotoManager contactPhotoManager;
-
-  public NumbersAdapter(
-      Context context,
-      FragmentManager fragmentManager,
-      ContactInfoHelper contactInfoHelper,
-      ContactPhotoManager contactPhotoManager) {
-    super(context, R.layout.blocked_number_item, null, new String[] {}, new int[] {}, 0);
-    this.context = context;
-    this.fragmentManager = fragmentManager;
-    this.contactInfoHelper = contactInfoHelper;
-    this.contactPhotoManager = contactPhotoManager;
-  }
-
-  public void updateView(View view, String number, String countryIso) {
-    final TextView callerName = (TextView) view.findViewById(R.id.caller_name);
-    final TextView callerNumber = (TextView) view.findViewById(R.id.caller_number);
-    final QuickContactBadge quickContactBadge =
-        (QuickContactBadge) view.findViewById(R.id.quick_contact_photo);
-    quickContactBadge.setOverlay(null);
-    quickContactBadge.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
-
-    ContactInfo info = contactInfoHelper.lookupNumber(number, countryIso);
-    if (info == null) {
-      info = new ContactInfo();
-      info.number = number;
-    }
-    final CharSequence locationOrType = getNumberTypeOrLocation(info, countryIso);
-    final String displayNumber = getDisplayNumber(info);
-    final String displayNumberStr =
-        bidiFormatter.unicodeWrap(displayNumber, TextDirectionHeuristics.LTR);
-
-    String nameForDefaultImage;
-    if (!TextUtils.isEmpty(info.name)) {
-      nameForDefaultImage = info.name;
-      callerName.setText(info.name);
-      callerNumber.setText(locationOrType + " " + displayNumberStr);
-    } else {
-      nameForDefaultImage = displayNumber;
-      callerName.setText(displayNumberStr);
-      if (!TextUtils.isEmpty(locationOrType)) {
-        callerNumber.setText(locationOrType);
-        callerNumber.setVisibility(View.VISIBLE);
-      } else {
-        callerNumber.setVisibility(View.GONE);
-      }
-    }
-    loadContactPhoto(info, nameForDefaultImage, quickContactBadge);
-  }
-
-  private void loadContactPhoto(ContactInfo info, String displayName, QuickContactBadge badge) {
-    final String lookupKey =
-        info.lookupUri == null ? null : UriUtils.getLookupKeyFromUri(info.lookupUri);
-    final int contactType =
-        contactInfoHelper.isBusiness(info.sourceType)
-            ? LetterTileDrawable.TYPE_BUSINESS
-            : LetterTileDrawable.TYPE_DEFAULT;
-    final DefaultImageRequest request =
-        new DefaultImageRequest(displayName, lookupKey, contactType, true /* isCircular */);
-    badge.assignContactUri(info.lookupUri);
-    badge.setContentDescription(
-        context.getResources().getString(R.string.description_contact_details, displayName));
-    contactPhotoManager.loadDirectoryPhoto(
-        badge, info.photoUri, false /* darkTheme */, true /* isCircular */, request);
-  }
-
-  private String getDisplayNumber(ContactInfo info) {
-    if (!TextUtils.isEmpty(info.formattedNumber)) {
-      return info.formattedNumber;
-    } else if (!TextUtils.isEmpty(info.number)) {
-      return info.number;
-    } else {
-      return "";
-    }
-  }
-
-  private CharSequence getNumberTypeOrLocation(ContactInfo info, String countryIso) {
-    if (!TextUtils.isEmpty(info.name)) {
-      return ContactsContract.CommonDataKinds.Phone.getTypeLabel(
-          context.getResources(), info.type, info.label);
-    } else {
-      return PhoneNumberHelper.getGeoDescription(context, info.number, countryIso);
-    }
-  }
-
-  protected Context getContext() {
-    return context;
-  }
-
-  protected FragmentManager getFragmentManager() {
-    return fragmentManager;
-  }
-}
diff --git a/java/com/android/dialer/app/filterednumber/ViewNumbersToImportAdapter.java b/java/com/android/dialer/app/filterednumber/ViewNumbersToImportAdapter.java
deleted file mode 100644
index 106c4fb..0000000
--- a/java/com/android/dialer/app/filterednumber/ViewNumbersToImportAdapter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.app.filterednumber;
-
-import android.app.FragmentManager;
-import android.content.Context;
-import android.database.Cursor;
-import android.view.View;
-import com.android.dialer.app.R;
-import com.android.dialer.blocking.FilteredNumbersUtil;
-import com.android.dialer.contactphoto.ContactPhotoManager;
-import com.android.dialer.location.GeoUtil;
-import com.android.dialer.phonenumbercache.ContactInfoHelper;
-
-/** TODO(calderwoodra): documentation */
-public class ViewNumbersToImportAdapter extends NumbersAdapter {
-
-  private ViewNumbersToImportAdapter(
-      Context context,
-      FragmentManager fragmentManager,
-      ContactInfoHelper contactInfoHelper,
-      ContactPhotoManager contactPhotoManager) {
-    super(context, fragmentManager, contactInfoHelper, contactPhotoManager);
-  }
-
-  public static ViewNumbersToImportAdapter newViewNumbersToImportAdapter(
-      Context context, FragmentManager fragmentManager) {
-    return new ViewNumbersToImportAdapter(
-        context,
-        fragmentManager,
-        new ContactInfoHelper(context, GeoUtil.getCurrentCountryIso(context)),
-        ContactPhotoManager.getInstance(context));
-  }
-
-  @Override
-  public void bindView(View view, Context context, Cursor cursor) {
-    super.bindView(view, context, cursor);
-
-    final String number = cursor.getString(FilteredNumbersUtil.PhoneQuery.NUMBER_COLUMN_INDEX);
-
-    view.findViewById(R.id.delete_button).setVisibility(View.GONE);
-    updateView(view, number, null /* countryIso */);
-  }
-}
diff --git a/java/com/android/dialer/app/filterednumber/ViewNumbersToImportFragment.java b/java/com/android/dialer/app/filterednumber/ViewNumbersToImportFragment.java
deleted file mode 100644
index be3ae79..0000000
--- a/java/com/android/dialer/app/filterednumber/ViewNumbersToImportFragment.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * 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.app.filterednumber;
-
-import android.app.ListFragment;
-import android.app.LoaderManager;
-import android.content.Context;
-import android.content.CursorLoader;
-import android.content.Loader;
-import android.database.Cursor;
-import android.os.Bundle;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import com.android.dialer.app.R;
-import com.android.dialer.blocking.FilteredNumbersUtil;
-import com.android.dialer.blocking.FilteredNumbersUtil.ImportSendToVoicemailContactsListener;
-
-/** TODO(calderwoodra): documentation */
-public class ViewNumbersToImportFragment extends ListFragment
-    implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener {
-
-  private ViewNumbersToImportAdapter adapter;
-
-  @Override
-  public Context getContext() {
-    return getActivity();
-  }
-
-  @Override
-  public void onActivityCreated(Bundle savedInstanceState) {
-    super.onActivityCreated(savedInstanceState);
-
-    if (adapter == null) {
-      adapter =
-          ViewNumbersToImportAdapter.newViewNumbersToImportAdapter(
-              getContext(), getActivity().getFragmentManager());
-    }
-    setListAdapter(adapter);
-  }
-
-  @Override
-  public void onDestroy() {
-    setListAdapter(null);
-    super.onDestroy();
-  }
-
-  @Override
-  public void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    getLoaderManager().initLoader(0, null, this);
-  }
-
-  @Override
-  public void onResume() {
-    super.onResume();
-
-    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);
-  }
-
-  @Override
-  public View onCreateView(
-      LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-    return inflater.inflate(R.layout.view_numbers_to_import_fragment, container, false);
-  }
-
-  @Override
-  public Loader<Cursor> onCreateLoader(int id, Bundle args) {
-    final CursorLoader cursorLoader =
-        new CursorLoader(
-            getContext(),
-            Phone.CONTENT_URI,
-            FilteredNumbersUtil.PhoneQuery.PROJECTION,
-            FilteredNumbersUtil.PhoneQuery.SELECT_SEND_TO_VOICEMAIL_TRUE,
-            null,
-            null);
-    return cursorLoader;
-  }
-
-  @Override
-  public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-    adapter.swapCursor(data);
-  }
-
-  @Override
-  public void onLoaderReset(Loader<Cursor> loader) {
-    adapter.swapCursor(null);
-  }
-
-  @Override
-  public void onClick(final View view) {
-    if (view.getId() == R.id.import_button) {
-      FilteredNumbersUtil.importSendToVoicemailContacts(
-          getContext(),
-          new ImportSendToVoicemailContactsListener() {
-            @Override
-            public void onImportComplete() {
-              if (getActivity() != null) {
-                getActivity().onBackPressed();
-              }
-            }
-          });
-    } else if (view.getId() == R.id.cancel_button) {
-      getActivity().onBackPressed();
-    }
-  }
-}
diff --git a/java/com/android/dialer/app/list/ListsFragment.java b/java/com/android/dialer/app/list/ListsFragment.java
index 93e8923..4a606bb 100644
--- a/java/com/android/dialer/app/list/ListsFragment.java
+++ b/java/com/android/dialer/app/list/ListsFragment.java
@@ -46,8 +46,6 @@
 import com.android.dialer.logging.UiAction;
 import com.android.dialer.performancereport.PerformanceReport;
 import com.android.dialer.util.PermissionsUtil;
-import com.android.dialer.voicemail.listui.error.VoicemailStatusCorruptionHandler;
-import com.android.dialer.voicemail.listui.error.VoicemailStatusCorruptionHandler.Source;
 import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker;
 import com.android.dialer.voicemailstatus.VoicemailStatusHelper;
 import java.util.ArrayList;
@@ -333,9 +331,6 @@
       return;
     }
 
-    VoicemailStatusCorruptionHandler.maybeFixVoicemailStatus(
-        getContext(), statusCursor, Source.Activity);
-
     // Update hasActiveVoicemailProvider, which controls the number of tabs displayed.
     boolean hasActiveVoicemailProvider =
         VoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor) > 0;
diff --git a/java/com/android/dialer/app/res/layout/blocked_number_footer.xml b/java/com/android/dialer/app/res/layout/blocked_number_footer.xml
deleted file mode 100644
index 2d36860..0000000
--- a/java/com/android/dialer/app/res/layout/blocked_number_footer.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-  android:layout_width="match_parent"
-  android:layout_height="wrap_content"
-  android:focusable="false"
-  android:orientation="vertical">
-
-  <LinearLayout
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:padding="@dimen/blocked_number_container_padding"
-    android:background="@android:color/white"
-    android:focusable="true"
-    android:orientation="vertical">
-
-    <TextView
-      android:id="@+id/blocked_number_footer_textview"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:text="@string/block_number_footer_message_vvm"
-      style="@style/Dialer.TextAppearance.Secondary"/>
-  </LinearLayout>
-</LinearLayout>
diff --git a/java/com/android/dialer/app/res/layout/blocked_number_fragment.xml b/java/com/android/dialer/app/res/layout/blocked_number_fragment.xml
deleted file mode 100644
index 22dcfef..0000000
--- a/java/com/android/dialer/app/res/layout/blocked_number_fragment.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-  android:id="@+id/blocked_number_fragment"
-  android:layout_width="match_parent"
-  android:layout_height="match_parent"
-  android:background="?android:attr/colorBackground"
-  android:orientation="vertical">
-
-  <ListView
-    android:id="@id/android:list"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:divider="@null"
-    android:headerDividersEnabled="false"/>
-
-</LinearLayout>
diff --git a/java/com/android/dialer/app/res/layout/blocked_number_header.xml b/java/com/android/dialer/app/res/layout/blocked_number_header.xml
deleted file mode 100644
index 27b624c..0000000
--- a/java/com/android/dialer/app/res/layout/blocked_number_header.xml
+++ /dev/null
@@ -1,180 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-  xmlns:card_view="http://schemas.android.com/apk/res-auto"
-  xmlns:tools="http://schemas.android.com/tools"
-  android:layout_width="match_parent"
-  android:layout_height="wrap_content"
-  android:focusable="false"
-  android:orientation="vertical">
-
-  <LinearLayout
-    android:id="@+id/blocked_numbers_disabled_for_emergency"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingTop="27dp"
-    android:paddingBottom="29dp"
-    android:paddingStart="@dimen/blocked_number_container_padding"
-    android:paddingEnd="44dp"
-    android:background="?android:attr/colorBackground"
-    android:focusable="true"
-    android:orientation="vertical"
-    android:visibility="gone">
-
-    <TextView
-      style="@style/BlockedNumbersDescriptionTextStyle"
-      android:textStyle="bold"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:text="@string/blocked_numbers_disabled_emergency_header_label"/>
-
-    <TextView
-      style="@style/BlockedNumbersDescriptionTextStyle"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:text="@string/blocked_numbers_disabled_emergency_desc"/>
-
-  </LinearLayout>
-
-  <android.support.v7.widget.CardView
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    card_view:cardCornerRadius="0dp">
-
-    <LinearLayout
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:background="@android:color/white"
-      android:focusable="true"
-      android:orientation="vertical">
-
-      <TextView
-        android:id="@+id/blocked_number_text_view"
-        style="@android:style/TextAppearance.Material.Subhead"
-        android:layout_width="wrap_content"
-        android:layout_height="48dp"
-        android:paddingStart="@dimen/blocked_number_container_padding"
-        android:gravity="center_vertical"
-        android:text="@string/block_list"
-        android:textColor="?android:attr/textColorPrimary"/>
-
-      <RelativeLayout
-        android:id="@+id/import_settings"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:visibility="gone"
-        tools:visibility="visible">
-
-        <TextView
-          android:id="@+id/import_description"
-          style="@style/BlockedNumbersDescriptionTextStyle"
-          android:layout_width="match_parent"
-          android:layout_height="wrap_content"
-          android:paddingTop="11dp"
-          android:paddingBottom="27dp"
-          android:paddingStart="@dimen/blocked_number_container_padding"
-          android:paddingEnd="@dimen/blocked_number_container_padding"
-          android:text="@string/blocked_call_settings_import_description"
-          android:textColor="?colorIcon"
-          android:textSize="@dimen/blocked_number_settings_description_text_size"/>
-
-        <Button
-          android:id="@+id/import_button"
-          style="@style/DialerFlatButtonStyle"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:layout_marginEnd="@dimen/blocked_number_container_padding"
-          android:layout_alignParentEnd="true"
-          android:layout_below="@id/import_description"
-          android:text="@string/blocked_call_settings_import_button"/>
-
-        <Button
-          android:id="@+id/view_numbers_button"
-          style="@style/DialerFlatButtonStyle"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:layout_marginEnd="8dp"
-          android:layout_below="@id/import_description"
-          android:layout_toStartOf="@id/import_button"
-          android:text="@string/blocked_call_settings_view_numbers_button"/>
-
-        <View
-          android:layout_width="match_parent"
-          android:layout_height="1dp"
-          android:layout_marginTop="8dp"
-          android:layout_below="@id/import_button"
-          android:background="@color/dialer_divider_line_color"/>
-
-      </RelativeLayout>
-
-      <LinearLayout
-        android:id="@+id/migrate_promo"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:visibility="gone"
-        tools:visibility="visible">
-
-        <TextView
-          android:id="@+id/migrate_promo_header"
-          style="@android:style/TextAppearance.Material.Subhead"
-          android:textStyle="bold"
-          android:layout_width="match_parent"
-          android:layout_height="48dp"
-          android:paddingStart="@dimen/blocked_number_container_padding"
-          android:paddingEnd="@dimen/blocked_number_container_padding"
-          android:gravity="center_vertical"
-          android:text="@string/migrate_blocked_numbers_dialog_title"
-          android:textColor="?android:attr/textColorPrimary"/>
-
-        <TextView
-          android:id="@+id/migrate_promo_description"
-          android:layout_width="match_parent"
-          android:layout_height="wrap_content"
-          android:layout_marginBottom="@dimen/blocked_number_container_padding"
-          android:layout_marginStart="@dimen/blocked_number_container_padding"
-          android:layout_marginEnd="@dimen/blocked_number_container_padding"
-          android:text="@string/migrate_blocked_numbers_dialog_message"
-          android:textColor="?colorIcon"/>
-
-        <Button
-          android:id="@+id/migrate_promo_allow_button"
-          style="@style/DialerPrimaryFlatButtonStyle"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:layout_marginBottom="@dimen/blocked_number_container_padding"
-          android:layout_marginStart="@dimen/blocked_number_container_padding"
-          android:layout_marginEnd="@dimen/blocked_number_container_padding"
-          android:layout_gravity="end"
-          android:text="@string/migrate_blocked_numbers_dialog_allow_button"/>
-
-        <View
-          style="@style/FullWidthDivider"/>
-
-      </LinearLayout>
-
-      <View
-        android:id="@+id/blocked_number_list_divider"
-        android:layout_width="match_parent"
-        android:layout_height="1dp"
-        android:layout_marginStart="72dp"
-        android:background="@color/dialer_divider_line_color"/>
-
-    </LinearLayout>
-
-  </android.support.v7.widget.CardView>
-
-</LinearLayout>
diff --git a/java/com/android/dialer/app/res/layout/blocked_number_item.xml b/java/com/android/dialer/app/res/layout/blocked_number_item.xml
deleted file mode 100644
index 921c476..0000000
--- a/java/com/android/dialer/app/res/layout/blocked_number_item.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<LinearLayout
-  xmlns:android="http://schemas.android.com/apk/res/android"
-  android:id="@+id/caller_information"
-  android:layout_width="match_parent"
-  android:layout_height="wrap_content"
-  android:paddingStart="@dimen/blocked_number_horizontal_margin"
-  android:background="@android:color/white"
-  android:baselineAligned="false"
-  android:focusable="true"
-  android:gravity="center_vertical"
-  android:orientation="horizontal">
-
-  <QuickContactBadge
-    android:id="@+id/quick_contact_photo"
-    android:layout_width="@dimen/contact_photo_size"
-    android:layout_height="@dimen/contact_photo_size"
-    android:layout_marginTop="@dimen/blocked_number_top_margin"
-    android:layout_marginBottom="@dimen/blocked_number_bottom_margin"
-    android:focusable="true"/>
-  <LinearLayout
-    android:layout_width="0dp"
-    android:layout_height="match_parent"
-    android:layout_weight="1"
-    android:layout_marginStart="@dimen/blocked_number_horizontal_margin"
-    android:gravity="center_vertical"
-    android:orientation="vertical">
-
-    <TextView
-      android:id="@+id/caller_name"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:includeFontPadding="false"
-      style="@style/Dialer.TextAppearance.Primary.Ellipsize"/>
-
-    <TextView
-      android:id="@+id/caller_number"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      style="@style/Dialer.TextAppearance.Secondary.Ellipsize"/>
-  </LinearLayout>
-
-  <ImageView
-    android:id="@+id/delete_button"
-    android:layout_width="@dimen/blocked_number_delete_icon_size"
-    android:layout_height="@dimen/blocked_number_delete_icon_size"
-    android:layout_marginEnd="24dp"
-    android:background="?android:attr/selectableItemBackgroundBorderless"
-    android:contentDescription="@string/description_blocked_number_list_delete"
-    android:scaleType="center"
-    android:src="@drawable/ic_remove"
-    android:tint="?colorIcon"/>
-</LinearLayout>
diff --git a/java/com/android/dialer/app/res/layout/blocked_numbers_activity.xml b/java/com/android/dialer/app/res/layout/blocked_numbers_activity.xml
deleted file mode 100644
index 0c4874c..0000000
--- a/java/com/android/dialer/app/res/layout/blocked_numbers_activity.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<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_marginTop="@dimen/action_bar_height">
-</FrameLayout>
diff --git a/java/com/android/dialer/app/res/layout/view_numbers_to_import_fragment.xml b/java/com/android/dialer/app/res/layout/view_numbers_to_import_fragment.xml
deleted file mode 100644
index e821c06..0000000
--- a/java/com/android/dialer/app/res/layout/view_numbers_to_import_fragment.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-  android:layout_width="match_parent"
-  android:layout_height="match_parent"
-  android:background="?android:attr/colorBackground"
-  android:orientation="vertical">
-
-  <ListView
-    android:id="@id/android:list"
-    android:layout_width="match_parent"
-    android:layout_height="0dp"
-    android:layout_weight="1"
-    android:divider="@null"
-    android:headerDividersEnabled="false"/>
-
-  <RelativeLayout
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_gravity="bottom"
-    android:paddingTop="8dp"
-    android:paddingBottom="8dp"
-    android:background="@android:color/white">
-
-    <Button
-      android:id="@+id/import_button"
-      style="@style/DialerFlatButtonStyle"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:layout_marginEnd="@dimen/blocked_number_container_padding"
-      android:layout_alignParentEnd="true"
-      android:text="@string/blocked_call_settings_import_button"/>
-
-    <Button
-      android:id="@+id/cancel_button"
-      style="@style/DialerFlatButtonStyle"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:layout_below="@id/import_description"
-      android:layout_toLeftOf="@id/import_button"
-      android:text="@android:string/cancel"/>
-
-  </RelativeLayout>
-
-</LinearLayout>
diff --git a/java/com/android/dialer/app/settings/DialerSettingsActivity.java b/java/com/android/dialer/app/settings/DialerSettingsActivity.java
index 6ffa62a..12331ba 100644
--- a/java/com/android/dialer/app/settings/DialerSettingsActivity.java
+++ b/java/com/android/dialer/app/settings/DialerSettingsActivity.java
@@ -19,8 +19,6 @@
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.net.Uri;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.os.UserManager;
 import android.preference.PreferenceManager;
@@ -34,11 +32,9 @@
 import android.widget.Toast;
 import com.android.dialer.about.AboutPhoneFragment;
 import com.android.dialer.app.R;
-import com.android.dialer.assisteddialing.ConcreteCreator;
-import com.android.dialer.blocking.FilteredNumberCompat;
+import com.android.dialer.blocking.FilteredNumbersUtil;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.compat.telephony.TelephonyManagerCompat;
-import com.android.dialer.configprovider.ConfigProviderComponent;
 import com.android.dialer.lookup.LookupSettingsFragment;
 import com.android.dialer.proguard.UsedByReflection;
 import com.android.dialer.util.PermissionsUtil;
@@ -52,7 +48,6 @@
 public class DialerSettingsActivity extends AppCompatPreferenceActivity {
 
   protected SharedPreferences preferences;
-  private boolean migrationStatusOnBuildHeaders;
   private List<Header> headers;
 
   @Override
@@ -80,13 +75,6 @@
   @Override
   protected void onResume() {
     super.onResume();
-    /*
-     * The blockedCallsHeader need to be recreated if the migration status changed because
-     * the intent needs to be updated.
-     */
-    if (migrationStatusOnBuildHeaders != FilteredNumberCompat.hasMigratedToNewBlocking(this)) {
-      invalidateHeaders();
-    }
   }
 
   @Override
@@ -142,12 +130,12 @@
       phoneAccountSettingsHeader.intent = phoneAccountSettingsIntent;
       target.add(phoneAccountSettingsHeader);
     }
-    if (FilteredNumberCompat.canCurrentUserOpenBlockSettings(this)) {
+    if (FilteredNumbersUtil.canCurrentUserOpenBlockSettings(this)) {
       Header blockedCallsHeader = new Header();
       blockedCallsHeader.titleRes = R.string.manage_blocked_numbers_label;
-      blockedCallsHeader.intent = FilteredNumberCompat.createManageBlockedNumbersIntent(this);
+      blockedCallsHeader.intent = getApplicationContext().getSystemService(TelecomManager.class)
+              .createManageBlockedNumbersIntent();
       target.add(blockedCallsHeader);
-      migrationStatusOnBuildHeaders = FilteredNumberCompat.hasMigratedToNewBlocking(this);
     }
 
     addVoicemailSettings(target, isPrimaryUser);
@@ -163,22 +151,6 @@
       target.add(accessibilitySettingsHeader);
     }
 
-    boolean isAssistedDialingEnabled =
-        ConcreteCreator.isAssistedDialingEnabled(
-            ConfigProviderComponent.get(getApplicationContext()).getConfigProvider());
-    LogUtil.i(
-        "DialerSettingsActivity.onBuildHeaders",
-        "showing assisted dialing header: " + isAssistedDialingEnabled);
-    if (isAssistedDialingEnabled) {
-
-      Header assistedDialingSettingsHeader = new Header();
-      assistedDialingSettingsHeader.titleRes =
-          com.android.dialer.assisteddialing.ui.R.string.assisted_dialing_setting_title;
-      assistedDialingSettingsHeader.intent =
-          new Intent("com.android.dialer.app.settings.SHOW_ASSISTED_DIALING_SETTINGS");
-      target.add(assistedDialingSettingsHeader);
-    }
-
     if (showAbout()) {
       Header aboutPhoneHeader = new Header();
       aboutPhoneHeader.titleRes = R.string.about_phone_label;
@@ -192,12 +164,6 @@
       LogUtil.i("DialerSettingsActivity.addVoicemailSettings", "user not primary user");
       return;
     }
-    if (VERSION.SDK_INT < VERSION_CODES.O) {
-      LogUtil.i(
-          "DialerSettingsActivity.addVoicemailSettings",
-          "Dialer voicemail settings not supported by system");
-      return;
-    }
 
     if (!PermissionsUtil.hasReadPhoneStatePermissions(this)) {
       LogUtil.i("DialerSettingsActivity.addVoicemailSettings", "Missing READ_PHONE_STATE");
diff --git a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
index cf76385..7e71bf4 100644
--- a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
+++ b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
@@ -16,15 +16,11 @@
 
 package com.android.dialer.app.voicemail;
 
-import android.annotation.TargetApi;
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.VisibleForTesting;
-import android.support.v4.os.BuildCompat;
 import android.support.v4.os.UserManagerCompat;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
@@ -42,7 +38,6 @@
  * LegacyVoicemailNotifier}. Will ignore the notification if the account has visual voicemail.
  * Legacy voicemail is the traditional, non-visual, dial-in voicemail.
  */
-@TargetApi(VERSION_CODES.O)
 public class LegacyVoicemailNotificationReceiver extends BroadcastReceiver {
 
   @VisibleForTesting static final String LEGACY_VOICEMAIL_DISMISSED = "legacy_voicemail_dismissed";
@@ -57,18 +52,6 @@
 
     LogUtil.i(
         "LegacyVoicemailNotificationReceiver.onReceive", "received legacy voicemail notification");
-    if (!BuildCompat.isAtLeastO()) {
-      LogUtil.e(
-          "LegacyVoicemailNotificationReceiver.onReceive",
-          "SDK not finalized: SDK_INT="
-              + Build.VERSION.SDK_INT
-              + ", PREVIEW_SDK_INT="
-              + Build.VERSION.PREVIEW_SDK_INT
-              + ", RELEASE="
-              + Build.VERSION.RELEASE_OR_CODENAME);
-      return;
-    }
-
     PhoneAccountHandle phoneAccountHandle =
         Assert.isNotNull(intent.getParcelableExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE));
     int count = intent.getIntExtra(TelephonyManager.EXTRA_NOTIFICATION_COUNT, -1);
diff --git a/java/com/android/dialer/assisteddialing/ConcreteCreator.java b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
index b4f926d..6e14516 100644
--- a/java/com/android/dialer/assisteddialing/ConcreteCreator.java
+++ b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
@@ -22,6 +22,8 @@
 import android.support.annotation.NonNull;
 import android.support.v4.os.UserManagerCompat;
 import android.telephony.TelephonyManager;
+
+import com.android.dialer.R;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProvider;
 import com.android.dialer.configprovider.ConfigProviderComponent;
@@ -35,10 +37,6 @@
  */
 public final class ConcreteCreator {
 
-  // Ceiling set at P (version code 28) because this feature will ship as part of the framework in
-  // Q.
-  public static final int BUILD_CODE_CEILING = 28;
-
   /**
    * Creates a new AssistedDialingMediator
    *
@@ -49,59 +47,7 @@
    */
   public static AssistedDialingMediator createNewAssistedDialingMediator(
       @NonNull TelephonyManager telephonyManager, @NonNull Context context) {
-
-    ConfigProvider configProvider = ConfigProviderComponent.get(context).getConfigProvider();
-
-    if (telephonyManager == null) {
-      LogUtil.i(
-          "ConcreteCreator.createNewAssistedDialingMediator", "provided TelephonyManager was null");
-      throw new NullPointerException("Provided TelephonyManager was null");
-    }
-    if (context == null) {
-      LogUtil.i("ConcreteCreator.createNewAssistedDialingMediator", "provided context was null");
-      throw new NullPointerException("Provided context was null");
-    }
-
-    if (!UserManagerCompat.isUserUnlocked(context)) {
-      // To avoid any issues reading preferences, we disable the feature when the user is in a
-      // locked state.
-      LogUtil.i("ConcreteCreator.createNewAssistedDialingMediator", "user is locked");
-      return new AssistedDialingMediatorStub();
-    }
-
-    if (!isAssistedDialingEnabled(configProvider)) {
-      LogUtil.i("ConcreteCreator.createNewAssistedDialingMediator", "feature not enabled");
-      return new AssistedDialingMediatorStub();
-    }
-
-    if (!PreferenceManager.getDefaultSharedPreferences(context)
-        .getBoolean(context.getString(R.string.assisted_dialing_setting_toggle_key), true)) {
-      LogUtil.i("ConcreteCreator.createNewAssistedDialingMediator", "disabled by local setting");
-
-      return new AssistedDialingMediatorStub();
-    }
-
-    Constraints constraints = new Constraints(context, getCountryCodeProvider(configProvider));
-    return new AssistedDialingMediatorImpl(
-        new LocationDetector(
-            telephonyManager,
-            StrictModeUtils.bypass(
-                () ->
-                    PreferenceManager.getDefaultSharedPreferences(context)
-                        .getString(
-                            context.getString(R.string.assisted_dialing_setting_cc_key), null))),
-        new NumberTransformer(constraints));
-  }
-
-  /** Returns a boolean indicating whether or not the assisted dialing feature is enabled. */
-  public static boolean isAssistedDialingEnabled(@NonNull ConfigProvider configProvider) {
-    if (configProvider == null) {
-      LogUtil.i("ConcreteCreator.isAssistedDialingEnabled", "provided configProvider was null");
-      throw new NullPointerException("Provided configProvider was null");
-    }
-
-    return Build.VERSION.SDK_INT <= BUILD_CODE_CEILING
-        && configProvider.getBoolean("assisted_dialing_enabled", false);
+    return new AssistedDialingMediatorStub();
   }
 
   /**
diff --git a/java/com/android/dialer/assisteddialing/ui/AssistedDialingSettingFragment.java b/java/com/android/dialer/assisteddialing/ui/AssistedDialingSettingFragment.java
index 2da2528..76e6127 100644
--- a/java/com/android/dialer/assisteddialing/ui/AssistedDialingSettingFragment.java
+++ b/java/com/android/dialer/assisteddialing/ui/AssistedDialingSettingFragment.java
@@ -23,6 +23,8 @@
 import android.preference.PreferenceFragment;
 import android.preference.SwitchPreference;
 import android.telephony.TelephonyManager;
+
+import com.android.dialer.R;
 import com.android.dialer.assisteddialing.AssistedDialingMediator;
 import com.android.dialer.assisteddialing.ConcreteCreator;
 import com.android.dialer.assisteddialing.CountryCodeProvider;
diff --git a/java/com/android/dialer/binary/common/DialerApplication.java b/java/com/android/dialer/binary/common/DialerApplication.java
index 0f15025..146c252 100644
--- a/java/com/android/dialer/binary/common/DialerApplication.java
+++ b/java/com/android/dialer/binary/common/DialerApplication.java
@@ -19,9 +19,6 @@
 import android.app.Application;
 import android.os.Trace;
 import android.support.annotation.NonNull;
-import android.support.v4.os.BuildCompat;
-import com.android.dialer.blocking.BlockedNumbersAutoMigrator;
-import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.calllog.CallLogComponent;
 import com.android.dialer.calllog.CallLogFramework;
 import com.android.dialer.calllog.config.CallLogConfig;
@@ -44,21 +41,13 @@
     Trace.beginSection("DialerApplication.onCreate");
     StrictModeComponent.get(this).getDialerStrictMode().onApplicationCreate(this);
     super.onCreate();
-    new BlockedNumbersAutoMigrator(
-            this.getApplicationContext(),
-            new FilteredNumberAsyncQueryHandler(this),
-            DialerExecutorComponent.get(this).dialerExecutorFactory())
-        .asyncAutoMigrate();
     new CallRecordingAutoMigrator(
             this.getApplicationContext(),
             DialerExecutorComponent.get(this).dialerExecutorFactory())
         .asyncAutoMigrate();
     initializeAnnotatedCallLog();
     PersistentLogger.initialize(this);
-
-    if (BuildCompat.isAtLeastO()) {
-      NotificationChannelManager.initChannels(this);
-    }
+    NotificationChannelManager.initChannels(this);
     Trace.endSection();
   }
 
diff --git a/java/com/android/dialer/blocking/AndroidManifest.xml b/java/com/android/dialer/blocking/AndroidManifest.xml
index fb811ea..c71c491 100644
--- a/java/com/android/dialer/blocking/AndroidManifest.xml
+++ b/java/com/android/dialer/blocking/AndroidManifest.xml
@@ -15,13 +15,6 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.android.dialer.blocking">
 
-  <application>
+  <application />
 
-  <provider
-      android:authorities="com.android.dialer.blocking.filterednumberprovider"
-      android:exported="false"
-      android:multiprocess="false"
-      android:name="com.android.dialer.blocking.FilteredNumberProvider"/>
-
-  </application>
 </manifest>
diff --git a/java/com/android/dialer/blocking/BlockNumberDialogFragment.java b/java/com/android/dialer/blocking/BlockNumberDialogFragment.java
deleted file mode 100644
index de974cb..0000000
--- a/java/com/android/dialer/blocking/BlockNumberDialogFragment.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * 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.blocking;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.FragmentManager;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.DialogInterface;
-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;
-import com.android.contacts.common.util.ContactDisplayUtils;
-import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnBlockNumberListener;
-import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnUnblockNumberListener;
-import com.android.dialer.logging.InteractionEvent;
-import com.android.dialer.logging.Logger;
-import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker;
-
-/**
- * Fragment for confirming and enacting blocking/unblocking a number. Also invokes snackbar
- * providing undo functionality.
- */
-@Deprecated
-public class BlockNumberDialogFragment extends DialogFragment {
-
-  private static final String BLOCK_DIALOG_FRAGMENT = "BlockNumberDialog";
-  private static final String ARG_BLOCK_ID = "argBlockId";
-  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 number;
-  private String displayNumber;
-  private String countryIso;
-  private FilteredNumberAsyncQueryHandler handler;
-  private View parentView;
-  private VisualVoicemailEnabledChecker voicemailEnabledChecker;
-  private Callback callback;
-
-  public static BlockNumberDialogFragment show(
-      Integer blockId,
-      String number,
-      String countryIso,
-      String displayNumber,
-      Integer parentViewId,
-      FragmentManager fragmentManager,
-      Callback callback) {
-    final BlockNumberDialogFragment newFragment =
-        BlockNumberDialogFragment.newInstance(
-            blockId, number, countryIso, displayNumber, parentViewId);
-
-    newFragment.setCallback(callback);
-    newFragment.show(fragmentManager, BlockNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
-    return newFragment;
-  }
-
-  private static BlockNumberDialogFragment newInstance(
-      Integer blockId,
-      String number,
-      String countryIso,
-      String displayNumber,
-      Integer parentViewId) {
-    final BlockNumberDialogFragment fragment = new BlockNumberDialogFragment();
-    final Bundle args = new Bundle();
-    if (blockId != null) {
-      args.putInt(ARG_BLOCK_ID, blockId.intValue());
-    }
-    if (parentViewId != null) {
-      args.putInt(ARG_PARENT_VIEW_ID, parentViewId.intValue());
-    }
-    args.putString(ARG_NUMBER, number);
-    args.putString(ARG_COUNTRY_ISO, countryIso);
-    args.putString(ARG_DISPLAY_NUMBER, displayNumber);
-    fragment.setArguments(args);
-    return fragment;
-  }
-
-  public void setFilteredNumberAsyncQueryHandlerForTesting(
-      FilteredNumberAsyncQueryHandler handler) {
-    this.handler = handler;
-  }
-
-  @Override
-  public Context getContext() {
-    return getActivity();
-  }
-
-  @Override
-  public Dialog onCreateDialog(Bundle savedInstanceState) {
-    super.onCreateDialog(savedInstanceState);
-    final boolean isBlocked = getArguments().containsKey(ARG_BLOCK_ID);
-
-    number = getArguments().getString(ARG_NUMBER);
-    displayNumber = getArguments().getString(ARG_DISPLAY_NUMBER);
-    countryIso = getArguments().getString(ARG_COUNTRY_ISO);
-
-    if (TextUtils.isEmpty(displayNumber)) {
-      displayNumber = number;
-    }
-
-    handler = new FilteredNumberAsyncQueryHandler(getContext());
-    voicemailEnabledChecker = new VisualVoicemailEnabledChecker(getActivity(), null);
-    // Choose not to update VoicemailEnabledChecker, as checks should already been done in
-    // all current use cases.
-    parentView = getActivity().findViewById(getArguments().getInt(ARG_PARENT_VIEW_ID));
-
-    CharSequence title;
-    String okText;
-    String message;
-    if (isBlocked) {
-      title = null;
-      okText = getString(R.string.unblock_number_ok);
-      message =
-          ContactDisplayUtils.getTtsSpannedPhoneNumber(
-                  getResources(), R.string.unblock_number_confirmation_title, displayNumber)
-              .toString();
-    } else {
-      title =
-          ContactDisplayUtils.getTtsSpannedPhoneNumber(
-              getResources(), R.string.old_block_number_confirmation_title, displayNumber);
-      okText = getString(R.string.block_number_ok);
-      if (FilteredNumberCompat.useNewFiltering(getContext())) {
-        message = getString(R.string.block_number_confirmation_message_new_filtering);
-      } else if (voicemailEnabledChecker.isVisualVoicemailEnabled()) {
-        message = getString(R.string.block_number_confirmation_message_vvm);
-      } else {
-        message = getString(R.string.block_number_confirmation_message_no_vvm);
-      }
-    }
-
-    AlertDialog.Builder builder =
-        new AlertDialog.Builder(getActivity())
-            .setTitle(title)
-            .setMessage(message)
-            .setPositiveButton(
-                okText,
-                new DialogInterface.OnClickListener() {
-                  @Override
-                  public void onClick(DialogInterface dialog, int id) {
-                    if (isBlocked) {
-                      unblockNumber();
-                    } else {
-                      blockNumber();
-                    }
-                  }
-                })
-            .setNegativeButton(android.R.string.cancel, null);
-    return builder.create();
-  }
-
-  @Override
-  public void onActivityCreated(Bundle savedInstanceState) {
-    super.onActivityCreated(savedInstanceState);
-    String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
-    if (!FilteredNumbersUtil.canBlockNumber(getContext(), e164Number, number)) {
-      dismiss();
-      Toast.makeText(
-              getContext(),
-              ContactDisplayUtils.getTtsSpannedPhoneNumber(
-                  getResources(), R.string.invalidNumber, displayNumber),
-              Toast.LENGTH_SHORT)
-          .show();
-    }
-  }
-
-  @Override
-  public void onPause() {
-    // Dismiss on rotation.
-    dismiss();
-    callback = null;
-
-    super.onPause();
-  }
-
-  public void setCallback(Callback callback) {
-    this.callback = callback;
-  }
-
-  private CharSequence getBlockedMessage() {
-    return ContactDisplayUtils.getTtsSpannedPhoneNumber(
-        getResources(), R.string.snackbar_number_blocked, displayNumber);
-  }
-
-  private CharSequence getUnblockedMessage() {
-    return ContactDisplayUtils.getTtsSpannedPhoneNumber(
-        getResources(), R.string.snackbar_number_unblocked, displayNumber);
-  }
-
-  private int getActionTextColor() {
-    return getContext().getResources().getColor(R.color.dialer_snackbar_action_text_color);
-  }
-
-  private void blockNumber() {
-    final CharSequence message = getBlockedMessage();
-    final CharSequence undoMessage = getUnblockedMessage();
-    final Callback callback = this.callback;
-    final int actionTextColor = getActionTextColor();
-    final Context applicationContext = getContext().getApplicationContext();
-
-    final OnUnblockNumberListener onUndoListener =
-        new OnUnblockNumberListener() {
-          @Override
-          public void onUnblockComplete(int rows, ContentValues values) {
-            Snackbar.make(parentView, undoMessage, Snackbar.LENGTH_LONG).show();
-            if (callback != null) {
-              callback.onChangeFilteredNumberUndo();
-            }
-          }
-        };
-
-    final OnBlockNumberListener onBlockNumberListener =
-        new OnBlockNumberListener() {
-          @Override
-          public void onBlockComplete(final Uri uri) {
-            final View.OnClickListener undoListener =
-                new View.OnClickListener() {
-                  @Override
-                  public void onClick(View view) {
-                    // Delete the newly created row on 'undo'.
-                    Logger.get(applicationContext)
-                        .logInteraction(InteractionEvent.Type.UNDO_BLOCK_NUMBER);
-                    handler.unblock(onUndoListener, uri);
-                  }
-                };
-
-            Snackbar.make(parentView, message, Snackbar.LENGTH_LONG)
-                .setAction(R.string.snackbar_undo, undoListener)
-                .setActionTextColor(actionTextColor)
-                .show();
-
-            if (callback != null) {
-              callback.onFilterNumberSuccess();
-            }
-
-            if (FilteredNumbersUtil.hasRecentEmergencyCall(applicationContext)) {
-              FilteredNumbersUtil.maybeNotifyCallBlockingDisabled(applicationContext);
-            }
-          }
-        };
-
-    handler.blockNumber(onBlockNumberListener, number, countryIso);
-  }
-
-  private void unblockNumber() {
-    final CharSequence message = getUnblockedMessage();
-    final CharSequence undoMessage = getBlockedMessage();
-    final Callback callback = this.callback;
-    final int actionTextColor = getActionTextColor();
-    final Context applicationContext = getContext().getApplicationContext();
-
-    final OnBlockNumberListener onUndoListener =
-        new OnBlockNumberListener() {
-          @Override
-          public void onBlockComplete(final Uri uri) {
-            Snackbar.make(parentView, undoMessage, Snackbar.LENGTH_LONG).show();
-            if (callback != null) {
-              callback.onChangeFilteredNumberUndo();
-            }
-          }
-        };
-
-    handler.unblock(
-        new OnUnblockNumberListener() {
-          @Override
-          public void onUnblockComplete(int rows, final ContentValues values) {
-            final View.OnClickListener undoListener =
-                new View.OnClickListener() {
-                  @Override
-                  public void onClick(View view) {
-                    // Re-insert the row on 'undo', with a new ID.
-                    Logger.get(applicationContext)
-                        .logInteraction(InteractionEvent.Type.UNDO_UNBLOCK_NUMBER);
-                    handler.blockNumber(onUndoListener, values);
-                  }
-                };
-
-            Snackbar.make(parentView, message, Snackbar.LENGTH_LONG)
-                .setAction(R.string.snackbar_undo, undoListener)
-                .setActionTextColor(actionTextColor)
-                .show();
-
-            if (callback != null) {
-              callback.onUnfilterNumberSuccess();
-            }
-          }
-        },
-        getArguments().getInt(ARG_BLOCK_ID));
-  }
-
-  /**
-   * Use a callback interface to update UI after success/undo. Favor this approach over other more
-   * standard paradigms because of the variety of scenarios in which the DialogFragment can be
-   * invoked (by an Activity, by a fragment, by an adapter, by an adapter list item). Because of
-   * this, we do NOT support retaining state on rotation, and will dismiss the dialog upon rotation
-   * instead.
-   */
-  public interface Callback {
-
-    /** Called when a number is successfully added to the set of filtered numbers */
-    void onFilterNumberSuccess();
-
-    /** Called when a number is successfully removed from the set of filtered numbers */
-    void onUnfilterNumberSuccess();
-
-    /** Called when the action of filtering or unfiltering a number is undone */
-    void onChangeFilteredNumberUndo();
-  }
-}
diff --git a/java/com/android/dialer/blocking/BlockedNumbersAutoMigrator.java b/java/com/android/dialer/blocking/BlockedNumbersAutoMigrator.java
deleted file mode 100644
index 8a57f29..0000000
--- a/java/com/android/dialer/blocking/BlockedNumbersAutoMigrator.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2016 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.blocking;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.os.UserManagerCompat;
-import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
-import com.android.dialer.common.Assert;
-import com.android.dialer.common.LogUtil;
-import com.android.dialer.common.concurrent.DialerExecutor.Worker;
-import com.android.dialer.common.concurrent.DialerExecutorFactory;
-
-/**
- * Class responsible for checking if the user can be auto-migrated to {@link
- * android.provider.BlockedNumberContract} blocking. In order for this to happen, the user cannot
- * have any numbers that are blocked in the Dialer solution.
- */
-@Deprecated
-public class BlockedNumbersAutoMigrator {
-
-  static final String HAS_CHECKED_AUTO_MIGRATE_KEY = "checkedAutoMigrate";
-
-  @NonNull private final Context appContext;
-  @NonNull private final FilteredNumberAsyncQueryHandler queryHandler;
-  @NonNull private final DialerExecutorFactory dialerExecutorFactory;
-
-  /**
-   * Constructs the BlockedNumbersAutoMigrator with the given {@link
-   * FilteredNumberAsyncQueryHandler}.
-   *
-   * @param queryHandler The FilteredNumberAsyncQueryHandler used to determine if there are blocked
-   *     numbers.
-   * @throws NullPointerException if sharedPreferences or queryHandler are null.
-   */
-  public BlockedNumbersAutoMigrator(
-      @NonNull Context appContext,
-      @NonNull FilteredNumberAsyncQueryHandler queryHandler,
-      @NonNull DialerExecutorFactory dialerExecutorFactory) {
-    this.appContext = Assert.isNotNull(appContext);
-    this.queryHandler = Assert.isNotNull(queryHandler);
-    this.dialerExecutorFactory = Assert.isNotNull(dialerExecutorFactory);
-  }
-
-  public void asyncAutoMigrate() {
-    dialerExecutorFactory
-        .createNonUiTaskBuilder(new ShouldAttemptAutoMigrate(appContext))
-        .onSuccess(this::autoMigrate)
-        .build()
-        .executeParallel(null);
-  }
-
-  /**
-   * Attempts to perform the auto-migration. Auto-migration will only be attempted once and can be
-   * performed only when the user has no blocked numbers. As a result of this method, the user will
-   * be migrated to the framework blocking solution if blocked numbers don't exist.
-   */
-  private void autoMigrate(boolean shouldAttemptAutoMigrate) {
-    if (!shouldAttemptAutoMigrate) {
-      return;
-    }
-
-    LogUtil.i("BlockedNumbersAutoMigrator", "attempting to auto-migrate.");
-    queryHandler.hasBlockedNumbers(
-        new OnHasBlockedNumbersListener() {
-          @Override
-          public void onHasBlockedNumbers(boolean hasBlockedNumbers) {
-            if (hasBlockedNumbers) {
-              LogUtil.i("BlockedNumbersAutoMigrator", "not auto-migrating: blocked numbers exist.");
-              return;
-            }
-            LogUtil.i("BlockedNumbersAutoMigrator", "auto-migrating: no blocked numbers.");
-            FilteredNumberCompat.setHasMigratedToNewBlocking(appContext, true);
-          }
-        });
-  }
-
-  private static class ShouldAttemptAutoMigrate implements Worker<Void, Boolean> {
-    private final Context appContext;
-
-    ShouldAttemptAutoMigrate(Context appContext) {
-      this.appContext = appContext;
-    }
-
-    @Nullable
-    @Override
-    public Boolean doInBackground(@Nullable Void input) {
-      if (!UserManagerCompat.isUserUnlocked(appContext)) {
-        LogUtil.i("BlockedNumbersAutoMigrator", "not attempting auto-migrate: device is locked");
-        return false;
-      }
-      SharedPreferences sharedPreferences =
-          PreferenceManager.getDefaultSharedPreferences(appContext);
-
-      if (sharedPreferences.contains(HAS_CHECKED_AUTO_MIGRATE_KEY)) {
-        LogUtil.v(
-            "BlockedNumbersAutoMigrator", "not attempting auto-migrate: already checked once.");
-        return false;
-      }
-
-      if (!FilteredNumberCompat.canAttemptBlockOperations(appContext)) {
-        // This may be the case where the user is on the lock screen, so we shouldn't record that
-        // the migration status was checked.
-        LogUtil.i(
-            "BlockedNumbersAutoMigrator", "not attempting auto-migrate: current user can't block");
-        return false;
-      }
-      LogUtil.i(
-          "BlockedNumbersAutoMigrator", "updating state as already checked for auto-migrate.");
-      sharedPreferences.edit().putBoolean(HAS_CHECKED_AUTO_MIGRATE_KEY, true).apply();
-
-      if (!FilteredNumberCompat.canUseNewFiltering()) {
-        LogUtil.i("BlockedNumbersAutoMigrator", "not attempting auto-migrate: not available.");
-        return false;
-      }
-
-      if (FilteredNumberCompat.hasMigratedToNewBlocking(appContext)) {
-        LogUtil.i("BlockedNumbersAutoMigrator", "not attempting auto-migrate: already migrated.");
-        return false;
-      }
-      return true;
-    }
-  }
-}
diff --git a/java/com/android/dialer/blocking/BlockedNumbersMigrator.java b/java/com/android/dialer/blocking/BlockedNumbersMigrator.java
deleted file mode 100644
index ef047a0..0000000
--- a/java/com/android/dialer/blocking/BlockedNumbersMigrator.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * 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.blocking;
-
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.os.AsyncTask;
-import android.provider.BlockedNumberContract.BlockedNumbers;
-import com.android.dialer.common.LogUtil;
-import com.android.dialer.database.FilteredNumberContract;
-import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
-import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
-import java.util.Objects;
-
-/**
- * Class which should be used to migrate numbers from {@link FilteredNumberContract} blocking to
- * {@link android.provider.BlockedNumberContract} blocking.
- */
-@Deprecated
-public class BlockedNumbersMigrator {
-
-  private final Context context;
-
-  /**
-   * Creates a new BlockedNumbersMigrate, using the given {@link ContentResolver} to perform queries
-   * against the blocked numbers tables.
-   */
-  public BlockedNumbersMigrator(Context context) {
-    this.context = Objects.requireNonNull(context);
-  }
-
-  private static boolean migrateToNewBlockingInBackground(ContentResolver resolver) {
-    try (Cursor cursor =
-        resolver.query(
-            FilteredNumber.CONTENT_URI,
-            new String[] {FilteredNumberColumns.NUMBER},
-            null,
-            null,
-            null)) {
-      if (cursor == null) {
-        LogUtil.i(
-            "BlockedNumbersMigrator.migrateToNewBlockingInBackground", "migrate - cursor was null");
-        return false;
-      }
-
-      LogUtil.i(
-          "BlockedNumbersMigrator.migrateToNewBlockingInBackground",
-          "migrate - attempting to migrate " + cursor.getCount() + "numbers");
-
-      int numMigrated = 0;
-      while (cursor.moveToNext()) {
-        String originalNumber =
-            cursor.getString(cursor.getColumnIndex(FilteredNumberColumns.NUMBER));
-        if (isNumberInNewBlocking(resolver, originalNumber)) {
-          LogUtil.i(
-              "BlockedNumbersMigrator.migrateToNewBlockingInBackground",
-              "migrate - number was already blocked in new blocking");
-          continue;
-        }
-        ContentValues values = new ContentValues();
-        values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, originalNumber);
-        resolver.insert(BlockedNumbers.CONTENT_URI, values);
-        ++numMigrated;
-      }
-      LogUtil.i(
-          "BlockedNumbersMigrator.migrateToNewBlockingInBackground",
-          "migrate - migration complete. " + numMigrated + " numbers migrated.");
-      return true;
-    }
-  }
-
-  private static boolean isNumberInNewBlocking(ContentResolver resolver, String originalNumber) {
-    try (Cursor cursor =
-        resolver.query(
-            BlockedNumbers.CONTENT_URI,
-            new String[] {BlockedNumbers.COLUMN_ID},
-            BlockedNumbers.COLUMN_ORIGINAL_NUMBER + " = ?",
-            new String[] {originalNumber},
-            null)) {
-      return cursor != null && cursor.getCount() != 0;
-    }
-  }
-
-  /**
-   * Copies all of the numbers in the {@link FilteredNumberContract} block list to the {@link
-   * android.provider.BlockedNumberContract} block list.
-   *
-   * @param listener {@link Listener} called once the migration is complete.
-   * @return {@code true} if the migrate can be attempted, {@code false} otherwise.
-   * @throws NullPointerException if listener is null
-   */
-  public boolean migrate(final Listener listener) {
-    LogUtil.i("BlockedNumbersMigrator.migrate", "migrate - start");
-    if (!FilteredNumberCompat.canUseNewFiltering()) {
-      LogUtil.i("BlockedNumbersMigrator.migrate", "migrate - can't use new filtering");
-      return false;
-    }
-    Objects.requireNonNull(listener);
-    new MigratorTask(listener).execute();
-    return true;
-  }
-
-  /**
-   * Listener for the operation to migrate from {@link FilteredNumberContract} blocking to {@link
-   * android.provider.BlockedNumberContract} blocking.
-   */
-  public interface Listener {
-
-    /** Called when the migration operation is finished. */
-    void onComplete();
-  }
-
-  private class MigratorTask extends AsyncTask<Void, Void, Boolean> {
-
-    private final Listener listener;
-
-    public MigratorTask(Listener listener) {
-      this.listener = listener;
-    }
-
-    @Override
-    protected Boolean doInBackground(Void... params) {
-      LogUtil.i("BlockedNumbersMigrator.doInBackground", "migrate - start background migration");
-      return migrateToNewBlockingInBackground(context.getContentResolver());
-    }
-
-    @Override
-    protected void onPostExecute(Boolean isSuccessful) {
-      LogUtil.i("BlockedNumbersMigrator.onPostExecute", "migrate - marking migration complete");
-      FilteredNumberCompat.setHasMigratedToNewBlocking(context, isSuccessful);
-      LogUtil.i("BlockedNumbersMigrator.onPostExecute", "migrate - calling listener");
-      listener.onComplete();
-    }
-  }
-}
diff --git a/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java b/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java
index 08526ef..e7cbbcb 100644
--- a/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java
+++ b/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java
@@ -17,12 +17,14 @@
 package com.android.dialer.blocking;
 
 import android.content.AsyncQueryHandler;
+import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
 import android.database.Cursor;
 import android.database.DatabaseUtils;
 import android.database.sqlite.SQLiteDatabaseCorruptException;
 import android.net.Uri;
+import android.provider.BlockedNumberContract.BlockedNumbers;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
 import android.support.v4.os.UserManagerCompat;
@@ -30,9 +32,8 @@
 import android.text.TextUtils;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
-import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
-import com.android.dialer.database.FilteredNumberContract.FilteredNumberTypes;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 
 /** TODO(calderwoodra): documentation */
@@ -88,28 +89,6 @@
     }
   }
 
-  void hasBlockedNumbers(final OnHasBlockedNumbersListener listener) {
-    if (!FilteredNumberCompat.canAttemptBlockOperations(context)) {
-      listener.onHasBlockedNumbers(false);
-      return;
-    }
-    startQuery(
-        NO_TOKEN,
-        new Listener() {
-          @Override
-          protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
-            listener.onHasBlockedNumbers(cursor != null && cursor.getCount() > 0);
-          }
-        },
-        FilteredNumberCompat.getContentUri(context, null),
-        new String[] {FilteredNumberCompat.getIdColumnName(context)},
-        FilteredNumberCompat.useNewFiltering(context)
-            ? null
-            : FilteredNumberColumns.TYPE + "=" + FilteredNumberTypes.BLOCKED_NUMBER,
-        null,
-        null);
-  }
-
   /**
    * Checks if the given number is blocked, calling the given {@link OnCheckBlockedListener} with
    * the id for the blocked number, {@link #INVALID_ID}, or {@code null} based on the result of the
@@ -121,7 +100,7 @@
       listener.onCheckComplete(INVALID_ID);
       return;
     }
-    if (!FilteredNumberCompat.canAttemptBlockOperations(context)) {
+    if (!FilteredNumbersUtil.canAttemptBlockOperations(context)) {
       listener.onCheckComplete(null);
       return;
     }
@@ -146,7 +125,7 @@
     }
 
     String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
-    String formattedNumber = FilteredNumbersUtil.getBlockableNumber(context, e164Number, number);
+    String formattedNumber = FilteredNumbersUtil.getBlockableNumber(e164Number, number);
     if (TextUtils.isEmpty(formattedNumber)) {
       listener.onCheckComplete(INVALID_ID);
       blockedNumberCache.put(number, INVALID_ID);
@@ -170,25 +149,13 @@
               return;
             }
             cursor.moveToFirst();
-            // New filtering doesn't have a concept of type
-            if (!FilteredNumberCompat.useNewFiltering(context)
-                && cursor.getInt(cursor.getColumnIndex(FilteredNumberColumns.TYPE))
-                    != FilteredNumberTypes.BLOCKED_NUMBER) {
-              blockedNumberCache.put(number, BLOCKED_NUMBER_CACHE_NULL_ID);
-              listener.onCheckComplete(null);
-              return;
-            }
-            Integer blockedId = cursor.getInt(cursor.getColumnIndex(FilteredNumberColumns._ID));
+            Integer blockedId = cursor.getInt(cursor.getColumnIndex(BlockedNumbers.COLUMN_ID));
             blockedNumberCache.put(number, blockedId);
             listener.onCheckComplete(blockedId);
           }
         },
-        FilteredNumberCompat.getContentUri(context, null),
-        FilteredNumberCompat.filter(
-            new String[] {
-              FilteredNumberCompat.getIdColumnName(context),
-              FilteredNumberCompat.getTypeColumnName(context)
-            }),
+        BlockedNumbers.CONTENT_URI,
+        new String[] {BlockedNumbers.COLUMN_ID},
         getIsBlockedNumberSelection(e164Number != null) + " = ?",
         new String[] {formattedNumber},
         null);
@@ -205,7 +172,7 @@
     if (number == null) {
       return null;
     }
-    if (!FilteredNumberCompat.canAttemptBlockOperations(context)) {
+    if (!FilteredNumbersUtil.canAttemptBlockOperations(context)) {
       return null;
     }
     Integer cachedId = blockedNumberCache.get(number);
@@ -217,7 +184,7 @@
     }
 
     String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
-    String formattedNumber = FilteredNumbersUtil.getBlockableNumber(context, e164Number, number);
+    String formattedNumber = FilteredNumbersUtil.getBlockableNumber(e164Number, number);
     if (TextUtils.isEmpty(formattedNumber)) {
       return null;
     }
@@ -226,12 +193,8 @@
         context
             .getContentResolver()
             .query(
-                FilteredNumberCompat.getContentUri(context, null),
-                FilteredNumberCompat.filter(
-                    new String[] {
-                      FilteredNumberCompat.getIdColumnName(context),
-                      FilteredNumberCompat.getTypeColumnName(context)
-                    }),
+                BlockedNumbers.CONTENT_URI,
+                new String[] {BlockedNumbers.COLUMN_ID},
                 getIsBlockedNumberSelection(e164Number != null) + " = ?",
                 new String[] {formattedNumber},
                 null)) {
@@ -246,7 +209,7 @@
         return null;
       }
       cursor.moveToFirst();
-      int blockedId = cursor.getInt(cursor.getColumnIndex(FilteredNumberColumns._ID));
+      int blockedId = cursor.getInt(cursor.getColumnIndex(BlockedNumbers.COLUMN_ID));
       blockedNumberCache.put(number, blockedId);
       return blockedId;
     } catch (SecurityException e) {
@@ -266,27 +229,17 @@
    * number is e164 or not.
    */
   private String getIsBlockedNumberSelection(boolean isE164Number) {
-    if (FilteredNumberCompat.useNewFiltering(context) && !isE164Number) {
-      return FilteredNumberCompat.getOriginalNumberColumnName(context);
+    if (!isE164Number) {
+      return BlockedNumbers.COLUMN_ORIGINAL_NUMBER;
     }
-    return FilteredNumberCompat.getE164NumberColumnName(context);
-  }
-
-  public void blockNumber(
-      final OnBlockNumberListener listener, String number, @Nullable String countryIso) {
-    blockNumber(listener, null, number, countryIso);
+    return BlockedNumbers.COLUMN_E164_NUMBER;
   }
 
   /** Add a number manually blocked by the user. */
-  public void blockNumber(
-      final OnBlockNumberListener listener,
-      @Nullable String normalizedNumber,
-      String number,
-      @Nullable String countryIso) {
-    blockNumber(
-        listener,
-        FilteredNumberCompat.newBlockNumberContentValues(
-            context, number, normalizedNumber, countryIso));
+  public void blockNumber(final OnBlockNumberListener listener, String number) {
+    ContentValues contentValues = new ContentValues();
+    contentValues.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, Objects.requireNonNull(number));
+    blockNumber(listener, contentValues);
   }
 
   /**
@@ -295,7 +248,7 @@
    */
   public void blockNumber(final OnBlockNumberListener listener, ContentValues values) {
     blockedNumberCache.clear();
-    if (!FilteredNumberCompat.canAttemptBlockOperations(context)) {
+    if (!FilteredNumbersUtil.canAttemptBlockOperations(context)) {
       if (listener != null) {
         listener.onBlockComplete(null);
       }
@@ -311,7 +264,7 @@
             }
           }
         },
-        FilteredNumberCompat.getContentUri(context, null),
+        BlockedNumbers.CONTENT_URI,
         values);
   }
 
@@ -326,7 +279,7 @@
     if (id == null) {
       throw new IllegalArgumentException("Null id passed into unblock");
     }
-    unblock(listener, FilteredNumberCompat.getContentUri(context, id));
+    unblock(listener, ContentUris.withAppendedId(BlockedNumbers.CONTENT_URI, id));
   }
 
   /**
@@ -338,7 +291,7 @@
    */
   public void unblock(@Nullable final OnUnblockNumberListener listener, final Uri uri) {
     blockedNumberCache.clear();
-    if (!FilteredNumberCompat.canAttemptBlockOperations(context)) {
+    if (!FilteredNumbersUtil.canAttemptBlockOperations(context)) {
       if (listener != null) {
         listener.onUnblockComplete(0, null);
       }
@@ -357,7 +310,7 @@
             cursor.moveToFirst();
             final ContentValues values = new ContentValues();
             DatabaseUtils.cursorRowToContentValues(cursor, values);
-            values.remove(FilteredNumberCompat.getIdColumnName(context));
+            values.remove(BlockedNumbers.COLUMN_ID);
 
             startDelete(
                 NO_TOKEN,
@@ -415,16 +368,6 @@
     void onUnblockComplete(int rows, ContentValues values);
   }
 
-  /** TODO(calderwoodra): documentation */
-  interface OnHasBlockedNumbersListener {
-
-    /**
-     * @param hasBlockedNumbers {@code true} if any blocked numbers are stored. {@code false}
-     *     otherwise.
-     */
-    void onHasBlockedNumbers(boolean hasBlockedNumbers);
-  }
-
   /** Methods for FilteredNumberAsyncQueryHandler result returns. */
   private abstract static class Listener {
 
diff --git a/java/com/android/dialer/blocking/FilteredNumberCompat.java b/java/com/android/dialer/blocking/FilteredNumberCompat.java
deleted file mode 100644
index 71af340..0000000
--- a/java/com/android/dialer/blocking/FilteredNumberCompat.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright (C) 2016 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.blocking;
-
-import android.app.FragmentManager;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.preference.PreferenceManager;
-import android.provider.BlockedNumberContract;
-import android.provider.BlockedNumberContract.BlockedNumbers;
-import android.support.annotation.Nullable;
-import android.support.annotation.VisibleForTesting;
-import android.telecom.TelecomManager;
-import android.telephony.PhoneNumberUtils;
-import com.android.dialer.common.LogUtil;
-import com.android.dialer.configprovider.ConfigProviderComponent;
-import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
-import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
-import com.android.dialer.database.FilteredNumberContract.FilteredNumberSources;
-import com.android.dialer.database.FilteredNumberContract.FilteredNumberTypes;
-import com.android.dialer.strictmode.StrictModeUtils;
-import com.android.dialer.telecom.TelecomUtil;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Compatibility class to encapsulate logic to switch between call blocking using {@link
- * com.android.dialer.database.FilteredNumberContract} and using {@link
- * android.provider.BlockedNumberContract}. This class should be used rather than explicitly
- * referencing columns from either contract class in situations where both blocking solutions may be
- * used.
- */
-@Deprecated
-public class FilteredNumberCompat {
-
-  private static Boolean canAttemptBlockOperationsForTest;
-
-  @VisibleForTesting
-  public static final String HAS_MIGRATED_TO_NEW_BLOCKING_KEY = "migratedToNewBlocking";
-
-  /** @return The column name for ID in the filtered number database. */
-  public static String getIdColumnName(Context context) {
-    return useNewFiltering(context) ? BlockedNumbers.COLUMN_ID : FilteredNumberColumns._ID;
-  }
-
-  /**
-   * @return The column name for type in the filtered number database. Will be {@code null} for the
-   *     framework blocking implementation.
-   */
-  @Nullable
-  public static String getTypeColumnName(Context context) {
-    return useNewFiltering(context) ? null : FilteredNumberColumns.TYPE;
-  }
-
-  /**
-   * @return The column name for source in the filtered number database. Will be {@code null} for
-   *     the framework blocking implementation
-   */
-  @Nullable
-  public static String getSourceColumnName(Context context) {
-    return useNewFiltering(context) ? null : FilteredNumberColumns.SOURCE;
-  }
-
-  /** @return The column name for the original number in the filtered number database. */
-  public static String getOriginalNumberColumnName(Context context) {
-    return useNewFiltering(context)
-        ? BlockedNumbers.COLUMN_ORIGINAL_NUMBER
-        : FilteredNumberColumns.NUMBER;
-  }
-
-  /**
-   * @return The column name for country iso in the filtered number database. Will be {@code null}
-   *     the framework blocking implementation
-   */
-  @Nullable
-  public static String getCountryIsoColumnName(Context context) {
-    return useNewFiltering(context) ? null : FilteredNumberColumns.COUNTRY_ISO;
-  }
-
-  /** @return The column name for the e164 formatted number in the filtered number database. */
-  public static String getE164NumberColumnName(Context context) {
-    return useNewFiltering(context)
-        ? BlockedNumbers.COLUMN_E164_NUMBER
-        : FilteredNumberColumns.NORMALIZED_NUMBER;
-  }
-
-  /**
-   * @return {@code true} if the current SDK version supports using new filtering, {@code false}
-   *     otherwise.
-   */
-  public static boolean canUseNewFiltering() {
-    return true;
-  }
-
-  /**
-   * @return {@code true} if the new filtering should be used, i.e. it's enabled and any necessary
-   *     migration has been performed, {@code false} otherwise.
-   */
-  public static boolean useNewFiltering(Context context) {
-    return !ConfigProviderComponent.get(context)
-            .getConfigProvider()
-            .getBoolean("debug_force_dialer_filtering", false)
-        && canUseNewFiltering()
-        && hasMigratedToNewBlocking(context);
-  }
-
-  /**
-   * @return {@code true} if the user has migrated to use {@link
-   *     android.provider.BlockedNumberContract} blocking, {@code false} otherwise.
-   */
-  public static boolean hasMigratedToNewBlocking(Context context) {
-    return StrictModeUtils.bypass(
-        () ->
-            PreferenceManager.getDefaultSharedPreferences(context)
-                .getBoolean(HAS_MIGRATED_TO_NEW_BLOCKING_KEY, false));
-  }
-
-  /**
-   * Called to inform this class whether the user has fully migrated to use {@link
-   * android.provider.BlockedNumberContract} blocking or not.
-   *
-   * @param hasMigrated {@code true} if the user has migrated, {@code false} otherwise.
-   */
-  public static void setHasMigratedToNewBlocking(Context context, boolean hasMigrated) {
-    PreferenceManager.getDefaultSharedPreferences(context)
-        .edit()
-        .putBoolean(HAS_MIGRATED_TO_NEW_BLOCKING_KEY, hasMigrated)
-        .apply();
-  }
-
-  /**
-   * Gets the content {@link Uri} for number filtering.
-   *
-   * @param id The optional id to append with the base content uri.
-   * @return The Uri for number filtering.
-   */
-  public static Uri getContentUri(Context context, @Nullable Integer id) {
-    if (id == null) {
-      return getBaseUri(context);
-    }
-    return ContentUris.withAppendedId(getBaseUri(context), id);
-  }
-
-  private static Uri getBaseUri(Context context) {
-    // Explicit version check to aid static analysis
-    return useNewFiltering(context) ? BlockedNumbers.CONTENT_URI : FilteredNumber.CONTENT_URI;
-  }
-
-  /**
-   * Removes any null column names from the given projection array. This method is intended to be
-   * used to strip out any column names that aren't available in every version of number blocking.
-   * Example: {@literal getContext().getContentResolver().query( someUri, // Filtering ensures that
-   * no non-existent columns are queried FilteredNumberCompat.filter(new String[]
-   * {FilteredNumberCompat.getIdColumnName(), FilteredNumberCompat.getTypeColumnName()},
-   * FilteredNumberCompat.getE164NumberColumnName() + " = ?", new String[] {e164Number}); }
-   *
-   * @param projection The projection array.
-   * @return The filtered projection array.
-   */
-  @Nullable
-  public static String[] filter(@Nullable String[] projection) {
-    if (projection == null) {
-      return null;
-    }
-    List<String> filtered = new ArrayList<>();
-    for (String column : projection) {
-      if (column != null) {
-        filtered.add(column);
-      }
-    }
-    return filtered.toArray(new String[filtered.size()]);
-  }
-
-  /**
-   * Creates a new {@link ContentValues} suitable for inserting in the filtered number table.
-   *
-   * @param number The unformatted number to insert.
-   * @param e164Number (optional) The number to insert formatted to E164 standard.
-   * @param countryIso (optional) The country iso to use to format the number.
-   * @return The ContentValues to insert.
-   * @throws NullPointerException If number is null.
-   */
-  public static ContentValues newBlockNumberContentValues(
-      Context context, String number, @Nullable String e164Number, @Nullable String countryIso) {
-    ContentValues contentValues = new ContentValues();
-    contentValues.put(getOriginalNumberColumnName(context), Objects.requireNonNull(number));
-    if (!useNewFiltering(context)) {
-      if (e164Number == null) {
-        e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
-      }
-      contentValues.put(getE164NumberColumnName(context), e164Number);
-      contentValues.put(getCountryIsoColumnName(context), countryIso);
-      contentValues.put(getTypeColumnName(context), FilteredNumberTypes.BLOCKED_NUMBER);
-      contentValues.put(getSourceColumnName(context), FilteredNumberSources.USER);
-    }
-    return contentValues;
-  }
-
-  /**
-   * Shows block number migration dialog if necessary.
-   *
-   * @param fragmentManager The {@link FragmentManager} used to show fragments.
-   * @param listener The {@link BlockedNumbersMigrator.Listener} to call when migration is complete.
-   * @return boolean True if migration dialog is shown.
-   */
-  public static boolean maybeShowBlockNumberMigrationDialog(
-      Context context, FragmentManager fragmentManager, BlockedNumbersMigrator.Listener listener) {
-    if (shouldShowMigrationDialog(context)) {
-      LogUtil.i(
-          "FilteredNumberCompat.maybeShowBlockNumberMigrationDialog",
-          "maybeShowBlockNumberMigrationDialog - showing migration dialog");
-      MigrateBlockedNumbersDialogFragment.newInstance(new BlockedNumbersMigrator(context), listener)
-          .show(fragmentManager, "MigrateBlockedNumbers");
-      return true;
-    }
-    return false;
-  }
-
-  private static boolean shouldShowMigrationDialog(Context context) {
-    return canUseNewFiltering() && !hasMigratedToNewBlocking(context);
-  }
-
-  /**
-   * Creates the {@link Intent} which opens the blocked numbers management interface.
-   *
-   * @param context The {@link Context}.
-   * @return The intent.
-   */
-  public static Intent createManageBlockedNumbersIntent(Context context) {
-    // Explicit version check to aid static analysis
-    if (canUseNewFiltering() && hasMigratedToNewBlocking(context)) {
-      return context.getSystemService(TelecomManager.class).createManageBlockedNumbersIntent();
-    }
-    Intent intent = new Intent("com.android.dialer.action.BLOCKED_NUMBERS_SETTINGS");
-    intent.setPackage(context.getPackageName());
-    return intent;
-  }
-
-  /**
-   * Method used to determine if block operations are possible.
-   *
-   * @param context The {@link Context}.
-   * @return {@code true} if the app and user can block numbers, {@code false} otherwise.
-   */
-  public static boolean canAttemptBlockOperations(Context context) {
-    if (canAttemptBlockOperationsForTest != null) {
-      return canAttemptBlockOperationsForTest;
-    }
-
-    // Great Wall blocking, must be primary user and the default or system dialer
-    // TODO(maxwelb): check that we're the system Dialer
-    return TelecomUtil.isDefaultDialer(context)
-        && safeBlockedNumbersContractCanCurrentUserBlockNumbers(context);
-  }
-
-  @VisibleForTesting(otherwise = VisibleForTesting.NONE)
-  public static void setCanAttemptBlockOperationsForTest(boolean canAttempt) {
-    canAttemptBlockOperationsForTest = canAttempt;
-  }
-
-  /**
-   * Used to determine if the call blocking settings can be opened.
-   *
-   * @param context The {@link Context}.
-   * @return {@code true} if the current user can open the call blocking settings, {@code false}
-   *     otherwise.
-   */
-  public static boolean canCurrentUserOpenBlockSettings(Context context) {
-    // BlockedNumberContract blocking, verify through Contract API
-    return TelecomUtil.isDefaultDialer(context)
-        && safeBlockedNumbersContractCanCurrentUserBlockNumbers(context);
-  }
-
-  /**
-   * Calls {@link BlockedNumberContract#canCurrentUserBlockNumbers(Context)} in such a way that it
-   * never throws an exception. While on the CryptKeeper screen, the BlockedNumberContract isn't
-   * available, using this method ensures that the Dialer doesn't crash when on that screen.
-   *
-   * @param context The {@link Context}.
-   * @return the result of BlockedNumberContract#canCurrentUserBlockNumbers, or {@code false} if an
-   *     exception was thrown.
-   */
-  private static boolean safeBlockedNumbersContractCanCurrentUserBlockNumbers(Context context) {
-    try {
-      return BlockedNumberContract.canCurrentUserBlockNumbers(context);
-    } catch (Exception e) {
-      LogUtil.e(
-          "FilteredNumberCompat.safeBlockedNumbersContractCanCurrentUserBlockNumbers",
-          "Exception while querying BlockedNumberContract",
-          e);
-      return false;
-    }
-  }
-}
diff --git a/java/com/android/dialer/blocking/FilteredNumberProvider.java b/java/com/android/dialer/blocking/FilteredNumberProvider.java
deleted file mode 100644
index 547892b..0000000
--- a/java/com/android/dialer/blocking/FilteredNumberProvider.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * 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.blocking;
-
-import android.content.ContentProvider;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.UriMatcher;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteQueryBuilder;
-import android.net.Uri;
-import android.support.annotation.VisibleForTesting;
-import android.text.TextUtils;
-import com.android.dialer.common.LogUtil;
-import com.android.dialer.database.Database;
-import com.android.dialer.database.DialerDatabaseHelper;
-import com.android.dialer.database.FilteredNumberContract;
-import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
-import com.android.dialer.location.GeoUtil;
-
-/** Filtered number content provider. */
-@Deprecated
-public class FilteredNumberProvider extends ContentProvider {
-
-  private static final int FILTERED_NUMBERS_TABLE = 1;
-  private static final int FILTERED_NUMBERS_TABLE_ID = 2;
-  private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
-  private DialerDatabaseHelper dialerDatabaseHelper;
-
-  @Override
-  public boolean onCreate() {
-    dialerDatabaseHelper = Database.get(getContext()).getDatabaseHelper(getContext());
-    if (dialerDatabaseHelper == null) {
-      return false;
-    }
-    uriMatcher.addURI(
-        FilteredNumberContract.AUTHORITY,
-        FilteredNumberContract.FilteredNumber.FILTERED_NUMBERS_TABLE,
-        FILTERED_NUMBERS_TABLE);
-    uriMatcher.addURI(
-        FilteredNumberContract.AUTHORITY,
-        FilteredNumberContract.FilteredNumber.FILTERED_NUMBERS_TABLE + "/#",
-        FILTERED_NUMBERS_TABLE_ID);
-    return true;
-  }
-
-  @Override
-  public Cursor query(
-      Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
-    final SQLiteDatabase db = dialerDatabaseHelper.getReadableDatabase();
-    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
-    qb.setTables(DialerDatabaseHelper.Tables.FILTERED_NUMBER_TABLE);
-    final int match = uriMatcher.match(uri);
-    switch (match) {
-      case FILTERED_NUMBERS_TABLE:
-        break;
-      case FILTERED_NUMBERS_TABLE_ID:
-        qb.appendWhere(FilteredNumberColumns._ID + "=" + ContentUris.parseId(uri));
-        break;
-      default:
-        throw new IllegalArgumentException("Unknown uri: " + uri);
-    }
-    final Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, null);
-    if (c != null) {
-      c.setNotificationUri(
-          getContext().getContentResolver(), FilteredNumberContract.FilteredNumber.CONTENT_URI);
-    } else {
-      LogUtil.d("FilteredNumberProvider.query", "CURSOR WAS NULL");
-    }
-    return c;
-  }
-
-  @Override
-  public String getType(Uri uri) {
-    return FilteredNumberContract.FilteredNumber.CONTENT_ITEM_TYPE;
-  }
-
-  @Override
-  public Uri insert(Uri uri, ContentValues values) {
-    SQLiteDatabase db = dialerDatabaseHelper.getWritableDatabase();
-    setDefaultValues(values);
-    long id = db.insert(DialerDatabaseHelper.Tables.FILTERED_NUMBER_TABLE, null, values);
-    if (id < 0) {
-      return null;
-    }
-    notifyChange(uri);
-    return ContentUris.withAppendedId(uri, id);
-  }
-
-  @VisibleForTesting
-  protected long getCurrentTimeMs() {
-    return System.currentTimeMillis();
-  }
-
-  private void setDefaultValues(ContentValues values) {
-    if (values.getAsString(FilteredNumberColumns.COUNTRY_ISO) == null) {
-      values.put(FilteredNumberColumns.COUNTRY_ISO, GeoUtil.getCurrentCountryIso(getContext()));
-    }
-    if (values.getAsInteger(FilteredNumberColumns.TIMES_FILTERED) == null) {
-      values.put(FilteredNumberContract.FilteredNumberColumns.TIMES_FILTERED, 0);
-    }
-    if (values.getAsLong(FilteredNumberColumns.CREATION_TIME) == null) {
-      values.put(FilteredNumberColumns.CREATION_TIME, getCurrentTimeMs());
-    }
-  }
-
-  @Override
-  public int delete(Uri uri, String selection, String[] selectionArgs) {
-    SQLiteDatabase db = dialerDatabaseHelper.getWritableDatabase();
-    final int match = uriMatcher.match(uri);
-    switch (match) {
-      case FILTERED_NUMBERS_TABLE:
-        break;
-      case FILTERED_NUMBERS_TABLE_ID:
-        selection = getSelectionWithId(selection, ContentUris.parseId(uri));
-        break;
-      default:
-        throw new IllegalArgumentException("Unknown uri: " + uri);
-    }
-    int rows =
-        db.delete(DialerDatabaseHelper.Tables.FILTERED_NUMBER_TABLE, selection, selectionArgs);
-    if (rows > 0) {
-      notifyChange(uri);
-    }
-    return rows;
-  }
-
-  @Override
-  public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
-    SQLiteDatabase db = dialerDatabaseHelper.getWritableDatabase();
-    final int match = uriMatcher.match(uri);
-    switch (match) {
-      case FILTERED_NUMBERS_TABLE:
-        break;
-      case FILTERED_NUMBERS_TABLE_ID:
-        selection = getSelectionWithId(selection, ContentUris.parseId(uri));
-        break;
-      default:
-        throw new IllegalArgumentException("Unknown uri: " + uri);
-    }
-    int rows =
-        db.update(
-            DialerDatabaseHelper.Tables.FILTERED_NUMBER_TABLE, values, selection, selectionArgs);
-    if (rows > 0) {
-      notifyChange(uri);
-    }
-    return rows;
-  }
-
-  private String getSelectionWithId(String selection, long id) {
-    if (TextUtils.isEmpty(selection)) {
-      return FilteredNumberContract.FilteredNumberColumns._ID + "=" + id;
-    } else {
-      return selection + "AND " + FilteredNumberContract.FilteredNumberColumns._ID + "=" + id;
-    }
-  }
-
-  private void notifyChange(Uri uri) {
-    getContext().getContentResolver().notifyChange(uri, null);
-  }
-}
diff --git a/java/com/android/dialer/blocking/FilteredNumbersUtil.java b/java/com/android/dialer/blocking/FilteredNumbersUtil.java
index d839ef5..6d6f339 100644
--- a/java/com/android/dialer/blocking/FilteredNumbersUtil.java
+++ b/java/com/android/dialer/blocking/FilteredNumbersUtil.java
@@ -15,38 +15,24 @@
  */
 package com.android.dialer.blocking;
 
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.content.ContentValues;
 import android.content.Context;
-import android.database.Cursor;
-import android.os.AsyncTask;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.Contacts;
+import android.provider.BlockedNumberContract;
 import android.provider.Settings;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
-import android.support.v4.os.BuildCompat;
-import android.support.v4.os.UserManagerCompat;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
-import android.widget.Toast;
-import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
+
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.logging.InteractionEvent;
-import com.android.dialer.logging.Logger;
-import com.android.dialer.notification.DialerNotificationManager;
-import com.android.dialer.notification.NotificationChannelId;
 import com.android.dialer.storage.StorageComponent;
-import com.android.dialer.util.PermissionsUtil;
+import com.android.dialer.telecom.TelecomUtil;
 import java.util.concurrent.TimeUnit;
 
 /** Utility to help with tasks related to filtered numbers. */
 @Deprecated
 public class FilteredNumbersUtil {
 
-  public static final String CALL_BLOCKING_NOTIFICATION_TAG = "call_blocking";
-  public static final int CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID = 10;
   // Pref key for storing the time of end of the last emergency call in milliseconds after epoch.\
   @VisibleForTesting
   public static final String LAST_EMERGENCY_CALL_MS_PREF_KEY = "last_emergency_call_ms";
@@ -67,126 +53,6 @@
   private static final String RECENT_EMERGENCY_CALL_THRESHOLD_SETTINGS_KEY =
       "dialer_emergency_call_threshold_ms";
 
-  /** Checks if there exists a contact with {@code Contacts.SEND_TO_VOICEMAIL} set to true. */
-  public static void checkForSendToVoicemailContact(
-      final Context context, final CheckForSendToVoicemailContactListener listener) {
-    final AsyncTask task =
-        new AsyncTask<Object, Void, Boolean>() {
-          @Override
-          public Boolean doInBackground(Object... params) {
-            if (context == null || !PermissionsUtil.hasContactsReadPermissions(context)) {
-              return false;
-            }
-
-            final Cursor cursor =
-                context
-                    .getContentResolver()
-                    .query(
-                        Contacts.CONTENT_URI,
-                        ContactsQuery.PROJECTION,
-                        ContactsQuery.SELECT_SEND_TO_VOICEMAIL_TRUE,
-                        null,
-                        null);
-
-            boolean hasSendToVoicemailContacts = false;
-            if (cursor != null) {
-              try {
-                hasSendToVoicemailContacts = cursor.getCount() > 0;
-              } finally {
-                cursor.close();
-              }
-            }
-
-            return hasSendToVoicemailContacts;
-          }
-
-          @Override
-          public void onPostExecute(Boolean hasSendToVoicemailContact) {
-            if (listener != null) {
-              listener.onComplete(hasSendToVoicemailContact);
-            }
-          }
-        };
-    task.execute();
-  }
-
-  /**
-   * Blocks all the phone numbers of any contacts marked as SEND_TO_VOICEMAIL, then clears the
-   * SEND_TO_VOICEMAIL flag on those contacts.
-   */
-  public static void importSendToVoicemailContacts(
-      final Context context, final ImportSendToVoicemailContactsListener listener) {
-    Logger.get(context).logInteraction(InteractionEvent.Type.IMPORT_SEND_TO_VOICEMAIL);
-    final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler =
-        new FilteredNumberAsyncQueryHandler(context);
-
-    final AsyncTask<Object, Void, Boolean> task =
-        new AsyncTask<Object, Void, Boolean>() {
-          @Override
-          public Boolean doInBackground(Object... params) {
-            if (context == null) {
-              return false;
-            }
-
-            // Get the phone number of contacts marked as SEND_TO_VOICEMAIL.
-            final Cursor phoneCursor =
-                context
-                    .getContentResolver()
-                    .query(
-                        Phone.CONTENT_URI,
-                        PhoneQuery.PROJECTION,
-                        PhoneQuery.SELECT_SEND_TO_VOICEMAIL_TRUE,
-                        null,
-                        null);
-
-            if (phoneCursor == null) {
-              return false;
-            }
-
-            try {
-              while (phoneCursor.moveToNext()) {
-                final String normalizedNumber =
-                    phoneCursor.getString(PhoneQuery.NORMALIZED_NUMBER_COLUMN_INDEX);
-                final String number = phoneCursor.getString(PhoneQuery.NUMBER_COLUMN_INDEX);
-                if (normalizedNumber != null) {
-                  // Block the phone number of the contact.
-                  mFilteredNumberAsyncQueryHandler.blockNumber(
-                      null, normalizedNumber, number, null);
-                }
-              }
-            } finally {
-              phoneCursor.close();
-            }
-
-            // Clear SEND_TO_VOICEMAIL on all contacts. The setting has been imported to Dialer.
-            ContentValues newValues = new ContentValues();
-            newValues.put(Contacts.SEND_TO_VOICEMAIL, 0);
-            context
-                .getContentResolver()
-                .update(
-                    Contacts.CONTENT_URI,
-                    newValues,
-                    ContactsQuery.SELECT_SEND_TO_VOICEMAIL_TRUE,
-                    null);
-
-            return true;
-          }
-
-          @Override
-          public void onPostExecute(Boolean success) {
-            if (success) {
-              if (listener != null) {
-                listener.onImportComplete();
-              }
-            } else if (context != null) {
-              String toastStr = context.getString(R.string.send_to_voicemail_import_failed);
-              Toast.makeText(context, toastStr, Toast.LENGTH_SHORT).show();
-            }
-          }
-        };
-    task.execute();
-  }
-
   public static long getLastEmergencyCallTimeMillis(Context context) {
     return StorageComponent.get(context)
         .unencryptedSharedPrefs()
@@ -218,67 +84,6 @@
         .putLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, System.currentTimeMillis())
         .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)
         .apply();
-
-    if (UserManagerCompat.isUserUnlocked(context)) {
-      maybeNotifyCallBlockingDisabled(context);
-    }
-  }
-
-  public static void maybeNotifyCallBlockingDisabled(final Context context) {
-    // The Dialer is not responsible for this notification after migrating
-    if (FilteredNumberCompat.useNewFiltering(context)) {
-      return;
-    }
-    // Skip if the user has already received a notification for the most recent emergency call.
-    if (StorageComponent.get(context)
-        .unencryptedSharedPrefs()
-        .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);
-    queryHandler.hasBlockedNumbers(
-        new OnHasBlockedNumbersListener() {
-          @Override
-          public void onHasBlockedNumbers(boolean hasBlockedNumbers) {
-            if (context == null || !hasBlockedNumbers) {
-              return;
-            }
-
-            Notification.Builder builder =
-                new Notification.Builder(context)
-                    .setSmallIcon(R.drawable.quantum_ic_block_white_24)
-                    .setContentTitle(
-                        context.getString(R.string.call_blocking_disabled_notification_title))
-                    .setContentText(
-                        context.getString(R.string.call_blocking_disabled_notification_text))
-                    .setAutoCancel(true);
-
-            if (BuildCompat.isAtLeastO()) {
-              builder.setChannelId(NotificationChannelId.DEFAULT);
-            }
-            builder.setContentIntent(
-                PendingIntent.getActivity(
-                    context,
-                    0,
-                    FilteredNumberCompat.createManageBlockedNumbersIntent(context),
-                    PendingIntent.FLAG_UPDATE_CURRENT));
-
-            DialerNotificationManager.notify(
-                context,
-                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.
-            StorageComponent.get(context)
-                .unencryptedSharedPrefs()
-                .edit()
-                .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, true)
-                .apply();
-          }
-        });
   }
 
   /**
@@ -288,8 +93,8 @@
    * @return {@code true} if the number can be blocked, {@code false} otherwise.
    */
   public static boolean canBlockNumber(Context context, String e164Number, String number) {
-    String blockableNumber = getBlockableNumber(context, e164Number, number);
-    return !TextUtils.isEmpty(blockableNumber)
+    String blockableNumber = getBlockableNumber(e164Number, number);
+    return canAttemptBlockOperations(context) && !TextUtils.isEmpty(blockableNumber)
         && !PhoneNumberUtils.isEmergencyNumber(blockableNumber);
   }
 
@@ -300,11 +105,7 @@
    * @return The version of the given number that can be blocked with the current blocking solution.
    */
   @Nullable
-  public static String getBlockableNumber(
-      Context context, @Nullable String e164Number, String number) {
-    if (!FilteredNumberCompat.useNewFiltering(context)) {
-      return e164Number;
-    }
+  public static String getBlockableNumber(@Nullable String e164Number, String number) {
     return TextUtils.isEmpty(e164Number) ? number : e164Number;
   }
 
@@ -319,33 +120,50 @@
     }
   }
 
-  public interface CheckForSendToVoicemailContactListener {
-
-    void onComplete(boolean hasSendToVoicemailContact);
+  /**
+   * Method used to determine if block operations are possible.
+   *
+   * @param context The {@link Context}.
+   * @return {@code true} if the app and user can block numbers, {@code false} otherwise.
+   */
+  public static boolean canAttemptBlockOperations(Context context) {
+    // Great Wall blocking, must be primary user and the default or system dialer
+    // TODO(maxwelb): check that we're the system Dialer
+    return TelecomUtil.isDefaultDialer(context)
+            && safeBlockedNumbersContractCanCurrentUserBlockNumbers(context);
   }
 
-  public interface ImportSendToVoicemailContactsListener {
-
-    void onImportComplete();
+  /**
+   * Used to determine if the call blocking settings can be opened.
+   *
+   * @param context The {@link Context}.
+   * @return {@code true} if the current user can open the call blocking settings, {@code false}
+   *     otherwise.
+   */
+  public static boolean canCurrentUserOpenBlockSettings(Context context) {
+    // BlockedNumberContract blocking, verify through Contract API
+    return TelecomUtil.isDefaultDialer(context)
+            && safeBlockedNumbersContractCanCurrentUserBlockNumbers(context);
   }
 
-  private static class ContactsQuery {
-
-    static final String[] PROJECTION = {Contacts._ID};
-
-    static final String SELECT_SEND_TO_VOICEMAIL_TRUE = Contacts.SEND_TO_VOICEMAIL + "=1";
-
-    static final int ID_COLUMN_INDEX = 0;
-  }
-
-  public static class PhoneQuery {
-
-    public static final String[] PROJECTION = {Contacts._ID, Phone.NORMALIZED_NUMBER, Phone.NUMBER};
-
-    public static final int ID_COLUMN_INDEX = 0;
-    public static final int NORMALIZED_NUMBER_COLUMN_INDEX = 1;
-    public static final int NUMBER_COLUMN_INDEX = 2;
-
-    public static final String SELECT_SEND_TO_VOICEMAIL_TRUE = Contacts.SEND_TO_VOICEMAIL + "=1";
+  /**
+   * Calls {@link BlockedNumberContract#canCurrentUserBlockNumbers(Context)} in such a way that it
+   * never throws an exception. While on the CryptKeeper screen, the BlockedNumberContract isn't
+   * available, using this method ensures that the Dialer doesn't crash when on that screen.
+   *
+   * @param context The {@link Context}.
+   * @return the result of BlockedNumberContract#canCurrentUserBlockNumbers, or {@code false} if an
+   *     exception was thrown.
+   */
+  private static boolean safeBlockedNumbersContractCanCurrentUserBlockNumbers(Context context) {
+    try {
+      return BlockedNumberContract.canCurrentUserBlockNumbers(context);
+    } catch (Exception e) {
+      LogUtil.e(
+              "FilteredNumberCompat.safeBlockedNumbersContractCanCurrentUserBlockNumbers",
+              "Exception while querying BlockedNumberContract",
+              e);
+      return false;
+    }
   }
 }
diff --git a/java/com/android/dialer/blocking/MigrateBlockedNumbersDialogFragment.java b/java/com/android/dialer/blocking/MigrateBlockedNumbersDialogFragment.java
deleted file mode 100644
index 9a3b647..0000000
--- a/java/com/android/dialer/blocking/MigrateBlockedNumbersDialogFragment.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2016 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.blocking;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnShowListener;
-import android.os.Bundle;
-import android.view.View;
-import com.android.dialer.blocking.BlockedNumbersMigrator.Listener;
-import java.util.Objects;
-
-/**
- * Dialog fragment shown to users when they need to migrate to use {@link
- * android.provider.BlockedNumberContract} for blocking.
- */
-@Deprecated
-public class MigrateBlockedNumbersDialogFragment extends DialogFragment {
-
-  private BlockedNumbersMigrator blockedNumbersMigrator;
-  private BlockedNumbersMigrator.Listener migrationListener;
-
-  /**
-   * Creates a new MigrateBlockedNumbersDialogFragment.
-   *
-   * @param blockedNumbersMigrator The {@link BlockedNumbersMigrator} which will be used to migrate
-   *     the numbers.
-   * @param migrationListener The {@link BlockedNumbersMigrator.Listener} to call when the migration
-   *     is complete.
-   * @return The new MigrateBlockedNumbersDialogFragment.
-   * @throws NullPointerException if blockedNumbersMigrator or migrationListener are {@code null}.
-   */
-  public static DialogFragment newInstance(
-      BlockedNumbersMigrator blockedNumbersMigrator,
-      BlockedNumbersMigrator.Listener migrationListener) {
-    MigrateBlockedNumbersDialogFragment fragment = new MigrateBlockedNumbersDialogFragment();
-    fragment.blockedNumbersMigrator = Objects.requireNonNull(blockedNumbersMigrator);
-    fragment.migrationListener = Objects.requireNonNull(migrationListener);
-    return fragment;
-  }
-
-  @Override
-  public Dialog onCreateDialog(Bundle savedInstanceState) {
-    super.onCreateDialog(savedInstanceState);
-    AlertDialog dialog =
-        new AlertDialog.Builder(getActivity())
-            .setTitle(R.string.migrate_blocked_numbers_dialog_title)
-            .setMessage(R.string.migrate_blocked_numbers_dialog_message)
-            .setPositiveButton(R.string.migrate_blocked_numbers_dialog_allow_button, null)
-            .setNegativeButton(R.string.migrate_blocked_numbers_dialog_cancel_button, null)
-            .create();
-    // The Dialog's buttons aren't available until show is called, so an OnShowListener
-    // is used to set the positive button callback.
-    dialog.setOnShowListener(
-        new OnShowListener() {
-          @Override
-          public void onShow(DialogInterface dialog) {
-            final AlertDialog alertDialog = (AlertDialog) dialog;
-            alertDialog
-                .getButton(AlertDialog.BUTTON_POSITIVE)
-                .setOnClickListener(newPositiveButtonOnClickListener(alertDialog));
-          }
-        });
-    return dialog;
-  }
-
-  /*
-   * Creates a new View.OnClickListener to be used as the positive button in this dialog. The
-   * OnClickListener will grey out the dialog's positive and negative buttons while the migration
-   * is underway, and close the dialog once the migrate is complete.
-   */
-  private View.OnClickListener newPositiveButtonOnClickListener(final AlertDialog alertDialog) {
-    return new View.OnClickListener() {
-      @Override
-      public void onClick(View v) {
-        alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
-        alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
-        blockedNumbersMigrator.migrate(
-            new Listener() {
-              @Override
-              public void onComplete() {
-                alertDialog.dismiss();
-                migrationListener.onComplete();
-              }
-            });
-      }
-    };
-  }
-
-  @Override
-  public void onPause() {
-    // The dialog is dismissed and state is cleaned up onPause, i.e. rotation.
-    dismiss();
-    blockedNumbersMigrator = null;
-    migrationListener = null;
-    super.onPause();
-  }
-}
diff --git a/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java b/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java
index ff2a588..9d57c15 100644
--- a/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java
+++ b/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java
@@ -27,7 +27,8 @@
 import android.view.View;
 import android.widget.CheckBox;
 import android.widget.TextView;
-import com.android.dialer.blocking.FilteredNumberCompat;
+
+import com.android.dialer.R;
 
 /** Creates dialog fragments to block a number and/or report it as spam/not spam. */
 public final class BlockReportSpamDialogs {
@@ -58,13 +59,7 @@
   }
 
   private static String getBlockMessage(Context context) {
-    String message;
-    if (FilteredNumberCompat.useNewFiltering(context)) {
-      message = context.getString(R.string.block_number_confirmation_message_new_filtering);
-    } else {
-      message = context.getString(R.string.block_report_number_alert_details);
-    }
-    return message;
+      return context.getString(R.string.block_number_confirmation_message_new_filtering);
   }
 
   /**
diff --git a/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
index a9be544..5b35dcb 100644
--- a/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
+++ b/java/com/android/dialer/calldetails/CallDetailsEntryViewHolder.java
@@ -27,7 +27,6 @@
 import android.support.annotation.NonNull;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.content.FileProvider;
-import android.support.v4.os.BuildCompat;
 import android.support.v7.widget.RecyclerView.ViewHolder;
 import android.text.TextUtils;
 import android.text.format.DateFormat;
@@ -38,6 +37,8 @@
 import android.widget.PopupMenu;
 import android.widget.TextView;
 import android.widget.Toast;
+
+import com.android.dialer.R;
 import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry;
 import com.android.dialer.calllogutils.CallLogDates;
 import com.android.dialer.calllogutils.CallLogDurations;
@@ -129,9 +130,7 @@
         (entry.getFeatures() & Calls.FEATURES_PULLED_EXTERNALLY)
             == Calls.FEATURES_PULLED_EXTERNALLY;
     boolean isDuoCall = entry.getIsDuoCall();
-    boolean isRttCall =
-        BuildCompat.isAtLeastP()
-            && (entry.getFeatures() & Calls.FEATURES_RTT) == Calls.FEATURES_RTT;
+    boolean isRttCall = (entry.getFeatures() & Calls.FEATURES_RTT) == Calls.FEATURES_RTT;
 
     callTime.setTextColor(getColorForCallType(context, callType));
     callTypeIcon.clear();
@@ -141,9 +140,7 @@
         (entry.getFeatures() & Calls.FEATURES_HD_CALL) == Calls.FEATURES_HD_CALL);
     callTypeIcon.setShowWifi(
         MotorolaUtils.shouldShowWifiIconInCallLog(context, entry.getFeatures()));
-    if (BuildCompat.isAtLeastP()) {
-      callTypeIcon.setShowRtt((entry.getFeatures() & Calls.FEATURES_RTT) == Calls.FEATURES_RTT);
-    }
+    callTypeIcon.setShowRtt((entry.getFeatures() & Calls.FEATURES_RTT) == Calls.FEATURES_RTT);
 
     callTypeText.setText(
         callTypeHelper.getCallTypeText(callType, isVideoCall, isPulledCall, isDuoCall));
diff --git a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java
index 1fdf38a..21f32b9 100644
--- a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java
+++ b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java
@@ -177,8 +177,6 @@
     /**
      * See {@link VoicemailCompat#TRANSCRIPTION_STATE}
      *
-     * <p>Only populated in {@link Build.VERSION_CODES#O} and above
-     *
      * <p>TYPE: INTEGER
      */
     public static final String TRANSCRIPTION_STATE = "transcription_state";
diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
index 3e123c9..7b02d0d 100644
--- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
+++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
@@ -21,19 +21,17 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.database.Cursor;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.provider.CallLog;
 import android.provider.CallLog.Calls;
 import android.provider.VoicemailContract;
 import android.provider.VoicemailContract.Voicemails;
 import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
 import android.support.annotation.VisibleForTesting;
 import android.support.annotation.WorkerThread;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 import android.util.ArraySet;
+
 import com.android.dialer.DialerPhoneNumber;
 import com.android.dialer.calllog.database.AnnotatedCallLogDatabaseHelper;
 import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.AnnotatedCallLog;
@@ -382,12 +380,10 @@
   }
 
   private void setTranscriptionState(Cursor cursor, ContentValues contentValues) {
-    if (VERSION.SDK_INT >= VERSION_CODES.O) {
-      int transcriptionStateColumn =
-          cursor.getColumnIndexOrThrow(VoicemailCompat.TRANSCRIPTION_STATE);
-      int transcriptionState = cursor.getInt(transcriptionStateColumn);
-      contentValues.put(VoicemailCompat.TRANSCRIPTION_STATE, transcriptionState);
-    }
+    int transcriptionStateColumn =
+        cursor.getColumnIndexOrThrow(VoicemailCompat.TRANSCRIPTION_STATE);
+    int transcriptionState = cursor.getInt(transcriptionStateColumn);
+    contentValues.put(VoicemailCompat.TRANSCRIPTION_STATE, transcriptionState);
   }
 
   private static final String[] PROJECTION_PRE_O =
@@ -412,7 +408,6 @@
         Calls.POST_DIAL_DIGITS
       };
 
-  @RequiresApi(VERSION_CODES.O)
   private static final String[] PROJECTION_O_AND_LATER;
 
   static {
@@ -422,10 +417,7 @@
   }
 
   private String[] getProjection() {
-    if (VERSION.SDK_INT >= VERSION_CODES.O) {
       return PROJECTION_O_AND_LATER;
-    }
-    return PROJECTION_PRE_O;
   }
 
   private static void handleDeletes(
diff --git a/java/com/android/dialer/calllogutils/PhotoInfoBuilder.java b/java/com/android/dialer/calllogutils/PhotoInfoBuilder.java
index 2e2e4ab..16fb9ac 100644
--- a/java/com/android/dialer/calllogutils/PhotoInfoBuilder.java
+++ b/java/com/android/dialer/calllogutils/PhotoInfoBuilder.java
@@ -18,7 +18,6 @@
 
 import android.content.Context;
 import android.provider.CallLog.Calls;
-import android.support.v4.os.BuildCompat;
 import com.android.dialer.NumberAttributes;
 import com.android.dialer.calllog.model.CoalescedRow;
 import com.android.dialer.glidephotomanager.PhotoInfo;
@@ -38,9 +37,7 @@
             Spam.shouldShowAsSpam(
                 coalescedRow.getNumberAttributes().getIsSpam(), coalescedRow.getCallType()))
         .setIsVideo((coalescedRow.getFeatures() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO)
-        .setIsRtt(
-            BuildCompat.isAtLeastP()
-                && (coalescedRow.getFeatures() & Calls.FEATURES_RTT) == Calls.FEATURES_RTT);
+        .setIsRtt((coalescedRow.getFeatures() & Calls.FEATURES_RTT) == Calls.FEATURES_RTT);
   }
 
   /** Returns a {@link PhotoInfo.Builder} with info from {@link VoicemailEntry}. */
diff --git a/java/com/android/dialer/callrecord/CallRecordingAutoMigrator.java b/java/com/android/dialer/callrecord/CallRecordingAutoMigrator.java
index 81c1612..456f122 100644
--- a/java/com/android/dialer/callrecord/CallRecordingAutoMigrator.java
+++ b/java/com/android/dialer/callrecord/CallRecordingAutoMigrator.java
@@ -17,12 +17,10 @@
 
 package com.android.dialer.callrecord;
 
-import android.annotation.TargetApi;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.net.Uri;
-import android.os.Build;
 import android.os.Environment;
 import android.provider.MediaStore;
 import android.support.annotation.NonNull;
@@ -65,7 +63,6 @@
         .executeParallel(null);
   }
 
-  @TargetApi(26)
   private void autoMigrate(boolean shouldAttemptAutoMigrate) {
     if (!shouldAttemptAutoMigrate) {
       return;
@@ -136,9 +133,6 @@
     @Nullable
     @Override
     public Boolean doInBackground(@Nullable Void input) {
-      if (Build.VERSION.SDK_INT < 26) {
-        return false;
-      }
       if (appContext.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
           != PackageManager.PERMISSION_GRANTED) {
         LogUtil.i(TAG, "not attempting auto-migrate: no storage permission");
diff --git a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java
index 41e5be2..653fc08 100644
--- a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java
+++ b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java
@@ -17,12 +17,8 @@
 package com.android.dialer.compat.telephony;
 
 import android.content.Context;
-import android.content.Intent;
 import android.net.Uri;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.Nullable;
-import android.support.v4.os.BuildCompat;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
 import com.android.dialer.common.LogUtil;
@@ -69,8 +65,7 @@
   /** Indicates the Connection/Call used assisted dialing. */
   public static final int PROPERTY_ASSISTED_DIALING_USED = 1 << 9;
 
-  public static final String EXTRA_IS_REFRESH =
-      BuildCompat.isAtLeastOMR1() ? "android.telephony.extra.IS_REFRESH" : "is_refresh";
+  public static final String EXTRA_IS_REFRESH = "android.telephony.extra.IS_REFRESH";
 
   /**
    * Indicates the call underwent Assisted Dialing; typically set as a feature available from the
@@ -189,21 +184,13 @@
    * @param secretCode the secret code without the "*#*#" prefix and "#*#*" suffix
    */
   public static void handleSecretCode(Context context, String secretCode) {
-    // Must use system service on O+ to avoid using broadcasts, which are not allowed on O+.
-    if (BuildCompat.isAtLeastO()) {
-      if (!TelecomUtil.isDefaultDialer(context)) {
-        LogUtil.e(
-            "TelephonyManagerCompat.handleSecretCode",
-            "not default dialer, cannot send special code");
-        return;
-      }
-      context.getSystemService(TelephonyManager.class).sendDialerSpecialCode(secretCode);
-    } else {
-      // System service call is not supported pre-O, so must use a broadcast for N-.
-      Intent intent =
-          new Intent(SECRET_CODE_ACTION, Uri.parse("android_secret_code://" + secretCode));
-      context.sendBroadcast(intent);
+    if (!TelecomUtil.isDefaultDialer(context)) {
+      LogUtil.e(
+          "TelephonyManagerCompat.handleSecretCode",
+          "not default dialer, cannot send special code");
+      return;
     }
+    context.getSystemService(TelephonyManager.class).sendDialerSpecialCode(secretCode);
   }
 
   /**
@@ -226,12 +213,10 @@
     if (phoneAccountHandle == null) {
       return telephonyManager;
     }
-    if (VERSION.SDK_INT >= VERSION_CODES.O) {
-      TelephonyManager telephonyManagerForPhoneAccount =
-          telephonyManager.createForPhoneAccountHandle(phoneAccountHandle);
-      if (telephonyManagerForPhoneAccount != null) {
-        return telephonyManagerForPhoneAccount;
-      }
+    TelephonyManager telephonyManagerForPhoneAccount =
+        telephonyManager.createForPhoneAccountHandle(phoneAccountHandle);
+    if (telephonyManagerForPhoneAccount != null) {
+      return telephonyManagerForPhoneAccount;
     }
     return telephonyManager;
   }
diff --git a/java/com/android/dialer/constants/Constants.java b/java/com/android/dialer/constants/Constants.java
index fb1aa2a..8570192 100644
--- a/java/com/android/dialer/constants/Constants.java
+++ b/java/com/android/dialer/constants/Constants.java
@@ -49,9 +49,6 @@
   }
 
   @NonNull
-  public abstract String getFilteredNumberProviderAuthority();
-
-  @NonNull
   public abstract String getFileProviderAuthority();
 
   @NonNull
diff --git a/java/com/android/dialer/constants/aospdialer/ConstantsImpl.java b/java/com/android/dialer/constants/aospdialer/ConstantsImpl.java
index 312b3f5..eb93563 100644
--- a/java/com/android/dialer/constants/aospdialer/ConstantsImpl.java
+++ b/java/com/android/dialer/constants/aospdialer/ConstantsImpl.java
@@ -26,12 +26,6 @@
 
   @Override
   @NonNull
-  public String getFilteredNumberProviderAuthority() {
-    return "com.android.dialer.blocking.filterednumberprovider";
-  }
-
-  @Override
-  @NonNull
   public String getFileProviderAuthority() {
     return "com.android.dialer.files";
   }
diff --git a/java/com/android/dialer/constants/googledialer/ConstantsImpl.java b/java/com/android/dialer/constants/googledialer/ConstantsImpl.java
index e4a96fe..9a6fdd7 100644
--- a/java/com/android/dialer/constants/googledialer/ConstantsImpl.java
+++ b/java/com/android/dialer/constants/googledialer/ConstantsImpl.java
@@ -28,12 +28,6 @@
 
   @Override
   @NonNull
-  public String getFilteredNumberProviderAuthority() {
-    return "com.google.android.dialer.blocking.filterednumberprovider";
-  }
-
-  @Override
-  @NonNull
   public String getFileProviderAuthority() {
     return "com.google.android.dialer.files";
   }
diff --git a/java/com/android/dialer/database/DialerDatabaseHelper.java b/java/com/android/dialer/database/DialerDatabaseHelper.java
index 9d26398..8c1c1cc 100644
--- a/java/com/android/dialer/database/DialerDatabaseHelper.java
+++ b/java/com/android/dialer/database/DialerDatabaseHelper.java
@@ -43,7 +43,6 @@
 import com.android.dialer.common.database.Selection;
 import com.android.dialer.configprovider.ConfigProviderComponent;
 import com.android.dialer.contacts.resources.R;
-import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
 import com.android.dialer.smartdial.util.SmartDialNameMatcher;
 import com.android.dialer.smartdial.util.SmartDialPrefix;
 import com.android.dialer.util.PermissionsUtil;
@@ -67,7 +66,7 @@
    *   0-98   KitKat
    * </pre>
    */
-  public static final int DATABASE_VERSION = 10;
+  public static final int DATABASE_VERSION = 11;
 
   public static final String DATABASE_NAME = "dialer.db";
 
@@ -89,17 +88,11 @@
   private final Context context;
   private final DialerFutureSerializer dialerFutureSerializer = new DialerFutureSerializer();
 
-  private boolean isTestInstance = false;
-
   protected DialerDatabaseHelper(Context context, String databaseName, int dbVersion) {
     super(context, databaseName, null, dbVersion);
     this.context = Objects.requireNonNull(context, "Context must not be null");
   }
 
-  public void setIsTestInstance(boolean isTestInstance) {
-    this.isTestInstance = isTestInstance;
-  }
-
   /**
    * Creates tables in the database when database is created for the first time.
    *
@@ -170,45 +163,16 @@
             + " TEXT "
             + ");");
 
-    // This will need to also be updated in setupTablesForFilteredNumberTest and onUpgrade.
-    // Hardcoded so we know on glance what columns are updated in setupTables,
-    // and to be able to guarantee the state of the DB at each upgrade step.
-    db.execSQL(
-        "CREATE TABLE "
-            + Tables.FILTERED_NUMBER_TABLE
-            + " ("
-            + FilteredNumberColumns._ID
-            + " INTEGER PRIMARY KEY AUTOINCREMENT,"
-            + FilteredNumberColumns.NORMALIZED_NUMBER
-            + " TEXT UNIQUE,"
-            + FilteredNumberColumns.NUMBER
-            + " TEXT,"
-            + FilteredNumberColumns.COUNTRY_ISO
-            + " TEXT,"
-            + FilteredNumberColumns.TIMES_FILTERED
-            + " INTEGER,"
-            + FilteredNumberColumns.LAST_TIME_FILTERED
-            + " LONG,"
-            + FilteredNumberColumns.CREATION_TIME
-            + " LONG,"
-            + FilteredNumberColumns.TYPE
-            + " INTEGER,"
-            + FilteredNumberColumns.SOURCE
-            + " INTEGER"
-            + ");");
-
     setProperty(db, DATABASE_VERSION_PROPERTY, String.valueOf(DATABASE_VERSION));
-    if (!isTestInstance) {
-      resetSmartDialLastUpdatedTime();
-    }
+    resetSmartDialLastUpdatedTime();
   }
 
   public void dropTables(SQLiteDatabase db) {
     db.execSQL("DROP TABLE IF EXISTS " + Tables.PREFIX_TABLE);
     db.execSQL("DROP TABLE IF EXISTS " + Tables.SMARTDIAL_TABLE);
     db.execSQL("DROP TABLE IF EXISTS " + Tables.PROPERTIES);
-    db.execSQL("DROP TABLE IF EXISTS " + Tables.FILTERED_NUMBER_TABLE);
     db.execSQL("DROP TABLE IF EXISTS " + Tables.VOICEMAIL_ARCHIVE_TABLE);
+    db.execSQL("DROP TABLE IF EXISTS filtered_numbers_table");
   }
 
   @Override
@@ -231,30 +195,6 @@
     }
 
     if (oldVersion < 7) {
-      db.execSQL("DROP TABLE IF EXISTS " + Tables.FILTERED_NUMBER_TABLE);
-      db.execSQL(
-          "CREATE TABLE "
-              + Tables.FILTERED_NUMBER_TABLE
-              + " ("
-              + FilteredNumberColumns._ID
-              + " INTEGER PRIMARY KEY AUTOINCREMENT,"
-              + FilteredNumberColumns.NORMALIZED_NUMBER
-              + " TEXT UNIQUE,"
-              + FilteredNumberColumns.NUMBER
-              + " TEXT,"
-              + FilteredNumberColumns.COUNTRY_ISO
-              + " TEXT,"
-              + FilteredNumberColumns.TIMES_FILTERED
-              + " INTEGER,"
-              + FilteredNumberColumns.LAST_TIME_FILTERED
-              + " LONG,"
-              + FilteredNumberColumns.CREATION_TIME
-              + " LONG,"
-              + FilteredNumberColumns.TYPE
-              + " INTEGER,"
-              + FilteredNumberColumns.SOURCE
-              + " INTEGER"
-              + ");");
       oldVersion = 7;
     }
 
@@ -268,6 +208,11 @@
       oldVersion = 10;
     }
 
+    if (oldVersion < 11) {
+      db.execSQL("DROP TABLE IF EXISTS filtered_numbers_table");
+      oldVersion = 11;
+    }
+
     if (oldVersion != DATABASE_VERSION) {
       throw new IllegalStateException(
           "error upgrading the database to version " + DATABASE_VERSION);
@@ -1048,9 +993,6 @@
   }
 
   public interface Tables {
-
-    /** Saves a list of numbers to be blocked. */
-    String FILTERED_NUMBER_TABLE = "filtered_numbers_table";
     /** Saves the necessary smart dial information of all contacts. */
     String SMARTDIAL_TABLE = "smartdial_table";
     /** Saves all possible prefixes to refer to a contacts. */
diff --git a/java/com/android/dialer/database/FilteredNumberContract.java b/java/com/android/dialer/database/FilteredNumberContract.java
deleted file mode 100644
index 5a7153e..0000000
--- a/java/com/android/dialer/database/FilteredNumberContract.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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.database;
-
-import android.net.Uri;
-import android.provider.BaseColumns;
-import com.android.dialer.constants.Constants;
-
-/**
- * The contract between the filtered number provider and applications. Contains definitions for the
- * supported URIs and columns. Currently only accessible within Dialer.
- */
-public final class FilteredNumberContract {
-
-  public static final String AUTHORITY = Constants.get().getFilteredNumberProviderAuthority();
-
-  public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);
-
-  /** The type of filtering to be applied, e.g. block the number or allow the number. */
-  public interface FilteredNumberTypes {
-
-    int UNDEFINED = 0;
-    /** Dialer will disconnect the call without sending the caller to voicemail. */
-    int BLOCKED_NUMBER = 1;
-  }
-
-  /** The original source of the filtered number, e.g. the user manually added it. */
-  public interface FilteredNumberSources {
-
-    int UNDEFINED = 0;
-    /** The user manually added this number through Dialer (e.g. from the call log or InCallUI). */
-    int USER = 1;
-  }
-
-  public interface FilteredNumberColumns {
-
-    // TYPE: INTEGER
-    String _ID = "_id";
-    /**
-     * Represents the number to be filtered, normalized to compare phone numbers for equality.
-     *
-     * <p>TYPE: TEXT
-     */
-    String NORMALIZED_NUMBER = "normalized_number";
-    /**
-     * Represents the number to be filtered, for formatting and used with country iso for contact
-     * lookups.
-     *
-     * <p>TYPE: TEXT
-     */
-    String NUMBER = "number";
-    /**
-     * The country code representing the country detected when the phone number was added to the
-     * database. Most numbers don't have the country code, so a best guess is provided by the
-     * country detector system. The country iso is also needed in order to format phone numbers
-     * correctly.
-     *
-     * <p>TYPE: TEXT
-     */
-    String COUNTRY_ISO = "country_iso";
-    /**
-     * The number of times the number has been filtered by Dialer. When this number is incremented,
-     * LAST_TIME_FILTERED should also be updated to the current time.
-     *
-     * <p>TYPE: INTEGER
-     */
-    String TIMES_FILTERED = "times_filtered";
-    /**
-     * Set to the current time when the phone number is filtered. When this is updated,
-     * TIMES_FILTERED should also be incremented.
-     *
-     * <p>TYPE: LONG
-     */
-    String LAST_TIME_FILTERED = "last_time_filtered";
-    // TYPE: LONG
-    String CREATION_TIME = "creation_time";
-    /**
-     * Indicates the type of filtering to be applied.
-     *
-     * <p>TYPE: INTEGER See {@link FilteredNumberTypes}
-     */
-    String TYPE = "type";
-    /**
-     * Integer representing the original source of the filtered number.
-     *
-     * <p>TYPE: INTEGER See {@link FilteredNumberSources}
-     */
-    String SOURCE = "source";
-  }
-
-  /**
-   * Constants for the table of filtered numbers.
-   *
-   * <h3>Operations</h3>
-   *
-   * <dl>
-   * <dt><b>Insert</b>
-   * <dd>Required fields: NUMBER, NORMALIZED_NUMBER, TYPE, SOURCE. A default value will be used for
-   *     the other fields if left null.
-   * <dt><b>Update</b>
-   * <dt><b>Delete</b>
-   * <dt><b>Query</b>
-   * <dd>{@link #CONTENT_URI} can be used for any query, append an ID to retrieve a specific
-   *     filtered number entry.
-   * </dl>
-   */
-  public static class FilteredNumber implements BaseColumns {
-
-    public static final String FILTERED_NUMBERS_TABLE = "filtered_numbers_table";
-
-    /**
-     * The MIME type of a {@link android.content.ContentProvider#getType(Uri)} single filtered
-     * number.
-     */
-    public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/filtered_numbers_table";
-
-    public static final Uri CONTENT_URI =
-        Uri.withAppendedPath(AUTHORITY_URI, FILTERED_NUMBERS_TABLE);
-
-    /** This utility class cannot be instantiated. */
-    private FilteredNumber() {}
-  }
-}
diff --git a/java/com/android/dialer/databasepopulator/VoicemailPopulator.java b/java/com/android/dialer/databasepopulator/VoicemailPopulator.java
index 4465056..4e76484 100644
--- a/java/com/android/dialer/databasepopulator/VoicemailPopulator.java
+++ b/java/com/android/dialer/databasepopulator/VoicemailPopulator.java
@@ -19,8 +19,6 @@
 import android.content.ComponentName;
 import android.content.ContentValues;
 import android.content.Context;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.provider.VoicemailContract.Status;
 import android.provider.VoicemailContract.Voicemails;
 import android.support.annotation.NonNull;
@@ -28,6 +26,7 @@
 import android.support.annotation.WorkerThread;
 import android.telecom.PhoneAccountHandle;
 import com.android.dialer.common.Assert;
+import com.android.voicemail.impl.Voicemail;
 import com.google.auto.value.AutoValue;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -118,9 +117,7 @@
     componentName = handle.getComponentName().toString();
     ContentValues values = new ContentValues();
     values.put(Status.SOURCE_PACKAGE, handle.getComponentName().getPackageName());
-    if (VERSION.SDK_INT >= VERSION_CODES.N_MR1) {
-      values.put(Status.SOURCE_TYPE, "vvm_type_vvm3"); // mark populated voice mail as vvm3
-    }
+    values.put(Status.SOURCE_TYPE, "vvm_type_vvm3"); // mark populated voice mail as vvm3
     values.put(Status.PHONE_ACCOUNT_COMPONENT_NAME, handle.getComponentName().flattenToString());
     values.put(Status.PHONE_ACCOUNT_ID, handle.getId());
     values.put(Status.CONFIGURATION_STATE, Status.CONFIGURATION_STATE_OK);
diff --git a/java/com/android/dialer/dialpadview/DialpadFragment.java b/java/com/android/dialer/dialpadview/DialpadFragment.java
index 234457e..20d75b1 100644
--- a/java/com/android/dialer/dialpadview/DialpadFragment.java
+++ b/java/com/android/dialer/dialpadview/DialpadFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.dialer.dialpadview;
 
-import android.annotation.TargetApi;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
@@ -35,8 +34,6 @@
 import android.media.AudioManager;
 import android.media.ToneGenerator;
 import android.net.Uri;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.os.PersistableBundle;
 import android.os.Trace;
@@ -81,6 +78,7 @@
 import android.widget.TextView;
 import com.android.contacts.common.dialog.CallSubjectDialog;
 import com.android.contacts.common.util.StopWatch;
+import com.android.dialer.R;
 import com.android.dialer.animation.AnimUtils;
 import com.android.dialer.animation.AnimUtils.AnimationCallback;
 import com.android.dialer.callintent.CallInitiationType;
@@ -493,15 +491,11 @@
    * cannot be inflated in robolectric.
    */
   @SuppressWarnings("missingPermission")
-  @TargetApi(VERSION_CODES.O)
   @VisibleForTesting
   static boolean shouldShowEmergencyCallWarning(Context context) {
     if (showEmergencyCallWarningForTest != null) {
       return showEmergencyCallWarningForTest;
     }
-    if (VERSION.SDK_INT < VERSION_CODES.O) {
-      return false;
-    }
     if (!PermissionsUtil.hasReadPhoneStatePermissions(context)) {
       return false;
     }
diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
index 78ed252..a818ef4 100644
--- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
@@ -55,6 +55,7 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
+import com.android.dialer.R;
 import com.android.dialer.animation.AnimUtils;
 import com.android.dialer.app.MainComponent;
 import com.android.dialer.app.calllog.CallLogAdapter;
@@ -123,8 +124,6 @@
 import com.android.dialer.util.PermissionsUtil;
 import com.android.dialer.util.TransactionSafeActivity;
 import com.android.dialer.voicemail.listui.NewVoicemailFragment;
-import com.android.dialer.voicemail.listui.error.VoicemailStatusCorruptionHandler;
-import com.android.dialer.voicemail.listui.error.VoicemailStatusCorruptionHandler.Source;
 import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker;
 import com.android.dialer.voicemailstatus.VoicemailStatusHelper;
 import com.android.voicemail.VoicemailComponent;
@@ -966,8 +965,6 @@
     @Override
     public void onVoicemailStatusFetched(Cursor statusCursor) {
       LogUtil.i("OldMainActivityPeer.MainCallLogFragmentListener", "onVoicemailStatusFetched");
-      VoicemailStatusCorruptionHandler.maybeFixVoicemailStatus(
-          context, statusCursor, Source.Activity);
 
       // Update hasActiveVoicemailProvider, which controls the number of tabs displayed.
       int numberOfActiveVoicemailSources =
diff --git a/java/com/android/dialer/notification/DialerNotificationManager.java b/java/com/android/dialer/notification/DialerNotificationManager.java
index eb730be..a311124 100644
--- a/java/com/android/dialer/notification/DialerNotificationManager.java
+++ b/java/com/android/dialer/notification/DialerNotificationManager.java
@@ -22,7 +22,6 @@
 import android.service.notification.StatusBarNotification;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.v4.os.BuildCompat;
 import android.text.TextUtils;
 import android.util.Pair;
 import com.android.dialer.common.Assert;
@@ -49,10 +48,7 @@
     Assert.isNotNull(context);
     Assert.isNotNull(notification);
     Assert.checkArgument(!TextUtils.isEmpty(tag));
-
-    if (BuildCompat.isAtLeastO()) {
-      Assert.checkArgument(!TextUtils.isEmpty(notification.getChannelId()));
-    }
+    Assert.checkArgument(!TextUtils.isEmpty(notification.getChannelId()));
 
     getNotificationManager(context).notify(tag, id, notification);
     throttledNotificationSet.addAll(NotificationThrottler.throttle(context, notification));
diff --git a/java/com/android/dialer/notification/NotificationChannelManager.java b/java/com/android/dialer/notification/NotificationChannelManager.java
index 790aac3..8f9229d 100644
--- a/java/com/android/dialer/notification/NotificationChannelManager.java
+++ b/java/com/android/dialer/notification/NotificationChannelManager.java
@@ -16,23 +16,21 @@
 
 package com.android.dialer.notification;
 
-import android.annotation.TargetApi;
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
 import android.content.Context;
 import android.media.AudioAttributes;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.v4.os.BuildCompat;
 import android.telecom.PhoneAccountHandle;
 import android.util.ArraySet;
+
+import com.android.dialer.R;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import java.util.Set;
 
 /** Creates all notification channels for Dialer. */
-@TargetApi(VERSION_CODES.O)
 public final class NotificationChannelManager {
 
   /**
@@ -51,7 +49,6 @@
    *       <ul>
    */
   public static void initChannels(@NonNull Context context) {
-    Assert.checkArgument(BuildCompat.isAtLeastO());
     Assert.isNotNull(context);
 
     NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
@@ -90,7 +87,6 @@
   @NonNull
   public static String getVoicemailChannelId(
       @NonNull Context context, @Nullable PhoneAccountHandle handle) {
-    Assert.checkArgument(BuildCompat.isAtLeastO());
     Assert.isNotNull(context);
     return VoicemailChannelUtils.getChannelId(context, handle);
   }
diff --git a/java/com/android/dialer/notification/VoicemailChannelUtils.java b/java/com/android/dialer/notification/VoicemailChannelUtils.java
index ddc0f77..5cf8ee9 100644
--- a/java/com/android/dialer/notification/VoicemailChannelUtils.java
+++ b/java/com/android/dialer/notification/VoicemailChannelUtils.java
@@ -17,24 +17,23 @@
 package com.android.dialer.notification;
 
 import android.Manifest.permission;
-import android.annotation.TargetApi;
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
 import android.content.Context;
 import android.media.AudioAttributes;
-import android.os.Build.VERSION_CODES;
 import android.provider.Settings;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RequiresPermission;
 import android.support.annotation.VisibleForTesting;
-import android.support.v4.os.BuildCompat;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.ArraySet;
+
+import com.android.dialer.R;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.util.PermissionsUtil;
@@ -43,16 +42,12 @@
 import java.util.Set;
 
 /** Utilities for working with voicemail channels. */
-@TargetApi(VERSION_CODES.O)
 /* package */ final class VoicemailChannelUtils {
   @VisibleForTesting static final String GLOBAL_VOICEMAIL_CHANNEL_ID = "phone_voicemail";
   private static final String PER_ACCOUNT_VOICEMAIL_CHANNEL_ID_PREFIX = "phone_voicemail_account_";
 
   @SuppressWarnings("MissingPermission") // isSingleSimDevice() returns true if no permission
   static Set<String> getAllChannelIds(@NonNull Context context) {
-    Assert.checkArgument(BuildCompat.isAtLeastO());
-    Assert.isNotNull(context);
-
     Set<String> result = new ArraySet<>();
     if (isSingleSimDevice(context)) {
       result.add(GLOBAL_VOICEMAIL_CHANNEL_ID);
@@ -66,9 +61,6 @@
 
   @SuppressWarnings("MissingPermission") // isSingleSimDevice() returns true if no permission
   static void createAllChannels(@NonNull Context context) {
-    Assert.checkArgument(BuildCompat.isAtLeastO());
-    Assert.isNotNull(context);
-
     if (isSingleSimDevice(context)) {
       createGlobalVoicemailChannel(context);
     } else {
@@ -80,9 +72,6 @@
 
   @NonNull
   static String getChannelId(@NonNull Context context, @Nullable PhoneAccountHandle handle) {
-    Assert.checkArgument(BuildCompat.isAtLeastO());
-    Assert.isNotNull(context);
-
     // Most devices we deal with have a single SIM slot. No need to distinguish between phone
     // accounts.
     if (isSingleSimDevice(context)) {
diff --git a/java/com/android/dialer/phonelookup/blockednumber/SystemBlockedNumberPhoneLookup.java b/java/com/android/dialer/phonelookup/blockednumber/SystemBlockedNumberPhoneLookup.java
index 4192e79..2d53d2d 100644
--- a/java/com/android/dialer/phonelookup/blockednumber/SystemBlockedNumberPhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/blockednumber/SystemBlockedNumberPhoneLookup.java
@@ -23,7 +23,6 @@
 import android.support.annotation.WorkerThread;
 import android.util.ArraySet;
 import com.android.dialer.DialerPhoneNumber;
-import com.android.dialer.blocking.FilteredNumberCompat;
 import com.android.dialer.calllog.observer.MarkDirtyObserver;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
@@ -66,9 +65,6 @@
 
   @Override
   public ListenableFuture<SystemBlockedNumberInfo> lookup(@NonNull DialerPhoneNumber number) {
-    if (!FilteredNumberCompat.useNewFiltering(appContext)) {
-      return Futures.immediateFuture(SystemBlockedNumberInfo.getDefaultInstance());
-    }
     return executorService.submit(() -> queryNumbers(ImmutableSet.of(number)).get(number));
   }
 
@@ -83,9 +79,6 @@
   public ListenableFuture<ImmutableMap<DialerPhoneNumber, SystemBlockedNumberInfo>>
       getMostRecentInfo(ImmutableMap<DialerPhoneNumber, SystemBlockedNumberInfo> existingInfoMap) {
     LogUtil.enterBlock("SystemBlockedNumberPhoneLookup.getMostRecentPhoneLookupInfo");
-    if (!FilteredNumberCompat.useNewFiltering(appContext)) {
-      return Futures.immediateFuture(existingInfoMap);
-    }
     return executorService.submit(() -> queryNumbers(existingInfoMap.keySet()));
   }
 
diff --git a/java/com/android/dialer/phonenumbercache/CallLogQuery.java b/java/com/android/dialer/phonenumbercache/CallLogQuery.java
index 2f2758a..c001eaf 100644
--- a/java/com/android/dialer/phonenumbercache/CallLogQuery.java
+++ b/java/com/android/dialer/phonenumbercache/CallLogQuery.java
@@ -16,12 +16,9 @@
 
 package com.android.dialer.phonenumbercache;
 
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.provider.CallLog;
 import android.provider.CallLog.Calls;
 import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -55,8 +52,6 @@
   public static final int CACHED_PHOTO_URI = 23;
   public static final int POST_DIAL_DIGITS = 24;
   public static final int VIA_NUMBER = 25;
-
-  @RequiresApi(VERSION_CODES.O)
   public static final int TRANSCRIPTION_STATE = 26;
 
   private static final String[] PROJECTION_N =
@@ -86,14 +81,14 @@
         Calls.TRANSCRIPTION, // 22
         Calls.CACHED_PHOTO_URI, // 23
         CallLog.Calls.POST_DIAL_DIGITS, // 24
-        CallLog.Calls.VIA_NUMBER // 25
+        CallLog.Calls.VIA_NUMBER, // 25
       };
 
   private static final String[] PROJECTION_O;
 
   // TODO(mdooley): remove when this becomes a public api
   // Copied from android.provider.CallLog.Calls
-  private static final String TRANSCRIPTION_STATE_COLUMN = "transcription_state";
+  public static final String TRANSCRIPTION_STATE_COLUMN = "transcription_state";
 
   static {
     List<String> projectionList = new ArrayList<>(Arrays.asList(PROJECTION_N));
@@ -103,6 +98,6 @@
 
   @NonNull
   public static String[] getProjection() {
-    return VERSION.SDK_INT >= VERSION_CODES.O ? PROJECTION_O : PROJECTION_N;
+    return PROJECTION_O;
   }
 }
diff --git a/java/com/android/dialer/preferredsim/PreferredAccountUtil.java b/java/com/android/dialer/preferredsim/PreferredAccountUtil.java
index 1cfdbb1..9b7c56b 100644
--- a/java/com/android/dialer/preferredsim/PreferredAccountUtil.java
+++ b/java/com/android/dialer/preferredsim/PreferredAccountUtil.java
@@ -18,15 +18,9 @@
 
 import android.content.ComponentName;
 import android.content.Context;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
-import android.telephony.SubscriptionInfo;
-import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import com.android.dialer.common.LogUtil;
@@ -66,32 +60,10 @@
 
   public static boolean isPhoneAccountValid(
       Context context, PhoneAccountHandle phoneAccountHandle) {
-    if (VERSION.SDK_INT >= VERSION_CODES.O) {
       return context
               .getSystemService(TelephonyManager.class)
               .createForPhoneAccountHandle(phoneAccountHandle)
           != null;
-    }
-
-    PhoneAccount phoneAccount =
-        context.getSystemService(TelecomManager.class).getPhoneAccount(phoneAccountHandle);
-    if (phoneAccount == null) {
-      LogUtil.e("PreferredAccountUtil.isPhoneAccountValid", "invalid phone account");
-      return false;
-    }
-
-    if (!phoneAccount.isEnabled()) {
-      LogUtil.e("PreferredAccountUtil.isPhoneAccountValid", "disabled phone account");
-      return false;
-    }
-    for (SubscriptionInfo info :
-        SubscriptionManager.from(context).getActiveSubscriptionInfoList()) {
-      if (phoneAccountHandle.getId().startsWith(info.getIccId())) {
-        LogUtil.i("PreferredAccountUtil.isPhoneAccountValid", "sim found");
-        return true;
-      }
-    }
-    return false;
   }
 
   /**
diff --git a/java/com/android/dialer/shortcuts/DialerShortcut.java b/java/com/android/dialer/shortcuts/DialerShortcut.java
index a8d4204..5132b95 100644
--- a/java/com/android/dialer/shortcuts/DialerShortcut.java
+++ b/java/com/android/dialer/shortcuts/DialerShortcut.java
@@ -16,10 +16,8 @@
 
 package com.android.dialer.shortcuts;
 
-import android.annotation.TargetApi;
 import android.content.pm.ShortcutInfo;
 import android.net.Uri;
-import android.os.Build.VERSION_CODES;
 import android.provider.ContactsContract.Contacts;
 import android.support.annotation.NonNull;
 import com.google.auto.value.AutoValue;
@@ -30,7 +28,6 @@
  * <p>This differs from {@link ShortcutInfo} in that it doesn't hold an icon or intent, and provides
  * convenience methods for doing things like constructing labels.
  */
-@TargetApi(VERSION_CODES.N_MR1) // Shortcuts introduced in N MR1
 @AutoValue
 abstract class DialerShortcut {
 
diff --git a/java/com/android/dialer/shortcuts/DynamicShortcuts.java b/java/com/android/dialer/shortcuts/DynamicShortcuts.java
index e39dc27..e0d6104 100644
--- a/java/com/android/dialer/shortcuts/DynamicShortcuts.java
+++ b/java/com/android/dialer/shortcuts/DynamicShortcuts.java
@@ -17,12 +17,10 @@
 package com.android.dialer.shortcuts;
 
 import android.Manifest;
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.content.pm.ShortcutInfo;
 import android.content.pm.ShortcutManager;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.NonNull;
 import android.support.annotation.WorkerThread;
 import android.support.v4.content.ContextCompat;
@@ -60,7 +58,6 @@
  * updated periodically (about once a day).
  *
  */
-@TargetApi(VERSION_CODES.N_MR1) // Shortcuts introduced in N MR1
 final class DynamicShortcuts {
 
   private static final int MAX_DYNAMIC_SHORTCUTS = 3;
diff --git a/java/com/android/dialer/shortcuts/IconFactory.java b/java/com/android/dialer/shortcuts/IconFactory.java
index 7aad112..711e5a5 100644
--- a/java/com/android/dialer/shortcuts/IconFactory.java
+++ b/java/com/android/dialer/shortcuts/IconFactory.java
@@ -21,18 +21,14 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.drawable.AdaptiveIconDrawable;
-import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
 import android.net.Uri;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.provider.ContactsContract;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
 import android.support.annotation.WorkerThread;
-import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
-import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
+
+import com.android.dialer.R;
 import com.android.dialer.common.Assert;
 import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.util.DrawableConverter;
@@ -88,12 +84,9 @@
         ContactsContract.Contacts.openContactPhotoInputStream(
             context.getContentResolver(), lookupUri, false /* preferHighres */);
 
-    return VERSION.SDK_INT >= VERSION_CODES.O
-        ? createAdaptiveIcon(displayName, lookupKey, inputStream)
-        : createFlatIcon(displayName, lookupKey, inputStream);
+    return createAdaptiveIcon(displayName, lookupKey, inputStream);
   }
 
-  @RequiresApi(VERSION_CODES.O)
   private Icon createAdaptiveIcon(
       @NonNull String displayName, @NonNull String lookupKey, @Nullable InputStream inputStream) {
     if (inputStream == null) {
@@ -117,33 +110,4 @@
     Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
     return Icon.createWithAdaptiveBitmap(bitmap);
   }
-
-  private Icon createFlatIcon(
-      @NonNull String displayName, @NonNull String lookupKey, @Nullable InputStream inputStream) {
-    Drawable drawable;
-    if (inputStream == null) {
-      // No photo for contact; use a letter tile.
-      LetterTileDrawable letterTileDrawable = new LetterTileDrawable(context.getResources());
-      letterTileDrawable.setCanonicalDialerLetterTileDetails(
-          displayName, lookupKey, LetterTileDrawable.SHAPE_CIRCLE, LetterTileDrawable.TYPE_DEFAULT);
-      drawable = letterTileDrawable;
-    } else {
-      // There's a photo, create a circular drawable from it.
-      Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
-      drawable = createCircularDrawable(bitmap);
-    }
-    int iconSize =
-        context.getResources().getDimensionPixelSize(R.dimen.launcher_shortcut_icon_size);
-    return Icon.createWithBitmap(
-        DrawableConverter.drawableToBitmap(drawable, iconSize /* width */, iconSize /* height */));
-  }
-
-  @NonNull
-  private Drawable createCircularDrawable(@NonNull Bitmap bitmap) {
-    RoundedBitmapDrawable roundedBitmapDrawable =
-        RoundedBitmapDrawableFactory.create(context.getResources(), bitmap);
-    roundedBitmapDrawable.setCircular(true);
-    roundedBitmapDrawable.setAntiAlias(true);
-    return roundedBitmapDrawable;
-  }
 }
diff --git a/java/com/android/dialer/shortcuts/PeriodicJobService.java b/java/com/android/dialer/shortcuts/PeriodicJobService.java
index 62c9e37..4a48c74 100644
--- a/java/com/android/dialer/shortcuts/PeriodicJobService.java
+++ b/java/com/android/dialer/shortcuts/PeriodicJobService.java
@@ -16,15 +16,12 @@
 
 package com.android.dialer.shortcuts;
 
-import android.annotation.TargetApi;
 import android.app.job.JobInfo;
 import android.app.job.JobParameters;
 import android.app.job.JobScheduler;
 import android.app.job.JobService;
 import android.content.ComponentName;
 import android.content.Context;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.MainThread;
 import android.support.annotation.NonNull;
 import android.support.v4.os.UserManagerCompat;
@@ -38,7 +35,6 @@
  *
  * <p>Only {@link #schedulePeriodicJob(Context)} should be used by callers.
  */
-@TargetApi(VERSION_CODES.N_MR1) // Shortcuts introduced in N MR1
 public final class PeriodicJobService extends JobService {
 
   private static final long REFRESH_PERIOD_MILLIS = TimeUnit.HOURS.toMillis(24);
@@ -57,7 +53,7 @@
     Assert.isMainThread();
     LogUtil.enterBlock("PeriodicJobService.schedulePeriodicJob");
 
-    if (VERSION.SDK_INT >= VERSION_CODES.N_MR1 && UserManagerCompat.isUserUnlocked(context)) {
+    if (UserManagerCompat.isUserUnlocked(context)) {
       JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
       if (jobScheduler.getPendingJob(ScheduledJobIds.SHORTCUT_PERIODIC_JOB) != null) {
         LogUtil.i("PeriodicJobService.schedulePeriodicJob", "job already scheduled.");
@@ -91,16 +87,7 @@
     Assert.isMainThread();
     LogUtil.enterBlock("PeriodicJobService.onStartJob");
 
-    if (VERSION.SDK_INT >= VERSION_CODES.N_MR1) {
-      (refreshShortcutsTask = new RefreshShortcutsTask(this)).execute(params);
-    } else {
-      // It is possible for the job to have been scheduled on NMR1+ and then the system was
-      // downgraded to < NMR1. In this case, shortcuts are no longer supported so we cancel the job
-      // which creates them.
-      LogUtil.i("PeriodicJobService.onStartJob", "not running on NMR1, cancelling job");
-      cancelJob(this);
-      return false;
-    }
+    (refreshShortcutsTask = new RefreshShortcutsTask(this)).execute(params);
     return true;
   }
 
diff --git a/java/com/android/dialer/shortcuts/PinnedShortcuts.java b/java/com/android/dialer/shortcuts/PinnedShortcuts.java
index d5265c2..870abac 100644
--- a/java/com/android/dialer/shortcuts/PinnedShortcuts.java
+++ b/java/com/android/dialer/shortcuts/PinnedShortcuts.java
@@ -17,19 +17,19 @@
 package com.android.dialer.shortcuts;
 
 import android.Manifest;
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.content.pm.ShortcutInfo;
 import android.content.pm.ShortcutManager;
 import android.database.Cursor;
 import android.net.Uri;
-import android.os.Build.VERSION_CODES;
 import android.provider.ContactsContract.Contacts;
 import android.support.annotation.NonNull;
 import android.support.annotation.WorkerThread;
 import android.support.v4.content.ContextCompat;
 import android.util.ArrayMap;
+
+import com.android.dialer.R;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import java.util.ArrayList;
@@ -47,7 +47,6 @@
  * still up to date (e.g. photo and name). We also check to see if the contact has been deleted from
  * the user's contacts, and if so, we disable the pinned shortcut.
  */
-@TargetApi(VERSION_CODES.N_MR1) // Shortcuts introduced in N MR1
 final class PinnedShortcuts {
 
   private static final String[] PROJECTION =
diff --git a/java/com/android/dialer/shortcuts/RefreshShortcutsTask.java b/java/com/android/dialer/shortcuts/RefreshShortcutsTask.java
index 086d1dc..0bb9ecb 100644
--- a/java/com/android/dialer/shortcuts/RefreshShortcutsTask.java
+++ b/java/com/android/dialer/shortcuts/RefreshShortcutsTask.java
@@ -16,11 +16,9 @@
 
 package com.android.dialer.shortcuts;
 
-import android.annotation.TargetApi;
 import android.app.job.JobParameters;
 import android.app.job.JobService;
 import android.os.AsyncTask;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.MainThread;
 import android.support.annotation.NonNull;
 import android.support.annotation.WorkerThread;
@@ -28,7 +26,6 @@
 import com.android.dialer.common.LogUtil;
 
 /** {@link AsyncTask} used by the periodic job service to refresh dynamic and pinned shortcuts. */
-@TargetApi(VERSION_CODES.N_MR1) // Shortcuts introduced in N MR1
 final class RefreshShortcutsTask extends AsyncTask<JobParameters, Void, JobParameters> {
 
   private final JobService jobService;
diff --git a/java/com/android/dialer/shortcuts/ShortcutInfoFactory.java b/java/com/android/dialer/shortcuts/ShortcutInfoFactory.java
index cf780bb..62dd0e9 100644
--- a/java/com/android/dialer/shortcuts/ShortcutInfoFactory.java
+++ b/java/com/android/dialer/shortcuts/ShortcutInfoFactory.java
@@ -16,11 +16,9 @@
 
 package com.android.dialer.shortcuts;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ShortcutInfo;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.NonNull;
 import android.support.annotation.WorkerThread;
 import com.android.dialer.common.Assert;
@@ -35,7 +33,6 @@
  * <p>The main work this factory does is create shortcut intents. It also delegates to the {@link
  * IconFactory} to create icons.
  */
-@TargetApi(VERSION_CODES.N_MR1) // Shortcuts introduced in N MR1
 final class ShortcutInfoFactory {
 
   /** Key for the contact ID extra (a long) stored as part of the shortcut intent. */
diff --git a/java/com/android/dialer/shortcuts/ShortcutRefresher.java b/java/com/android/dialer/shortcuts/ShortcutRefresher.java
index 7776aa9..810fd8b 100644
--- a/java/com/android/dialer/shortcuts/ShortcutRefresher.java
+++ b/java/com/android/dialer/shortcuts/ShortcutRefresher.java
@@ -38,10 +38,6 @@
     Assert.isMainThread();
     Assert.isNotNull(context);
 
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) {
-      return;
-    }
-
     if (!Shortcuts.areDynamicShortcutsEnabled(context)) {
       return;
     }
diff --git a/java/com/android/dialer/shortcuts/ShortcutUsageReporter.java b/java/com/android/dialer/shortcuts/ShortcutUsageReporter.java
index 3f0b2a6..49ff51b 100644
--- a/java/com/android/dialer/shortcuts/ShortcutUsageReporter.java
+++ b/java/com/android/dialer/shortcuts/ShortcutUsageReporter.java
@@ -17,15 +17,12 @@
 package com.android.dialer.shortcuts;
 
 import android.Manifest;
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.content.pm.ShortcutManager;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.AsyncTask;
-import android.os.Build;
-import android.os.Build.VERSION_CODES;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.PhoneLookup;
 import android.support.annotation.MainThread;
@@ -48,7 +45,6 @@
  * <p>This allows launcher applications to provide users with shortcut suggestions, even if the user
  * isn't already using shortcuts.
  */
-@TargetApi(VERSION_CODES.N_MR1) // Shortcuts introduced in N_MR1
 public class ShortcutUsageReporter {
 
   private static final AsyncTaskExecutor EXECUTOR = AsyncTaskExecutors.createThreadPoolExecutor();
@@ -68,7 +64,7 @@
     Assert.isMainThread();
     Assert.isNotNull(context);
 
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1 || TextUtils.isEmpty(phoneNumber)) {
+    if (TextUtils.isEmpty(phoneNumber)) {
       return;
     }
 
diff --git a/java/com/android/dialer/simulator/impl/RttChatBot.java b/java/com/android/dialer/simulator/impl/RttChatBot.java
index cd52343..f141130 100644
--- a/java/com/android/dialer/simulator/impl/RttChatBot.java
+++ b/java/com/android/dialer/simulator/impl/RttChatBot.java
@@ -16,7 +16,6 @@
 
 package com.android.dialer.simulator.impl;
 
-import android.annotation.TargetApi;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
@@ -31,7 +30,6 @@
 import java.util.Random;
 
 /** Chat bot to generate remote RTT chat messages. */
-@TargetApi(28)
 class RttChatBot {
 
   interface Callback {
diff --git a/java/com/android/dialer/simulator/impl/SimulatorConnection.java b/java/com/android/dialer/simulator/impl/SimulatorConnection.java
index 3aa3296..b04742f 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorConnection.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorConnection.java
@@ -16,10 +16,8 @@
 
 package com.android.dialer.simulator.impl;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.support.annotation.NonNull;
-import android.support.v4.os.BuildCompat;
 import android.telecom.Connection;
 import android.telecom.Connection.RttTextStream;
 import android.telecom.ConnectionRequest;
@@ -34,7 +32,6 @@
 import java.util.List;
 
 /** Represents a single phone call on the device. */
-@TargetApi(28)
 public final class SimulatorConnection extends Connection {
   private final List<Listener> listeners = new ArrayList<>();
   private final List<Event> events = new ArrayList<>();
@@ -60,9 +57,7 @@
             getConnectionCapabilities() | CAPABILITY_SEPARATE_FROM_CONFERENCE);
       }
     }
-    if (BuildCompat.isAtLeastP()) {
-      rttTextStream = request.getRttTextStream();
-    }
+    rttTextStream = request.getRttTextStream();
     setVideoProvider(new SimulatorVideoProvider(context, this));
     simulatorConnectionsBank = SimulatorComponent.get(context).getSimulatorConnectionsBank();
   }
diff --git a/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java b/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java
index c270c59..cf67a79 100644
--- a/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java
+++ b/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java
@@ -25,9 +25,10 @@
 import android.graphics.drawable.Icon;
 import android.support.design.widget.Snackbar;
 import android.support.v4.app.FragmentManager;
-import android.support.v4.os.BuildCompat;
 import android.view.View;
 import android.widget.Toast;
+
+import com.android.dialer.R;
 import com.android.dialer.configprovider.ConfigProviderComponent;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
@@ -196,11 +197,8 @@
                         context.getString(R.string.spam_blocking_promo_action_filter_spam),
                         actionIntent)
                     .build())
-            .setContentTitle(context.getString(R.string.spam_blocking_promo_title));
-
-    if (BuildCompat.isAtLeastO()) {
-      builder.setChannelId(NotificationChannelId.DEFAULT);
-    }
+            .setContentTitle(context.getString(R.string.spam_blocking_promo_title))
+            .setChannelId(NotificationChannelId.DEFAULT);
     return builder.build();
   }
 }
diff --git a/java/com/android/dialer/strictmode/impl/SystemDialerStrictMode.java b/java/com/android/dialer/strictmode/impl/SystemDialerStrictMode.java
index f3ce70c..4e527e5 100644
--- a/java/com/android/dialer/strictmode/impl/SystemDialerStrictMode.java
+++ b/java/com/android/dialer/strictmode/impl/SystemDialerStrictMode.java
@@ -17,8 +17,6 @@
 package com.android.dialer.strictmode.impl;
 
 import android.app.Application;
-import android.os.Build;
-import android.os.Build.VERSION_CODES;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.StrictMode;
@@ -91,12 +89,10 @@
     StrictMode.VmPolicy.Builder vmPolicyBuilder =
         new StrictMode.VmPolicy.Builder(vmPenalties)
             .detectLeakedClosableObjects()
-            .detectLeakedSqlLiteObjects();
-    if (Build.VERSION.SDK_INT >= VERSION_CODES.O) {
-      vmPolicyBuilder.detectContentUriWithoutPermission();
+            .detectLeakedSqlLiteObjects()
+            .detectContentUriWithoutPermission();
       // TODO(azlatin): Enable detecting untagged sockets once: a bug is fixed.
       // vmPolicyBuilder.detectUntaggedSockets();
-    }
     StrictMode.setVmPolicy(vmPolicyBuilder.build());
   }
 
diff --git a/java/com/android/dialer/telecom/TelecomUtil.java b/java/com/android/dialer/telecom/TelecomUtil.java
index 633a53e..2d22314 100644
--- a/java/com/android/dialer/telecom/TelecomUtil.java
+++ b/java/com/android/dialer/telecom/TelecomUtil.java
@@ -23,8 +23,6 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.net.Uri;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.os.UserHandle;
 import android.provider.CallLog.Calls;
 import android.support.annotation.NonNull;
@@ -356,11 +354,7 @@
         // Dialer is launched.
         // Instead, Dialer should use TelecomManager#isInManagedCall, which only returns true if the
         // device is in a managed call which Dialer would know about.
-        if (VERSION.SDK_INT >= VERSION_CODES.O) {
-          return getTelecomManager(context).isInManagedCall();
-        } else {
-          return getTelecomManager(context).isInCall();
-        }
+        return getTelecomManager(context).isInManagedCall();
       }
       return false;
     }
diff --git a/java/com/android/dialer/voicemail/listui/error/VoicemailErrorMessageCreator.java b/java/com/android/dialer/voicemail/listui/error/VoicemailErrorMessageCreator.java
index 43da6af..86cfad7 100644
--- a/java/com/android/dialer/voicemail/listui/error/VoicemailErrorMessageCreator.java
+++ b/java/com/android/dialer/voicemail/listui/error/VoicemailErrorMessageCreator.java
@@ -17,8 +17,6 @@
 package com.android.dialer.voicemail.listui.error;
 
 import android.content.Context;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.Nullable;
 import com.android.voicemail.VisualVoicemailTypeExtensions;
 
@@ -32,10 +30,6 @@
   @Nullable
   public VoicemailErrorMessage create(
       Context context, VoicemailStatus status, VoicemailStatusReader statusReader) {
-    // Never return error message before NMR1. Voicemail status is not supported on those.
-    if (VERSION.SDK_INT < VERSION_CODES.N_MR1) {
-      return null;
-    }
     switch (status.type) {
       case VisualVoicemailTypeExtensions.VVM_TYPE_VVM3:
         return Vvm3VoicemailMessageCreator.create(context, status, statusReader);
diff --git a/java/com/android/dialer/voicemail/listui/error/VoicemailStatus.java b/java/com/android/dialer/voicemail/listui/error/VoicemailStatus.java
index ebda0e6..05bb32a 100644
--- a/java/com/android/dialer/voicemail/listui/error/VoicemailStatus.java
+++ b/java/com/android/dialer/voicemail/listui/error/VoicemailStatus.java
@@ -16,18 +16,14 @@
 
 package com.android.dialer.voicemail.listui.error;
 
-import android.annotation.TargetApi;
 import android.content.ComponentName;
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.provider.Settings;
 import android.provider.Settings.Global;
 import android.provider.VoicemailContract.Status;
 import android.support.annotation.Nullable;
-import android.support.v4.os.BuildCompat;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.ServiceState;
 import android.telephony.TelephonyManager;
@@ -67,18 +63,11 @@
     settingsUri = getUri(statusCursor, VoicemailStatusQuery.SETTINGS_URI_INDEX);
     voicemailAccessUri = getUri(statusCursor, VoicemailStatusQuery.VOICEMAIL_ACCESS_URI_INDEX);
 
-    if (VERSION.SDK_INT >= VERSION_CODES.N_MR1) {
-      type =
-          getString(
-              statusCursor, VoicemailStatusQuery.SOURCE_TYPE_INDEX, TelephonyManager.VVM_TYPE_OMTP);
-      phoneAccountComponentName =
-          getString(statusCursor, VoicemailStatusQuery.PHONE_ACCOUNT_COMPONENT_NAME, "");
-      phoneAccountId = getString(statusCursor, VoicemailStatusQuery.PHONE_ACCOUNT_ID, "");
-    } else {
-      type = TelephonyManager.VVM_TYPE_OMTP;
-      phoneAccountComponentName = "";
-      phoneAccountId = "";
-    }
+    type = getString(
+            statusCursor, VoicemailStatusQuery.SOURCE_TYPE_INDEX, TelephonyManager.VVM_TYPE_OMTP);
+    phoneAccountComponentName =
+        getString(statusCursor, VoicemailStatusQuery.PHONE_ACCOUNT_COMPONENT_NAME, "");
+    phoneAccountId = getString(statusCursor, VoicemailStatusQuery.PHONE_ACCOUNT_ID, "");
 
     configurationState =
         getInt(
@@ -97,7 +86,7 @@
      * user. It is much simpler to poll the status on the UI side. The result is injected back to
      * the status query result so the handling will be consistent with other voicemail clients.
      */
-    if (BuildCompat.isAtLeastO() && sourcePackage.equals(context.getPackageName())) {
+    if (sourcePackage.equals(context.getPackageName())) {
       notificationChannelState =
           getNotificationChannelStateFormTelephony(context, getPhoneAccountHandle());
     } else {
@@ -130,7 +119,6 @@
     isAirplaneMode = builder.isAirplaneMode;
   }
 
-  @TargetApi(VERSION_CODES.O)
   private static int getNotificationChannelStateFormTelephony(
       Context context, PhoneAccountHandle phoneAccountHandle) {
     TelephonyManager telephonyManager =
diff --git a/java/com/android/dialer/voicemail/listui/error/VoicemailStatusCorruptionHandler.java b/java/com/android/dialer/voicemail/listui/error/VoicemailStatusCorruptionHandler.java
deleted file mode 100644
index 75b21e7..0000000
--- a/java/com/android/dialer/voicemail/listui/error/VoicemailStatusCorruptionHandler.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2016 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.voicemail.listui.error;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.database.Cursor;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
-import android.provider.VoicemailContract.Status;
-import android.telecom.PhoneAccountHandle;
-import android.telephony.TelephonyManager;
-import com.android.dialer.common.Assert;
-import com.android.dialer.common.LogUtil;
-import com.android.dialer.compat.telephony.TelephonyManagerCompat;
-import com.android.dialer.configprovider.ConfigProviderComponent;
-import com.android.dialer.logging.DialerImpression;
-import com.android.dialer.logging.Logger;
-
-/**
- * This class will detect the corruption in the voicemail status and log it so we can track how many
- * users are affected.
- */
-public class VoicemailStatusCorruptionHandler {
-
-  /** Where the check is made so logging can be done. */
-  public enum Source {
-    Activity,
-    Notification
-  }
-
-  private static final String CONFIG_VVM_STATUS_FIX_DISABLED = "vvm_status_fix_disabled";
-
-  public static void maybeFixVoicemailStatus(Context context, Cursor statusCursor, Source source) {
-
-    if (ConfigProviderComponent.get(context)
-        .getConfigProvider()
-        .getBoolean(CONFIG_VVM_STATUS_FIX_DISABLED, false)) {
-      return;
-    }
-
-    if (VERSION.SDK_INT != VERSION_CODES.N_MR1) {
-      // This issue is specific to N MR1, it is fixed in future SDK.
-      return;
-    }
-
-    if (statusCursor.getCount() == 0) {
-      return;
-    }
-
-    statusCursor.moveToFirst();
-    VoicemailStatus status = new VoicemailStatus(context, statusCursor);
-    PhoneAccountHandle phoneAccountHandle =
-        new PhoneAccountHandle(
-            ComponentName.unflattenFromString(status.phoneAccountComponentName),
-            status.phoneAccountId);
-
-    TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class);
-
-    boolean visualVoicemailEnabled =
-        TelephonyManagerCompat.isVisualVoicemailEnabled(telephonyManager, phoneAccountHandle);
-    LogUtil.i(
-        "VoicemailStatusCorruptionHandler.maybeFixVoicemailStatus",
-        "Source="
-            + source
-            + ", CONFIGURATION_STATE="
-            + status.configurationState
-            + ", visualVoicemailEnabled="
-            + visualVoicemailEnabled);
-
-    // If visual voicemail is enabled, the CONFIGURATION_STATE should be either OK, PIN_NOT_SET,
-    // or other failure code. CONFIGURATION_STATE_NOT_CONFIGURED means that the client has been
-    // shut down improperly (a bug). The client should be reset or the VVM tab will be
-    // missing.
-    if (Status.CONFIGURATION_STATE_NOT_CONFIGURED == status.configurationState
-        && visualVoicemailEnabled) {
-      LogUtil.e(
-          "VoicemailStatusCorruptionHandler.maybeFixVoicemailStatus",
-          "VVM3 voicemail status corrupted");
-
-      switch (source) {
-        case Activity:
-          Logger.get(context)
-              .logImpression(
-                  DialerImpression.Type
-                      .VOICEMAIL_CONFIGURATION_STATE_CORRUPTION_DETECTED_FROM_ACTIVITY);
-          break;
-        case Notification:
-          Logger.get(context)
-              .logImpression(
-                  DialerImpression.Type
-                      .VOICEMAIL_CONFIGURATION_STATE_CORRUPTION_DETECTED_FROM_NOTIFICATION);
-          break;
-        default:
-          Assert.fail("this should never happen");
-          break;
-      }
-      // At this point we could attempt to work around the issue by disabling and re-enabling
-      // voicemail. Unfortunately this work around is buggy so we'll do nothing for now.
-    }
-  }
-}
diff --git a/java/com/android/dialer/voicemail/listui/error/Vvm3VoicemailMessageCreator.java b/java/com/android/dialer/voicemail/listui/error/Vvm3VoicemailMessageCreator.java
index 863c586..6106111 100644
--- a/java/com/android/dialer/voicemail/listui/error/Vvm3VoicemailMessageCreator.java
+++ b/java/com/android/dialer/voicemail/listui/error/Vvm3VoicemailMessageCreator.java
@@ -19,14 +19,14 @@
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
-import android.os.Build.VERSION_CODES;
 import android.provider.VoicemailContract.Status;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
 import android.view.View;
 import android.view.View.OnClickListener;
+
 import com.android.contacts.common.util.ContactDisplayUtils;
+import com.android.dialer.R;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.voicemail.listui.error.VoicemailErrorMessage.Action;
@@ -35,7 +35,6 @@
  * Create error message from {@link VoicemailStatus} for VVM3 visual voicemail. VVM3 is used only by
  * Verizon Wireless.
  */
-@RequiresApi(VERSION_CODES.N_MR1)
 public class Vvm3VoicemailMessageCreator {
 
   // Copied from com.android.phone.vvm.omtp.protocol.Vvm3EventHandler
diff --git a/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java b/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java
index ebebdf7..5952e4f 100644
--- a/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java
+++ b/java/com/android/dialer/voicemail/settings/VoicemailChangePinActivity.java
@@ -16,14 +16,12 @@
 
 package com.android.dialer.voicemail.settings;
 
-import android.annotation.TargetApi;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.ProgressDialog;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnDismissListener;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
@@ -44,6 +42,8 @@
 import android.widget.TextView;
 import android.widget.TextView.OnEditorActionListener;
 import android.widget.Toast;
+
+import com.android.dialer.R;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.DialerExecutor;
 import com.android.dialer.common.concurrent.DialerExecutor.Worker;
@@ -62,7 +62,6 @@
  * traditional voicemail through phone call. The intent to launch this activity must contain {@link
  * VoicemailClient#PARAM_PHONE_ACCOUNT_HANDLE}
  */
-@TargetApi(VERSION_CODES.O)
 public class VoicemailChangePinActivity extends Activity
     implements OnClickListener, OnEditorActionListener, TextWatcher {
 
diff --git a/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java b/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java
index 1eb831f..00b5901 100644
--- a/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java
+++ b/java/com/android/dialer/voicemail/settings/VoicemailSettingsFragment.java
@@ -13,11 +13,9 @@
  */
 package com.android.dialer.voicemail.settings;
 
-import android.annotation.TargetApi;
 import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceClickListener;
@@ -33,6 +31,8 @@
 import android.telecom.TelecomManager;
 import android.telephony.SubscriptionInfo;
 import android.telephony.TelephonyManager;
+
+import com.android.dialer.R;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.preference.SwitchPreferenceWithClickableSummary;
@@ -53,7 +53,6 @@
  * Fragment for voicemail settings. Requires {@link VoicemailClient#PARAM_PHONE_ACCOUNT_HANDLE} set
  * in arguments.
  */
-@TargetApi(VERSION_CODES.O)
 public class VoicemailSettingsFragment extends PreferenceFragment
     implements Preference.OnPreferenceChangeListener, ActivationStateListener {
 
diff --git a/java/com/android/dialer/voicemailstatus/VoicemailStatusQuery.java b/java/com/android/dialer/voicemailstatus/VoicemailStatusQuery.java
index 7264afe..20b073d 100644
--- a/java/com/android/dialer/voicemailstatus/VoicemailStatusQuery.java
+++ b/java/com/android/dialer/voicemailstatus/VoicemailStatusQuery.java
@@ -16,13 +16,7 @@
 
 package com.android.dialer.voicemailstatus;
 
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.provider.VoicemailContract.Status;
-import android.support.annotation.RequiresApi;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
 
 /** The query for the call voicemail status table. */
 public class VoicemailStatusQuery {
@@ -36,19 +30,11 @@
   public static final int NOTIFICATION_CHANNEL_STATE_INDEX = 5;
   public static final int QUOTA_OCCUPIED_INDEX = 6;
   public static final int QUOTA_TOTAL_INDEX = 7;
-
-  @RequiresApi(VERSION_CODES.N_MR1)
-  // The PHONE_ACCOUNT columns were added in M, but aren't queryable until N MR1
   public static final int PHONE_ACCOUNT_COMPONENT_NAME = 8;
-
-  @RequiresApi(VERSION_CODES.N_MR1)
   public static final int PHONE_ACCOUNT_ID = 9;
-
-  @RequiresApi(VERSION_CODES.N_MR1)
   public static final int SOURCE_TYPE_INDEX = 10;
 
-  @RequiresApi(VERSION_CODES.N)
-  private static final String[] PROJECTION_N =
+  private static final String[] PROJECTION =
       new String[] {
         Status.SOURCE_PACKAGE, // 0
         Status.SETTINGS_URI, // 1
@@ -57,21 +43,14 @@
         Status.DATA_CHANNEL_STATE, // 4
         Status.NOTIFICATION_CHANNEL_STATE, // 5
         Status.QUOTA_OCCUPIED, // 6
-        Status.QUOTA_TOTAL // 7
+        Status.QUOTA_TOTAL, // 7
+        Status.PHONE_ACCOUNT_COMPONENT_NAME, // 8
+        Status.PHONE_ACCOUNT_ID, // 9
+        Status.SOURCE_TYPE // 10
       };
 
-  @RequiresApi(VERSION_CODES.N_MR1)
-  private static final String[] PROJECTION_NMR1;
-
-  static {
-    List<String> projectionList = new ArrayList<>(Arrays.asList(PROJECTION_N));
-    projectionList.add(Status.PHONE_ACCOUNT_COMPONENT_NAME); // 8
-    projectionList.add(Status.PHONE_ACCOUNT_ID); // 9
-    projectionList.add(Status.SOURCE_TYPE); // 10
-    PROJECTION_NMR1 = projectionList.toArray(new String[projectionList.size()]);
-  }
 
   public static String[] getProjection() {
-    return VERSION.SDK_INT >= VERSION_CODES.N_MR1 ? PROJECTION_NMR1 : PROJECTION_N;
+    return PROJECTION;
   }
 }
diff --git a/java/com/android/incallui/ExternalCallNotifier.java b/java/com/android/incallui/ExternalCallNotifier.java
index 160e250..53a43a8 100644
--- a/java/com/android/incallui/ExternalCallNotifier.java
+++ b/java/com/android/incallui/ExternalCallNotifier.java
@@ -16,7 +16,6 @@
 
 package com.android.incallui;
 
-import android.annotation.TargetApi;
 import android.app.Notification;
 import android.app.PendingIntent;
 import android.content.Context;
@@ -25,10 +24,8 @@
 import android.graphics.BitmapFactory;
 import android.graphics.drawable.BitmapDrawable;
 import android.net.Uri;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.v4.os.BuildCompat;
 import android.telecom.Call;
 import android.telecom.PhoneAccount;
 import android.telecom.VideoProfile;
@@ -38,6 +35,7 @@
 import android.util.ArrayMap;
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.compat.CallCompat;
+import com.android.dialer.R;
 import com.android.dialer.common.Assert;
 import com.android.dialer.contactphoto.BitmapUtil;
 import com.android.dialer.contacts.ContactsComponent;
@@ -128,7 +126,6 @@
    * @param notificationId The notification ID associated with the external call which is to be
    *     pulled.
    */
-  @TargetApi(VERSION_CODES.N_MR1)
   public void pullExternalCall(int notificationId) {
     for (NotificationInfo info : notifications.values()) {
       if (info.getNotificationId() == notificationId
@@ -239,9 +236,7 @@
     builder.setLargeIcon(info.getLargeIcon());
     builder.setColor(ThemeComponent.get(context).theme().getColorPrimary());
     builder.addPerson(info.getPersonReference());
-    if (BuildCompat.isAtLeastO()) {
-      builder.setChannelId(NotificationChannelId.DEFAULT);
-    }
+    builder.setChannelId(NotificationChannelId.DEFAULT);
 
     // Where the external call supports being transferred to the local device, add an action
     // to the notification to initiate the call pull process.
@@ -274,9 +269,7 @@
     Notification.Builder publicBuilder = new Notification.Builder(context);
     publicBuilder.setSmallIcon(R.drawable.quantum_ic_call_white_24);
     publicBuilder.setColor(ThemeComponent.get(context).theme().getColorPrimary());
-    if (BuildCompat.isAtLeastO()) {
-      publicBuilder.setChannelId(NotificationChannelId.DEFAULT);
-    }
+    publicBuilder.setChannelId(NotificationChannelId.DEFAULT);
 
     builder.setPublicVersion(publicBuilder.build());
     Notification notification = builder.build();
@@ -451,9 +444,7 @@
     summary.setGroup(GROUP_KEY);
     summary.setGroupSummary(true);
     summary.setSmallIcon(R.drawable.quantum_ic_call_white_24);
-    if (BuildCompat.isAtLeastO()) {
-      summary.setChannelId(NotificationChannelId.DEFAULT);
-    }
+    summary.setChannelId(NotificationChannelId.DEFAULT);
     DialerNotificationManager.notify(
         context, GROUP_SUMMARY_NOTIFICATION_TAG, GROUP_SUMMARY_NOTIFICATION_ID, summary.build());
   }
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index 8881029..67bc2a5 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -20,13 +20,12 @@
 import android.content.Intent;
 import android.graphics.Point;
 import android.os.Bundle;
-import android.os.Handler;
 import android.os.Trace;
+import android.provider.BlockedNumberContract;
 import android.support.annotation.MainThread;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
-import android.support.v4.os.UserManagerCompat;
 import android.telecom.Call.Details;
 import android.telecom.CallAudioState;
 import android.telecom.DisconnectCause;
@@ -43,20 +42,18 @@
 import com.android.contacts.common.compat.CallCompat;
 import com.android.dialer.CallConfiguration;
 import com.android.dialer.Mode;
+import com.android.dialer.R;
 import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
 import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
-import com.android.dialer.blocking.FilteredNumberCompat;
 import com.android.dialer.blocking.FilteredNumbersUtil;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.DialerExecutorComponent;
 import com.android.dialer.enrichedcall.EnrichedCallComponent;
-import com.android.dialer.location.GeoUtil;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.InteractionEvent;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.postcall.PostCall;
-import com.android.dialer.telecom.TelecomCallUtil;
 import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.util.TouchPointManager;
 import com.android.incallui.InCallOrientationEventListener.ScreenOrientation;
@@ -70,7 +67,6 @@
 import com.android.incallui.disconnectdialog.DisconnectMessage;
 import com.android.incallui.incalluilock.InCallUiLock;
 import com.android.incallui.latencyreport.LatencyReport;
-import com.android.incallui.legacyblocking.BlockedNumberContentObserver;
 import com.android.incallui.spam.SpamCallListListener;
 import com.android.incallui.speakeasy.SpeakEasyCallManager;
 import com.android.incallui.telecomeventui.InternationalCallOnWifiDialogActivity;
@@ -85,7 +81,6 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * Takes updates from the CallList and notifies the InCallActivity (UI) of the changes. Responsible
@@ -95,11 +90,8 @@
  * of a state machine at this point. Consider renaming.
  */
 public class InCallPresenter implements CallList.Listener, AudioModeProvider.AudioModeListener {
-  private static final String PIXEL2017_SYSTEM_FEATURE =
-      "com.google.android.feature.PIXEL_2017_EXPERIENCE";
-  private static final String CALL_CONFIGURATION_EXTRA = "call_configuration";
 
-  private static final long BLOCK_QUERY_TIMEOUT_MS = 1000;
+  private static final String CALL_CONFIGURATION_EXTRA = "call_configuration";
 
   private static final Bundle EMPTY_EXTRAS = new Bundle();
 
@@ -201,7 +193,6 @@
   private final PseudoScreenState pseudoScreenState = new PseudoScreenState();
   private boolean serviceConnected;
   private InCallCameraManager inCallCameraManager;
-  private FilteredNumberAsyncQueryHandler filteredQueryHandler;
   private CallList.Listener spamCallListListener;
   private CallList.Listener activeCallsListener;
   /** Whether or not we are currently bound and waiting for Telecom to send us a new call. */
@@ -220,9 +211,9 @@
               return;
             }
             // Check if the number is blocked, to silence the ringer.
-            String countryIso = GeoUtil.getCurrentCountryIso(context);
-            filteredQueryHandler.isBlockedNumber(
-                onCheckBlockedListener, incomingNumber, countryIso);
+            if (BlockedNumberContract.isBlocked(context, incomingNumber)) {
+              TelecomUtil.silenceRinger(context);
+            }
           }
         }
       };
@@ -342,7 +333,6 @@
       ExternalCallNotifier externalCallNotifier,
       ContactInfoCache contactInfoCache,
       ProximitySensor proximitySensor,
-      FilteredNumberAsyncQueryHandler filteredNumberQueryHandler,
       @NonNull SpeakEasyCallManager speakEasyCallManager) {
     Trace.beginSection("InCallPresenter.setUp");
     if (serviceConnected) {
@@ -401,7 +391,6 @@
 
     VideoPauseController.getInstance().setUp(this);
 
-    filteredQueryHandler = filteredNumberQueryHandler;
     this.speakEasyCallManager = speakEasyCallManager;
     this.context
         .getSystemService(TelephonyManager.class)
@@ -629,15 +618,11 @@
   public void onCallAdded(final android.telecom.Call call) {
     Trace.beginSection("InCallPresenter.onCallAdded");
     LatencyReport latencyReport = new LatencyReport(call);
-    if (shouldAttemptBlocking(call)) {
-      maybeBlockCall(call, latencyReport);
+    if (call.getDetails().hasProperty(CallCompat.Details.PROPERTY_IS_EXTERNAL_CALL)) {
+      externalCallList.onCallAdded(call);
     } else {
-      if (call.getDetails().hasProperty(CallCompat.Details.PROPERTY_IS_EXTERNAL_CALL)) {
-        externalCallList.onCallAdded(call);
-      } else {
-        latencyReport.onCallBlockingDone();
-        callList.onCallAdded(context, call, latencyReport);
-      }
+      latencyReport.onCallBlockingDone();
+      callList.onCallAdded(context, call, latencyReport);
     }
 
     // Since a call has been added we are no longer waiting for Telecom to send us a call.
@@ -648,121 +633,6 @@
     Trace.endSection();
   }
 
-  private boolean shouldAttemptBlocking(android.telecom.Call call) {
-    if (call.getState() != android.telecom.Call.STATE_RINGING) {
-      return false;
-    }
-    if (!UserManagerCompat.isUserUnlocked(context)) {
-      LogUtil.i(
-          "InCallPresenter.shouldAttemptBlocking",
-          "not attempting to block incoming call because user is locked");
-      return false;
-    }
-    if (TelecomCallUtil.isEmergencyCall(call)) {
-      LogUtil.i(
-          "InCallPresenter.shouldAttemptBlocking",
-          "Not attempting to block incoming emergency call");
-      return false;
-    }
-    if (FilteredNumbersUtil.hasRecentEmergencyCall(context)) {
-      LogUtil.i(
-          "InCallPresenter.shouldAttemptBlocking",
-          "Not attempting to block incoming call due to recent emergency call");
-      return false;
-    }
-    if (call.getDetails().hasProperty(CallCompat.Details.PROPERTY_IS_EXTERNAL_CALL)) {
-      return false;
-    }
-    if (FilteredNumberCompat.useNewFiltering(context)) {
-      LogUtil.i(
-          "InCallPresenter.shouldAttemptBlocking",
-          "not attempting to block incoming call because framework blocking is in use");
-      return false;
-    }
-    return true;
-  }
-
-  /**
-   * Checks whether a call should be blocked, and blocks it if so. Otherwise, it adds the call to
-   * the CallList so it can proceed as normal. There is a timeout, so if the function for checking
-   * whether a function is blocked does not return in a reasonable time, we proceed with adding the
-   * call anyways.
-   */
-  private void maybeBlockCall(final android.telecom.Call call, final LatencyReport latencyReport) {
-    final String countryIso = GeoUtil.getCurrentCountryIso(context);
-    final String number = TelecomCallUtil.getNumber(call);
-    final long timeAdded = System.currentTimeMillis();
-
-    // Though AtomicBoolean's can be scary, don't fear, as in this case it is only used on the
-    // main UI thread. It is needed so we can change its value within different scopes, since
-    // that cannot be done with a final boolean.
-    final AtomicBoolean hasTimedOut = new AtomicBoolean(false);
-
-    final Handler handler = new Handler();
-
-    // Proceed if the query is slow; the call may still be blocked after the query returns.
-    final Runnable runnable =
-        new Runnable() {
-          @Override
-          public void run() {
-            hasTimedOut.set(true);
-            latencyReport.onCallBlockingDone();
-            callList.onCallAdded(context, call, latencyReport);
-          }
-        };
-    handler.postDelayed(runnable, BLOCK_QUERY_TIMEOUT_MS);
-
-    OnCheckBlockedListener onCheckBlockedListener =
-        new OnCheckBlockedListener() {
-          @Override
-          public void onCheckComplete(final Integer id) {
-            if (isReadyForTearDown()) {
-              LogUtil.i("InCallPresenter.onCheckComplete", "torn down, not adding call");
-              return;
-            }
-            if (!hasTimedOut.get()) {
-              handler.removeCallbacks(runnable);
-            }
-            if (id == null) {
-              if (!hasTimedOut.get()) {
-                latencyReport.onCallBlockingDone();
-                callList.onCallAdded(context, call, latencyReport);
-              }
-            } else if (id == FilteredNumberAsyncQueryHandler.INVALID_ID) {
-              LogUtil.d(
-                  "InCallPresenter.onCheckComplete", "invalid number, skipping block checking");
-              if (!hasTimedOut.get()) {
-                handler.removeCallbacks(runnable);
-
-                latencyReport.onCallBlockingDone();
-                callList.onCallAdded(context, call, latencyReport);
-              }
-            } else {
-              LogUtil.i(
-                  "InCallPresenter.onCheckComplete", "Rejecting incoming call from blocked number");
-              call.reject(false, null);
-              Logger.get(context).logInteraction(InteractionEvent.Type.CALL_BLOCKED);
-
-              /*
-               * If mContext is null, then the InCallPresenter was torn down before the
-               * block check had a chance to complete. The context is no longer valid, so
-               * don't attempt to remove the call log entry.
-               */
-              if (context == null) {
-                return;
-              }
-              // Register observer to update the call log.
-              // BlockedNumberContentObserver will unregister after successful log or timeout.
-              BlockedNumberContentObserver contentObserver =
-                  new BlockedNumberContentObserver(context, new Handler(), number, timeAdded);
-              contentObserver.register();
-            }
-          }
-        };
-
-    filteredQueryHandler.isBlockedNumber(onCheckBlockedListener, number, countryIso);
-  }
-
   public void onCallRemoved(android.telecom.Call call) {
     if (call.getDetails().hasProperty(CallCompat.Details.PROPERTY_IS_EXTERNAL_CALL)) {
       externalCallList.onCallRemoved(call);
@@ -1892,22 +1762,14 @@
 
   VideoSurfaceTexture getLocalVideoSurfaceTexture() {
     if (localVideoSurfaceTexture == null) {
-      boolean isPixel2017 = false;
-      if (context != null) {
-        isPixel2017 = context.getPackageManager().hasSystemFeature(PIXEL2017_SYSTEM_FEATURE);
-      }
-      localVideoSurfaceTexture = VideoSurfaceBindings.createLocalVideoSurfaceTexture(isPixel2017);
+      localVideoSurfaceTexture = VideoSurfaceBindings.createLocalVideoSurfaceTexture();
     }
     return localVideoSurfaceTexture;
   }
 
   VideoSurfaceTexture getRemoteVideoSurfaceTexture() {
     if (remoteVideoSurfaceTexture == null) {
-      boolean isPixel2017 = false;
-      if (context != null) {
-        isPixel2017 = context.getPackageManager().hasSystemFeature(PIXEL2017_SYSTEM_FEATURE);
-      }
-      remoteVideoSurfaceTexture = VideoSurfaceBindings.createRemoteVideoSurfaceTexture(isPixel2017);
+      remoteVideoSurfaceTexture = VideoSurfaceBindings.createRemoteVideoSurfaceTexture();
     }
     return remoteVideoSurfaceTexture;
   }
diff --git a/java/com/android/incallui/InCallServiceImpl.java b/java/com/android/incallui/InCallServiceImpl.java
index b2d318f..b225d53 100644
--- a/java/com/android/incallui/InCallServiceImpl.java
+++ b/java/com/android/incallui/InCallServiceImpl.java
@@ -108,7 +108,6 @@
             contactInfoCache,
             new ProximitySensor(
                 context, AudioModeProvider.getInstance(), new AccelerometerListener(context)),
-            new FilteredNumberAsyncQueryHandler(context),
             speakEasyCallManager);
     InCallPresenter.getInstance().onServiceBind();
     InCallPresenter.getInstance().maybeStartRevealAnimation(intent);
diff --git a/java/com/android/incallui/NotificationBroadcastReceiver.java b/java/com/android/incallui/NotificationBroadcastReceiver.java
index 91421ea..5051231 100644
--- a/java/com/android/incallui/NotificationBroadcastReceiver.java
+++ b/java/com/android/incallui/NotificationBroadcastReceiver.java
@@ -20,10 +20,8 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
 import android.telecom.CallAudioState;
 import android.telecom.VideoProfile;
 
@@ -70,7 +68,6 @@
   public static final String ACTION_ANSWER_SPEAKEASY_CALL =
       "com.android.incallui.ACTION_ANSWER_SPEAKEASY_CALL";
 
-  @RequiresApi(VERSION_CODES.N_MR1)
   public static final String ACTION_PULL_EXTERNAL_CALL =
       "com.android.incallui.ACTION_PULL_EXTERNAL_CALL";
 
diff --git a/java/com/android/incallui/RttCallPresenter.java b/java/com/android/incallui/RttCallPresenter.java
index 2114691..4726cd3 100644
--- a/java/com/android/incallui/RttCallPresenter.java
+++ b/java/com/android/incallui/RttCallPresenter.java
@@ -16,7 +16,6 @@
 
 package com.android.incallui;
 
-import android.annotation.TargetApi;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
@@ -36,7 +35,6 @@
  * Logic related to the {@link RttCallScreen} and for managing changes to the RTT calling surfaces
  * based on other user interface events and incoming events.
  */
-@TargetApi(28)
 public class RttCallPresenter implements RttCallScreenDelegate, InCallStateListener {
 
   private RttCallScreen rttCallScreen;
diff --git a/java/com/android/incallui/StatusBarNotifier.java b/java/com/android/incallui/StatusBarNotifier.java
index 3942851..ed4109e 100644
--- a/java/com/android/incallui/StatusBarNotifier.java
+++ b/java/com/android/incallui/StatusBarNotifier.java
@@ -44,8 +44,6 @@
 import android.graphics.drawable.Icon;
 import android.media.AudioAttributes;
 import android.net.Uri;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.os.Trace;
 import android.support.annotation.ColorRes;
 import android.support.annotation.NonNull;
@@ -53,7 +51,6 @@
 import android.support.annotation.RequiresPermission;
 import android.support.annotation.StringRes;
 import android.support.annotation.VisibleForTesting;
-import android.support.v4.os.BuildCompat;
 import android.telecom.Call.Details;
 import android.telecom.CallAudioState;
 import android.telecom.PhoneAccount;
@@ -68,6 +65,7 @@
 import android.text.style.ForegroundColorSpan;
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.ContactsUtils.UserType;
+import com.android.dialer.R;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProviderComponent;
@@ -356,9 +354,7 @@
     LogUtil.i("StatusBarNotifier.buildAndSendNotification", "notificationType=" + notificationType);
     switch (notificationType) {
       case NOTIFICATION_INCOMING_CALL:
-        if (BuildCompat.isAtLeastO()) {
-          builder.setChannelId(NotificationChannelId.INCOMING_CALL);
-        }
+        builder.setChannelId(NotificationChannelId.INCOMING_CALL);
         // Set the intent as a full screen intent as well if a call is incoming
         configureFullScreenIntent(builder, createLaunchPendingIntent(true /* isFullScreen */));
         // Set the notification category and bump the priority for incoming calls
@@ -375,16 +371,12 @@
         }
         break;
       case NOTIFICATION_INCOMING_CALL_QUIET:
-        if (BuildCompat.isAtLeastO()) {
-          builder.setChannelId(NotificationChannelId.ONGOING_CALL);
-        }
+        builder.setChannelId(NotificationChannelId.ONGOING_CALL);
         break;
       case NOTIFICATION_IN_CALL:
-        if (BuildCompat.isAtLeastO()) {
-          publicBuilder.setColorized(true);
-          builder.setColorized(true);
-          builder.setChannelId(NotificationChannelId.ONGOING_CALL);
-        }
+        publicBuilder.setColorized(true);
+        builder.setColorized(true);
+        builder.setChannelId(NotificationChannelId.ONGOING_CALL);
         break;
       default:
         break;
@@ -874,13 +866,11 @@
 
   private Spannable getActionText(@StringRes int stringRes, @ColorRes int colorRes) {
     Spannable spannable = new SpannableString(context.getText(stringRes));
-    if (VERSION.SDK_INT >= VERSION_CODES.N_MR1) {
-      // This will only work for cases where the Notification.Builder has a fullscreen intent set
-      // Notification.Builder that does not have a full screen intent will take the color of the
-      // app and the following leads to a no-op.
-      spannable.setSpan(
-          new ForegroundColorSpan(context.getColor(colorRes)), 0, spannable.length(), 0);
-    }
+    // This will only work for cases where the Notification.Builder has a fullscreen intent set
+    // Notification.Builder that does not have a full screen intent will take the color of the
+    // app and the following leads to a no-op.
+    spannable.setSpan(
+        new ForegroundColorSpan(context.getColor(colorRes)), 0, spannable.length(), 0);
     return spannable;
   }
 
diff --git a/java/com/android/incallui/answer/impl/AnswerFragment.java b/java/com/android/incallui/answer/impl/AnswerFragment.java
index 2405b8e..395faa7 100644
--- a/java/com/android/incallui/answer/impl/AnswerFragment.java
+++ b/java/com/android/incallui/answer/impl/AnswerFragment.java
@@ -22,15 +22,12 @@
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.annotation.SuppressLint;
-import android.annotation.TargetApi;
 import android.app.KeyguardManager;
 import android.app.KeyguardManager.KeyguardDismissCallback;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.location.Location;
 import android.net.Uri;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
@@ -55,6 +52,8 @@
 import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
+
+import com.android.dialer.R;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.FragmentUtils;
 import com.android.dialer.common.LogUtil;
@@ -1057,17 +1056,11 @@
   }
 
   @Override
-  @TargetApi(VERSION_CODES.O)
   public void smsSelected(@Nullable CharSequence text) {
     LogUtil.i("AnswerFragment.smsSelected", null);
     textResponsesFragment = null;
 
     if (text == null) {
-      if (VERSION.SDK_INT < VERSION_CODES.O) {
-        LogUtil.i("AnswerFragment.smsSelected", "below O, showing dialog directly");
-        showCustomSmsDialog();
-        return;
-      }
       if (!getContext().getSystemService(KeyguardManager.class).isKeyguardLocked()) {
         LogUtil.i("AnswerFragment.smsSelected", "not locked, showing dialog directly");
         showCustomSmsDialog();
diff --git a/java/com/android/incallui/audioroute/AudioRouteSelectorDialogFragment.java b/java/com/android/incallui/audioroute/AudioRouteSelectorDialogFragment.java
index 846834f..68aa2c1 100644
--- a/java/com/android/incallui/audioroute/AudioRouteSelectorDialogFragment.java
+++ b/java/com/android/incallui/audioroute/AudioRouteSelectorDialogFragment.java
@@ -27,7 +27,6 @@
 import android.provider.Settings;
 import android.support.annotation.Nullable;
 import android.support.design.widget.BottomSheetDialogFragment;
-import android.support.v4.os.BuildCompat;
 import android.telecom.CallAudioState;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -35,6 +34,8 @@
 import android.view.WindowManager;
 import android.widget.LinearLayout;
 import android.widget.TextView;
+
+import com.android.dialer.R;
 import com.android.dialer.common.FragmentUtils;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.logging.DialerImpression;
@@ -82,10 +83,7 @@
     if (Settings.canDrawOverlays(getContext())) {
       dialog
           .getWindow()
-          .setType(
-              BuildCompat.isAtLeastO()
-                  ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
-                  : WindowManager.LayoutParams.TYPE_PHONE);
+          .setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
     }
     return dialog;
   }
@@ -98,27 +96,14 @@
     View view = layoutInflater.inflate(R.layout.audioroute_selector, viewGroup, false);
     CallAudioState audioState = getArguments().getParcelable(ARG_AUDIO_STATE);
 
-    if (BuildCompat.isAtLeastP()) {
-      // Create items for all connected Bluetooth devices
-      Collection<BluetoothDevice> bluetoothDeviceSet = audioState.getSupportedBluetoothDevices();
-      for (BluetoothDevice device : bluetoothDeviceSet) {
-        boolean selected =
-            (audioState.getRoute() == CallAudioState.ROUTE_BLUETOOTH)
-                && (bluetoothDeviceSet.size() == 1
-                    || device.equals(audioState.getActiveBluetoothDevice()));
-        TextView textView = createBluetoothItem(device, selected);
-        ((LinearLayout) view).addView(textView, 0);
-      }
-    } else {
-      // Only create Bluetooth audio route
-      TextView textView =
-          (TextView) getLayoutInflater().inflate(R.layout.audioroute_item, null, false);
-      textView.setText(getString(R.string.audioroute_bluetooth));
-      initItem(
-          textView,
-          CallAudioState.ROUTE_BLUETOOTH,
-          audioState,
-          DialerImpression.Type.IN_CALL_SWITCH_AUDIO_ROUTE_BLUETOOTH);
+    // Create items for all connected Bluetooth devices
+    Collection<BluetoothDevice> bluetoothDeviceSet = audioState.getSupportedBluetoothDevices();
+    for (BluetoothDevice device : bluetoothDeviceSet) {
+      boolean selected =
+          (audioState.getRoute() == CallAudioState.ROUTE_BLUETOOTH)
+              && (bluetoothDeviceSet.size() == 1
+                  || device.equals(audioState.getActiveBluetoothDevice()));
+      TextView textView = createBluetoothItem(device, selected);
       ((LinearLayout) view).addView(textView, 0);
     }
 
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index b028946..a8a62f7 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -18,13 +18,9 @@
 
 import android.Manifest.permission;
 import android.annotation.SuppressLint;
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
 import android.net.Uri;
-import android.os.Build;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.os.PersistableBundle;
 import android.os.SystemClock;
@@ -33,7 +29,6 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
-import android.support.v4.os.BuildCompat;
 import android.telecom.Call;
 import android.telecom.Call.Details;
 import android.telecom.Call.RttCall;
@@ -377,11 +372,8 @@
               isMergeInProcess = false;
               break;
             case TelephonyManagerCompat.EVENT_CALL_FORWARDED:
-              // Only handle this event for P+ since it's unreliable pre-P.
-              if (BuildCompat.isAtLeastP()) {
-                isCallForwarded = true;
-                update();
-              }
+              isCallForwarded = true;
+              update();
               break;
             default:
               break;
@@ -663,9 +655,6 @@
     if (!PermissionsUtil.hasPermission(context, permission.READ_PHONE_STATE)) {
       return;
     }
-    if (VERSION.SDK_INT < VERSION_CODES.O) {
-      return;
-    }
     // TODO(a bug): This may take several seconds to complete, revisit it to move it to worker
     // thread.
     carrierConfig =
@@ -827,12 +816,6 @@
       return true;
     }
 
-    // Call.EXTRA_LAST_EMERGENCY_CALLBACK_TIME_MILLIS is available starting in O
-    if (VERSION.SDK_INT < VERSION_CODES.O) {
-      long timestampMillis = FilteredNumbersUtil.getLastEmergencyCallTimeMillis(context);
-      return isInEmergencyCallbackWindow(timestampMillis);
-    }
-
     // We want to treat any incoming call that arrives a short time after an outgoing emergency call
     // as a potential emergency callback.
     if (getExtras() != null
@@ -989,7 +972,6 @@
   }
 
   /** Checks if the call supports the given set of capabilities supplied as a bit mask. */
-  @TargetApi(28)
   public boolean can(int capabilities) {
     int supportedCapabilities = telecomCall.getDetails().getCallCapabilities();
 
@@ -998,7 +980,7 @@
       // RTT call is not conferenceable, it's a bug (a bug) in Telecom and we work around it
       // here before it's fixed in Telecom.
       for (Call call : telecomCall.getConferenceableCalls()) {
-        if (!(BuildCompat.isAtLeastP() && call.isRttActive())) {
+        if (!call.isRttActive()) {
           hasConferenceableCall = true;
           break;
         }
@@ -1034,7 +1016,6 @@
    * the same time that is logged as the start time in the Call Log (see {@link
    * android.provider.CallLog.Calls#DATE}).
    */
-  @TargetApi(VERSION_CODES.O)
   public long getCreationTimeMillis() {
     return telecomCall.getDetails().getCreationTimeMillis();
   }
@@ -1078,16 +1059,10 @@
     return getVideoTech().isTransmittingOrReceiving() || VideoProfile.isVideo(getVideoState());
   }
 
-  @TargetApi(28)
   public boolean isActiveRttCall() {
-    if (BuildCompat.isAtLeastP()) {
-      return getTelecomCall().isRttActive();
-    } else {
-      return false;
-    }
+    return getTelecomCall().isRttActive();
   }
 
-  @TargetApi(28)
   @Nullable
   public RttCall getRttCall() {
     if (!isActiveRttCall()) {
@@ -1096,7 +1071,6 @@
     return getTelecomCall().getRttCall();
   }
 
-  @TargetApi(28)
   public boolean isPhoneAccountRttCapable() {
     PhoneAccount phoneAccount = getPhoneAccount();
     if (phoneAccount == null) {
@@ -1108,7 +1082,6 @@
     return true;
   }
 
-  @TargetApi(28)
   public boolean canUpgradeToRttCall() {
     if (!isPhoneAccountRttCapable()) {
       return false;
@@ -1128,12 +1101,10 @@
     return true;
   }
 
-  @TargetApi(28)
   public void sendRttUpgradeRequest() {
     getTelecomCall().sendRttRequest();
   }
 
-  @TargetApi(28)
   public void respondToRttRequest(boolean accept, int rttRequestId) {
     Logger.get(context)
         .logCallImpression(
@@ -1145,11 +1116,7 @@
     getTelecomCall().respondToRttRequest(rttRequestId, accept);
   }
 
-  @TargetApi(28)
   private void saveRttTranscript() {
-    if (!BuildCompat.isAtLeastP()) {
-      return;
-    }
     if (getRttCall() != null) {
       // Save any remaining text in the buffer that's not shown by UI yet.
       // This may happen when the call is switched to background before disconnect.
@@ -1353,19 +1320,6 @@
    * @return a boolean indicating assisted dialing may have been performed
    */
   public boolean isAssistedDialed() {
-    if (getIntentExtras() != null) {
-      // P and below uses the existence of USE_ASSISTED_DIALING to indicate assisted dialing
-      // was used. The Dialer client is responsible for performing assisted dialing before
-      // placing the outgoing call.
-      //
-      // The existence of the assisted dialing extras indicates that assisted dialing took place.
-      if (getIntentExtras().getBoolean(TelephonyManagerCompat.USE_ASSISTED_DIALING, false)
-          && getAssistedDialingExtras() != null
-          && Build.VERSION.SDK_INT <= ConcreteCreator.BUILD_CODE_CEILING) {
-        return true;
-      }
-    }
-
     return false;
   }
 
diff --git a/java/com/android/incallui/call/TelecomAdapter.java b/java/com/android/incallui/call/TelecomAdapter.java
index 4ae1bc1..3070fb2 100644
--- a/java/com/android/incallui/call/TelecomAdapter.java
+++ b/java/com/android/incallui/call/TelecomAdapter.java
@@ -16,7 +16,6 @@
 
 package com.android.incallui.call;
 
-import android.annotation.TargetApi;
 import android.app.Notification;
 import android.bluetooth.BluetoothDevice;
 import android.content.ActivityNotFoundException;
@@ -196,7 +195,6 @@
     }
   }
 
-  @TargetApi(28)
   public void requestBluetoothAudio(BluetoothDevice bluetoothDevice) {
     if (inCallService != null) {
       inCallService.requestBluetoothAudio(bluetoothDevice);
diff --git a/java/com/android/incallui/disconnectdialog/VideoCallNotAvailablePrompt.java b/java/com/android/incallui/disconnectdialog/VideoCallNotAvailablePrompt.java
index 099450a..f6af4a1 100644
--- a/java/com/android/incallui/disconnectdialog/VideoCallNotAvailablePrompt.java
+++ b/java/com/android/incallui/disconnectdialog/VideoCallNotAvailablePrompt.java
@@ -23,7 +23,7 @@
 import android.telecom.DisconnectCause;
 import android.telecom.PhoneAccountHandle;
 import android.util.Pair;
-import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
+import com.android.dialer.R;
 import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.common.LogUtil;
@@ -36,7 +36,7 @@
   @Override
   public boolean shouldShow(DisconnectCause disconnectCause) {
     if (disconnectCause.getCode() == DisconnectCause.ERROR
-        && TelecomManagerCompat.REASON_IMS_ACCESS_BLOCKED.equals(disconnectCause.getReason())) {
+        && DisconnectCause.REASON_IMS_ACCESS_BLOCKED.equals(disconnectCause.getReason())) {
       LogUtil.i(
           "VideoCallNotAvailablePrompt.shouldShowPrompt",
           "showing prompt for disconnect cause: %s",
diff --git a/java/com/android/incallui/legacyblocking/BlockedNumberContentObserver.java b/java/com/android/incallui/legacyblocking/BlockedNumberContentObserver.java
deleted file mode 100644
index d774fc3..0000000
--- a/java/com/android/incallui/legacyblocking/BlockedNumberContentObserver.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2016 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.incallui.legacyblocking;
-
-import android.content.Context;
-import android.database.ContentObserver;
-import android.os.Handler;
-import android.provider.CallLog;
-import android.support.annotation.NonNull;
-import com.android.dialer.common.LogUtil;
-import com.android.dialer.common.concurrent.AsyncTaskExecutor;
-import com.android.dialer.common.concurrent.AsyncTaskExecutors;
-import com.android.dialer.util.PermissionsUtil;
-import java.util.Objects;
-
-/**
- * Observes the {@link CallLog} to delete the CallLog entry for a blocked call after it is added.
- * Automatically de-registers itself {@link #TIMEOUT_MS} ms after registration or if the entry is
- * found and deleted.
- */
-public class BlockedNumberContentObserver extends ContentObserver
-    implements DeleteBlockedCallTask.Listener {
-
-  /**
-   * The time after which a {@link BlockedNumberContentObserver} will be automatically unregistered.
-   */
-  public static final int TIMEOUT_MS = 5000;
-
-  @NonNull private final Context context;
-  @NonNull private final Handler handler;
-  private final String number;
-  private final long timeAddedMillis;
-  private final Runnable timeoutRunnable =
-      new Runnable() {
-        @Override
-        public void run() {
-          unregister();
-        }
-      };
-
-  private final AsyncTaskExecutor asyncTaskExecutor = AsyncTaskExecutors.createThreadPoolExecutor();
-
-  /**
-   * Creates the BlockedNumberContentObserver to delete the new {@link CallLog} entry from the given
-   * blocked number.
-   *
-   * @param number The blocked number.
-   * @param timeAddedMillis The time at which the call from the blocked number was placed.
-   */
-  public BlockedNumberContentObserver(
-      @NonNull Context context, @NonNull Handler handler, String number, long timeAddedMillis) {
-    super(handler);
-    this.context = Objects.requireNonNull(context, "context").getApplicationContext();
-    this.handler = Objects.requireNonNull(handler);
-    this.number = number;
-    this.timeAddedMillis = timeAddedMillis;
-  }
-
-  @Override
-  public void onChange(boolean selfChange) {
-    LogUtil.i(
-        "BlockedNumberContentObserver.onChange",
-        "attempting to remove call log entry from blocked number");
-    asyncTaskExecutor.submit(
-        DeleteBlockedCallTask.IDENTIFIER,
-        new DeleteBlockedCallTask(context, this, number, timeAddedMillis));
-  }
-
-  @Override
-  public void onDeleteBlockedCallTaskComplete(boolean didFindEntry) {
-    if (didFindEntry) {
-      unregister();
-    }
-  }
-
-  /**
-   * Registers this {@link ContentObserver} to listen for changes to the {@link CallLog}. If the
-   * CallLog entry is not found before {@link #TIMEOUT_MS}, this ContentObserver automatically
-   * un-registers itself.
-   */
-  public void register() {
-    LogUtil.i("BlockedNumberContentObserver.register", null);
-    if (PermissionsUtil.hasCallLogReadPermissions(context)
-        && PermissionsUtil.hasCallLogWritePermissions(context)) {
-      context.getContentResolver().registerContentObserver(CallLog.CONTENT_URI, true, this);
-      handler.postDelayed(timeoutRunnable, TIMEOUT_MS);
-    } else {
-      LogUtil.w("BlockedNumberContentObserver.register", "no call log read/write permissions.");
-    }
-  }
-
-  private void unregister() {
-    LogUtil.i("BlockedNumberContentObserver.unregister", null);
-    handler.removeCallbacks(timeoutRunnable);
-    context.getContentResolver().unregisterContentObserver(this);
-  }
-}
diff --git a/java/com/android/incallui/legacyblocking/DeleteBlockedCallTask.java b/java/com/android/incallui/legacyblocking/DeleteBlockedCallTask.java
deleted file mode 100644
index 309e994..0000000
--- a/java/com/android/incallui/legacyblocking/DeleteBlockedCallTask.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2016 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.incallui.legacyblocking;
-
-import android.Manifest.permission;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.database.Cursor;
-import android.os.AsyncTask;
-import android.provider.CallLog;
-import android.support.v4.content.ContextCompat;
-import com.android.dialer.common.LogUtil;
-import com.android.dialer.telecom.TelecomUtil;
-import java.util.Objects;
-
-/**
- * Deletes a blocked call from the call log. This is only used on Android Marshmallow. On later
- * versions of the OS, call blocking is implemented in the system and there's no need to mess with
- * the call log.
- */
-public class DeleteBlockedCallTask extends AsyncTask<Void, Void, Long> {
-
-  public static final String IDENTIFIER = "DeleteBlockedCallTask";
-
-  // 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 = 3000;
-
-  private final Context context;
-  private final Listener listener;
-  private final String number;
-  private final long timeAddedMillis;
-
-  /**
-   * Creates the task to delete the new {@link CallLog} entry from the given blocked number.
-   *
-   * @param number The blocked number.
-   * @param timeAddedMillis The time at which the call from the blocked number was placed.
-   */
-  public DeleteBlockedCallTask(
-      Context context, Listener listener, String number, long timeAddedMillis) {
-    this.context = Objects.requireNonNull(context);
-    this.listener = Objects.requireNonNull(listener);
-    this.number = number;
-    this.timeAddedMillis = timeAddedMillis;
-  }
-
-  @Override
-  public Long doInBackground(Void... params) {
-    if (ContextCompat.checkSelfPermission(context, permission.READ_CALL_LOG)
-            != PackageManager.PERMISSION_GRANTED
-        || ContextCompat.checkSelfPermission(context, permission.WRITE_CALL_LOG)
-            != PackageManager.PERMISSION_GRANTED) {
-      LogUtil.i("DeleteBlockedCallTask.doInBackground", "missing call log permissions");
-      return -1L;
-    }
-
-    // First, lookup the call log entry of the most recent call with this number.
-    try (Cursor cursor =
-        context
-            .getContentResolver()
-            .query(
-                TelecomUtil.getCallLogUri(context),
-                CallLogDeleteBlockedCallQuery.PROJECTION,
-                CallLog.Calls.NUMBER + "= ?",
-                new String[] {number},
-                CallLog.Calls.DATE + " DESC LIMIT 1")) {
-
-      // If match is found, delete this call log entry and return the call log entry id.
-      if (cursor != null && cursor.moveToFirst()) {
-        long creationTime = cursor.getLong(CallLogDeleteBlockedCallQuery.DATE_COLUMN_INDEX);
-        if (timeAddedMillis > creationTime
-            && timeAddedMillis - creationTime < MATCH_BLOCKED_CALL_THRESHOLD_MS) {
-          long callLogEntryId = cursor.getLong(CallLogDeleteBlockedCallQuery.ID_COLUMN_INDEX);
-          context
-              .getContentResolver()
-              .delete(
-                  TelecomUtil.getCallLogUri(context),
-                  CallLog.Calls._ID + " IN (" + callLogEntryId + ")",
-                  null);
-          return callLogEntryId;
-        }
-      }
-    }
-    return -1L;
-  }
-
-  @Override
-  public void onPostExecute(Long callLogEntryId) {
-    listener.onDeleteBlockedCallTaskComplete(callLogEntryId >= 0);
-  }
-
-  /** Callback invoked when delete is complete. */
-  public interface Listener {
-
-    void onDeleteBlockedCallTaskComplete(boolean didFindEntry);
-  }
-
-  private static class CallLogDeleteBlockedCallQuery {
-
-    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;
-  }
-}
diff --git a/java/com/android/incallui/spam/SpamCallListListener.java b/java/com/android/incallui/spam/SpamCallListListener.java
index 7fd41f9..bf48d8b 100644
--- a/java/com/android/incallui/spam/SpamCallListListener.java
+++ b/java/com/android/incallui/spam/SpamCallListListener.java
@@ -28,11 +28,11 @@
 import android.provider.CallLog.Calls;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.v4.os.BuildCompat;
 import android.telecom.DisconnectCause;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
-import com.android.dialer.blocking.FilteredNumberCompat;
+
+import com.android.dialer.R;
 import com.android.dialer.blocking.FilteredNumbersUtil;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
@@ -182,8 +182,7 @@
     String e164Number =
         PhoneNumberUtils.formatNumberToE164(
             call.getNumber(), GeoUtil.getCurrentCountryIso(context));
-    if (!FilteredNumbersUtil.canBlockNumber(context, e164Number, call.getNumber())
-        || !FilteredNumberCompat.canAttemptBlockOperations(context)) {
+    if (!FilteredNumbersUtil.canBlockNumber(context, e164Number, call.getNumber())) {
       return;
     }
     if (e164Number == null) {
@@ -256,10 +255,8 @@
             .setPriority(Notification.PRIORITY_DEFAULT)
             .setColor(ThemeComponent.get(context).theme().getColorPrimary())
             .setSmallIcon(R.drawable.quantum_ic_call_end_vd_theme_24)
-            .setGroup(GROUP_KEY);
-    if (BuildCompat.isAtLeastO()) {
-      builder.setChannelId(NotificationChannelId.DEFAULT);
-    }
+            .setGroup(GROUP_KEY)
+            .setChannelId(NotificationChannelId.DEFAULT);
     return builder;
   }
 
diff --git a/java/com/android/incallui/spam/SpamNotificationActivity.java b/java/com/android/incallui/spam/SpamNotificationActivity.java
index 4c0c67c..0299dc3 100644
--- a/java/com/android/incallui/spam/SpamNotificationActivity.java
+++ b/java/com/android/incallui/spam/SpamNotificationActivity.java
@@ -28,9 +28,9 @@
 import android.support.v4.app.FragmentActivity;
 import android.support.v7.app.AlertDialog;
 import android.telephony.PhoneNumberUtils;
-import com.android.dialer.blocking.BlockedNumbersMigrator;
+
+import com.android.dialer.R;
 import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
-import com.android.dialer.blocking.FilteredNumberCompat;
 import com.android.dialer.blockreportspam.BlockReportSpamDialogs;
 import com.android.dialer.blockreportspam.BlockReportSpamDialogs.DialogFragmentForBlockingNumberAndOptionallyReportingAsSpam;
 import com.android.dialer.blockreportspam.BlockReportSpamDialogs.DialogFragmentForReportingNotSpam;
@@ -241,27 +241,21 @@
       final String number, final ContactLookupResult.Type contactLookupResultType) {
     if (SpamComponent.get(this).spamSettings().isDialogEnabledForSpamNotification()) {
       String displayNumber = getFormattedNumber(number, this);
-      maybeShowBlockNumberMigrationDialog(
-          new BlockedNumbersMigrator.Listener() {
-            @Override
-            public void onComplete() {
-              DialogFragmentForBlockingNumberAndOptionallyReportingAsSpam.newInstance(
-                      displayNumber,
-                      SpamComponent.get(SpamNotificationActivity.this)
-                          .spamSettings()
-                          .isDialogReportSpamCheckedByDefault(),
-                      new BlockReportSpamDialogs.OnSpamDialogClickListener() {
-                        @Override
-                        public void onClick(boolean isSpamChecked) {
-                          blockReportNumber(number, isSpamChecked, contactLookupResultType);
-                        }
-                      },
-                      dismissListener)
-                  .show(
-                      getSupportFragmentManager(),
-                      BlockReportSpamDialogs.BLOCK_REPORT_SPAM_DIALOG_TAG);
-            }
-          });
+      DialogFragmentForBlockingNumberAndOptionallyReportingAsSpam.newInstance(
+                displayNumber,
+                SpamComponent.get(SpamNotificationActivity.this)
+                        .spamSettings()
+                        .isDialogReportSpamCheckedByDefault(),
+                new BlockReportSpamDialogs.OnSpamDialogClickListener() {
+                  @Override
+                  public void onClick(boolean isSpamChecked) {
+                    blockReportNumber(number, isSpamChecked, contactLookupResultType);
+                  }
+                },
+                dismissListener)
+        .show(
+                getSupportFragmentManager(),
+                BlockReportSpamDialogs.BLOCK_REPORT_SPAM_DIALOG_TAG);
     } else {
       blockReportNumber(number, true, contactLookupResultType);
     }
@@ -286,14 +280,6 @@
         .show(getFragmentManager(), FirstTimeSpamCallDialogFragment.TAG);
   }
 
-  /** Checks if the user has migrated to the new blocking and display a dialog if necessary. */
-  private void maybeShowBlockNumberMigrationDialog(BlockedNumbersMigrator.Listener listener) {
-    if (!FilteredNumberCompat.maybeShowBlockNumberMigrationDialog(
-        this, getFragmentManager(), listener)) {
-      listener.onComplete();
-    }
-  }
-
   /** Block and report the number as spam. */
   private void blockReportNumber(
       String number, boolean reportAsSpam, ContactLookupResult.Type contactLookupResultType) {
@@ -310,7 +296,7 @@
     }
 
     logCallImpression(DialerImpression.Type.SPAM_AFTER_CALL_NOTIFICATION_BLOCK_NUMBER);
-    filteredNumberAsyncQueryHandler.blockNumber(null, number, getCountryIso());
+    filteredNumberAsyncQueryHandler.blockNumber(null, number);
   }
 
   /** Report the number as not spam. */
diff --git a/java/com/android/incallui/spam/SpamNotificationService.java b/java/com/android/incallui/spam/SpamNotificationService.java
index f7deae1..26aec2f 100644
--- a/java/com/android/incallui/spam/SpamNotificationService.java
+++ b/java/com/android/incallui/spam/SpamNotificationService.java
@@ -128,7 +128,7 @@
                 CallLog.Calls.INCOMING_TYPE,
                 ReportingLocation.Type.FEEDBACK_PROMPT,
                 contactLookupResultType);
-        new FilteredNumberAsyncQueryHandler(this).blockNumber(null, number, countryIso);
+        new FilteredNumberAsyncQueryHandler(this).blockNumber(null, number);
         if (shouldShowSpamBlockingPromo) {
           spamBlockingPromoHelper.showSpamBlockingPromoNotification(
               notificationTag,
diff --git a/java/com/android/incallui/videosurface/bindings/VideoSurfaceBindings.java b/java/com/android/incallui/videosurface/bindings/VideoSurfaceBindings.java
index 1cb26bd..96fccb4 100644
--- a/java/com/android/incallui/videosurface/bindings/VideoSurfaceBindings.java
+++ b/java/com/android/incallui/videosurface/bindings/VideoSurfaceBindings.java
@@ -24,12 +24,12 @@
 /** Bindings for video surface module. */
 public class VideoSurfaceBindings {
 
-  public static VideoSurfaceTexture createLocalVideoSurfaceTexture(boolean isPixel2017) {
-    return new VideoSurfaceTextureImpl(isPixel2017, VideoSurfaceTexture.SURFACE_TYPE_LOCAL);
+  public static VideoSurfaceTexture createLocalVideoSurfaceTexture() {
+    return new VideoSurfaceTextureImpl(VideoSurfaceTexture.SURFACE_TYPE_LOCAL);
   }
 
-  public static VideoSurfaceTexture createRemoteVideoSurfaceTexture(boolean isPixel2017) {
-    return new VideoSurfaceTextureImpl(isPixel2017, VideoSurfaceTexture.SURFACE_TYPE_REMOTE);
+  public static VideoSurfaceTexture createRemoteVideoSurfaceTexture() {
+    return new VideoSurfaceTextureImpl(VideoSurfaceTexture.SURFACE_TYPE_REMOTE);
   }
 
   public static void scaleVideoAndFillView(
diff --git a/java/com/android/incallui/videosurface/impl/VideoSurfaceTextureImpl.java b/java/com/android/incallui/videosurface/impl/VideoSurfaceTextureImpl.java
index fa75724..18d09a7 100644
--- a/java/com/android/incallui/videosurface/impl/VideoSurfaceTextureImpl.java
+++ b/java/com/android/incallui/videosurface/impl/VideoSurfaceTextureImpl.java
@@ -18,8 +18,6 @@
 
 import android.graphics.Point;
 import android.graphics.SurfaceTexture;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
 import android.view.Surface;
 import android.view.TextureView;
 import android.view.View;
@@ -35,7 +33,6 @@
  */
 public class VideoSurfaceTextureImpl implements VideoSurfaceTexture {
   @SurfaceType private final int surfaceType;
-  private final boolean isPixel2017;
 
   private VideoSurfaceDelegate delegate;
   private TextureView textureView;
@@ -45,8 +42,7 @@
   private Point sourceVideoDimensions;
   private boolean isDoneWithSurface;
 
-  public VideoSurfaceTextureImpl(boolean isPixel2017, @SurfaceType int surfaceType) {
-    this.isPixel2017 = isPixel2017;
+  public VideoSurfaceTextureImpl(@SurfaceType int surfaceType) {
     this.surfaceType = surfaceType;
   }
 
@@ -73,13 +69,6 @@
         "surfaceDimensions: " + surfaceDimensions + " " + toString());
     this.surfaceDimensions = surfaceDimensions;
     if (surfaceDimensions != null && savedSurfaceTexture != null) {
-      // Only do this on O (not at least O) because we expect this issue to be fixed in OMR1
-      if (VERSION.SDK_INT == VERSION_CODES.O && isPixel2017) {
-        LogUtil.i(
-            "VideoSurfaceTextureImpl.setSurfaceDimensions",
-            "skip setting default buffer size on Pixel 2017 ODR");
-        return;
-      }
       savedSurfaceTexture.setDefaultBufferSize(surfaceDimensions.x, surfaceDimensions.y);
     }
   }
diff --git a/java/com/android/voicemail/impl/ActivationTask.java b/java/com/android/voicemail/impl/ActivationTask.java
index d8ec4e2..4f3c0c4 100644
--- a/java/com/android/voicemail/impl/ActivationTask.java
+++ b/java/com/android/voicemail/impl/ActivationTask.java
@@ -16,10 +16,8 @@
 
 package com.android.voicemail.impl;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.support.annotation.Nullable;
@@ -52,7 +50,6 @@
  * boots, the SIM is inserted, signal returned when VVM is not activated yet, and when the carrier
  * spontaneously sent a STATUS SMS.
  */
-@TargetApi(VERSION_CODES.O)
 @UsedByReflection(value = "Tasks.java")
 public class ActivationTask extends BaseTask {
 
@@ -133,8 +130,6 @@
       return;
     }
 
-    PreOMigrationHandler.migrate(getContext(), phoneAccountHandle);
-
     OmtpVvmCarrierConfigHelper helper;
     if (configForTest != null) {
       helper = configForTest;
diff --git a/java/com/android/voicemail/impl/CarrierIdentifier.java b/java/com/android/voicemail/impl/CarrierIdentifier.java
index 7788b7d..8b0b693 100644
--- a/java/com/android/voicemail/impl/CarrierIdentifier.java
+++ b/java/com/android/voicemail/impl/CarrierIdentifier.java
@@ -16,9 +16,7 @@
 
 package com.android.voicemail.impl;
 
-import android.annotation.TargetApi;
 import android.content.Context;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.Nullable;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
@@ -27,7 +25,6 @@
 
 /** Identifies a carrier. */
 @AutoValue
-@TargetApi(VERSION_CODES.O)
 @SuppressWarnings({"missingpermission"})
 public abstract class CarrierIdentifier {
 
diff --git a/java/com/android/voicemail/impl/DeviceProvisionedJobService.java b/java/com/android/voicemail/impl/DeviceProvisionedJobService.java
index 20993d0..39ac1e1 100644
--- a/java/com/android/voicemail/impl/DeviceProvisionedJobService.java
+++ b/java/com/android/voicemail/impl/DeviceProvisionedJobService.java
@@ -16,7 +16,6 @@
 
 package com.android.voicemail.impl;
 
-import android.annotation.TargetApi;
 import android.app.job.JobInfo;
 import android.app.job.JobInfo.TriggerContentUri;
 import android.app.job.JobParameters;
@@ -26,7 +25,6 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build.VERSION_CODES;
 import android.provider.Settings;
 import android.provider.Settings.Global;
 import android.support.annotation.VisibleForTesting;
@@ -37,7 +35,6 @@
  * JobService triggered when the setup wizard is completed, and rerun all {@link ActivationTask}
  * scheduled during the setup.
  */
-@TargetApi(VERSION_CODES.O)
 public class DeviceProvisionedJobService extends JobService {
 
   @VisibleForTesting static final String EXTRA_PHONE_ACCOUNT_HANDLE = "EXTRA_PHONE_ACCOUNT_HANDLE";
diff --git a/java/com/android/voicemail/impl/OmtpService.java b/java/com/android/voicemail/impl/OmtpService.java
index e10a275..f96666a 100644
--- a/java/com/android/voicemail/impl/OmtpService.java
+++ b/java/com/android/voicemail/impl/OmtpService.java
@@ -16,10 +16,8 @@
 
 package com.android.voicemail.impl;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build.VERSION_CODES;
 import android.os.UserManager;
 import android.preference.PreferenceManager;
 import android.support.annotation.MainThread;
@@ -36,7 +34,6 @@
 import com.android.voicemail.impl.sync.VvmAccountManager;
 
 /** Implements {@link VisualVoicemailService} to receive visual voicemail events */
-@TargetApi(VERSION_CODES.O)
 public class OmtpService extends VisualVoicemailService {
 
   private static final String TAG = "VvmOmtpService";
diff --git a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
index e5263f4..31841fd 100644
--- a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
+++ b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
@@ -15,12 +15,10 @@
  */
 package com.android.voicemail.impl;
 
-import android.annotation.TargetApi;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.os.PersistableBundle;
 import android.support.annotation.NonNull;
@@ -55,7 +53,6 @@
  *
  * <p>TODO(twyen): refactor this to an interface.
  */
-@TargetApi(VERSION_CODES.O)
 @SuppressWarnings({"missingpermission"})
 public class OmtpVvmCarrierConfigHelper {
 
diff --git a/java/com/android/voicemail/impl/PinChangerImpl.java b/java/com/android/voicemail/impl/PinChangerImpl.java
index 8735a26..a2df22d 100644
--- a/java/com/android/voicemail/impl/PinChangerImpl.java
+++ b/java/com/android/voicemail/impl/PinChangerImpl.java
@@ -16,10 +16,8 @@
 
 package com.android.voicemail.impl;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.net.Network;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.WorkerThread;
 import android.telecom.PhoneAccountHandle;
 import com.android.dialer.common.Assert;
@@ -31,7 +29,6 @@
 import com.android.voicemail.impl.sync.VvmNetworkRequest.NetworkWrapper;
 import com.android.voicemail.impl.sync.VvmNetworkRequest.RequestFailedException;
 
-@TargetApi(VERSION_CODES.O)
 class PinChangerImpl implements PinChanger {
 
   private final Context context;
diff --git a/java/com/android/voicemail/impl/PreOMigrationHandler.java b/java/com/android/voicemail/impl/PreOMigrationHandler.java
deleted file mode 100644
index 2c45471..0000000
--- a/java/com/android/voicemail/impl/PreOMigrationHandler.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2017 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.voicemail.impl;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.support.annotation.VisibleForTesting;
-import android.support.annotation.WorkerThread;
-import android.telecom.PhoneAccountHandle;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import com.android.voicemail.VoicemailComponent;
-import com.android.voicemail.impl.settings.VisualVoicemailSettingsUtil;
-import java.lang.reflect.Method;
-
-/** Handles migration of data from the visual voicemail client in telephony before O. */
-public final class PreOMigrationHandler {
-
-  // Hidden system APIs to access pre O VVM data
-  // Bundle getVisualVoicemailSettings()
-  private static final String METHOD_GET_VISUAL_VOICEMAIL_SETTINGS = "getVisualVoicemailSettings";
-
-  /**
-   * Key in bundle returned by {@link #METHOD_GET_VISUAL_VOICEMAIL_SETTINGS}, indicating whether
-   * visual voicemail was enabled or disabled by the user. If the user never explicitly changed this
-   * setting, this key will not exist.
-   */
-  private static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL =
-      "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL";
-
-  /**
-   * Key in bundle returned by {@link #METHOD_GET_VISUAL_VOICEMAIL_SETTINGS}, indicating the
-   * voicemail access PIN scrambled during the auto provisioning process. The user is expected to
-   * reset their PIN if this value is not {@code null}.
-   */
-  private static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING =
-      "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING";
-
-  @VisibleForTesting static final String PRE_O_MIGRATION_FINISHED = "pre_o_migration_finished";
-
-  @WorkerThread
-  public static void migrate(Context context, PhoneAccountHandle phoneAccountHandle) {
-    Assert.isNotMainThread();
-    VisualVoicemailPreferences preferences =
-        new VisualVoicemailPreferences(context, phoneAccountHandle);
-    if (preferences.getBoolean(PRE_O_MIGRATION_FINISHED, false)) {
-      VvmLog.i("PreOMigrationHandler", phoneAccountHandle + " already migrated");
-      return;
-    }
-    VvmLog.i("PreOMigrationHandler", "migrating " + phoneAccountHandle);
-    migrateSettings(context, phoneAccountHandle);
-
-    preferences.edit().putBoolean(PRE_O_MIGRATION_FINISHED, true).apply();
-  }
-
-  private static void migrateSettings(Context context, PhoneAccountHandle phoneAccountHandle) {
-    VvmLog.i("PreOMigrationHandler.migrateSettings", "migrating settings");
-    TelephonyManager telephonyManager =
-        context
-            .getSystemService(TelephonyManager.class)
-            .createForPhoneAccountHandle(phoneAccountHandle);
-    if (telephonyManager == null) {
-      VvmLog.e("PreOMigrationHandler.migrateSettings", "invalid PhoneAccountHandle");
-      return;
-    }
-    Bundle legacySettings;
-    try {
-      Method method = TelephonyManager.class.getMethod(METHOD_GET_VISUAL_VOICEMAIL_SETTINGS);
-      legacySettings = (Bundle) method.invoke(telephonyManager);
-    } catch (ReflectiveOperationException | ClassCastException e) {
-      VvmLog.i("PreOMigrationHandler.migrateSettings", "unable to retrieve settings from system");
-      return;
-    }
-
-    if (legacySettings.containsKey(EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL)) {
-      boolean enabled = legacySettings.getBoolean(EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL);
-      VvmLog.i("PreOMigrationHandler.migrateSettings", "setting VVM enabled to " + enabled);
-      VisualVoicemailSettingsUtil.setEnabled(context, phoneAccountHandle, enabled);
-    }
-
-    if (legacySettings.containsKey(EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING)) {
-      String scrambledPin = legacySettings.getString(EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING);
-      if (!TextUtils.isEmpty(scrambledPin)) {
-        VvmLog.i("PreOMigrationHandler.migrateSettings", "migrating scrambled PIN");
-        VoicemailComponent.get(context)
-            .getVoicemailClient()
-            .createPinChanger(context, phoneAccountHandle)
-            .setScrambledPin(scrambledPin);
-      }
-    }
-  }
-}
diff --git a/java/com/android/voicemail/impl/StatusCheckJobService.java b/java/com/android/voicemail/impl/StatusCheckJobService.java
index 870c5b4..fb2016b 100644
--- a/java/com/android/voicemail/impl/StatusCheckJobService.java
+++ b/java/com/android/voicemail/impl/StatusCheckJobService.java
@@ -13,14 +13,12 @@
  */
 package com.android.voicemail.impl;
 
-import android.annotation.TargetApi;
 import android.app.job.JobInfo;
 import android.app.job.JobParameters;
 import android.app.job.JobScheduler;
 import android.app.job.JobService;
 import android.content.ComponentName;
 import android.content.Context;
-import android.os.Build.VERSION_CODES;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import com.android.dialer.constants.ScheduledJobIds;
@@ -33,7 +31,6 @@
  * scheduled for each active voicemail account. The status is expected to be always in sync, the
  * check is a failsafe to mimic the previous status check on signal return behavior.
  */
-@TargetApi(VERSION_CODES.O)
 public class StatusCheckJobService extends JobService {
 
   public static void schedule(Context context) {
diff --git a/java/com/android/voicemail/impl/StatusCheckTask.java b/java/com/android/voicemail/impl/StatusCheckTask.java
index e59eb3b..973d00d 100644
--- a/java/com/android/voicemail/impl/StatusCheckTask.java
+++ b/java/com/android/voicemail/impl/StatusCheckTask.java
@@ -13,10 +13,8 @@
  */
 package com.android.voicemail.impl;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.ServiceState;
@@ -41,7 +39,6 @@
  * com.android.voicemail.impl.sms.OmtpMessageReceiver}). If the provisioning status is not ready an
  * {@link ActivationTask} will be launched to attempt to correct it.
  */
-@TargetApi(VERSION_CODES.O)
 @UsedByReflection(value = "Tasks.java")
 public class StatusCheckTask extends BaseTask {
 
diff --git a/java/com/android/voicemail/impl/VoicemailClientImpl.java b/java/com/android/voicemail/impl/VoicemailClientImpl.java
index 36e5a6c..2a112e8 100644
--- a/java/com/android/voicemail/impl/VoicemailClientImpl.java
+++ b/java/com/android/voicemail/impl/VoicemailClientImpl.java
@@ -13,11 +13,9 @@
  */
 package com.android.voicemail.impl;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
-import android.os.Build.VERSION_CODES;
 import android.os.PersistableBundle;
 import android.preference.PreferenceManager;
 import android.provider.VoicemailContract.Status;
@@ -25,9 +23,9 @@
 import android.support.annotation.MainThread;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.v4.os.BuildCompat;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
+
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProviderComponent;
@@ -67,9 +65,7 @@
   };
 
   @Inject
-  public VoicemailClientImpl() {
-    Assert.checkArgument(BuildCompat.isAtLeastO());
-  }
+  public VoicemailClientImpl() { }
 
   @Override
   public boolean isVoicemailModuleEnabled() {
@@ -100,11 +96,6 @@
 
   @Override
   public boolean isVoicemailArchiveAvailable(Context context) {
-    if (!BuildCompat.isAtLeastO()) {
-      LogUtil.i("VoicemailClientImpl.isVoicemailArchiveAllowed", "not running on O or later");
-      return false;
-    }
-
     if (!ConfigProviderComponent.get(context)
         .getConfigProvider()
         .getBoolean(ALLOW_VOICEMAIL_ARCHIVE, false)) {
@@ -132,12 +123,6 @@
           "VoicemailClientImpl.isVoicemailTranscriptionAvailable", "phone account handle is null");
     }
 
-    if (!BuildCompat.isAtLeastO()) {
-      LogUtil.i(
-          "VoicemailClientImpl.isVoicemailTranscriptionAvailable", "not running on O or later");
-      return false;
-    }
-
     if (!isVoicemailEnabled(context, phoneAccountHandle)) {
       LogUtil.i(
           "VoicemailClientImpl.isVoicemailTranscriptionAvailable",
@@ -271,7 +256,6 @@
     return new PinChangerImpl(context, phoneAccountHandle);
   }
 
-  @TargetApi(VERSION_CODES.O)
   @Override
   public void appendOmtpVoicemailSelectionClause(
       Context context, StringBuilder where, List<String> selectionArgs) {
@@ -303,7 +287,6 @@
     }
   }
 
-  @TargetApi(VERSION_CODES.O)
   @Override
   public void appendOmtpVoicemailStatusSelectionClause(
       Context context, StringBuilder where, List<String> selectionArgs) {
diff --git a/java/com/android/voicemail/impl/VoicemailModule.java b/java/com/android/voicemail/impl/VoicemailModule.java
index c4c72d3..07968d8 100644
--- a/java/com/android/voicemail/impl/VoicemailModule.java
+++ b/java/com/android/voicemail/impl/VoicemailModule.java
@@ -17,7 +17,6 @@
 package com.android.voicemail.impl;
 
 import android.content.Context;
-import android.support.v4.os.BuildCompat;
 import com.android.dialer.inject.ApplicationContext;
 import com.android.dialer.inject.DialerVariant;
 import com.android.dialer.inject.InstallIn;
@@ -36,11 +35,6 @@
   @Provides
   @Singleton
   static VoicemailClient provideVoicemailClient(@ApplicationContext Context context) {
-    if (!BuildCompat.isAtLeastO()) {
-      VvmLog.i("VoicemailModule.provideVoicemailClient", "SDK below O");
-      return new StubVoicemailClient();
-    }
-
     if (!VoicemailPermissionHelper.hasPermissions(context)) {
       VvmLog.i(
           "VoicemailModule.provideVoicemailClient",
diff --git a/java/com/android/voicemail/impl/VvmPackageInstallHandler.java b/java/com/android/voicemail/impl/VvmPackageInstallHandler.java
index ee8b722..d6d5b77 100644
--- a/java/com/android/voicemail/impl/VvmPackageInstallHandler.java
+++ b/java/com/android/voicemail/impl/VvmPackageInstallHandler.java
@@ -16,9 +16,7 @@
 
 package com.android.voicemail.impl;
 
-import android.annotation.TargetApi;
 import android.content.Context;
-import android.os.Build.VERSION_CODES;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import com.android.voicemail.impl.settings.VisualVoicemailSettingsUtil;
@@ -33,7 +31,6 @@
  * when a VVM SMS is received instead, as it can be a result of the carrier VVM app trying to run
  * activation.
  */
-@TargetApi(VERSION_CODES.O)
 public final class VvmPackageInstallHandler {
 
   /**
diff --git a/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java b/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java
index 7be22e4..0fae679 100644
--- a/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java
+++ b/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java
@@ -15,7 +15,6 @@
  */
 package com.android.voicemail.impl.fetch;
 
-import android.annotation.TargetApi;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.ContentResolver;
@@ -24,12 +23,10 @@
 import android.database.Cursor;
 import android.net.Network;
 import android.net.Uri;
-import android.os.Build.VERSION_CODES;
 import android.provider.VoicemailContract;
 import android.provider.VoicemailContract.Voicemails;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.v4.os.BuildCompat;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telephony.TelephonyManager;
@@ -45,7 +42,6 @@
 import java.util.concurrent.Executors;
 
 /** handles {@link VoicemailContract#ACTION_FETCH_VOICEMAIL} */
-@TargetApi(VERSION_CODES.O)
 public class FetchVoicemailReceiver extends BroadcastReceiver {
 
   private static final String TAG = "FetchVoicemailReceiver";
@@ -157,9 +153,6 @@
   @Nullable
   private static PhoneAccountHandle getAccountFromMarshmallowAccount(
       Context context, PhoneAccountHandle oldAccount) {
-    if (!BuildCompat.isAtLeastN()) {
-      return null;
-    }
     for (PhoneAccountHandle handle :
         context.getSystemService(TelecomManager.class).getCallCapablePhoneAccounts()) {
       if (getIccSerialNumberFromFullIccSerialNumber(handle.getId()).equals(oldAccount.getId())) {
diff --git a/java/com/android/voicemail/impl/mail/store/imap/DigestMd5Utils.java b/java/com/android/voicemail/impl/mail/store/imap/DigestMd5Utils.java
index 6607160..ab835dc 100644
--- a/java/com/android/voicemail/impl/mail/store/imap/DigestMd5Utils.java
+++ b/java/com/android/voicemail/impl/mail/store/imap/DigestMd5Utils.java
@@ -16,8 +16,6 @@
 
 package com.android.voicemail.impl.mail.store.imap;
 
-import android.annotation.TargetApi;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
 import android.util.ArrayMap;
@@ -33,7 +31,6 @@
 import java.util.Map;
 
 /** Utilities for DIGEST-MD5. */
-@TargetApi(VERSION_CODES.O)
 public class DigestMd5Utils {
 
   private static final String TAG = "DigestMd5Utils";
diff --git a/java/com/android/voicemail/impl/protocol/Vvm3Protocol.java b/java/com/android/voicemail/impl/protocol/Vvm3Protocol.java
index 5e7b592..0d14bcb 100644
--- a/java/com/android/voicemail/impl/protocol/Vvm3Protocol.java
+++ b/java/com/android/voicemail/impl/protocol/Vvm3Protocol.java
@@ -16,11 +16,9 @@
 
 package com.android.voicemail.impl.protocol;
 
-import android.annotation.TargetApi;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.net.Network;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.telecom.PhoneAccountHandle;
@@ -55,7 +53,6 @@
  *
  * <p>Used by carriers such as Verizon Wireless
  */
-@TargetApi(VERSION_CODES.O)
 public class Vvm3Protocol extends VisualVoicemailProtocol {
 
   private static final String TAG = "Vvm3Protocol";
diff --git a/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java b/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java
index 41598e0..c478a93 100644
--- a/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java
+++ b/java/com/android/voicemail/impl/protocol/Vvm3Subscriber.java
@@ -16,11 +16,9 @@
 
 package com.android.voicemail.impl.protocol;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.net.Network;
 import android.os.Build;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.VisibleForTesting;
@@ -81,7 +79,6 @@
  * <p>After the process is completed, the carrier should send us another STATUS SMS with a new or
  * ready user.
  */
-@TargetApi(VERSION_CODES.O)
 public class Vvm3Subscriber {
 
   private static final String TAG = "Vvm3Subscriber";
diff --git a/java/com/android/voicemail/impl/scheduling/TaskExecutor.java b/java/com/android/voicemail/impl/scheduling/TaskExecutor.java
index afa77c5..d2ddea7 100644
--- a/java/com/android/voicemail/impl/scheduling/TaskExecutor.java
+++ b/java/com/android/voicemail/impl/scheduling/TaskExecutor.java
@@ -16,10 +16,8 @@
 
 package com.android.voicemail.impl.scheduling;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -69,7 +67,6 @@
  *   <li>A job cannot be mutated to store information such as retry count.
  * </ul>
  */
-@TargetApi(VERSION_CODES.O)
 final class TaskExecutor {
 
   /**
diff --git a/java/com/android/voicemail/impl/scheduling/TaskReceiver.java b/java/com/android/voicemail/impl/scheduling/TaskReceiver.java
index b9fd272..d838b9e 100644
--- a/java/com/android/voicemail/impl/scheduling/TaskReceiver.java
+++ b/java/com/android/voicemail/impl/scheduling/TaskReceiver.java
@@ -16,11 +16,9 @@
 
 package com.android.voicemail.impl.scheduling;
 
-import android.annotation.TargetApi;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import com.android.voicemail.impl.VvmLog;
 import com.android.voicemail.impl.scheduling.Tasks.TaskCreationException;
@@ -34,7 +32,6 @@
  * Tasks#createIntent(Context, Class)}). The task will be queued directly in {@link TaskExecutor} if
  * it is already running, or in {@link TaskSchedulerJobService} if not.
  */
-@TargetApi(VERSION_CODES.O)
 public class TaskReceiver extends BroadcastReceiver {
 
   private static final String TAG = "VvmTaskReceiver";
diff --git a/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java b/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java
index 77a0d25..2daf3a1 100644
--- a/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java
+++ b/java/com/android/voicemail/impl/scheduling/TaskSchedulerJobService.java
@@ -16,7 +16,6 @@
 
 package com.android.voicemail.impl.scheduling;
 
-import android.annotation.TargetApi;
 import android.app.job.JobInfo;
 import android.app.job.JobParameters;
 import android.app.job.JobScheduler;
@@ -24,7 +23,6 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.os.Parcelable;
 import android.preference.PreferenceManager;
@@ -38,7 +36,6 @@
 import java.util.List;
 
 /** A {@link JobService} that will trigger the background execution of {@link TaskExecutor}. */
-@TargetApi(VERSION_CODES.O)
 public class TaskSchedulerJobService extends JobService implements TaskExecutor.Job {
 
   private static final String TAG = "TaskSchedulerJobService";
diff --git a/java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java b/java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java
index 5a16f86..f75e23b 100644
--- a/java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java
+++ b/java/com/android/voicemail/impl/sms/LegacyModeSmsHandler.java
@@ -16,11 +16,9 @@
 
 package com.android.voicemail.impl.sms;
 
-import android.annotation.TargetApi;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.telecom.PhoneAccountHandle;
@@ -39,7 +37,6 @@
  *
  * @see OmtpVvmCarrierConfigHelper#isLegacyModeEnabled()
  */
-@TargetApi(VERSION_CODES.O)
 public class LegacyModeSmsHandler {
 
   private static final String TAG = "LegacyModeSmsHandler";
diff --git a/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java b/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java
index 0f22c3d..e71dca0 100644
--- a/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java
+++ b/java/com/android/voicemail/impl/sms/OmtpMessageReceiver.java
@@ -15,13 +15,11 @@
  */
 package com.android.voicemail.impl.sms;
 
-import android.annotation.TargetApi;
 import android.content.BroadcastReceiver;
 import android.content.ContentUris;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.os.UserManager;
 import android.telecom.PhoneAccountHandle;
@@ -42,7 +40,6 @@
 import com.android.voicemail.impl.utils.VoicemailDatabaseUtil;
 
 /** Receive SMS messages and send for processing by the OMTP visual voicemail source. */
-@TargetApi(VERSION_CODES.O)
 public class OmtpMessageReceiver extends BroadcastReceiver {
 
   private static final String TAG = "OmtpMessageReceiver";
diff --git a/java/com/android/voicemail/impl/sms/OmtpMessageSender.java b/java/com/android/voicemail/impl/sms/OmtpMessageSender.java
index 8b9e049..b10b18f 100644
--- a/java/com/android/voicemail/impl/sms/OmtpMessageSender.java
+++ b/java/com/android/voicemail/impl/sms/OmtpMessageSender.java
@@ -15,10 +15,8 @@
  */
 package com.android.voicemail.impl.sms;
 
-import android.annotation.TargetApi;
 import android.app.PendingIntent;
 import android.content.Context;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.Nullable;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.SmsManager;
@@ -35,7 +33,6 @@
  *
  * <p>Provides simple APIs to send different types of mobile originated OMTP SMS to the VVM server.
  */
-@TargetApi(VERSION_CODES.O)
 public abstract class OmtpMessageSender {
   protected static final String TAG = "OmtpMessageSender";
   protected final Context context;
diff --git a/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java b/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java
index dd945e9..2684abb 100644
--- a/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java
+++ b/java/com/android/voicemail/impl/sms/StatusSmsFetcher.java
@@ -16,14 +16,12 @@
 
 package com.android.voicemail.impl.sms;
 
-import android.annotation.TargetApi;
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.os.Build.VERSION_CODES;
 import android.os.Bundle;
 import android.support.annotation.MainThread;
 import android.support.annotation.Nullable;
@@ -46,7 +44,6 @@
 import java.util.concurrent.TimeoutException;
 
 /** Intercepts a incoming STATUS SMS with a blocking call. */
-@TargetApi(VERSION_CODES.O)
 public class StatusSmsFetcher extends BroadcastReceiver implements Closeable {
 
   private static final String TAG = "VvmStatusSmsFetcher";
diff --git a/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java b/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java
index cf2763b..957572e 100644
--- a/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java
+++ b/java/com/android/voicemail/impl/sync/OmtpVvmSyncService.java
@@ -15,12 +15,9 @@
  */
 package com.android.voicemail.impl.sync;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.net.Network;
 import android.net.Uri;
-import android.os.Build.VERSION_CODES;
-import android.support.v4.os.BuildCompat;
 import android.telecom.PhoneAccountHandle;
 import android.text.TextUtils;
 import android.util.ArrayMap;
@@ -48,7 +45,6 @@
 import java.util.Map;
 
 /** Sync OMTP visual voicemail. */
-@TargetApi(VERSION_CODES.O)
 public class OmtpVvmSyncService {
 
   private static final String TAG = "OmtpVvmSyncService";
@@ -188,9 +184,6 @@
   }
 
   private void deleteAndArchiveVM(ImapHelper imapHelper, Quota quotaOnServer) {
-    // Archive column should only be used for 0 and above
-    Assert.isTrue(BuildCompat.isAtLeastO());
-
     // The number of voicemails that exceed our threshold and should be deleted from the server
     int numVoicemails =
         quotaOnServer.occupied - (int) (AUTO_DELETE_ARCHIVE_VM_THRESHOLD * quotaOnServer.total);
diff --git a/java/com/android/voicemail/impl/sync/VvmAccountManager.java b/java/com/android/voicemail/impl/sync/VvmAccountManager.java
index e7f2eef..795e207 100644
--- a/java/com/android/voicemail/impl/sync/VvmAccountManager.java
+++ b/java/com/android/voicemail/impl/sync/VvmAccountManager.java
@@ -15,9 +15,7 @@
  */
 package com.android.voicemail.impl.sync;
 
-import android.annotation.TargetApi;
 import android.content.Context;
-import android.os.Build.VERSION_CODES;
 import android.os.UserManager;
 import android.support.annotation.MainThread;
 import android.support.annotation.NonNull;
@@ -47,7 +45,6 @@
  * #removeAccount(Context, PhoneAccountHandle)} should be called to clear the connection information
  * and allow reactivation.
  */
-@TargetApi(VERSION_CODES.O)
 public class VvmAccountManager {
   public static final String TAG = "VvmAccountManager";
 
diff --git a/java/com/android/voicemail/impl/sync/VvmNetworkRequest.java b/java/com/android/voicemail/impl/sync/VvmNetworkRequest.java
index a7d578d..92456ca 100644
--- a/java/com/android/voicemail/impl/sync/VvmNetworkRequest.java
+++ b/java/com/android/voicemail/impl/sync/VvmNetworkRequest.java
@@ -16,9 +16,7 @@
 
 package com.android.voicemail.impl.sync;
 
-import android.annotation.TargetApi;
 import android.net.Network;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.NonNull;
 import android.telecom.PhoneAccountHandle;
 import com.android.voicemail.impl.OmtpVvmCarrierConfigHelper;
@@ -33,7 +31,6 @@
  * Class to retrieve a {@link Network} synchronously. {@link #getNetwork(OmtpVvmCarrierConfigHelper,
  * PhoneAccountHandle)} will block until a suitable network is retrieved or it has failed.
  */
-@TargetApi(VERSION_CODES.O)
 public class VvmNetworkRequest {
 
   private static final String TAG = "VvmNetworkRequest";
diff --git a/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java b/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java
index 5762a09..84c3cb5 100644
--- a/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java
+++ b/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java
@@ -15,7 +15,6 @@
  */
 package com.android.voicemail.impl.sync;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.net.InetAddresses;
@@ -24,7 +23,6 @@
 import android.net.NetworkCapabilities;
 import android.net.NetworkRequest;
 import android.os.ConditionVariable;
-import android.os.Build.VERSION_CODES;
 import android.os.Handler;
 import android.os.Looper;
 import android.support.annotation.CallSuper;
@@ -40,7 +38,6 @@
  * Base class for network request call backs for visual voicemail syncing with the Imap server. This
  * handles retries and network requests.
  */
-@TargetApi(VERSION_CODES.O)
 public abstract class VvmNetworkRequestCallback extends ConnectivityManager.NetworkCallback {
 
   private static final String TAG = "VvmNetworkRequest";
diff --git a/java/com/android/voicemail/impl/transcribe/TranscriptionBackfillService.java b/java/com/android/voicemail/impl/transcribe/TranscriptionBackfillService.java
index 8fc40ee..4e79d18 100644
--- a/java/com/android/voicemail/impl/transcribe/TranscriptionBackfillService.java
+++ b/java/com/android/voicemail/impl/transcribe/TranscriptionBackfillService.java
@@ -25,7 +25,6 @@
 import android.os.Bundle;
 import android.support.annotation.WorkerThread;
 import android.support.v4.app.JobIntentService;
-import android.support.v4.os.BuildCompat;
 import android.telecom.PhoneAccountHandle;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.ThreadUtil;
@@ -41,19 +40,14 @@
 
   /** Schedule a task to scan the database for untranscribed voicemails */
   public static boolean scheduleTask(Context context, PhoneAccountHandle account) {
-    if (BuildCompat.isAtLeastO()) {
-      LogUtil.enterBlock("TranscriptionBackfillService.transcribeOldVoicemails");
-      ComponentName componentName = new ComponentName(context, TranscriptionBackfillService.class);
-      JobInfo.Builder builder =
-          new JobInfo.Builder(ScheduledJobIds.VVM_TRANSCRIPTION_BACKFILL_JOB, componentName)
-              .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
-      JobScheduler scheduler = context.getSystemService(JobScheduler.class);
-      return scheduler.enqueue(builder.build(), makeWorkItem(account))
-          == JobScheduler.RESULT_SUCCESS;
-    } else {
-      LogUtil.i("TranscriptionBackfillService.transcribeOldVoicemails", "not supported");
-      return false;
-    }
+    LogUtil.enterBlock("TranscriptionBackfillService.transcribeOldVoicemails");
+    ComponentName componentName = new ComponentName(context, TranscriptionBackfillService.class);
+    JobInfo.Builder builder =
+        new JobInfo.Builder(ScheduledJobIds.VVM_TRANSCRIPTION_BACKFILL_JOB, componentName)
+            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
+    JobScheduler scheduler = context.getSystemService(JobScheduler.class);
+    return scheduler.enqueue(builder.build(), makeWorkItem(account))
+        == JobScheduler.RESULT_SUCCESS;
   }
 
   private static JobWorkItem makeWorkItem(PhoneAccountHandle account) {
diff --git a/java/com/android/voicemail/impl/transcribe/TranscriptionConfigProvider.java b/java/com/android/voicemail/impl/transcribe/TranscriptionConfigProvider.java
index 66bf16c..ee10685 100644
--- a/java/com/android/voicemail/impl/transcribe/TranscriptionConfigProvider.java
+++ b/java/com/android/voicemail/impl/transcribe/TranscriptionConfigProvider.java
@@ -16,7 +16,6 @@
 package com.android.voicemail.impl.transcribe;
 
 import android.content.Context;
-import android.os.Build;
 import com.android.dialer.configprovider.ConfigProviderComponent;
 import java.util.concurrent.TimeUnit;
 
@@ -29,8 +28,7 @@
   }
 
   public boolean isVoicemailTranscriptionAvailable() {
-    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
-        && ConfigProviderComponent.get(context)
+    return ConfigProviderComponent.get(context)
             .getConfigProvider()
             .getBoolean("voicemail_transcription_available", false);
   }
diff --git a/java/com/android/voicemail/impl/transcribe/TranscriptionDbHelper.java b/java/com/android/voicemail/impl/transcribe/TranscriptionDbHelper.java
index 6ffb848..4dc54b1 100644
--- a/java/com/android/voicemail/impl/transcribe/TranscriptionDbHelper.java
+++ b/java/com/android/voicemail/impl/transcribe/TranscriptionDbHelper.java
@@ -15,14 +15,12 @@
  */
 package com.android.voicemail.impl.transcribe;
 
-import android.annotation.TargetApi;
 import android.content.ContentResolver;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
-import android.os.Build;
 import android.provider.VoicemailContract.Voicemails;
 import android.support.annotation.VisibleForTesting;
 import android.support.annotation.WorkerThread;
@@ -34,7 +32,6 @@
 import java.util.List;
 
 /** Helper class for reading and writing transcription data in the database */
-@TargetApi(Build.VERSION_CODES.O)
 public class TranscriptionDbHelper {
   @VisibleForTesting
   static final String[] PROJECTION =
@@ -63,7 +60,6 @@
 
   @WorkerThread
   Pair<String, Integer> getTranscriptionAndState() {
-    Assert.checkState(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O);
     Assert.isWorkerThread();
     try (Cursor cursor = contentResolver.query(uri, PROJECTION, null, null, null)) {
       if (cursor == null) {
@@ -83,7 +79,6 @@
 
   @WorkerThread
   List<Uri> getUntranscribedVoicemails() {
-    Assert.checkState(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O);
     Assert.isWorkerThread();
     List<Uri> untranscribed = new ArrayList<>();
     String whereClause =
@@ -110,7 +105,6 @@
 
   @WorkerThread
   List<Uri> getTranscribingVoicemails() {
-    Assert.checkState(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O);
     Assert.isWorkerThread();
     List<Uri> inProgress = new ArrayList<>();
     String whereClause = VoicemailCompat.TRANSCRIPTION_STATE + "=?";
diff --git a/java/com/android/voicemail/impl/transcribe/TranscriptionRatingService.java b/java/com/android/voicemail/impl/transcribe/TranscriptionRatingService.java
index cff2c6d..51fe3b1 100644
--- a/java/com/android/voicemail/impl/transcribe/TranscriptionRatingService.java
+++ b/java/com/android/voicemail/impl/transcribe/TranscriptionRatingService.java
@@ -21,7 +21,6 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build;
 import android.support.annotation.WorkerThread;
 import android.support.v4.app.JobIntentService;
 import com.android.dialer.common.LogUtil;
@@ -39,7 +38,6 @@
 
   /** Schedule a task to upload transcription rating feedback */
   public static boolean scheduleTask(Context context, SendTranscriptionFeedbackRequest request) {
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
       LogUtil.enterBlock("TranscriptionRatingService.scheduleTask");
       ComponentName componentName = new ComponentName(context, TranscriptionRatingService.class);
       JobInfo.Builder builder =
@@ -48,10 +46,6 @@
       JobScheduler scheduler = context.getSystemService(JobScheduler.class);
       return scheduler.enqueue(builder.build(), makeWorkItem(request))
           == JobScheduler.RESULT_SUCCESS;
-    } else {
-      LogUtil.i("TranscriptionRatingService.scheduleTask", "not supported");
-      return false;
-    }
   }
 
   public TranscriptionRatingService() {}
diff --git a/java/com/android/voicemail/impl/transcribe/TranscriptionService.java b/java/com/android/voicemail/impl/transcribe/TranscriptionService.java
index 781e347..b93c2e5 100644
--- a/java/com/android/voicemail/impl/transcribe/TranscriptionService.java
+++ b/java/com/android/voicemail/impl/transcribe/TranscriptionService.java
@@ -93,10 +93,6 @@
   }
 
   private static boolean canTranscribeVoicemail(Context context, PhoneAccountHandle account) {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
-      LogUtil.i("TranscriptionService.canTranscribeVoicemail", "not supported by sdk");
-      return false;
-    }
     VoicemailClient client = VoicemailComponent.get(context).getVoicemailClient();
     if (!client.isVoicemailTranscriptionEnabled(context, account)) {
       LogUtil.i("TranscriptionService.canTranscribeVoicemail", "transcription is not enabled");
diff --git a/java/com/android/voicemail/impl/transcribe/TranscriptionUtils.java b/java/com/android/voicemail/impl/transcribe/TranscriptionUtils.java
index 8611e80..f1d89d8 100644
--- a/java/com/android/voicemail/impl/transcribe/TranscriptionUtils.java
+++ b/java/com/android/voicemail/impl/transcribe/TranscriptionUtils.java
@@ -15,10 +15,8 @@
  */
 package com.android.voicemail.impl.transcribe;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.net.Uri;
-import android.os.Build.VERSION_CODES;
 import android.support.annotation.Nullable;
 import android.util.Base64;
 import com.android.dialer.common.Assert;
@@ -47,7 +45,6 @@
         : AudioFormat.AUDIO_FORMAT_UNSPECIFIED;
   }
 
-  @TargetApi(VERSION_CODES.O)
   static String getFingerprintFor(ByteString data, @Nullable String salt) {
     Assert.checkArgument(data != null);
     try {
