diff --git a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
index 450c914..6efdc62 100644
--- a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
+++ b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
@@ -17,6 +17,7 @@
 package com.android.dialer.app.calllog;
 
 import android.content.Context;
+import android.provider.BlockedNumberContract;
 import android.support.v4.app.FragmentManager;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
@@ -103,18 +104,15 @@
       final String countryIso,
       final int callType,
       final ContactSource.Type contactSourceType,
-      final boolean isSpam,
-      final Integer blockId) {
+      final boolean isSpam) {
     DialogFragmentForUnblockingNumberAndReportingAsNotSpam.newInstance(
             displayNumber,
             isSpam,
             () -> {
               LogUtil.i("BlockReportSpamListener.onUnblock", "onClick");
-              filteredNumberAsyncQueryHandler.unblock(
-                  (rows, values) -> {
-                    adapter.notifyDataSetChanged();
-                  },
-                  blockId);
+              if (BlockedNumberContract.unblock(context, number) > 0) {
+                  adapter.notifyDataSetChanged();
+              }
             },
             null)
         .show(fragmentManager, BlockReportSpamDialogs.UNBLOCK_DIALOG_TAG);
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index 483b56b..866f4d7 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -26,6 +26,7 @@
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Trace;
+import android.provider.BlockedNumberContract;
 import android.provider.CallLog;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.support.v7.app.AlertDialog;
@@ -79,9 +80,6 @@
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
 import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.util.PermissionsUtil;
-import com.google.i18n.phonenumbers.NumberParseException;
-import com.google.i18n.phonenumbers.PhoneNumberUtil;
-import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.Set;
@@ -568,10 +566,6 @@
     }
   }
 
