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 +++++++++++++++++++++ 3 files changed, 161 insertions(+), 2 deletions(-) (limited to 'java/com/android/dialer/blockreportspam') 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(); + } + } } -- cgit v1.2.3