Persist user enable/disable setting through reboot.
When the carrier vvm app is installed but the user manually enables
dialer vvm, we should ensure that the user preference is persisted
through reboots.
Also, if the installation of the carrier vvm causes the dialer vvm to
become disabled, do not send the deactivate sms message, as the carrier
vvm app may need it.
Bug: 21126480
Change-Id: I9ffa53c17663f5f7b324ca44a49b695ffd3646a8
diff --git a/src/com/android/phone/settings/VisualVoicemailSettingsUtil.java b/src/com/android/phone/settings/VisualVoicemailSettingsUtil.java
index 5dd3166..d2e797b 100644
--- a/src/com/android/phone/settings/VisualVoicemailSettingsUtil.java
+++ b/src/com/android/phone/settings/VisualVoicemailSettingsUtil.java
@@ -26,7 +26,8 @@
import com.android.phone.vvm.omtp.sms.StatusMessage;
/**
- * Save visual voicemail login values in shared preferences to be retrieved later.
+ * Save visual voicemail login values and whether or not a particular account is enabled in shared
+ * preferences to be retrieved later.
* Because a voicemail source is tied 1:1 to a phone account, the phone account handle is used in
* the key for each voicemail source and the associated data.
*/
@@ -35,18 +36,25 @@
"visual_voicemail_";
private static final String IS_ENABLED_KEY = "is_enabled";
+ // If a carrier vvm app is installed, Google visual voicemail is automatically switched off
+ // however, the user can override this setting.
+ private static final String IS_USER_SET = "is_user_set";
- public static void setVisualVoicemailEnabled(Phone phone, boolean isEnabled) {
+ public static void setVisualVoicemailEnabled(Phone phone, boolean isEnabled,
+ boolean isUserSet) {
setVisualVoicemailEnabled(phone.getContext(), PhoneUtils.makePstnPhoneAccountHandle(phone),
- isEnabled);
+ isEnabled, isUserSet);
}
public static void setVisualVoicemailEnabled(Context context, PhoneAccountHandle phoneAccount,
- boolean isEnabled) {
+ boolean isEnabled, boolean isUserSet) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(
getVisualVoicemailSharedPrefsKey(IS_ENABLED_KEY, phoneAccount), isEnabled);
+ editor.putBoolean(
+ getVisualVoicemailSharedPrefsKey(IS_USER_SET, phoneAccount),
+ isUserSet);
editor.commit();
}
@@ -65,6 +73,28 @@
PhoneUtils.makePstnPhoneAccountHandle(phone));
}
+ public static boolean isEnabledByUserOverride(Context context,
+ PhoneAccountHandle phoneAccount) {
+ return isVisualVoicemailUserSet(context, phoneAccount) &&
+ isVisualVoicemailEnabled(context, phoneAccount);
+ }
+
+ /**
+ * Differentiate user-enabled/disabled to know whether to ignore automatic enabling and
+ * disabling by the system. This is relevant when a carrier vvm app is installed and the user
+ * manually enables dialer visual voicemail. In that case we would want that setting to persist.
+ */
+ public static boolean isVisualVoicemailUserSet(Context context,
+ PhoneAccountHandle phoneAccount) {
+ if (phoneAccount == null) {
+ return false;
+ }
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ return prefs.getBoolean(
+ getVisualVoicemailSharedPrefsKey(IS_USER_SET, phoneAccount),
+ false);
+ }
+
public static void setVisualVoicemailCredentialsFromStatusMessage(Context context,
PhoneAccountHandle phoneAccount, StatusMessage message) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
diff --git a/src/com/android/phone/settings/VoicemailSettingsActivity.java b/src/com/android/phone/settings/VoicemailSettingsActivity.java
index f70ee65..3e9a613 100644
--- a/src/com/android/phone/settings/VoicemailSettingsActivity.java
+++ b/src/com/android/phone/settings/VoicemailSettingsActivity.java
@@ -387,8 +387,9 @@
VoicemailNotificationSettingsUtil.setVibrationEnabled(
mPhone, Boolean.TRUE.equals(objValue));
} else if (preference.getKey().equals(mVoicemailVisualVoicemail.getKey())) {
- if ((Boolean) objValue) {
- VisualVoicemailSettingsUtil.setVisualVoicemailEnabled(mPhone, true);
+ boolean isEnabled = (Boolean) objValue;
+ VisualVoicemailSettingsUtil.setVisualVoicemailEnabled(mPhone, isEnabled, true);
+ if (isEnabled) {
mOmtpVvmCarrierConfigHelper.startActivation();
} else {
OmtpVvmSourceManager.getInstance(mPhone.getContext()).removeSource(mPhone);
diff --git a/src/com/android/phone/vvm/omtp/SimChangeReceiver.java b/src/com/android/phone/vvm/omtp/SimChangeReceiver.java
index 3ac1096..0823552 100644
--- a/src/com/android/phone/vvm/omtp/SimChangeReceiver.java
+++ b/src/com/android/phone/vvm/omtp/SimChangeReceiver.java
@@ -70,11 +70,18 @@
if (carrierConfigHelper.isEnabledByDefault()) {
VisualVoicemailSettingsUtil.setVisualVoicemailEnabled(
- context, phoneAccount, true);
+ context, phoneAccount, true, false);
+ }
+
+ if (carrierConfigHelper.isEnabledByDefault() ||
+ VisualVoicemailSettingsUtil.isEnabledByUserOverride(
+ context, phoneAccount)) {
carrierConfigHelper.startActivation();
} else {
// It may be that the source was not registered to begin with but we want
// to run through the steps to remove the source just in case.
+ VisualVoicemailSettingsUtil.setVisualVoicemailEnabled(
+ context, phoneAccount, false, false);
OmtpVvmSourceManager.getInstance(context).removeSource(phoneAccount);
carrierConfigHelper.startDeactivation();
}
diff --git a/src/com/android/phone/vvm/omtp/VvmPackageInstallReceiver.java b/src/com/android/phone/vvm/omtp/VvmPackageInstallReceiver.java
index 1541f2d..5559feb 100644
--- a/src/com/android/phone/vvm/omtp/VvmPackageInstallReceiver.java
+++ b/src/com/android/phone/vvm/omtp/VvmPackageInstallReceiver.java
@@ -21,6 +21,7 @@
import android.telecom.PhoneAccountHandle;
import com.android.phone.PhoneUtils;
+import com.android.phone.settings.VisualVoicemailSettingsUtil;
import com.android.phone.vvm.omtp.sync.OmtpVvmSourceManager;
import java.util.Set;
@@ -44,11 +45,17 @@
OmtpVvmSourceManager vvmSourceManager = OmtpVvmSourceManager.getInstance(context);
Set<PhoneAccountHandle> phoneAccounts = vvmSourceManager.getOmtpVvmSources();
for (PhoneAccountHandle phoneAccount : phoneAccounts) {
+ if (VisualVoicemailSettingsUtil.isEnabledByUserOverride(context, phoneAccount)) {
+ // Skip the check if this voicemail source is enabled by the user.
+ continue;
+ }
+
OmtpVvmCarrierConfigHelper carrierConfigHelper = new OmtpVvmCarrierConfigHelper(
context, PhoneUtils.getSubIdForPhoneAccountHandle(phoneAccount));
if (packageName.equals(carrierConfigHelper.getCarrierVvmPackageName())) {
+ VisualVoicemailSettingsUtil.setVisualVoicemailEnabled(
+ context, phoneAccount, false, false);
OmtpVvmSourceManager.getInstance(context).removeSource(phoneAccount);
- carrierConfigHelper.startDeactivation();
}
}
}
diff --git a/src/com/android/phone/vvm/omtp/sync/OmtpVvmSourceManager.java b/src/com/android/phone/vvm/omtp/sync/OmtpVvmSourceManager.java
index e7a189d..37fb5e4 100644
--- a/src/com/android/phone/vvm/omtp/sync/OmtpVvmSourceManager.java
+++ b/src/com/android/phone/vvm/omtp/sync/OmtpVvmSourceManager.java
@@ -95,7 +95,6 @@
VoicemailContract.Status.DATA_CHANNEL_STATE_NO_CONNECTION,
VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION);
removePhoneStateListener(phoneAccount);
- VisualVoicemailSettingsUtil.setVisualVoicemailEnabled(mContext, phoneAccount, false);
}
public void addPhoneStateListener(PhoneAccountHandle phoneAccount) {