-  public void clearFilteredNumbersCache() {
-    filteredNumberAsyncQueryHandler.clearCache();
-  }
-
   public void onResume() {
     if (PermissionsUtil.hasPermission(activity, android.Manifest.permission.READ_CONTACTS)) {
       contactInfoCache.start();
@@ -747,17 +741,16 @@
     // Reset block and spam information since this view could be reused which may contain
     // outdated data.
     viewHolder.isSpam = false;
-    viewHolder.blockId = null;
+    viewHolder.isBlocked = false;
 
     viewHolder.setDetailedPhoneDetails(callDetailsEntries);
     final AsyncTask<Void, Void, Boolean> loadDataTask =
         new AsyncTask<Void, Void, Boolean>() {
           @Override
           protected Boolean doInBackground(Void... params) {
-            viewHolder.blockId =
-                filteredNumberAsyncQueryHandler.getBlockedIdSynchronous(
-                    viewHolder.number, viewHolder.countryIso);
-            details.isBlocked = viewHolder.blockId != null;
+            viewHolder.isBlocked = BlockedNumberContract.canCurrentUserBlockNumbers(activity) &&
+                    BlockedNumberContract.isBlocked(activity, viewHolder.number);
+            details.isBlocked = viewHolder.isBlocked;
             if (isCancelled()) {
               return false;
             }
diff --git a/java/com/android/dialer/app/calllog/CallLogFragment.java b/java/com/android/dialer/app/calllog/CallLogFragment.java
index 06d60b3..e60bbfa 100644
--- a/java/com/android/dialer/app/calllog/CallLogFragment.java
+++ b/java/com/android/dialer/app/calllog/CallLogFragment.java
@@ -400,11 +400,6 @@
 
     this.hasReadCallLogPermission = hasReadCallLogPermission;
 
-    /*
-     * Always clear the filtered numbers cache since users could have blocked/unblocked numbers
-     * from the settings page
-     */
-    adapter.clearFilteredNumbersCache();
     refreshData();
     adapter.onResume();
 
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index 63b0c94..53cc4b7 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -30,6 +30,7 @@
 import android.content.res.Resources;
 import android.net.Uri;
 import android.os.AsyncTask;
+import android.provider.BlockedNumberContract;
 import android.provider.CallLog;
 import android.provider.CallLog.Calls;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
@@ -65,7 +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.FilteredNumbersUtil;
 import com.android.dialer.calldetails.CallDetailsEntries;
 import com.android.dialer.calldetails.OldCallDetailsActivity;
 import com.android.dialer.calllogutils.CallbackActionHelper.CallbackAction;
@@ -189,9 +189,9 @@
    */
   public int callType;
   /**
-   * ID for blocked numbers database. Set when context menu is created, if the number is blocked.
+   * Set when context menu is created, if the number is blocked.
    */
-  public Integer blockId;
+  public boolean isBlocked;
   /**
    * The account for the current call log entry. Cached here as the call back intent is set only
    * when the actions ViewStub is inflated.
@@ -346,7 +346,7 @@
               displayNumber, number, countryIso, callType, info.sourceType);
     } else if (resId == R.id.context_menu_unblock) {
       blockReportListener.onUnblock(
-          displayNumber, number, countryIso, callType, info.sourceType, isSpam, blockId);
+          displayNumber, number, countryIso, callType, info.sourceType, isSpam);
     } else if (resId == R.id.context_menu_report_not_spam) {
       blockReportListener.onReportNotSpam(
           displayNumber, number, countryIso, callType, info.sourceType);
@@ -629,7 +629,7 @@
               callDetailsEntries, buildContact(), canReportCallerId, canSupportAssistedDialing()));
     }
 
-    boolean isBlockedOrSpam = blockId != null;
+    boolean isBlockedOrSpam = isBlocked || isSpam;
 
     if (!isBlockedOrSpam && info != null && UriUtils.isEncodedContactUri(info.lookupUri)) {
       createNewContactButtonView.setTag(
@@ -871,7 +871,7 @@
 
     if (view.getId() == R.id.unblock_action) {
       blockReportListener.onUnblock(
-          displayNumber, number, countryIso, callType, info.sourceType, isSpam, blockId);
+          displayNumber, number, countryIso, callType, info.sourceType, isSpam);
       return;
     }
 
@@ -968,10 +968,11 @@
     String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
     if (!canPlaceCallToNumber
         || isVoicemailNumber
-        || !FilteredNumbersUtil.canBlockNumber(context, e164Number, number)) {
+        || !BlockedNumberContract.canCurrentUserBlockNumbers(context)
+        || PhoneNumberUtils.isEmergencyNumber(e164Number)) {
       return;
     }
-    boolean isBlocked = blockId != null;
+
     if (isBlocked) {
       unblockView.setVisibility(View.VISIBLE);
     } else {
@@ -1026,8 +1027,8 @@
     boolean canPlaceCallToNumber = PhoneNumberHelper.canPlaceCallsTo(number, numberPresentation);
     if (canPlaceCallToNumber
         && !isVoicemailNumber
-        && FilteredNumbersUtil.canBlockNumber(context, e164Number, number)) {
-      boolean isBlocked = blockId != null;
+        && BlockedNumberContract.canCurrentUserBlockNumbers(context)
+            && !PhoneNumberUtils.isEmergencyNumber(e164Number)) {
       if (isBlocked) {
         menu.add(
                 ContextMenu.NONE,
@@ -1082,8 +1083,7 @@
         String countryIso,
         int callType,
         ContactSource.Type contactSourceType,
-        boolean isSpam,
-        Integer blockId);
+        boolean isSpam);
 
     void onReportNotSpam(
         String displayNumber,
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
index 659ca3a..9957ae7 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.net.Uri;
+import android.provider.BlockedNumberContract;
 import android.service.notification.StatusBarNotification;
 import android.text.TextUtils;
 import android.util.ArrayMap;
@@ -29,7 +30,6 @@
 import com.android.dialer.app.R;
 import com.android.dialer.app.calllog.CallLogNotificationsQueryHelper.NewCall;
 import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler;
-import com.android.dialer.blocking.FilteredNumbersUtil;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.DialerExecutor.Worker;
@@ -37,6 +37,8 @@
 import com.android.dialer.notification.DialerNotificationManager;
 import com.android.dialer.phonenumbercache.ContactInfo;
 import com.android.dialer.telecom.TelecomUtil;
+import com.android.dialer.util.EmergencyCallUtil;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -70,7 +72,7 @@
       return;
     }
 
-    if (FilteredNumbersUtil.hasRecentEmergencyCall(context)) {
+    if (EmergencyCallUtil.hasRecentEmergencyCall(context)) {
       LogUtil.i(
           "VisualVoicemailUpdateTask.updateNotification",
           "not filtering due to recent emergency call");
@@ -178,7 +180,8 @@
     Assert.isWorkerThread();
     List<NewCall> result = new ArrayList<>();
     for (NewCall newCall : newCalls) {
-      if (queryHandler.getBlockedIdSynchronous(newCall.number, newCall.countryIso) != null) {
+      if (BlockedNumberContract.canCurrentUserBlockNumbers(context)
+        && BlockedNumberContract.isBlocked(context, newCall.number)) {
         LogUtil.i(
             "VisualVoicemailUpdateTask.filterBlockedNumbers",
             "found voicemail from blocked number, deleting");
diff --git a/java/com/android/dialer/app/settings/DialerSettingsActivity.java b/java/com/android/dialer/app/settings/DialerSettingsActivity.java
index 84fc83e..5e73253 100644
--- a/java/com/android/dialer/app/settings/DialerSettingsActivity.java
+++ b/java/com/android/dialer/app/settings/DialerSettingsActivity.java
@@ -22,6 +22,7 @@
 import android.os.Bundle;
 import android.os.UserManager;
 import android.preference.PreferenceManager;
+import android.provider.BlockedNumberContract;
 import android.provider.Settings;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
@@ -33,7 +34,6 @@
 import androidx.annotation.Nullable;
 
 import com.android.dialer.app.R;
-import com.android.dialer.blocking.FilteredNumbersUtil;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.compat.telephony.TelephonyManagerCompat;
 import com.android.dialer.lookup.LookupSettingsFragment;
@@ -131,7 +131,7 @@
       phoneAccountSettingsHeader.intent = phoneAccountSettingsIntent;
       target.add(phoneAccountSettingsHeader);
     }
-    if (FilteredNumbersUtil.canCurrentUserOpenBlockSettings(this)) {
+    if (BlockedNumberContract.canCurrentUserBlockNumbers(this)) {
       Header blockedCallsHeader = new Header();
       blockedCallsHeader.titleRes = R.string.manage_blocked_numbers_label;
       blockedCallsHeader.intent = getApplicationContext().getSystemService(TelecomManager.class)
diff --git a/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java b/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java
index 852fd37..e21aa82 100644
--- a/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java
+++ b/java/com/android/dialer/blocking/FilteredNumberAsyncQueryHandler.java
@@ -17,35 +17,21 @@
 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;
 import android.provider.BlockedNumberContract.BlockedNumbers;
 import android.support.v4.os.UserManagerCompat;
-import android.telephony.PhoneNumberUtils;
-import android.text.TextUtils;
 
-import androidx.annotation.Nullable;
-
-import com.android.dialer.common.Assert;
-import com.android.dialer.common.LogUtil;
-import java.util.Map;
 import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
 
 /** TODO(calderwoodra): documentation */
 @Deprecated
 public class FilteredNumberAsyncQueryHandler extends AsyncQueryHandler {
 
   public static final int INVALID_ID = -1;
-  // Id used to replace null for blocked id since ConcurrentHashMap doesn't allow null key/value.
-  private static final int BLOCKED_NUMBER_CACHE_NULL_ID = -1;
-
-  private static final Map<String, Integer> blockedNumberCache = new ConcurrentHashMap<>();
 
   private static final int NO_TOKEN = 0;
   private final Context context;
@@ -89,151 +75,6 @@
     }
   }
 
-  /**
-   * 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
-   * check.
-   */
-  public void isBlockedNumber(
-          final OnCheckBlockedListener listener, @Nullable final String number, String countryIso) {
-    if (number == null) {
-      listener.onCheckComplete(INVALID_ID);
-      return;
-    }
-    if (!FilteredNumbersUtil.canAttemptBlockOperations(context)) {
-      listener.onCheckComplete(null);
-      return;
-    }
-    Integer cachedId = blockedNumberCache.get(number);
-    if (cachedId != null) {
-      if (listener == null) {
-        return;
-      }
-      if (cachedId == BLOCKED_NUMBER_CACHE_NULL_ID) {
-        cachedId = null;
-      }
-      listener.onCheckComplete(cachedId);
-      return;
-    }
-
-    if (!UserManagerCompat.isUserUnlocked(context)) {
-      LogUtil.i(
-          "FilteredNumberAsyncQueryHandler.isBlockedNumber",
-          "Device locked in FBE mode, cannot access blocked number database");
-      listener.onCheckComplete(INVALID_ID);
-      return;
-    }
-
-    String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
-    String formattedNumber = FilteredNumbersUtil.getBlockableNumber(e164Number, number);
-    if (TextUtils.isEmpty(formattedNumber)) {
-      listener.onCheckComplete(INVALID_ID);
-      blockedNumberCache.put(number, INVALID_ID);
-      return;
-    }
-
-    startQuery(
-        NO_TOKEN,
-        new Listener() {
-          @Override
-          protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
-            /*
-             * In the frameworking blocking, numbers can be blocked in both e164 format
-             * and not, resulting in multiple rows being returned for this query. For
-             * example, both '16502530000' and '6502530000' can exist at the same time
-             * and will be returned by this query.
-             */
-            if (cursor == null || cursor.getCount() == 0) {
-              blockedNumberCache.put(number, BLOCKED_NUMBER_CACHE_NULL_ID);
-              listener.onCheckComplete(null);
-              return;
-            }
-            cursor.moveToFirst();
-            Integer blockedId = cursor.getInt(cursor.getColumnIndex(BlockedNumbers.COLUMN_ID));
-            blockedNumberCache.put(number, blockedId);
-            listener.onCheckComplete(blockedId);
-          }
-        },
-        BlockedNumbers.CONTENT_URI,
-        new String[] {BlockedNumbers.COLUMN_ID},
-        getIsBlockedNumberSelection(e164Number != null) + " = ?",
-        new String[] {formattedNumber},
-        null);
-  }
-
-  /**
-   * Synchronously check if this number has been blocked.
-   *
-   * @return blocked id.
-   */
-  @Nullable
-  public Integer getBlockedIdSynchronous(@Nullable String number, String countryIso) {
-    Assert.isWorkerThread();
-    if (number == null) {
-      return null;
-    }
-    if (!FilteredNumbersUtil.canAttemptBlockOperations(context)) {
-      return null;
-    }
-    Integer cachedId = blockedNumberCache.get(number);
-    if (cachedId != null) {
-      if (cachedId == BLOCKED_NUMBER_CACHE_NULL_ID) {
-        cachedId = null;
-      }
-      return cachedId;
-    }
-
-    String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
-    String formattedNumber = FilteredNumbersUtil.getBlockableNumber(e164Number, number);
-    if (TextUtils.isEmpty(formattedNumber)) {
-      return null;
-    }
-
-    try (Cursor cursor =
-        context
-            .getContentResolver()
-            .query(
-                BlockedNumbers.CONTENT_URI,
-                new String[] {BlockedNumbers.COLUMN_ID},
-                getIsBlockedNumberSelection(e164Number != null) + " = ?",
-                new String[] {formattedNumber},
-                null)) {
-      /*
-       * In the frameworking blocking, numbers can be blocked in both e164 format
-       * and not, resulting in multiple rows being returned for this query. For
-       * example, both '16502530000' and '6502530000' can exist at the same time
-       * and will be returned by this query.
-       */
-      if (cursor == null || cursor.getCount() == 0) {
-        blockedNumberCache.put(number, BLOCKED_NUMBER_CACHE_NULL_ID);
-        return null;
-      }
-      cursor.moveToFirst();
-      int blockedId = cursor.getInt(cursor.getColumnIndex(BlockedNumbers.COLUMN_ID));
-      blockedNumberCache.put(number, blockedId);
-      return blockedId;
-    } catch (SecurityException e) {
-      LogUtil.e("FilteredNumberAsyncQueryHandler.getBlockedIdSynchronous", null, e);
-      return null;
-    }
-  }
-
-  public void clearCache() {
-    blockedNumberCache.clear();
-  }
-
-  /*
-   * TODO(maxwelb): a bug, non-e164 numbers can be blocked in the new form of blocking. As a
-   * temporary workaround, determine which column of the database to query based on whether the
-   * number is e164 or not.
-   */
-  private String getIsBlockedNumberSelection(boolean isE164Number) {
-    if (!isE164Number) {
-      return BlockedNumbers.COLUMN_ORIGINAL_NUMBER;
-    }
-    return BlockedNumbers.COLUMN_E164_NUMBER;
-  }
-
   /** Add a number manually blocked by the user. */
   public void blockNumber(final OnBlockNumberListener listener, String number) {
     ContentValues contentValues = new ContentValues();
@@ -246,8 +87,7 @@
    * performing the 'undo' action after unblocking.
    */
   public void blockNumber(final OnBlockNumberListener listener, ContentValues values) {
-    blockedNumberCache.clear();
-    if (!FilteredNumbersUtil.canAttemptBlockOperations(context)) {
+    if (!BlockedNumberContract.canCurrentUserBlockNumbers(context)) {
       if (listener != null) {
         listener.onBlockComplete(null);
       }
@@ -267,83 +107,6 @@
         values);
   }
 
-  /**
-   * Unblocks the number with the given id.
-   *
-   * @param listener (optional) The {@link OnUnblockNumberListener} called after the number is
-   *     unblocked.
-   * @param id The id of the number to unblock.
-   */
-  public void unblock(@Nullable final OnUnblockNumberListener listener, Integer id) {
-    if (id == null) {
-      throw new IllegalArgumentException("Null id passed into unblock");
-    }
-    unblock(listener, ContentUris.withAppendedId(BlockedNumbers.CONTENT_URI, id));
-  }
-
-  /**
-   * Removes row from database.
-   *
-   * @param listener (optional) The {@link OnUnblockNumberListener} called after the number is
-   *     unblocked.
-   * @param uri The uri of row to remove, from {@link FilteredNumberAsyncQueryHandler#blockNumber}.
-   */
-  public void unblock(@Nullable final OnUnblockNumberListener listener, final Uri uri) {
-    blockedNumberCache.clear();
-    if (!FilteredNumbersUtil.canAttemptBlockOperations(context)) {
-      if (listener != null) {
-        listener.onUnblockComplete(0, null);
-      }
-      return;
-    }
-    startQuery(
-        NO_TOKEN,
-        new Listener() {
-          @Override
-          public void onQueryComplete(int token, Object cookie, Cursor cursor) {
-            int rowsReturned = cursor == null ? 0 : cursor.getCount();
-            if (rowsReturned != 1) {
-              throw new SQLiteDatabaseCorruptException(
-                  "Returned " + rowsReturned + " rows for uri " + uri + "where 1 expected.");
-            }
-            cursor.moveToFirst();
-            final ContentValues values = new ContentValues();
-            DatabaseUtils.cursorRowToContentValues(cursor, values);
-            values.remove(BlockedNumbers.COLUMN_ID);
-
-            startDelete(
-                NO_TOKEN,
-                new Listener() {
-                  @Override
-                  public void onDeleteComplete(int token, Object cookie, int result) {
-                    if (listener != null) {
-                      listener.onUnblockComplete(result, values);
-                    }
-                  }
-                },
-                uri,
-                null,
-                null);
-          }
-        },
-        uri,
-        null,
-        null,
-        null,
-        null);
-  }
-
-  /** TODO(calderwoodra): documentation */
-  public interface OnCheckBlockedListener {
-
-    /**
-     * Invoked after querying if a number is blocked.
-     *
-     * @param id The ID of the row if blocked, null otherwise.
-     */
-    void onCheckComplete(Integer id);
-  }
-
   /** TODO(calderwoodra): documentation */
   public interface OnBlockNumberListener {
 
@@ -355,18 +118,6 @@
     void onBlockComplete(Uri uri);
   }
 
-  /** TODO(calderwoodra): documentation */
-  public interface OnUnblockNumberListener {
-
-    /**
-     * Invoked after removing a blocked number
-     *
-     * @param rows The number of rows affected (expected value 1).
-     * @param values The deleted data (used for restoration).
-     */
-    void onUnblockComplete(int rows, ContentValues values);
-  }
-
   /** Methods for FilteredNumberAsyncQueryHandler result returns. */
   private abstract static class Listener {
 
diff --git a/java/com/android/dialer/blocking/FilteredNumbersUtil.java b/java/com/android/dialer/blocking/FilteredNumbersUtil.java
deleted file mode 100644
index d0cbf04..0000000
--- a/java/com/android/dialer/blocking/FilteredNumbersUtil.java
+++ /dev/null
@@ -1,167 +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.Context;
-import android.provider.BlockedNumberContract;
-import android.provider.Settings;
-import android.telephony.PhoneNumberUtils;
-import android.text.TextUtils;
-
-import androidx.annotation.Nullable;
-
-import com.android.dialer.common.LogUtil;
-import com.android.dialer.storage.StorageComponent;
-import com.android.dialer.telecom.TelecomUtil;
-import java.util.concurrent.TimeUnit;
-
-/** Utility to help with tasks related to filtered numbers. */
-@Deprecated
-public class FilteredNumbersUtil {
-
-  // Pref key for storing the time of end of the last emergency call in milliseconds after epoch.\
-  private static final String LAST_EMERGENCY_CALL_MS_PREF_KEY = "last_emergency_call_ms";
-  // Pref key for storing whether a notification has been dispatched to notify the user that call
-  // blocking has been disabled because of a recent emergency call.
-  protected static final String NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY =
-      "notified_call_blocking_disabled_by_emergency_call";
-  // Disable incoming call blocking if there was a call within the past 2 days.
-  static final long RECENT_EMERGENCY_CALL_THRESHOLD_MS = TimeUnit.DAYS.toMillis(2);
-
-  /**
-   * Used for testing to specify the custom threshold value, in milliseconds for whether an
-   * emergency call is "recent". The default value will be used if this custom threshold is less
-   * than zero. For example, to set this threshold to 60 seconds:
-   *
-   * <p>adb shell settings put system dialer_emergency_call_threshold_ms 60000
-   */
-  private static final String RECENT_EMERGENCY_CALL_THRESHOLD_SETTINGS_KEY =
-      "dialer_emergency_call_threshold_ms";
-
-  public static long getLastEmergencyCallTimeMillis(Context context) {
-    return StorageComponent.get(context)
-        .unencryptedSharedPrefs()
-        .getLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, 0);
-  }
-
-  public static boolean hasRecentEmergencyCall(Context context) {
-    if (context == null) {
-      return false;
-    }
-
-    Long lastEmergencyCallTime = getLastEmergencyCallTimeMillis(context);
-    if (lastEmergencyCallTime == 0) {
-      return false;
-    }
-
-    return (System.currentTimeMillis() - lastEmergencyCallTime)
-        < getRecentEmergencyCallThresholdMs(context);
-  }
-
-  public static void recordLastEmergencyCallTime(Context context) {
-    if (context == null) {
-      return;
-    }
-
-    StorageComponent.get(context)
-        .unencryptedSharedPrefs()
-        .edit()
-        .putLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, System.currentTimeMillis())
-        .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)
-        .apply();
-  }
-
-  /**
-   * @param e164Number The e164 formatted version of the number, or {@code null} if such a format
-   *     doesn't exist.
-   * @param number The number to attempt blocking.
-   * @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(e164Number, number);
-    return canAttemptBlockOperations(context) && !TextUtils.isEmpty(blockableNumber)
-        && !PhoneNumberUtils.isEmergencyNumber(blockableNumber);
-  }
-
-  /**
-   * @param e164Number The e164 formatted version of the number, or {@code null} if such a format
-   *     doesn't exist..
-   * @param number The number to attempt blocking.
-   * @return The version of the given number that can be blocked with the current blocking solution.
-   */
-  @Nullable
-  public static String getBlockableNumber(@Nullable String e164Number, String number) {
-    return TextUtils.isEmpty(e164Number) ? number : e164Number;
-  }
-
-  private static long getRecentEmergencyCallThresholdMs(Context context) {
-    if (LogUtil.isVerboseEnabled()) {
-      long thresholdMs =
-          Settings.System.getLong(
-              context.getContentResolver(), RECENT_EMERGENCY_CALL_THRESHOLD_SETTINGS_KEY, 0);
-      return thresholdMs > 0 ? thresholdMs : RECENT_EMERGENCY_CALL_THRESHOLD_MS;
-    } else {
-      return RECENT_EMERGENCY_CALL_THRESHOLD_MS;
-    }
-  }
-
-  /**
-   * 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);
-  }
-
-  /**
-   * 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/util/EmergencyCallUtil.java b/java/com/android/dialer/util/EmergencyCallUtil.java
new file mode 100644
index 0000000..cbcddee
--- /dev/null
+++ b/java/com/android/dialer/util/EmergencyCallUtil.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.util;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.storage.StorageComponent;
+
+import java.util.concurrent.TimeUnit;
+
+/** Utility to help with tasks related to emergency calls. */
+public class EmergencyCallUtil {
+
+  // Pref key for storing the time of end of the last emergency call in milliseconds after epoch.\
+  private static final String LAST_EMERGENCY_CALL_MS_PREF_KEY = "last_emergency_call_ms";
+  // Pref key for storing whether a notification has been dispatched to notify the user that call
+  // blocking has been disabled because of a recent emergency call.
+  protected static final String NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY =
+      "notified_call_blocking_disabled_by_emergency_call";
+  // Disable incoming call blocking if there was a call within the past 2 days.
+  static final long RECENT_EMERGENCY_CALL_THRESHOLD_MS = TimeUnit.DAYS.toMillis(2);
+
+  /**
+   * Used for testing to specify the custom threshold value, in milliseconds for whether an
+   * emergency call is "recent". The default value will be used if this custom threshold is less
+   * than zero. For example, to set this threshold to 60 seconds:
+   *
+   * <p>adb shell settings put system dialer_emergency_call_threshold_ms 60000
+   */
+  private static final String RECENT_EMERGENCY_CALL_THRESHOLD_SETTINGS_KEY =
+      "dialer_emergency_call_threshold_ms";
+
+  public static long getLastEmergencyCallTimeMillis(Context context) {
+    return StorageComponent.get(context)
+        .unencryptedSharedPrefs()
+        .getLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, 0);
+  }
+
+  public static boolean hasRecentEmergencyCall(Context context) {
+    if (context == null) {
+      return false;
+    }
+
+    Long lastEmergencyCallTime = getLastEmergencyCallTimeMillis(context);
+    if (lastEmergencyCallTime == 0) {
+      return false;
+    }
+
+    return (System.currentTimeMillis() - lastEmergencyCallTime)
+        < getRecentEmergencyCallThresholdMs(context);
+  }
+
+  public static void recordLastEmergencyCallTime(Context context) {
+    if (context == null) {
+      return;
+    }
+
+    StorageComponent.get(context)
+        .unencryptedSharedPrefs()
+        .edit()
+        .putLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, System.currentTimeMillis())
+        .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)
+        .apply();
+  }
+
+  private static long getRecentEmergencyCallThresholdMs(Context context) {
+    if (LogUtil.isVerboseEnabled()) {
+      long thresholdMs =
+          Settings.System.getLong(
+              context.getContentResolver(), RECENT_EMERGENCY_CALL_THRESHOLD_SETTINGS_KEY, 0);
+      return thresholdMs > 0 ? thresholdMs : RECENT_EMERGENCY_CALL_THRESHOLD_MS;
+    } else {
+      return RECENT_EMERGENCY_CALL_THRESHOLD_MS;
+    }
+  }
+}
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index 5ef725f..9e0dd49 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -44,14 +44,12 @@
 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.FilteredNumbersUtil;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.DialerExecutorComponent;
 import com.android.dialer.postcall.PostCall;
 import com.android.dialer.telecom.TelecomUtil;
