From aec0aa5f040c3d192ddb46e63f5383d35d918f36 Mon Sep 17 00:00:00 2001 From: twyen Date: Mon, 31 Jul 2017 12:07:04 -0700 Subject: Save dismissed state for legacy voicemail notification TelephonyManager will resend legacy voicemail notifications during connectivity changes with a "is_refresh" flag. Such notifications has already been shown before and should not alert the user. Previously the notification will be set to onlyAlertOnce, but if the user dismissed it it will be shown again. In this CL, if the notification is dismissed, the state will be persisted and the notification will not be shown again. The state will be cleared when a new voicemail arrived and the user will be notified again. Since telephony sends is_refresh=false during boot up, the state will also be cleared with a reboot. Bug: 62229933 Test: LegacyVoicemailNotificationReceieverTest PiperOrigin-RevId: 163728161 Change-Id: I7ec6b5a88fed26e0a4459b8803eeba9a37b7b32b --- .../LegacyVoicemailNotificationReceiver.java | 62 ++++++++++++++-------- 1 file changed, 40 insertions(+), 22 deletions(-) (limited to 'java/com/android/dialer/app/voicemail') diff --git a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java index 4100521ab..a81d8665a 100644 --- a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java +++ b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java @@ -23,15 +23,15 @@ import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Build.VERSION_CODES; -import android.preference.PreferenceManager; +import android.support.annotation.VisibleForTesting; import android.support.v4.os.BuildCompat; -import android.support.v4.os.UserManagerCompat; import android.telecom.PhoneAccountHandle; import android.telephony.TelephonyManager; import com.android.dialer.app.calllog.LegacyVoicemailNotifier; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.common.PerAccountSharedPreferences; +import com.android.dialer.util.DialerUtils; import com.android.voicemail.VoicemailComponent; /** @@ -43,15 +43,14 @@ import com.android.voicemail.VoicemailComponent; public class LegacyVoicemailNotificationReceiver extends BroadcastReceiver { private static final String LEGACY_VOICEMAIL_COUNT = "legacy_voicemail_count"; + @VisibleForTesting static final String LEGACY_VOICEMAIL_DISMISSED = "legacy_voicemail_dismissed"; /** - * Hidden extra for {@link TelephonyManager#ACTION_SHOW_VOICEMAIL_NOTIFICATION} for whether the - * notification is just a refresh or for a new voicemail. The phone should not play a ringtone or - * vibrate during a refresh if the notification is already showing. - * - *

TODO(b/62202833): make public + * Whether the notification is just a refresh or for a new voicemail. The phone should not play a + * ringtone or vibrate during a refresh if the notification is already showing. This is Hidden in + * O and public in O MR1. */ - private static final String EXTRA_IS_REFRESH = "is_refresh"; + @VisibleForTesting static final String EXTRA_IS_REFRESH = "is_refresh"; @Override public void onReceive(Context context, Intent intent) { @@ -72,8 +71,21 @@ public class LegacyVoicemailNotificationReceiver extends BroadcastReceiver { PhoneAccountHandle phoneAccountHandle = Assert.isNotNull(intent.getParcelableExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE)); int count = intent.getIntExtra(TelephonyManager.EXTRA_NOTIFICATION_COUNT, -1); + boolean isRefresh = intent.getBooleanExtra(EXTRA_IS_REFRESH, false); + LogUtil.i("LegacyVoicemailNotificationReceiver.onReceive", "isRefresh: " + isRefresh); + PerAccountSharedPreferences preferences = getSharedPreferences(context, phoneAccountHandle); + if (isRefresh) { + if (preferences.getBoolean(LEGACY_VOICEMAIL_DISMISSED, false)) { + LogUtil.i( + "LegacyVoicemailNotificationReceiver.onReceive", + "notification dismissed, ignoring refresh"); + return; + } + } else { + setDismissed(context, phoneAccountHandle, false); + } - if (!hasVoicemailCountChanged(context, phoneAccountHandle, count)) { + if (!hasVoicemailCountChanged(preferences, count)) { LogUtil.i( "LegacyVoicemailNotificationReceiver.onReceive", "voicemail count hasn't changed, ignoring"); @@ -116,27 +128,24 @@ public class LegacyVoicemailNotificationReceiver extends BroadcastReceiver { voicemailNumber, callVoicemailIntent, voicemailSettingIntent, - intent.getBooleanExtra(EXTRA_IS_REFRESH, false)); + isRefresh); } - private static boolean hasVoicemailCountChanged( - Context context, PhoneAccountHandle phoneAccountHandle, int newCount) { - // Need credential encrypted storage to access preferences. - if (!UserManagerCompat.isUserUnlocked(context)) { - LogUtil.i( - "LegacyVoicemailNotificationReceiver.onReceive", - "User locked, bypassing voicemail count check"); - return true; - } + public static void setDismissed( + Context context, PhoneAccountHandle phoneAccountHandle, boolean dismissed) { + getSharedPreferences(context, phoneAccountHandle) + .edit() + .putBoolean(LEGACY_VOICEMAIL_DISMISSED, dismissed) + .apply(); + } + private static boolean hasVoicemailCountChanged( + PerAccountSharedPreferences preferences, int newCount) { if (newCount == -1) { // Carrier does not report voicemail count return true; } - PerAccountSharedPreferences preferences = - new PerAccountSharedPreferences( - context, phoneAccountHandle, PreferenceManager.getDefaultSharedPreferences(context)); // Carriers may send multiple notifications for the same voicemail. if (newCount != 0 && newCount == preferences.getInt(LEGACY_VOICEMAIL_COUNT, -1)) { return false; @@ -144,4 +153,13 @@ public class LegacyVoicemailNotificationReceiver extends BroadcastReceiver { preferences.edit().putInt(LEGACY_VOICEMAIL_COUNT, newCount).apply(); return true; } + + @VisibleForTesting + static PerAccountSharedPreferences getSharedPreferences( + Context context, PhoneAccountHandle phoneAccountHandle) { + return new PerAccountSharedPreferences( + context, + phoneAccountHandle, + DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(context)); + } } -- cgit v1.2.3