/* * Copyright (C) 2013 The CyanogenMod 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 dev.dworks.apps.asecure.blacklist; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.text.TextUtils; import android.util.Log; import dev.dworks.apps.asecure.blacklist.Telephony.Blacklist; /** * Blacklist Utility Class * @hide */ public class BlacklistUtils { private static final String TAG = "BlacklistUtils"; private static final boolean DEBUG = false; // Blacklist matching type public final static int MATCH_NONE = 0; public final static int MATCH_PRIVATE = 1; public final static int MATCH_UNKNOWN = 2; public final static int MATCH_LIST = 3; public final static int MATCH_REGEX = 4; public final static int BLOCK_CALLS = Settings.System.BLACKLIST_BLOCK << Settings.System.BLACKLIST_PHONE_SHIFT; public final static int BLOCK_MESSAGES = Settings.System.BLACKLIST_BLOCK << Settings.System.BLACKLIST_MESSAGE_SHIFT; public static boolean addOrUpdate(Context context, String number, int flags, int valid) { ContentValues cv = new ContentValues(); if ((valid & BLOCK_CALLS) != 0) { cv.put(Blacklist.PHONE_MODE, (flags & BLOCK_CALLS) != 0 ? 1 : 0); } if ((valid & BLOCK_MESSAGES) != 0) { cv.put(Blacklist.MESSAGE_MODE, (flags & BLOCK_MESSAGES) != 0 ? 1 : 0); } Uri uri = Uri.withAppendedPath(Blacklist.CONTENT_FILTER_BYNUMBER_URI, number); int count = context.getContentResolver().update(uri, cv, null, null); return count > 0; } /** * Check if the number is in the blacklist * @param number: Number to check * @return one of: MATCH_NONE, MATCH_PRIVATE, MATCH_UNKNOWN, MATCH_LIST or MATCH_REGEX */ public static int isListed(Context context, String number, int mode) { if (!isBlacklistEnabled(context)) { return MATCH_NONE; } if (DEBUG) { Log.d(TAG, "Checking number " + number + " against the Blacklist for mode " + mode); } final String type; if (mode == BLOCK_CALLS) { if (DEBUG) Log.d(TAG, "Checking if an incoming call should be blocked"); type = Blacklist.PHONE_MODE; } else if (mode == BLOCK_MESSAGES) { if (DEBUG) Log.d(TAG, "Checking if an incoming message should be blocked"); type = Blacklist.MESSAGE_MODE; } else { Log.e(TAG, "Invalid mode " + mode); return MATCH_NONE; } // Private and unknown number matching if (TextUtils.isEmpty(number)) { if (isBlacklistPrivateNumberEnabled(context, mode)) { return MATCH_PRIVATE; } return MATCH_NONE; } if (isBlacklistUnknownNumberEnabled(context, mode)) { CallerInfo ci = CallerInfo.getCallerInfo(context, number); if (!ci.contactExists) { return MATCH_UNKNOWN; } } Uri.Builder builder = Blacklist.CONTENT_FILTER_BYNUMBER_URI.buildUpon(); builder.appendPath(number); if (isBlacklistRegexEnabled(context)) { builder.appendQueryParameter(Blacklist.REGEX_KEY, "1"); } int result = MATCH_NONE; Cursor c = context.getContentResolver().query(builder.build(), new String[] { Blacklist.IS_REGEX, type }, null, null, null); if (c != null) { if (DEBUG) Log.d(TAG, "Blacklist query successful, " + c.getCount() + " matches"); int regexColumnIndex = c.getColumnIndexOrThrow(Blacklist.IS_REGEX); int modeColumnIndex = c.getColumnIndexOrThrow(type); boolean whitelisted = false; c.moveToPosition(-1); while (c.moveToNext()) { boolean isRegex = c.getInt(regexColumnIndex) != 0; boolean blocked = c.getInt(modeColumnIndex) != 0; if (!isRegex) { whitelisted = !blocked; result = MATCH_LIST; if (blocked) { break; } } else if (blocked) { result = MATCH_REGEX; } } if (whitelisted) { result = MATCH_NONE; } c.close(); } return result; } public static boolean isBlacklistEnabled(Context context) { return Settings.System.getInt(context, Settings.System.PHONE_BLACKLIST_ENABLED, 1) != 0; } public static boolean isBlacklistNotifyEnabled(Context context) { return Settings.System.getInt(context, Settings.System.PHONE_BLACKLIST_NOTIFY_ENABLED, 1) != 0; } public static boolean isBlacklistPrivateNumberEnabled(Context context, int mode) { return (Settings.System.getInt(context, Settings.System.PHONE_BLACKLIST_PRIVATE_NUMBER_MODE, 0) & mode) != 0; } public static boolean isBlacklistUnknownNumberEnabled(Context context, int mode) { return (Settings.System.getInt(context, Settings.System.PHONE_BLACKLIST_UNKNOWN_NUMBER_MODE, 0) & mode) != 0; } public static boolean isBlacklistRegexEnabled(Context context) { return Settings.System.getInt(context, Settings.System.PHONE_BLACKLIST_REGEX_ENABLED, 0) != 0; } }