+import com.android.dialer.util.EmergencyCallUtil;
 import com.android.dialer.util.TouchPointManager;
 import com.android.incallui.InCallOrientationEventListener.ScreenOrientation;
 import com.android.incallui.answerproximitysensor.PseudoScreenState;
@@ -69,7 +67,7 @@
 import com.android.incallui.videosurface.bindings.VideoSurfaceBindings;
 import com.android.incallui.videosurface.protocol.VideoSurfaceTexture;
 import com.android.incallui.videotech.utils.VideoUtils;
-import com.google.protobuf.InvalidProtocolBufferException;
+
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -116,17 +114,6 @@
   private InCallDndHandler dndHandler;
   private ContactInfoCache contactInfoCache;
   private Context context;
-  private final OnCheckBlockedListener onCheckBlockedListener =
-      new OnCheckBlockedListener() {
-        @Override
-        public void onCheckComplete(final Integer id) {
-          if (id != null && id != FilteredNumberAsyncQueryHandler.INVALID_ID) {
-            // Silence the ringer now to prevent ringing and vibration before the call is
-            // terminated when Telecom attempts to add it.
-            TelecomUtil.silenceRinger(context);
-          }
-        }
-      };
   private CallList callList;
   private ExternalCallList externalCallList;
   private InCallActivity inCallActivity;
