Add spam blocking promotion after showing spam dialog in after-call
notification

Test: N/A
PiperOrigin-RevId: 193290689
Change-Id: Idff99e2f67d5161d09b7ea3c0818ed92d2286b61
diff --git a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
index d52ac32..5517918 100644
--- a/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
+++ b/java/com/android/dialer/app/calllog/BlockReportSpamListener.java
@@ -97,7 +97,7 @@
                   countryIso);
 
               if (isSpamChecked) {
-                spamBlockingPromoHelper.showSpamBlockingPromoDialog(rootView, fragmentManager);
+                showSpamBlockingPromoDialog();
               }
             },
             null)
@@ -136,8 +136,7 @@
                   },
                   number,
                   countryIso);
-
-              spamBlockingPromoHelper.showSpamBlockingPromoDialog(rootView, fragmentManager);
+              showSpamBlockingPromoDialog();
             },
             null)
         .show(fragmentManager, BlockReportSpamDialogs.BLOCK_DIALOG_TAG);
@@ -205,4 +204,13 @@
             null)
         .show(fragmentManager, BlockReportSpamDialogs.NOT_SPAM_DIALOG_TAG);
   }
+
+  private void showSpamBlockingPromoDialog() {
+    if (spamBlockingPromoHelper.shouldShowSpamBlockingPromo()) {
+      spamBlockingPromoHelper.showSpamBlockingPromoDialog(
+          fragmentManager,
+          success -> spamBlockingPromoHelper.showModifySettingOnCompleteSnackbar(rootView, success),
+          null /* onDissmissListener */);
+    }
+  }
 }
diff --git a/java/com/android/dialer/spam/promo/SpamBlockingPromoDialogFragment.java b/java/com/android/dialer/spam/promo/SpamBlockingPromoDialogFragment.java
index 0ea17d3..ea54728 100644
--- a/java/com/android/dialer/spam/promo/SpamBlockingPromoDialogFragment.java
+++ b/java/com/android/dialer/spam/promo/SpamBlockingPromoDialogFragment.java
@@ -19,7 +19,9 @@
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.DialogFragment;
+import android.content.DialogInterface;
 import android.os.Bundle;
