content: package com.android.internal.telephony;
  
  import android.content.Context;
  import android.os.Bundle;
  import android.provider.BlockedNumberContract;
  import android.telephony.Rlog;
  
  /**
   * {@hide} Checks for blocked phone numbers against {@link BlockedNumberContract}
   */
  public class BlockChecker {
      private static final String TAG = "BlockChecker";
      private static final boolean VDBG = false; // STOPSHIP if true.
  
      /**
       * Returns {@code true} if {@code phoneNumber} is blocked according to {@code extras}.
       * <p>
       * This method catches all underlying exceptions to ensure that this method never throws any
       * exception.
       * <p>
       * @deprecated use {@link #isBlocked(Context, String, Bundle)} instead.
       *
       * @param context the context of the caller.
       * @param phoneNumber the number to check.
       * @return {@code true} if the number is blocked. {@code false} otherwise.
       */
      @Deprecated
      public static boolean isBlocked(Context context, String phoneNumber) {
          return isBlocked(context, phoneNumber, null /* extras */);
      }
  
      /**
       * Returns {@code true} if {@code phoneNumber} is blocked according to {@code extras}.
       * <p>
       * This method catches all underlying exceptions to ensure that this method never throws any
       * exception.
       *
       * @param context the context of the caller.
       * @param phoneNumber the number to check.
       * @param extras the extra attribute of the number.
       * @return {@code true} if the number is blocked. {@code false} otherwise.
       */
      public static boolean isBlocked(Context context, String phoneNumber, Bundle extras) {
          return getBlockStatus(context, phoneNumber, extras)
                  != BlockedNumberContract.STATUS_NOT_BLOCKED;
      }
  
      /**
       * Returns the call blocking status for the {@code phoneNumber}.
       * <p>
       * This method catches all underlying exceptions to ensure that this method never throws any
       * exception.
       *
       * @param context the context of the caller.
       * @param phoneNumber the number to check.
       * @param extras the extra attribute of the number.
       * @return result code indicating if the number should be blocked, and if so why.
       *         Valid values are: {@link BlockedNumberContract#STATUS_NOT_BLOCKED},
       *         {@link BlockedNumberContract#STATUS_BLOCKED_IN_LIST},
       *         {@link BlockedNumberContract#STATUS_BLOCKED_NOT_IN_CONTACTS},
       *         {@link BlockedNumberContract#STATUS_BLOCKED_PAYPHONE},
       *         {@link BlockedNumberContract#STATUS_BLOCKED_RESTRICTED},
       *         {@link BlockedNumberContract#STATUS_BLOCKED_UNKNOWN_NUMBER}.
       */
      public static int getBlockStatus(Context context, String phoneNumber, Bundle extras) {
          int blockStatus = BlockedNumberContract.STATUS_NOT_BLOCKED;
          long startTimeNano = System.nanoTime();
  
          try {
              blockStatus = BlockedNumberContract.SystemContract.shouldSystemBlockNumber(
                      context, phoneNumber, extras);
              if (blockStatus != BlockedNumberContract.STATUS_NOT_BLOCKED) {
                  Rlog.d(TAG, phoneNumber + " is blocked.");
              }
          } catch (Exception e) {
              Rlog.e(TAG, "Exception checking for blocked number: " + e);
          }
  
          int durationMillis = (int) ((System.nanoTime() - startTimeNano) / 1000000);
          if (durationMillis > 500 || VDBG) {
              Rlog.d(TAG, "Blocked number lookup took: " + durationMillis + " ms.");
          }
          return blockStatus;
      }
  }
  