@@ -200,7 +187,7 @@
         @Override
         public void onCallStateChanged(int state, String incomingNumber) {
           if (state == TelephonyManager.CALL_STATE_RINGING) {
-            if (FilteredNumbersUtil.hasRecentEmergencyCall(context)) {
+            if (EmergencyCallUtil.hasRecentEmergencyCall(context)) {
               return;
             }
             // Check if the number is blocked, to silence the ringer.
@@ -814,7 +801,7 @@
     }
 
     if (call.isEmergencyCall()) {
-      FilteredNumbersUtil.recordLastEmergencyCallTime(context);
+      EmergencyCallUtil.recordLastEmergencyCallTime(context);
     }
 
     if (!callList.hasLiveCall()
diff --git a/java/com/android/incallui/call/CallList.java b/java/com/android/incallui/call/CallList.java
index 5dceda8..fb03a48 100644
--- a/java/com/android/incallui/call/CallList.java
+++ b/java/com/android/incallui/call/CallList.java
@@ -20,6 +20,7 @@
 import android.os.Handler;
 import android.os.Message;
 import android.os.Trace;
+import android.provider.BlockedNumberContract;
 import android.telecom.Call;
 import android.telecom.DisconnectCause;
 import android.telecom.PhoneAccount;
@@ -116,21 +117,11 @@
     Trace.endSection();
 
     Trace.beginSection("checkBlock");
-    FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler =
-        new FilteredNumberAsyncQueryHandler(context);
 
-    filteredNumberAsyncQueryHandler.isBlockedNumber(
-        new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() {
-          @Override
-          public void onCheckComplete(Integer id) {
-            if (id != null && id != FilteredNumberAsyncQueryHandler.INVALID_ID) {
-              call.setBlockedStatus(true);
-              // No need to update UI since it's only used for logging.
-            }
-          }
-        },
-        call.getNumber(),
-        call.getCountryIso());
+    if (BlockedNumberContract.canCurrentUserBlockNumbers(context) &&
+            BlockedNumberContract.isBlocked(context, call.getNumber())) {
+      call.setBlockedStatus(true);
+    }
     Trace.endSection();
 
     if (call.getState() == DialerCallState.INCOMING
diff --git a/java/com/android/incallui/spam/SpamCallListListener.java b/java/com/android/incallui/spam/SpamCallListListener.java
index d976cc3..96eac1b 100644
--- a/java/com/android/incallui/spam/SpamCallListListener.java
+++ b/java/com/android/incallui/spam/SpamCallListListener.java
@@ -28,12 +28,10 @@
 import androidx.annotation.Nullable;
 
 import com.android.dialer.R;
-import com.android.dialer.blocking.FilteredNumbersUtil;
 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;
-import com.android.dialer.location.GeoUtil;
 import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.util.PermissionsUtil;
 import com.android.incallui.call.CallList;
@@ -143,23 +141,5 @@
   public void onInternationalCallOnWifi(@NonNull DialerCall call) {}
 
   @Override
-  public void onDisconnect(DialerCall call) {
-    if (!shouldShowAfterCallNotification(call)) {
-      return;
-    }
-    String e164Number =
-        PhoneNumberUtils.formatNumberToE164(
-            call.getNumber(), GeoUtil.getCurrentCountryIso(context));
-    if (!FilteredNumbersUtil.canBlockNumber(context, e164Number, call.getNumber())) {
-      return;
-    }
-    if (e164Number == null) {
-      return;
-    }
-  }
-
-  /** Determines if the after call notification should be shown for the specified call. */
-  private boolean shouldShowAfterCallNotification(DialerCall call) {
-    return false;
-  }
+  public void onDisconnect(DialerCall call) {}
 }