+import android.support.annotation.Nullable;
 
 /** Dialog for spam blocking on-boarding promotion. */
 public class SpamBlockingPromoDialogFragment extends DialogFragment {
@@ -29,16 +31,32 @@
   /** Called when dialog positive button is pressed. */
   protected OnEnableListener positiveListener;
 
-  public static DialogFragment newInstance(OnEnableListener positiveListener) {
+  /** Called when the dialog is dismissed. */
+  @Nullable protected DialogInterface.OnDismissListener dismissListener;
+
+  public static DialogFragment newInstance(
+      OnEnableListener positiveListener,
+      @Nullable DialogInterface.OnDismissListener dismissListener) {
     SpamBlockingPromoDialogFragment fragment = new SpamBlockingPromoDialogFragment();
     fragment.positiveListener = positiveListener;
+    fragment.dismissListener = dismissListener;
     return fragment;
   }
 
   @Override
+  public void onDismiss(DialogInterface dialog) {
+    if (dismissListener != null) {
+      dismissListener.onDismiss(dialog);
+    }
+    super.onDismiss(dialog);
+  }
+
+  @Override
   public void onPause() {
     // The dialog is dismissed onPause, i.e. rotation.
     dismiss();
+    dismissListener = null;
+    positiveListener = null;
     super.onPause();
   }
 
diff --git a/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java b/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java
index 56143ce..b5bdd74 100644
--- a/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java
+++ b/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java
@@ -18,14 +18,16 @@
 
 import android.app.FragmentManager;
 import android.content.Context;
+import android.content.DialogInterface.OnDismissListener;
 import android.preference.PreferenceManager;
-import android.support.annotation.VisibleForTesting;
 import android.support.design.widget.Snackbar;
 import android.view.View;
+import android.widget.Toast;
 import com.android.dialer.configprovider.ConfigProviderBindings;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.spam.SpamSettings;
+import com.android.dialer.spam.SpamSettings.ModifySettingListener;
 
 /** Helper class for showing spam blocking on-boarding promotions. */
 public class SpamBlockingPromoHelper {
@@ -42,25 +44,6 @@
     this.spamSettings = spamSettings;
   }
 
-  /** Shows a spam blocking promo dialog with on complete snackbar if all the prerequisites meet. */
-  public void showSpamBlockingPromoDialog(View view, FragmentManager fragmentManager) {
-    if (!shouldShowSpamBlockingPromo()) {
-      return;
-    }
-
-    updateLastShowSpamTimestamp();
-    Logger.get(context).logImpression(DialerImpression.Type.SPAM_BLOCKING_CALL_LOG_PROMO_SHOWN);
-    SpamBlockingPromoDialogFragment.newInstance(
-            () -> {
-              Logger.get(context)
-                  .logImpression(
-                      DialerImpression.Type.SPAM_BLOCKING_ENABLED_THROUGH_CALL_LOG_PROMO);
-              spamSettings.modifySpamBlockingSetting(
-                  true, success -> showModifySettingOnCompleteSnackbar(view, success));
-            })
-        .show(fragmentManager, SpamBlockingPromoDialogFragment.SPAM_BLOCKING_PROMO_DIALOG_TAG);
-  }
-
   /**
    * Returns true if we should show a spam blocking promo.
    *
@@ -70,8 +53,7 @@
    *
    * @return true if we should show a spam blocking promo.
    */
-  @VisibleForTesting
-  boolean shouldShowSpamBlockingPromo() {
+  public boolean shouldShowSpamBlockingPromo() {
     if (!ConfigProviderBindings.get(context).getBoolean(ENABLE_SPAM_BLOCKING_PROMO, false)
         || !spamSettings.isSpamEnabled()
         || !spamSettings.isSpamBlockingEnabledByFlag()
@@ -88,6 +70,40 @@
     return lastShowMillis == 0 || System.currentTimeMillis() - lastShowMillis > showPeriodMillis;
   }
 
+  /**
+   * Shows a spam blocking promo dialog.
+   *
+   * @param fragmentManager the fragment manager to show the dialog.
+   * @param modifySettingListener the listener called after spam blocking setting is modified.
+   * @param onDismissListener the listener called when the dialog is dismissed.
+   */
+  public void showSpamBlockingPromoDialog(
+      FragmentManager fragmentManager,
+      ModifySettingListener modifySettingListener,
+      OnDismissListener onDismissListener) {
+    updateLastShowSpamTimestamp();
+    Logger.get(context).logImpression(DialerImpression.Type.SPAM_BLOCKING_CALL_LOG_PROMO_SHOWN);
+    SpamBlockingPromoDialogFragment.newInstance(
+            () -> {
+              Logger.get(context)
+                  .logImpression(
+                      DialerImpression.Type.SPAM_BLOCKING_ENABLED_THROUGH_CALL_LOG_PROMO);
+              spamSettings.modifySpamBlockingSetting(
+                  true,
+                  success -> {
+                    if (!success) {
+                      Logger.get(context)
+                          .logImpression(
+                              DialerImpression.Type
+                                  .SPAM_BLOCKING_MODIFY_FAILURE_THROUGH_CALL_LOG_PROMO);
+                    }
+                    modifySettingListener.onComplete(success);
+                  });
+            },
+            onDismissListener)
+        .show(fragmentManager, SpamBlockingPromoDialogFragment.SPAM_BLOCKING_PROMO_DIALOG_TAG);
+  }
+
   private void updateLastShowSpamTimestamp() {
     PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext())
         .edit()
@@ -96,16 +112,12 @@
   }
 
   /**
-   * Shows a modify setting on complete snackbar and a link to redirect to setting page
+   * Shows a modify setting on complete snackbar and a link to redirect to setting page.
    *
-   * @param view the view to attach on-complete notice snackbar
-   * @param success whether the modify setting operation succceeds
+   * @param view the view to attach on-complete notice snackbar.
+   * @param success whether the modify setting operation succceeds.
    */
-  private void showModifySettingOnCompleteSnackbar(View view, boolean success) {
-    if (!success) {
-      Logger.get(context)
-          .logImpression(DialerImpression.Type.SPAM_BLOCKING_MODIFY_FAILURE_THROUGH_CALL_LOG_PROMO);
-    }
+  public void showModifySettingOnCompleteSnackbar(View view, boolean success) {
     String snackBarText =
         success
             ? context.getString(R.string.spam_blocking_settings_enable_complete_text)
@@ -118,4 +130,13 @@
             context.getResources().getColor(R.color.dialer_snackbar_action_text_color))
         .show();
   }
+
+  /** Shows a modify setting on complete toast message. */
+  public void showModifySettingOnCompleteToast(boolean success) {
+    String toastText =
+        success
+            ? context.getString(R.string.spam_blocking_settings_enable_complete_text)
+            : context.getString(R.string.spam_blocking_settings_enable_error_text);
+    Toast.makeText(context, toastText, Toast.LENGTH_LONG).show();
+  }
 }
diff --git a/java/com/android/incallui/spam/SpamNotificationActivity.java b/java/com/android/incallui/spam/SpamNotificationActivity.java
index cb5f8e5..c04a071 100644
--- a/java/com/android/incallui/spam/SpamNotificationActivity.java
+++ b/java/com/android/incallui/spam/SpamNotificationActivity.java
@@ -25,6 +25,7 @@
 import android.os.Bundle;
 import android.provider.CallLog;
 import android.provider.ContactsContract;
+import android.support.annotation.Nullable;
 import android.support.v4.app.FragmentActivity;
 import android.telephony.PhoneNumberUtils;
 import com.android.dialer.blocking.BlockedNumbersMigrator;
@@ -42,6 +43,7 @@
 import com.android.dialer.notification.DialerNotificationManager;
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
 import com.android.dialer.spam.SpamComponent;
+import com.android.dialer.spam.promo.SpamBlockingPromoHelper;
 import com.android.incallui.call.DialerCall;
 
 /** Creates the after call notification dialogs. */
@@ -58,6 +60,12 @@
   static final String ACTION_MARK_NUMBER_AS_NOT_SPAM =
       "com.android.incallui.spam.ACTION_MARK_NUMBER_AS_NOT_SPAM";
 
+  static final String ACTION_ENABLE_SPAM_BLOCKING =
+      "com.android.incallui.spam.ACTION_ENABLE_SPAM_BLOCKING";
+
+  static final String ACTION_SHOW_SPAM_BLOCKING_PROMO_DIALOG =
+      "com.android.incallui.spam.ACTION_SHOW_SPAM_BLOCKING_PROMO_DIALOG";
+
   private static final String TAG = "SpamNotifications";
   private static final String EXTRA_NOTIFICATION_TAG = "notification_tag";
   private static final String EXTRA_NOTIFICATION_ID = "notification_id";
@@ -85,7 +93,11 @@
    * @return Intent intent that starts this activity.
    */
   public static Intent createActivityIntent(
-      Context context, DialerCall call, String action, String notificationTag, int notificationId) {
+      Context context,
+      @Nullable DialerCall call,
+      String action,
+      String notificationTag,
+      int notificationId) {
     Intent intent = new Intent(context, SpamNotificationActivity.class);
     intent.setAction(action);
     // This ensures only one activity of this kind exists at a time.
@@ -93,7 +105,10 @@
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     intent.putExtra(EXTRA_NOTIFICATION_TAG, notificationTag);
     intent.putExtra(EXTRA_NOTIFICATION_ID, notificationId);
-    intent.putExtra(EXTRA_CALL_INFO, newCallInfoBundle(call));
+
+    if (call != null) {
+      intent.putExtra(EXTRA_CALL_INFO, newCallInfoBundle(call));
+    }
     return intent;
   }
 
@@ -179,6 +194,9 @@
           showNonSpamDialog();
         }
         break;
+      case ACTION_SHOW_SPAM_BLOCKING_PROMO_DIALOG:
+        showSpamBlockingPromoDialog();
+        break;
       default: // fall out
     }
   }
