diff options
Diffstat (limited to 'java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java')
-rw-r--r-- | java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java | 74 |
1 files changed, 56 insertions, 18 deletions
diff --git a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java index 078a40a82..9d07ec561 100644 --- a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java +++ b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java @@ -22,14 +22,15 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Build.VERSION_CODES; +import android.preference.PreferenceManager; import android.support.v4.os.BuildCompat; -import android.telecom.PhoneAccount; +import android.support.v4.os.UserManagerCompat; import android.telecom.PhoneAccountHandle; -import android.telecom.TelecomManager; import android.telephony.TelephonyManager; import com.android.dialer.app.calllog.DefaultVoicemailNotifier; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; +import com.android.dialer.common.PerAccountSharedPreferences; import com.android.voicemail.VoicemailComponent; /** @@ -40,6 +41,8 @@ import com.android.voicemail.VoicemailComponent; @TargetApi(VERSION_CODES.O) public class LegacyVoicemailNotificationReceiver extends BroadcastReceiver { + private static final String LEGACY_VOICEMAIL_COUNT = "legacy_voicemail_count"; + @Override public void onReceive(Context context, Intent intent) { LogUtil.i( @@ -47,28 +50,37 @@ public class LegacyVoicemailNotificationReceiver extends BroadcastReceiver { Assert.checkArgument(BuildCompat.isAtLeastO()); PhoneAccountHandle phoneAccountHandle = - intent.getParcelableExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE); - if (phoneAccountHandle == null) { - // TODO: assert instead after API has landed. - phoneAccountHandle = - context - .getSystemService(TelecomManager.class) - .getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_VOICEMAIL); - } - if (VoicemailComponent.get(context) - .getVoicemailClient() - .isActivated(context, phoneAccountHandle)) { + Assert.isNotNull(intent.getParcelableExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE)); + + int count = intent.getIntExtra(TelephonyManager.EXTRA_NOTIFICATION_COUNT, -1); + + if (!hasVoicemailCountChanged(context, phoneAccountHandle, count)) { LogUtil.i( "LegacyVoicemailNotificationReceiver.onReceive", - "visual voicemail is activated, ignoring notification"); + "voicemail count hasn't changed, ignoring"); return; } - // Missing extra means there are unknown numbers of voicemails. - int count = intent.getIntExtra(TelephonyManager.EXTRA_NOTIFICATION_COUNT, 1); + if (count == -1) { + // Carrier might not send voicemail count. Missing extra means there are unknown numbers of + // voicemails (One or more). Treat it as 1 so the generic version will be shown. ("Voicemail" + // instead of "X voicemails") + count = 1; + } + if (count == 0) { LogUtil.i("LegacyVoicemailNotificationReceiver.onReceive", "clearing notification"); - DefaultVoicemailNotifier.getInstance(context).cancelLegacyNotification(); + new DefaultVoicemailNotifier(context).cancelLegacyNotification(); + return; + } + + if (UserManagerCompat.isUserUnlocked(context) + && VoicemailComponent.get(context) + .getVoicemailClient() + .isActivated(context, phoneAccountHandle)) { + LogUtil.i( + "LegacyVoicemailNotificationReceiver.onReceive", + "visual voicemail is activated, ignoring notification"); return; } @@ -79,7 +91,7 @@ public class LegacyVoicemailNotificationReceiver extends BroadcastReceiver { intent.getParcelableExtra(TelephonyManager.EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT); LogUtil.i("LegacyVoicemailNotificationReceiver.onReceive", "sending notification"); - DefaultVoicemailNotifier.getInstance(context) + new DefaultVoicemailNotifier(context) .notifyLegacyVoicemail( phoneAccountHandle, count, @@ -87,4 +99,30 @@ public class LegacyVoicemailNotificationReceiver extends BroadcastReceiver { callVoicemailIntent, voicemailSettingIntent); } + + 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; + } + + 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; + } + preferences.edit().putInt(LEGACY_VOICEMAIL_COUNT, newCount).apply(); + return true; + } } |