From 3e97f65b217c4b9e64c33e083b451ba83f239f6a Mon Sep 17 00:00:00 2001 From: Android Dialer Date: Mon, 19 Mar 2018 18:19:04 -0700 Subject: Show spam blocking promo after block spam dialog Test: SpamBlockingPromoHelperTest PiperOrigin-RevId: 189674918 Change-Id: I0b22eb9b8128125cc5b439674099820a01c3889f --- .../dialer/spam/promo/SpamBlockingPromoHelper.java | 117 +++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java (limited to 'java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java') diff --git a/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java b/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java new file mode 100644 index 000000000..9349577c5 --- /dev/null +++ b/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.spam.promo; + +import android.app.FragmentManager; +import android.content.Context; +import android.preference.PreferenceManager; +import android.support.annotation.VisibleForTesting; +import android.support.design.widget.Snackbar; +import android.view.View; +import com.android.dialer.configprovider.ConfigProviderBindings; +import com.android.dialer.logging.DialerImpression; +import com.android.dialer.logging.Logger; +import com.android.dialer.spam.Spam; + +/** Helper class for showing spam blocking on-boarding promotions. */ +public class SpamBlockingPromoHelper { + + static final String SPAM_BLOCKING_PROMO_PERIOD_MILLIS = "spam_blocking_promo_period_millis"; + static final String SPAM_BLOCKING_PROMO_LAST_SHOW_MILLIS = "spam_blocking_promo_last_show_millis"; + + private final Context context; + private final Spam spam; + + public SpamBlockingPromoHelper(Context context, Spam spam) { + this.context = context; + this.spam = spam; + } + + /** 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); + spam.modifySpamBlockingSetting( + true, success -> showModifySettingOnCompleteSnackbar(view, success)); + }) + .show(fragmentManager, SpamBlockingPromoDialogFragment.SPAM_BLOCKING_PROMO_DIALOG_TAG); + } + + /** + * Returns true if we should show a spam blocking promo. + * + *

Should show spam blocking promo only when all of the following criteria meet 1. Spam + * blocking setting is available. 2. Spam blocking setting is not yet enabled. 3. Time since last + * spam blocking promo exceeds the threshold. + * + * @return true if we should show a spam blocking promo. + */ + @VisibleForTesting + boolean shouldShowSpamBlockingPromo() { + if (!spam.isSpamEnabled() || !spam.isSpamBlockingAvailable() || spam.isSpamBlockingEnabled()) { + return false; + } + + long lastShowMillis = + PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()) + .getLong(SPAM_BLOCKING_PROMO_LAST_SHOW_MILLIS, 0); + long showPeriodMillis = + ConfigProviderBindings.get(context) + .getLong(SPAM_BLOCKING_PROMO_PERIOD_MILLIS, Long.MAX_VALUE); + return lastShowMillis == 0 || System.currentTimeMillis() - lastShowMillis > showPeriodMillis; + } + + private void updateLastShowSpamTimestamp() { + PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()) + .edit() + .putLong(SPAM_BLOCKING_PROMO_LAST_SHOW_MILLIS, System.currentTimeMillis()) + .commit(); + } + + /** + * 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 + */ + private void showModifySettingOnCompleteSnackbar(View view, boolean success) { + if (!success) { + Logger.get(context) + .logImpression(DialerImpression.Type.SPAM_BLOCKING_MODIFY_FAILURE_THROUGH_CALL_LOG_PROMO); + } + String snackBarText = + success + ? context.getString(R.string.spam_blocking_settings_enable_complete_text) + : context.getString(R.string.spam_blocking_settings_enable_error_text); + Snackbar.make(view, snackBarText, Snackbar.LENGTH_LONG) + .setAction( + R.string.spam_blocking_setting_prompt, + v -> context.startActivity(spam.getSpamBlockingSettingIntent(context))) + .setActionTextColor( + context.getResources().getColor(R.color.dialer_snackbar_action_text_color)) + .show(); + } +} -- cgit v1.2.3