summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java
blob: 9349577c5907ca5adc769e1aa80e5e6123771993 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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.
   *
   * <p>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();
  }
}