@@ -230,8 +248,7 @@
                       new BlockReportSpamDialogs.OnSpamDialogClickListener() {
                         @Override
                         public void onClick(boolean isSpamChecked) {
-                          blockReportNumberAndFinish(
-                              number, isSpamChecked, contactLookupResultType);
+                          blockReportNumber(number, isSpamChecked, contactLookupResultType);
                         }
                       },
                       dismissListener)
@@ -239,7 +256,7 @@
             }
           });
     } else {
-      blockReportNumberAndFinish(number, true, contactLookupResultType);
+      blockReportNumber(number, true, contactLookupResultType);
     }
   }
 
@@ -271,7 +288,7 @@
   }
 
   /** Block and report the number as spam. */
-  private void blockReportNumberAndFinish(
+  private void blockReportNumber(
       String number, boolean reportAsSpam, ContactLookupResult.Type contactLookupResultType) {
     if (reportAsSpam) {
       logCallImpression(DialerImpression.Type.SPAM_AFTER_CALL_NOTIFICATION_MARKED_NUMBER_AS_SPAM);
@@ -287,8 +304,6 @@
 
     logCallImpression(DialerImpression.Type.SPAM_AFTER_CALL_NOTIFICATION_BLOCK_NUMBER);
     filteredNumberAsyncQueryHandler.blockNumber(null, number, getCountryIso());
-    // TODO: DialerCall finish() after block/reporting async tasks complete (a bug)
-    finish();
   }
 
   /** Report the number as not spam. */
@@ -326,7 +341,9 @@
   }
 
   private Bundle getCallInfo() {
-    return getIntent().getBundleExtra(EXTRA_CALL_INFO);
+    return getIntent().hasExtra(EXTRA_CALL_INFO)
+        ? getIntent().getBundleExtra(EXTRA_CALL_INFO)
+        : new Bundle();
   }
 
   /** Dialog that displays "Not spam", "Block/report spam" and "Dismiss". */
@@ -400,6 +417,7 @@
                   dismiss();
                   spamNotificationActivity.maybeShowBlockReportSpamDialog(
                       number, contactLookupResultType);
+                  spamNotificationActivity.showSpamBlockingPromoDialog();
                 }
               })
           .setNegativeButton(
@@ -502,4 +520,18 @@
           .create();
     }
   }
+
+  private void showSpamBlockingPromoDialog() {
+    SpamBlockingPromoHelper spamBlockingPromoHelper =
+        new SpamBlockingPromoHelper(
+            getApplicationContext(), SpamComponent.get(this).spamSettings());
+    if (!spamBlockingPromoHelper.shouldShowSpamBlockingPromo()) {
+      finish();
+    } else {
+      spamBlockingPromoHelper.showSpamBlockingPromoDialog(
+          getFragmentManager(),
+          success -> spamBlockingPromoHelper.showModifySettingOnCompleteToast(success),
+          dialog -> finish());
+    }
+  }
 }