Loading java/com/android/dialer/logging/dialer_impression.proto +9 −1 Original line number Diff line number Diff line Loading @@ -12,7 +12,7 @@ message DialerImpression { // Event enums to be used for Impression Logging in Dialer. // It's perfectly acceptable for this enum to be large // Values should be from 1000 to 100000. // Next Tag: 1379 // Next Tag: 1382 enum Type { UNKNOWN_AOSP_EVENT_TYPE = 1000; Loading Loading @@ -746,5 +746,13 @@ message DialerImpression { LIGHTBRINGER_VIDEO_REQUESTED_FOR_FAVORITE_CONTACT = 1376; LIGHTBRINGER_VIDEO_REQUESTED_FOR_SUGGESTED_CONTACT = 1377; LIGHTBRINGER_VIDEO_REQUESTED_FOR_FAVORITE_CONTACT_DISAMBIG = 1378; // Spam blocking after call notification promo shown for user. SPAM_BLOCKING_AFTER_CALL_NOTIFICATION_PROMO_SHOWN = 1379; // User enabled spam blocking through after call notification promo. SPAM_BLOCKING_ENABLED_THROUGH_AFTER_CALL_NOTIFICATION_PROMO = 1380; // Failure happened while enabling spam blocking through after call // notification promo. SPAM_BLOCKING_MODIFY_FAILURE_THROUGH_AFTER_CALL_NOTIFICATION_PROMO = 1381; } } java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java +61 −0 Original line number Diff line number Diff line Loading @@ -16,16 +16,23 @@ package com.android.dialer.spam.promo; import android.annotation.SuppressLint; import android.app.FragmentManager; import android.app.Notification; import android.app.Notification.Builder; import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface.OnDismissListener; import android.preference.PreferenceManager; import android.support.design.widget.Snackbar; import android.support.v4.os.BuildCompat; 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.notification.DialerNotificationManager; import com.android.dialer.notification.NotificationChannelId; import com.android.dialer.spam.SpamSettings; import com.android.dialer.spam.SpamSettings.ModifySettingListener; Loading Loading @@ -139,4 +146,58 @@ public class SpamBlockingPromoHelper { : context.getString(R.string.spam_blocking_settings_enable_error_text); Toast.makeText(context, toastText, Toast.LENGTH_LONG).show(); } /** * Shows a spam blocking promo notification. * * @param notificationTag a string identifier for this notification. * @param notificationId an identifier for this notification. * @param contentIntent pending intent to be sent when notification is clicked. * @param actionIntent pending intent to be sent when enable-spam-blocking button is clicked. */ public void showSpamBlockingPromoNotification( String notificationTag, int notificationId, PendingIntent contentIntent, PendingIntent actionIntent) { updateLastShowSpamTimestamp(); Logger.get(context) .logImpression(DialerImpression.Type.SPAM_BLOCKING_AFTER_CALL_NOTIFICATION_PROMO_SHOWN); DialerNotificationManager.notify( context, notificationTag, notificationId, getSpamBlockingPromoNotification(contentIntent, actionIntent)); } /** * Builds a spam blocking promo notification with given intents. * * @param contentIntent pending intent to be sent when notification is clicked. * @param actionIntent pending intent to be sent when enable-spam-blocking button is clicked. */ @SuppressLint("NewApi") private Notification getSpamBlockingPromoNotification( PendingIntent contentIntent, PendingIntent actionIntent) { Notification.Builder builder = new Builder(context) .setContentIntent(contentIntent) .setCategory(Notification.CATEGORY_STATUS) .setPriority(Notification.PRIORITY_DEFAULT) .setColor(context.getColor(R.color.dialer_theme_color)) .setSmallIcon(R.drawable.quantum_ic_call_vd_theme_24) .setContentText(context.getString(R.string.spam_blocking_promo_text)) .addAction( new Notification.Action.Builder( R.drawable.quantum_ic_block_vd_theme_24, context.getString(R.string.spam_blocking_promo_action_filter_spam), actionIntent) .build()) .setContentTitle(context.getString(R.string.spam_blocking_promo_title)); if (BuildCompat.isAtLeastO()) { builder.setChannelId(NotificationChannelId.DEFAULT); } return builder.build(); } } java/com/android/incallui/spam/SpamNotificationService.java +73 −8 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.incallui.spam; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; Loading @@ -31,6 +32,8 @@ import com.android.dialer.logging.Logger; import com.android.dialer.logging.ReportingLocation; import com.android.dialer.notification.DialerNotificationManager; import com.android.dialer.spam.SpamComponent; import com.android.dialer.spam.SpamSettings; import com.android.dialer.spam.promo.SpamBlockingPromoHelper; import com.android.incallui.call.DialerCall; /** Loading @@ -51,18 +54,29 @@ public class SpamNotificationService extends Service { private static final String EXTRA_NOTIFICATION_ID = "service_notification_id"; private static final String EXTRA_CONTACT_LOOKUP_RESULT_TYPE = "service_contact_lookup_result_type"; private String notificationTag; private int notificationId; /** Creates an intent to start this service. */ public static Intent createServiceIntent( 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, SpamNotificationService.class); intent.setAction(action); intent.putExtra(EXTRA_NOTIFICATION_TAG, notificationTag); intent.putExtra(EXTRA_NOTIFICATION_ID, notificationId); if (call != null) { intent.putExtra(EXTRA_PHONE_NUMBER, call.getNumber()); intent.putExtra(EXTRA_CALL_ID, call.getUniqueCallId()); intent.putExtra(EXTRA_CALL_START_TIME_MILLIS, call.getTimeAddedMs()); intent.putExtra(EXTRA_NOTIFICATION_TAG, notificationTag); intent.putExtra(EXTRA_NOTIFICATION_ID, notificationId); intent.putExtra( EXTRA_CONTACT_LOOKUP_RESULT_TYPE, call.getLogState().contactLookupResult.getNumber()); } return intent; } Loading @@ -83,14 +97,18 @@ public class SpamNotificationService extends Service { return START_NOT_STICKY; } String number = intent.getStringExtra(EXTRA_PHONE_NUMBER); String notificationTag = intent.getStringExtra(EXTRA_NOTIFICATION_TAG); int notificationId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, 1); notificationTag = intent.getStringExtra(EXTRA_NOTIFICATION_TAG); notificationId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, 1); String countryIso = GeoUtil.getCurrentCountryIso(this); ContactLookupResult.Type contactLookupResultType = ContactLookupResult.Type.forNumber(intent.getIntExtra(EXTRA_CONTACT_LOOKUP_RESULT_TYPE, 0)); DialerNotificationManager.cancel(this, notificationTag, notificationId); SpamSettings spamSettings = SpamComponent.get(this).spamSettings(); SpamBlockingPromoHelper spamBlockingPromoHelper = new SpamBlockingPromoHelper(this, SpamComponent.get(this).spamSettings()); switch (intent.getAction()) { case SpamNotificationActivity.ACTION_MARK_NUMBER_AS_SPAM: logCallImpression( Loading @@ -104,6 +122,13 @@ public class SpamNotificationService extends Service { ReportingLocation.Type.FEEDBACK_PROMPT, contactLookupResultType); new FilteredNumberAsyncQueryHandler(this).blockNumber(null, number, countryIso); if (spamBlockingPromoHelper.shouldShowSpamBlockingPromo()) { spamBlockingPromoHelper.showSpamBlockingPromoNotification( notificationTag, notificationId, createPromoActivityPendingIntent(), createEnableSpamBlockingPendingIntent()); } break; case SpamNotificationActivity.ACTION_MARK_NUMBER_AS_NOT_SPAM: logCallImpression( Loading @@ -117,6 +142,22 @@ public class SpamNotificationService extends Service { ReportingLocation.Type.FEEDBACK_PROMPT, contactLookupResultType); break; case SpamNotificationActivity.ACTION_ENABLE_SPAM_BLOCKING: Logger.get(this) .logImpression( DialerImpression.Type.SPAM_BLOCKING_ENABLED_THROUGH_AFTER_CALL_NOTIFICATION_PROMO); spamSettings.modifySpamBlockingSetting( true, success -> { if (!success) { Logger.get(this) .logImpression( DialerImpression.Type .SPAM_BLOCKING_MODIFY_FAILURE_THROUGH_AFTER_CALL_NOTIFICATION_PROMO); } spamBlockingPromoHelper.showModifySettingOnCompleteToast(success); }); break; default: // fall out } // TODO: call stopSelf() after async tasks complete (a bug) Loading @@ -137,4 +178,28 @@ public class SpamNotificationService extends Service { intent.getStringExtra(EXTRA_CALL_ID), intent.getLongExtra(EXTRA_CALL_START_TIME_MILLIS, 0)); } private PendingIntent createPromoActivityPendingIntent() { Intent intent = SpamNotificationActivity.createActivityIntent( this, null, SpamNotificationActivity.ACTION_SHOW_SPAM_BLOCKING_PROMO_DIALOG, notificationTag, notificationId); return PendingIntent.getActivity( this, (int) System.currentTimeMillis(), intent, PendingIntent.FLAG_ONE_SHOT); } private PendingIntent createEnableSpamBlockingPendingIntent() { Intent intent = SpamNotificationService.createServiceIntent( this, null, SpamNotificationActivity.ACTION_ENABLE_SPAM_BLOCKING, notificationTag, notificationId); return PendingIntent.getService( this, (int) System.currentTimeMillis(), intent, PendingIntent.FLAG_ONE_SHOT); } } Loading
java/com/android/dialer/logging/dialer_impression.proto +9 −1 Original line number Diff line number Diff line Loading @@ -12,7 +12,7 @@ message DialerImpression { // Event enums to be used for Impression Logging in Dialer. // It's perfectly acceptable for this enum to be large // Values should be from 1000 to 100000. // Next Tag: 1379 // Next Tag: 1382 enum Type { UNKNOWN_AOSP_EVENT_TYPE = 1000; Loading Loading @@ -746,5 +746,13 @@ message DialerImpression { LIGHTBRINGER_VIDEO_REQUESTED_FOR_FAVORITE_CONTACT = 1376; LIGHTBRINGER_VIDEO_REQUESTED_FOR_SUGGESTED_CONTACT = 1377; LIGHTBRINGER_VIDEO_REQUESTED_FOR_FAVORITE_CONTACT_DISAMBIG = 1378; // Spam blocking after call notification promo shown for user. SPAM_BLOCKING_AFTER_CALL_NOTIFICATION_PROMO_SHOWN = 1379; // User enabled spam blocking through after call notification promo. SPAM_BLOCKING_ENABLED_THROUGH_AFTER_CALL_NOTIFICATION_PROMO = 1380; // Failure happened while enabling spam blocking through after call // notification promo. SPAM_BLOCKING_MODIFY_FAILURE_THROUGH_AFTER_CALL_NOTIFICATION_PROMO = 1381; } }
java/com/android/dialer/spam/promo/SpamBlockingPromoHelper.java +61 −0 Original line number Diff line number Diff line Loading @@ -16,16 +16,23 @@ package com.android.dialer.spam.promo; import android.annotation.SuppressLint; import android.app.FragmentManager; import android.app.Notification; import android.app.Notification.Builder; import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface.OnDismissListener; import android.preference.PreferenceManager; import android.support.design.widget.Snackbar; import android.support.v4.os.BuildCompat; 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.notification.DialerNotificationManager; import com.android.dialer.notification.NotificationChannelId; import com.android.dialer.spam.SpamSettings; import com.android.dialer.spam.SpamSettings.ModifySettingListener; Loading Loading @@ -139,4 +146,58 @@ public class SpamBlockingPromoHelper { : context.getString(R.string.spam_blocking_settings_enable_error_text); Toast.makeText(context, toastText, Toast.LENGTH_LONG).show(); } /** * Shows a spam blocking promo notification. * * @param notificationTag a string identifier for this notification. * @param notificationId an identifier for this notification. * @param contentIntent pending intent to be sent when notification is clicked. * @param actionIntent pending intent to be sent when enable-spam-blocking button is clicked. */ public void showSpamBlockingPromoNotification( String notificationTag, int notificationId, PendingIntent contentIntent, PendingIntent actionIntent) { updateLastShowSpamTimestamp(); Logger.get(context) .logImpression(DialerImpression.Type.SPAM_BLOCKING_AFTER_CALL_NOTIFICATION_PROMO_SHOWN); DialerNotificationManager.notify( context, notificationTag, notificationId, getSpamBlockingPromoNotification(contentIntent, actionIntent)); } /** * Builds a spam blocking promo notification with given intents. * * @param contentIntent pending intent to be sent when notification is clicked. * @param actionIntent pending intent to be sent when enable-spam-blocking button is clicked. */ @SuppressLint("NewApi") private Notification getSpamBlockingPromoNotification( PendingIntent contentIntent, PendingIntent actionIntent) { Notification.Builder builder = new Builder(context) .setContentIntent(contentIntent) .setCategory(Notification.CATEGORY_STATUS) .setPriority(Notification.PRIORITY_DEFAULT) .setColor(context.getColor(R.color.dialer_theme_color)) .setSmallIcon(R.drawable.quantum_ic_call_vd_theme_24) .setContentText(context.getString(R.string.spam_blocking_promo_text)) .addAction( new Notification.Action.Builder( R.drawable.quantum_ic_block_vd_theme_24, context.getString(R.string.spam_blocking_promo_action_filter_spam), actionIntent) .build()) .setContentTitle(context.getString(R.string.spam_blocking_promo_title)); if (BuildCompat.isAtLeastO()) { builder.setChannelId(NotificationChannelId.DEFAULT); } return builder.build(); } }
java/com/android/incallui/spam/SpamNotificationService.java +73 −8 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.incallui.spam; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; Loading @@ -31,6 +32,8 @@ import com.android.dialer.logging.Logger; import com.android.dialer.logging.ReportingLocation; import com.android.dialer.notification.DialerNotificationManager; import com.android.dialer.spam.SpamComponent; import com.android.dialer.spam.SpamSettings; import com.android.dialer.spam.promo.SpamBlockingPromoHelper; import com.android.incallui.call.DialerCall; /** Loading @@ -51,18 +54,29 @@ public class SpamNotificationService extends Service { private static final String EXTRA_NOTIFICATION_ID = "service_notification_id"; private static final String EXTRA_CONTACT_LOOKUP_RESULT_TYPE = "service_contact_lookup_result_type"; private String notificationTag; private int notificationId; /** Creates an intent to start this service. */ public static Intent createServiceIntent( 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, SpamNotificationService.class); intent.setAction(action); intent.putExtra(EXTRA_NOTIFICATION_TAG, notificationTag); intent.putExtra(EXTRA_NOTIFICATION_ID, notificationId); if (call != null) { intent.putExtra(EXTRA_PHONE_NUMBER, call.getNumber()); intent.putExtra(EXTRA_CALL_ID, call.getUniqueCallId()); intent.putExtra(EXTRA_CALL_START_TIME_MILLIS, call.getTimeAddedMs()); intent.putExtra(EXTRA_NOTIFICATION_TAG, notificationTag); intent.putExtra(EXTRA_NOTIFICATION_ID, notificationId); intent.putExtra( EXTRA_CONTACT_LOOKUP_RESULT_TYPE, call.getLogState().contactLookupResult.getNumber()); } return intent; } Loading @@ -83,14 +97,18 @@ public class SpamNotificationService extends Service { return START_NOT_STICKY; } String number = intent.getStringExtra(EXTRA_PHONE_NUMBER); String notificationTag = intent.getStringExtra(EXTRA_NOTIFICATION_TAG); int notificationId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, 1); notificationTag = intent.getStringExtra(EXTRA_NOTIFICATION_TAG); notificationId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, 1); String countryIso = GeoUtil.getCurrentCountryIso(this); ContactLookupResult.Type contactLookupResultType = ContactLookupResult.Type.forNumber(intent.getIntExtra(EXTRA_CONTACT_LOOKUP_RESULT_TYPE, 0)); DialerNotificationManager.cancel(this, notificationTag, notificationId); SpamSettings spamSettings = SpamComponent.get(this).spamSettings(); SpamBlockingPromoHelper spamBlockingPromoHelper = new SpamBlockingPromoHelper(this, SpamComponent.get(this).spamSettings()); switch (intent.getAction()) { case SpamNotificationActivity.ACTION_MARK_NUMBER_AS_SPAM: logCallImpression( Loading @@ -104,6 +122,13 @@ public class SpamNotificationService extends Service { ReportingLocation.Type.FEEDBACK_PROMPT, contactLookupResultType); new FilteredNumberAsyncQueryHandler(this).blockNumber(null, number, countryIso); if (spamBlockingPromoHelper.shouldShowSpamBlockingPromo()) { spamBlockingPromoHelper.showSpamBlockingPromoNotification( notificationTag, notificationId, createPromoActivityPendingIntent(), createEnableSpamBlockingPendingIntent()); } break; case SpamNotificationActivity.ACTION_MARK_NUMBER_AS_NOT_SPAM: logCallImpression( Loading @@ -117,6 +142,22 @@ public class SpamNotificationService extends Service { ReportingLocation.Type.FEEDBACK_PROMPT, contactLookupResultType); break; case SpamNotificationActivity.ACTION_ENABLE_SPAM_BLOCKING: Logger.get(this) .logImpression( DialerImpression.Type.SPAM_BLOCKING_ENABLED_THROUGH_AFTER_CALL_NOTIFICATION_PROMO); spamSettings.modifySpamBlockingSetting( true, success -> { if (!success) { Logger.get(this) .logImpression( DialerImpression.Type .SPAM_BLOCKING_MODIFY_FAILURE_THROUGH_AFTER_CALL_NOTIFICATION_PROMO); } spamBlockingPromoHelper.showModifySettingOnCompleteToast(success); }); break; default: // fall out } // TODO: call stopSelf() after async tasks complete (a bug) Loading @@ -137,4 +178,28 @@ public class SpamNotificationService extends Service { intent.getStringExtra(EXTRA_CALL_ID), intent.getLongExtra(EXTRA_CALL_START_TIME_MILLIS, 0)); } private PendingIntent createPromoActivityPendingIntent() { Intent intent = SpamNotificationActivity.createActivityIntent( this, null, SpamNotificationActivity.ACTION_SHOW_SPAM_BLOCKING_PROMO_DIALOG, notificationTag, notificationId); return PendingIntent.getActivity( this, (int) System.currentTimeMillis(), intent, PendingIntent.FLAG_ONE_SHOT); } private PendingIntent createEnableSpamBlockingPendingIntent() { Intent intent = SpamNotificationService.createServiceIntent( this, null, SpamNotificationActivity.ACTION_ENABLE_SPAM_BLOCKING, notificationTag, notificationId); return PendingIntent.getService( this, (int) System.currentTimeMillis(), intent, PendingIntent.FLAG_ONE_SHOT); } }