From 86135a2f4d9b6dc5facf5e33e554c23a31824c41 Mon Sep 17 00:00:00 2001 From: linyuh Date: Mon, 12 Feb 2018 09:58:34 -0800 Subject: Add bottom sheet options for blocked and/or spam numbers in the new call log. Bug: 70989605 Test: ModulesTest PiperOrigin-RevId: 185392711 Change-Id: I709a1e307925f1c99d2740ed52dc2b7784bca986 --- .../android/dialer/calllog/ui/menu/Modules.java | 39 ++++-- .../dialer/contactactions/IntentModule.java | 2 +- .../dialer/contactactions/SharedModules.java | 156 +++++++++++++++++++-- .../res/drawable-xxxhdpi/ic_unblock.png | Bin 0 -> 1034 bytes .../dialer/contactactions/res/values/strings.xml | 22 ++- .../android/dialer/theme/res/values/strings.xml | 3 - .../dialer/voicemail/listui/menu/Modules.java | 15 +- 7 files changed, 206 insertions(+), 31 deletions(-) create mode 100644 java/com/android/dialer/contactactions/res/drawable-xxxhdpi/ic_unblock.png (limited to 'java/com/android/dialer') diff --git a/java/com/android/dialer/calllog/ui/menu/Modules.java b/java/com/android/dialer/calllog/ui/menu/Modules.java index d59155810..c85a9fddd 100644 --- a/java/com/android/dialer/calllog/ui/menu/Modules.java +++ b/java/com/android/dialer/calllog/ui/menu/Modules.java @@ -52,15 +52,8 @@ final class Modules { if (canPlaceCalls) { addModuleForVideoOrAudioCall(context, modules, row, normalizedNumber); - - SharedModules.maybeAddModuleForAddingToContacts( - context, - modules, - row.number(), - row.numberAttributes().getName(), - row.numberAttributes().getLookupUri()); - - SharedModules.maybeAddModuleForSendingTextMessage(context, modules, normalizedNumber); + SharedModules.maybeAddModuleForSendingTextMessage( + context, modules, normalizedNumber, row.numberAttributes().getIsBlocked()); } if (!modules.isEmpty()) { @@ -68,10 +61,23 @@ final class Modules { } - // TODO(zachh): Module for blocking/unblocking spam. // TODO(zachh): Module for CallComposer. if (canPlaceCalls) { + SharedModules.maybeAddModuleForAddingToContacts( + context, + modules, + row.number(), + row.numberAttributes().getName(), + row.numberAttributes().getLookupUri(), + row.numberAttributes().getIsBlocked(), + row.numberAttributes().getIsSpam()); + SharedModules.addModulesHandlingBlockedOrSpamNumber( + context, + modules, + normalizedNumber, + row.numberAttributes().getIsBlocked(), + row.numberAttributes().getIsSpam()); SharedModules.maybeAddModuleForCopyingNumber(context, modules, normalizedNumber); } @@ -89,10 +95,23 @@ final class Modules { List modules, CoalescedRow row, String normalizedNumber) { + // If a number is blocked, skip this menu item. + if (row.numberAttributes().getIsBlocked()) { + return; + } + PhoneAccountHandle phoneAccountHandle = TelecomUtil.composePhoneAccountHandle( row.phoneAccountComponentName(), row.phoneAccountId()); + // For a spam number, only audio calls are allowed. + if (row.numberAttributes().getIsSpam()) { + modules.add( + IntentModule.newCallModule( + context, normalizedNumber, phoneAccountHandle, CallInitiationType.Type.CALL_LOG)); + return; + } + if ((row.features() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO) { // Add an audio call item for video calls. Clicking the top entry on the bottom sheet will // trigger a video call. diff --git a/java/com/android/dialer/contactactions/IntentModule.java b/java/com/android/dialer/contactactions/IntentModule.java index aa7fd25a6..9a345c669 100644 --- a/java/com/android/dialer/contactactions/IntentModule.java +++ b/java/com/android/dialer/contactactions/IntentModule.java @@ -72,7 +72,7 @@ public class IntentModule implements ContactActionModule { context, new CallIntentBuilder(number, initiationType) .setPhoneAccountHandle(phoneAccountHandle)), - R.string.call, + R.string.voice_call, R.drawable.quantum_ic_call_white_24); } diff --git a/java/com/android/dialer/contactactions/SharedModules.java b/java/com/android/dialer/contactactions/SharedModules.java index 7e72863aa..6d97fcb61 100644 --- a/java/com/android/dialer/contactactions/SharedModules.java +++ b/java/com/android/dialer/contactactions/SharedModules.java @@ -20,14 +20,15 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.provider.ContactsContract; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; +import android.widget.Toast; import com.android.dialer.DialerPhoneNumber; import com.android.dialer.clipboard.ClipboardUtils; import com.android.dialer.util.IntentUtil; import com.android.dialer.util.UriUtils; import java.util.List; +import java.util.Locale; /** * Modules for the bottom sheet that are shared between NewVoicemailFragment and NewCallLogFragment @@ -37,10 +38,15 @@ public class SharedModules { public static void maybeAddModuleForAddingToContacts( Context context, List modules, - @NonNull DialerPhoneNumber number, - @Nullable String name, - @Nullable String lookupUri) { - // TODO(zachh): Only show this for non-spam/blocked numbers. + DialerPhoneNumber number, + String name, + String lookupUri, + boolean isBlocked, + boolean isSpam) { + // Skip showing the menu item for a spam/blocked number. + if (isBlocked || isSpam) { + return; + } // Skip showing the menu item for existing contacts. if (isExistingContact(lookupUri)) { @@ -83,22 +89,148 @@ public class SharedModules { } public static void maybeAddModuleForSendingTextMessage( - Context context, List modules, String originalNumber) { + Context context, + List modules, + String normalizedNumber, + boolean isBlocked) { + // Don't show the option to send a text message if the number is blocked. + if (isBlocked) { + return; + } + // TODO(zachh): There are some conditions where this module should not be shown; consider - // voicemail, business numbers, blocked numbers, spam numbers, etc. - if (!TextUtils.isEmpty(originalNumber)) { + // voicemail, business numbers, etc. + + if (!TextUtils.isEmpty(normalizedNumber)) { modules.add( new IntentModule( context, - IntentUtil.getSendSmsIntent(originalNumber), + IntentUtil.getSendSmsIntent(normalizedNumber), R.string.send_a_message, R.drawable.quantum_ic_message_vd_theme_24)); } } + public static void addModulesHandlingBlockedOrSpamNumber( + Context context, + List modules, + String normalizedNumber, + boolean isBlocked, + boolean isSpam) { + // For a spam number, add two options: + // (1) "Not spam" and "Block", or + // (2) "Not spam" and "Unblock". + if (isSpam) { + addModuleForMarkingNumberAsNonSpam(context, modules, normalizedNumber); + addModuleForBlockingOrUnblockingNumber(context, modules, normalizedNumber, isBlocked); + return; + } + + // For a blocked non-spam number, add "Unblock" option. + if (isBlocked) { + addModuleForBlockingOrUnblockingNumber(context, modules, normalizedNumber, isBlocked); + return; + } + + // For a number that is neither a spam number nor blocked, add "Block/Report spam" option. + addModuleForBlockingNumberAndOptionallyReportingSpam(context, modules, normalizedNumber); + } + + private static void addModuleForMarkingNumberAsNonSpam( + Context context, List modules, String normalizedNumber) { + modules.add( + new ContactActionModule() { + @Override + public int getStringId() { + return R.string.not_spam; + } + + @Override + public int getDrawableId() { + return R.drawable.quantum_ic_report_off_vd_theme_24; + } + + @Override + public boolean onClick() { + // TODO(a bug): implement this method. + Toast.makeText( + context, + String.format(Locale.ENGLISH, "TODO: Report %s as non-spam", normalizedNumber), + Toast.LENGTH_SHORT) + .show(); + return true; // Close the bottom sheet. + } + }); + } + + private static void addModuleForBlockingOrUnblockingNumber( + Context context, + List modules, + String normalizedNumber, + boolean isBlocked) { + modules.add( + new ContactActionModule() { + @Override + public int getStringId() { + return isBlocked ? R.string.unblock_number : R.string.block_number; + } + + @Override + public int getDrawableId() { + return isBlocked + ? R.drawable.ic_unblock // TODO(a bug): use a vector icon + : R.drawable.quantum_ic_block_vd_theme_24; + } + + @Override + public boolean onClick() { + // TODO(a bug): implement this method. + Toast.makeText( + context, + String.format( + Locale.ENGLISH, + "TODO: " + (isBlocked ? "Unblock " : "Block ") + " number %s.", + normalizedNumber), + Toast.LENGTH_SHORT) + .show(); + return true; // Close the bottom sheet. + } + }); + } + + private static void addModuleForBlockingNumberAndOptionallyReportingSpam( + Context context, List modules, String normalizedNumber) { + modules.add( + new ContactActionModule() { + @Override + public int getStringId() { + return R.string.block_and_optionally_report_spam; + } + + @Override + public int getDrawableId() { + return R.drawable.quantum_ic_block_vd_theme_24; + } + + @Override + public boolean onClick() { + // TODO(a bug): implement this method. + Toast.makeText( + context, + String.format( + Locale.ENGLISH, + "TODO: Block and optionally report as spam %s.", + normalizedNumber), + Toast.LENGTH_SHORT) + .show(); + return true; // Close the bottom sheet. + } + }); + } + public static void maybeAddModuleForCopyingNumber( - Context context, List modules, String originalNumber) { - if (TextUtils.isEmpty(originalNumber)) { + Context context, List modules, String normalizedNumber) { + if (TextUtils.isEmpty(normalizedNumber)) { return; } modules.add( @@ -115,7 +247,7 @@ public class SharedModules { @Override public boolean onClick() { - ClipboardUtils.copyText(context, null, originalNumber, true); + ClipboardUtils.copyText(context, null, normalizedNumber, true); return false; } }); diff --git a/java/com/android/dialer/contactactions/res/drawable-xxxhdpi/ic_unblock.png b/java/com/android/dialer/contactactions/res/drawable-xxxhdpi/ic_unblock.png new file mode 100644 index 000000000..01551e2fc Binary files /dev/null and b/java/com/android/dialer/contactactions/res/drawable-xxxhdpi/ic_unblock.png differ diff --git a/java/com/android/dialer/contactactions/res/values/strings.xml b/java/com/android/dialer/contactactions/res/values/strings.xml index 0e953a56d..4d598a930 100644 --- a/java/com/android/dialer/contactactions/res/values/strings.xml +++ b/java/com/android/dialer/contactactions/res/values/strings.xml @@ -16,13 +16,31 @@ --> + + Voice call + + + Video call + - Add to contacts + Add contact - Send a message + Message + + + Not spam + + + Block + + + Unblock + + + Block/Report spam Copy number diff --git a/java/com/android/dialer/theme/res/values/strings.xml b/java/com/android/dialer/theme/res/values/strings.xml index 74cabadf7..a14693f51 100644 --- a/java/com/android/dialer/theme/res/values/strings.xml +++ b/java/com/android/dialer/theme/res/values/strings.xml @@ -30,9 +30,6 @@ used in the Launcher icon. --> Phone - - Video call - Call diff --git a/java/com/android/dialer/voicemail/listui/menu/Modules.java b/java/com/android/dialer/voicemail/listui/menu/Modules.java index 665031a1f..7254ad651 100644 --- a/java/com/android/dialer/voicemail/listui/menu/Modules.java +++ b/java/com/android/dialer/voicemail/listui/menu/Modules.java @@ -41,16 +41,25 @@ final class Modules { modules, voicemailEntry.number(), voicemailEntry.numberAttributes().getName(), - voicemailEntry.numberAttributes().getLookupUri()); + voicemailEntry.numberAttributes().getLookupUri(), + voicemailEntry.numberAttributes().getIsBlocked(), + voicemailEntry.numberAttributes().getIsSpam()); String normalizedNumber = voicemailEntry.number().getNormalizedNumber(); - SharedModules.maybeAddModuleForSendingTextMessage(context, modules, normalizedNumber); + SharedModules.maybeAddModuleForSendingTextMessage( + context, modules, normalizedNumber, voicemailEntry.numberAttributes().getIsBlocked()); if (!modules.isEmpty()) { modules.add(new DividerModule()); } - // TODO(zachh): Module for blocking/unblocking spam. + SharedModules.addModulesHandlingBlockedOrSpamNumber( + context, + modules, + normalizedNumber, + voicemailEntry.numberAttributes().getIsBlocked(), + voicemailEntry.numberAttributes().getIsSpam()); + // TODO(zachh): Module for CallComposer. SharedModules.maybeAddModuleForCopyingNumber(context, modules, normalizedNumber); -- cgit v1.2.3