From 20824a011cd8792568e922bbc374a1a51ea25e41 Mon Sep 17 00:00:00 2001 From: linyuh Date: Thu, 8 Mar 2018 11:05:37 -0800 Subject: Implement logic for unblocking a number from the new call log's bottom sheet. Bug: 70989547 Test: ShowBlockReportSpamDialogNotifierEndToEndTest PiperOrigin-RevId: 188357953 Change-Id: Ie1b1f439f043805892876790d7590a4c721dbf8c --- .../blockreportspam/BlockReportSpamDialogs.java | 41 +++++++- .../ShowBlockReportSpamDialogNotifier.java | 13 +++ .../ShowBlockReportSpamDialogReceiver.java | 109 +++++++++++++++++++++ .../dialer/historyitemactions/SharedModules.java | 17 +--- 4 files changed, 165 insertions(+), 15 deletions(-) (limited to 'java/com/android') diff --git a/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java b/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java index 2ec5dbd29..db5fe2134 100644 --- a/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java +++ b/java/com/android/dialer/blockreportspam/BlockReportSpamDialogs.java @@ -264,8 +264,8 @@ public final class BlockReportSpamDialogs { /** * Dialog for unblocking a number and marking it as not spam. * - *

This dialog is used in the old call log, where unblocking a number will also marking it as - * not spam. + *

