diff options
4 files changed, 111 insertions, 13 deletions
diff --git a/res/values/strings.xml b/res/values/strings.xml index b5703c6bf..f74d2ea0f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -883,12 +883,6 @@ <!-- Heading for the block list in the "Spam and blocked cal)ls" settings. [CHAR LIMIT=64] --> <string name="blockList">Block list</string> - <!-- Label for progress dialog when validating a number to be added to the block list. - [CHAR LIMIT=64] --> - <string name="checkingNumber">Checking - <xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g> - </string> - <!-- Error message shown when user tries to add invalid number to the block list. [CHAR LIMIT=64] --> <string name="invalidNumber"><xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g> @@ -899,6 +893,19 @@ <string name="alreadyBlocked"><xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g> is already blocked.</string> + <!-- Title of notification telling the user that call blocking has been temporarily disabled. + [CHAR LIMIT=56] --> + <string name="call_blocking_disabled_notification_title"> + Call blocking disabled for 48 hours + </string> + + <!-- Text for notification which provides the reason that call blocking has been temporarily + disabled. Namely, we disable call blocking after an emergency call in case of return + phone calls made by emergency services. [CHAR LIMIT=64] --> + <string name="call_blocking_disabled_notification_text"> + Disabled because an emergency call was made. + </string> + <!-- Label for the phone account settings [CHAR LIMIT=30] --> <string name="phone_account_settings_label">Calling accounts</string> diff --git a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java index 25613a6f8..e875f12e5 100644 --- a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java +++ b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java @@ -78,6 +78,14 @@ public class FilteredNumberAsyncQueryHandler extends AsyncQueryHandler { public void onUnblockComplete(int rows, ContentValues values); } + public interface OnHasBlockedNumbersListener { + /** + * @param hasBlockedNumbers {@code true} if any blocked numbers are stored. + * {@code false} otherwise. + */ + public void onHasBlockedNumbers(boolean hasBlockedNumbers); + } + @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { if (cookie != null) { @@ -120,6 +128,21 @@ public class FilteredNumberAsyncQueryHandler extends AsyncQueryHandler { null, null, null); } + public final void hasBlockedNumbersAsync(final OnHasBlockedNumbersListener listener) { + startQuery(NO_TOKEN, + new Listener() { + @Override + protected void onQueryComplete(int token, Object cookie, Cursor cursor) { + listener.onHasBlockedNumbers(cursor.getCount() > 0); + } + }, + getContentUri(null), + new String[]{ FilteredNumberColumns._ID }, + FilteredNumberColumns.TYPE + "=" + FilteredNumberTypes.BLOCKED_NUMBER, + null, + null); + } + /** * Check if the number + country iso given has been blocked. * This method normalizes the number for the lookup if normalizedNumber is null. diff --git a/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java b/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java index 8473e324a..4b4af4d2a 100644 --- a/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java +++ b/src/com/android/dialer/filterednumber/FilterNumberDialogFragment.java @@ -21,6 +21,7 @@ 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.content.res.Resources; import android.net.Uri; @@ -187,6 +188,7 @@ public class FilterNumberDialogFragment extends DialogFragment { final String undoMessage = getUnblockedMessage(); final Callback callback = mCallback; final int actionTextColor = getActionTextColor(); + final Context context = getContext(); final OnUnblockNumberListener onUndoListener = new OnUnblockNumberListener() { @Override @@ -217,6 +219,10 @@ public class FilterNumberDialogFragment extends DialogFragment { if (callback != null) { callback.onChangeFilteredNumberSuccess(); } + + if (context != null && FilteredNumbersUtil.hasRecentEmergencyCall(context)) { + FilteredNumbersUtil.maybeNotifyCallBlockingDisabled(context); + } } }; diff --git a/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java b/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java index 45fa6b73d..ce7cf8edf 100644 --- a/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java +++ b/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java @@ -15,8 +15,12 @@ */ package com.android.dialer.filterednumber; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.content.ContentValues; import android.content.Context; +import android.content.Intent; import android.database.Cursor; import android.os.AsyncTask; import android.preference.PreferenceManager; @@ -35,6 +39,7 @@ import java.util.List; import com.android.contacts.common.testing.NeededForTesting; import com.android.dialer.R; import com.android.dialer.database.FilteredNumberAsyncQueryHandler; +import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener; import com.android.dialer.database.FilteredNumberContract.FilteredNumber; import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns; @@ -43,13 +48,21 @@ import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns; */ public class FilteredNumbersUtil { - private static final String HIDE_BLOCKED_CALLS_PREF_KEY = "hide_blocked_calls"; - // Pref key for storing the time, in milliseconds after epoch, of end of the last emergency call. - private static final String LAST_EMERGENCY_CALL_PREF_KEY = "last_emergency_call"; - // Disable incoming call blocking if there was a call within the past 2 days. private static final long RECENT_EMERGENCY_CALL_THRESHOLD_MS = 1000 * 60 * 60 * 24 * 2; + private static final String HIDE_BLOCKED_CALLS_PREF_KEY = "hide_blocked_calls"; + // 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. + private static final String NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY = + "notified_call_blocking_disabled_by_emergency_call"; + + public static final String CALL_BLOCKING_NOTIFICATION_TAG = "call_blocking"; + public static final int CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID = 10; + /** * Used for testing to specify that a custom threshold should be used instead of the default. * This custom threshold will only be used when setting this log tag to VERBOSE: @@ -256,7 +269,7 @@ public class FilteredNumbersUtil { return false; } return PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(FilteredNumbersUtil.HIDE_BLOCKED_CALLS_PREF_KEY, false); + .getBoolean(HIDE_BLOCKED_CALLS_PREF_KEY, false); } public static void setShouldHideBlockedCalls(Context context, boolean shouldHide) { @@ -275,7 +288,7 @@ public class FilteredNumbersUtil { } Long lastEmergencyCallTime = PreferenceManager.getDefaultSharedPreferences(context) - .getLong(LAST_EMERGENCY_CALL_PREF_KEY, 0); + .getLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, 0); if (lastEmergencyCallTime == 0) { return false; } @@ -288,10 +301,59 @@ public class FilteredNumbersUtil { if (context == null) { return; } + PreferenceManager.getDefaultSharedPreferences(context) .edit() - .putLong(LAST_EMERGENCY_CALL_PREF_KEY, System.currentTimeMillis()) + .putLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, System.currentTimeMillis()) + .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false) .apply(); + + maybeNotifyCallBlockingDisabled(context); + } + + public static void maybeNotifyCallBlockingDisabled(final Context context) { + // Skip if the user has already received a notification for the most recent emergency call. + if (PreferenceManager.getDefaultSharedPreferences(context) + .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.getContentResolver()); + queryHandler.hasBlockedNumbersAsync(new OnHasBlockedNumbersListener() { + @Override + public void onHasBlockedNumbers(boolean hasBlockedNumbers) { + if (context == null || !hasBlockedNumbers) { + return; + } + + NotificationManager notificationManager = (NotificationManager) + context.getSystemService(Context.NOTIFICATION_SERVICE); + Notification.Builder builder = new Notification.Builder(context) + .setSmallIcon(R.drawable.ic_block_24dp) + .setContentTitle(context.getString( + R.string.call_blocking_disabled_notification_title)) + .setContentText(context.getString( + R.string.call_blocking_disabled_notification_text)); + + final Intent contentIntent = + new Intent(context, ManageBlockedNumbersActivity.class); + builder.setContentIntent(PendingIntent.getActivity( + context, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT)); + + notificationManager.notify( + 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. + PreferenceManager.getDefaultSharedPreferences(context) + .edit() + .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, true) + .apply(); + } + }); } public static boolean canBlockNumber(Context context, String number) { |