summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/app/voicemail
diff options
context:
space:
mode:
authortwyen <twyen@google.com>2017-07-31 12:07:04 -0700
committerEric Erfanian <erfanian@google.com>2017-08-01 08:37:41 -0700
commitaec0aa5f040c3d192ddb46e63f5383d35d918f36 (patch)
tree87a194857cd9e368dd51299145ce1d8a96db5908 /java/com/android/dialer/app/voicemail
parentcc89710d16fbfd3c979ae5881b6849ee1ee62881 (diff)
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
Diffstat (limited to 'java/com/android/dialer/app/voicemail')
-rw-r--r--java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java62
1 files changed, 40 insertions, 22 deletions
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.
- *
- * <p>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));
+ }
}