This dialog is used in the old call log, where unblocking a number will also mark it as not + * spam. */ public static class DialogFragmentForUnblockingNumberAndReportingAsNotSpam extends CommonDialogsFragment { @@ -310,6 +310,43 @@ public final class BlockReportSpamDialogs { } } + /** + * Dialog for unblocking a number. + * + *

This dialog is used in the new call log, where unblocking a number will *not* mark it as not + * spam. + */ + public static class DialogFragmentForUnblockingNumber extends CommonDialogsFragment { + + public static DialogFragment newInstance( + String displayNumber, + OnConfirmListener positiveListener, + @Nullable DialogInterface.OnDismissListener dismissListener) { + DialogFragmentForUnblockingNumberAndReportingAsNotSpam fragment = + new DialogFragmentForUnblockingNumberAndReportingAsNotSpam(); + fragment.displayNumber = displayNumber; + fragment.positiveListener = positiveListener; + fragment.dismissListener = dismissListener; + return fragment; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + super.onCreateDialog(savedInstanceState); + // Return the newly created dialog + AlertDialog.Builder alertDialogBuilder = createDialogBuilder(getActivity(), this); + alertDialogBuilder.setMessage( + getString(R.string.unblock_report_number_alert_title, displayNumber)); + Dialog dialog = + alertDialogBuilder + .setPositiveButton( + R.string.unblock_number_ok, createGenericOnClickListener(this, positiveListener)) + .create(); + dialog.setCanceledOnTouchOutside(true); + return dialog; + } + } + /** Dialog for reporting a number as not spam. */ public static class DialogFragmentForReportingNotSpam extends CommonDialogsFragment { diff --git a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java index 2fccdd115..b33dc0f14 100644 --- a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java +++ b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogNotifier.java @@ -72,4 +72,17 @@ public final class ShowBlockReportSpamDialogNotifier { LocalBroadcastManager.getInstance(context).sendBroadcast(intent); } + + /** Notifies that a dialog for unblocking a number should be shown. */ + public static void notifyShowDialogToUnblockNumber( + Context context, BlockReportSpamDialogInfo blockReportSpamDialogInfo) { + LogUtil.enterBlock("ShowBlockReportSpamDialogNotifier.notifyShowDialogToUnblockNumber"); + + Intent intent = new Intent(); + intent.setAction(ShowBlockReportSpamDialogReceiver.ACTION_SHOW_DIALOG_TO_UNBLOCK_NUMBER); + ProtoParsers.put( + intent, ShowBlockReportSpamDialogReceiver.EXTRA_DIALOG_INFO, blockReportSpamDialogInfo); + + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + } } diff --git a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java index 6b8f81908..02aa9943b 100644 --- a/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java +++ b/java/com/android/dialer/blockreportspam/ShowBlockReportSpamDialogReceiver.java @@ -21,19 +21,24 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.support.annotation.Nullable; import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler; import com.android.dialer.blockreportspam.BlockReportSpamDialogs.DialogFragmentForBlockingNumber; import com.android.dialer.blockreportspam.BlockReportSpamDialogs.DialogFragmentForBlockingNumberAndOptionallyReportingAsSpam; import com.android.dialer.blockreportspam.BlockReportSpamDialogs.DialogFragmentForReportingNotSpam; +import com.android.dialer.blockreportspam.BlockReportSpamDialogs.DialogFragmentForUnblockingNumber; import com.android.dialer.blockreportspam.BlockReportSpamDialogs.OnConfirmListener; import com.android.dialer.blockreportspam.BlockReportSpamDialogs.OnSpamDialogClickListener; 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.DialerExecutorComponent; import com.android.dialer.logging.DialerImpression; import com.android.dialer.logging.Logger; import com.android.dialer.protos.ProtoParsers; import com.android.dialer.spam.Spam; import com.android.dialer.spam.SpamComponent; +import com.google.auto.value.AutoValue; /** * A {@link BroadcastReceiver} that shows an appropriate dialog upon receiving notifications from @@ -45,6 +50,7 @@ public final class ShowBlockReportSpamDialogReceiver extends BroadcastReceiver { static final String ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER_AND_OPTIONALLY_REPORT_SPAM = "show_dialog_to_block_number_and_optionally_report_spam"; static final String ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM = "show_dialog_to_report_not_spam"; + static final String ACTION_SHOW_DIALOG_TO_UNBLOCK_NUMBER = "show_dialog_to_unblock_number"; static final String EXTRA_DIALOG_INFO = "dialog_info"; /** {@link FragmentManager} needed to show a {@link android.app.DialogFragment}. */ @@ -56,6 +62,7 @@ public final class ShowBlockReportSpamDialogReceiver extends BroadcastReceiver { intentFilter.addAction(ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER_AND_OPTIONALLY_REPORT_SPAM); intentFilter.addAction(ACTION_SHOW_DIALOG_TO_BLOCK_NUMBER); intentFilter.addAction(ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM); + intentFilter.addAction(ACTION_SHOW_DIALOG_TO_UNBLOCK_NUMBER); return intentFilter; } @@ -79,6 +86,9 @@ public final class ShowBlockReportSpamDialogReceiver extends BroadcastReceiver { case ACTION_SHOW_DIALOG_TO_REPORT_NOT_SPAM: showDialogToReportNotSpam(context, intent); break; + case ACTION_SHOW_DIALOG_TO_UNBLOCK_NUMBER: + showDialogToUnblockNumber(context, intent); + break; default: throw new IllegalStateException("Unsupported action: " + action); } @@ -197,4 +207,103 @@ public final class ShowBlockReportSpamDialogReceiver extends BroadcastReceiver { dialogInfo.getNormalizedNumber(), onConfirmListener, /* dismissListener = */ null) .show(fragmentManager, BlockReportSpamDialogs.NOT_SPAM_DIALOG_TAG); } + + private void showDialogToUnblockNumber(Context context, Intent intent) { + LogUtil.enterBlock("ShowBlockReportSpamDialogReceiver.showDialogToUnblockNumber"); + + Assert.checkArgument(intent.hasExtra(EXTRA_DIALOG_INFO)); + BlockReportSpamDialogInfo dialogInfo = + ProtoParsers.getTrusted( + intent, EXTRA_DIALOG_INFO, BlockReportSpamDialogInfo.getDefaultInstance()); + + FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler = + new FilteredNumberAsyncQueryHandler(context); + + // Set up the positive listener for the dialog. + OnConfirmListener onConfirmListener = + () -> { + LogUtil.i("ShowBlockReportSpamDialogReceiver.showDialogToUnblockNumber", "confirmed"); + + DialerExecutorComponent.get(context) + .dialerExecutorFactory() + .createNonUiTaskBuilder( + new GetIdForBlockedNumberWorker(filteredNumberAsyncQueryHandler)) + .onSuccess( + idForBlockedNumber -> { + LogUtil.i( + "ShowBlockReportSpamDialogReceiver.showDialogToUnblockNumber", + "ID for the blocked number retrieved"); + if (idForBlockedNumber == null) { + throw new IllegalStateException("ID for a blocked number is null."); + } + + LogUtil.i( + "ShowBlockReportSpamDialogReceiver.showDialogToUnblockNumber", + "unblocking number"); + filteredNumberAsyncQueryHandler.unblock( + (rows, values) -> + Logger.get(context) + .logImpression(DialerImpression.Type.USER_ACTION_UNBLOCKED_NUMBER), + idForBlockedNumber); + }) + .onFailure( + throwable -> { + throw new RuntimeException(throwable); + }) + .build() + .executeSerial( + NumberInfo.newBuilder() + .setNormalizedNumber(dialogInfo.getNormalizedNumber()) + .setCountryIso(dialogInfo.getCountryIso()) + .build()); + }; + + // Create & show the dialog. + DialogFragmentForUnblockingNumber.newInstance( + dialogInfo.getNormalizedNumber(), onConfirmListener, /* dismissListener = */ null) + .show(fragmentManager, BlockReportSpamDialogs.UNBLOCK_DIALOG_TAG); + } + + /** A {@link Worker} that retrieves the ID of a blocked number from the database. */ + private static final class GetIdForBlockedNumberWorker implements Worker { + + private final FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler; + + GetIdForBlockedNumberWorker(FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler) { + this.filteredNumberAsyncQueryHandler = filteredNumberAsyncQueryHandler; + } + + @Nullable + @Override + public Integer doInBackground(NumberInfo input) throws Throwable { + LogUtil.enterBlock("GetIdForBlockedNumberWorker.doInBackground"); + + return filteredNumberAsyncQueryHandler.getBlockedIdSynchronous( + input.getNormalizedNumber(), input.getCountryIso()); + } + } + + /** + * Contains information about a number and serves as the input to {@link + * GetIdForBlockedNumberWorker}. + */ + @AutoValue + abstract static class NumberInfo { + static Builder newBuilder() { + return new AutoValue_ShowBlockReportSpamDialogReceiver_NumberInfo.Builder(); + } + + abstract String getNormalizedNumber(); + + abstract String getCountryIso(); + + @AutoValue.Builder + abstract static class Builder { + abstract Builder setNormalizedNumber(String normalizedNumber); + + abstract Builder setCountryIso(String countryIso); + + abstract NumberInfo build(); + } + } } diff --git a/java/com/android/dialer/historyitemactions/SharedModules.java b/java/com/android/dialer/historyitemactions/SharedModules.java index 1147289db..fa7062653 100644 --- a/java/com/android/dialer/historyitemactions/SharedModules.java +++ b/java/com/android/dialer/historyitemactions/SharedModules.java @@ -22,7 +22,6 @@ import android.net.Uri; import android.provider.ContactsContract; import android.support.annotation.Nullable; import android.text.TextUtils; -import android.widget.Toast; import com.android.dialer.DialerPhoneNumber; import com.android.dialer.blockreportspam.BlockReportSpamDialogInfo; import com.android.dialer.blockreportspam.ShowBlockReportSpamDialogNotifier; @@ -32,7 +31,6 @@ import com.android.dialer.util.UriUtils; import com.google.common.base.Optional; import java.util.ArrayList; import java.util.List; -import java.util.Locale; /** * Modules for the bottom sheet that are shared between NewVoicemailFragment and NewCallLogFragment @@ -187,19 +185,12 @@ public class SharedModules { @Override public boolean onClick() { - if (!isBlocked) { - ShowBlockReportSpamDialogNotifier.notifyShowDialogToBlockNumber( + if (isBlocked) { + ShowBlockReportSpamDialogNotifier.notifyShowDialogToUnblockNumber( context, blockReportSpamDialogInfo); } else { - // TODO(a bug): implement this method. - Toast.makeText( - context, - String.format( - Locale.ENGLISH, - "TODO: Unblock number %s.", - blockReportSpamDialogInfo.getNormalizedNumber()), - Toast.LENGTH_SHORT) - .show(); + ShowBlockReportSpamDialogNotifier.notifyShowDialogToBlockNumber( + context, blockReportSpamDialogInfo); } return true; // Close the bottom sheet. } -- cgit v1.2.3