Make voicemail vibrate/ringtone MSIM-aware.

+ Use phone/subIds to set and query for settings.
+ Migrate old settings. Do not migrate for MSIM devices, because the
scenarios for figuring out how to migrate from one setting to
multiple settings is a bit convoluted. Falls back to default instead.
+ Initialize voicemail ringtone preference in call settings.

Bug: 18232725
Change-Id: I04a4908c9c38d6228ed3945bc00e9ef75d95b388
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index e67071a..18a4036 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -59,9 +59,10 @@
 import com.android.phone.settings.AccountSelectionPreference;
 import com.android.phone.settings.CallForwardInfoUtil;
 import com.android.phone.settings.VoicemailDialogUtil;
+import com.android.phone.settings.VoicemailNotificationSettingsUtil;
 import com.android.phone.settings.VoicemailProviderSettings;
 import com.android.phone.settings.VoicemailProviderSettingsUtil;
-import com.android.phone.settings.VoicemailNotificationSettingsUtil;
+import com.android.phone.settings.VoicemailRingtonePreference;
 import com.android.phone.settings.fdn.FdnSetting;
 import com.android.services.telephony.sip.SipUtil;
 
@@ -193,6 +194,7 @@
     private ListPreference mVoicemailProviders;
     private PreferenceScreen mVoicemailSettingsScreen;
     private PreferenceScreen mVoicemailSettings;
+    private VoicemailRingtonePreference mVoicemailNotificationRingtone;
     private CheckBoxPreference mVoicemailNotificationVibrate;
     private CheckBoxPreference mEnableVideoCalling;
 
@@ -420,7 +422,7 @@
             }
         } else if (preference.getKey().equals(mVoicemailNotificationVibrate.getKey())) {
             VoicemailNotificationSettingsUtil.setVibrationEnabled(
-                    mPhone.getContext(), Boolean.TRUE.equals(objValue));
+                    mPhone, Boolean.TRUE.equals(objValue));
         } else if (preference == mEnableVideoCalling) {
             if (ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())) {
                 PhoneGlobals.getInstance().phoneMgr.enableVideoCalling((boolean) objValue);
@@ -1180,6 +1182,10 @@
                 (PreferenceScreen) findPreference(VOICEMAIL_SETTING_SCREEN_PREF_KEY);
         mVoicemailSettings = (PreferenceScreen)findPreference(BUTTON_VOICEMAIL_SETTING_KEY);
 
+        mVoicemailNotificationRingtone = (VoicemailRingtonePreference) findPreference(
+                getResources().getString(R.string.voicemail_notification_ringtone_key));
+        mVoicemailNotificationRingtone.init(mPhone);
+
         mVoicemailNotificationVibrate = (CheckBoxPreference) findPreference(
                 getResources().getString(R.string.voicemail_notification_vibrate_key));
         mVoicemailNotificationVibrate.setOnPreferenceChangeListener(this);
@@ -1296,7 +1302,7 @@
         mVMProviderSettingsForced = false;
 
         mVoicemailNotificationVibrate.setChecked(
-                VoicemailNotificationSettingsUtil.isVibrationEnabled(mPhone.getContext()));
+                VoicemailNotificationSettingsUtil.isVibrationEnabled(mPhone));
 
         if (ImsManager.isVtEnabledByPlatform(mPhone.getContext()) && ENABLE_VT_FLAG) {
             boolean currentValue =
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index badca74..6e372c2 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -298,7 +298,7 @@
             Intent intent = new Intent(Intent.ACTION_CALL,
                     Uri.fromParts(PhoneAccount.SCHEME_VOICEMAIL, "", null));
             PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
-            Uri ringtoneUri = VoicemailNotificationSettingsUtil.getRingtoneUri(mContext);
+            Uri ringtoneUri = VoicemailNotificationSettingsUtil.getRingtoneUri(mPhone);
 
             Notification.Builder builder = new Notification.Builder(mContext);
             builder.setSmallIcon(resId)
@@ -310,7 +310,7 @@
                     .setColor(mContext.getResources().getColor(R.color.dialer_theme_color))
                     .setOngoing(true);
 
-            if (VoicemailNotificationSettingsUtil.isVibrationEnabled(mContext)) {
+            if (VoicemailNotificationSettingsUtil.isVibrationEnabled(mPhone)) {
                 builder.setDefaults(Notification.DEFAULT_VIBRATE);
             }
 
diff --git a/src/com/android/phone/settings/VoicemailNotificationSettingsUtil.java b/src/com/android/phone/settings/VoicemailNotificationSettingsUtil.java
index 3a93f11..7d9ce4b 100644
--- a/src/com/android/phone/settings/VoicemailNotificationSettingsUtil.java
+++ b/src/com/android/phone/settings/VoicemailNotificationSettingsUtil.java
@@ -21,17 +21,23 @@
 import android.net.Uri;
 import android.preference.PreferenceManager;
 import android.provider.Settings;
+import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 
+import com.android.internal.telephony.Phone;
 import com.android.phone.R;
 
 public class VoicemailNotificationSettingsUtil {
-    private static final String VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY =
-            "button_voicemail_notification_ringtone_key";
-    private static final String VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY =
-            "button_voicemail_notification_vibrate_key";
+    private static final String VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY_PREFIX =
+            "voicemail_notification_ringtone_";
+    private static final String VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY_PREFIX =
+            "voicemail_notification_vibrate_";
 
     // Old voicemail notification vibration string constants used for migration.
+    private static final String OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY =
+            "button_voicemail_notification_ringtone_key";
+    private static final String OLD_VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY =
+            "button_voicemail_notification_vibrate_key";
     private static final String OLD_VOICEMAIL_VIBRATE_WHEN_SHARED_PREFS_KEY =
             "button_voicemail_notification_vibrate_when_key";
     private static final String OLD_VOICEMAIL_RINGTONE_SHARED_PREFS_KEY =
@@ -39,26 +45,63 @@
     private static final String OLD_VOICEMAIL_VIBRATION_ALWAYS = "always";
     private static final String OLD_VOICEMAIL_VIBRATION_NEVER = "never";
 
-    public static void setVibrationEnabled(Context context, boolean isEnabled) {
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+    public static void setVibrationEnabled(Phone phone, boolean isEnabled) {
+        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
         SharedPreferences.Editor editor = prefs.edit();
-        editor.putBoolean(VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY, isEnabled);
+        editor.putBoolean(getVoicemailVibrationSharedPrefsKey(phone), isEnabled);
         editor.commit();
     }
 
-    public static boolean isVibrationEnabled(Context context) {
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
-        migrateVoicemailVibrationSettingsIfNeeded(prefs);
-        return prefs.getBoolean(
-                VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY, false /* defValue */);
+    public static boolean isVibrationEnabled(Phone phone) {
+        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
+        migrateVoicemailVibrationSettingsIfNeeded(phone, prefs);
+        return prefs.getBoolean(getVoicemailVibrationSharedPrefsKey(phone), false /* defValue */);
+    }
+
+   public static void setRingtoneUri(Phone phone, Uri ringtoneUri) {
+        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
+        String ringtoneUriStr = ringtoneUri != null ? ringtoneUri.toString() : "";
+
+        SharedPreferences.Editor editor = prefs.edit();
+        editor.putString(getVoicemailRingtoneSharedPrefsKey(phone), ringtoneUriStr);
+        editor.commit();
+    }
+
+    public static Uri getRingtoneUri(Phone phone) {
+        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
+        migrateVoicemailRingtoneSettingsIfNeeded(phone, prefs);
+        String uriString = prefs.getString(
+                getVoicemailRingtoneSharedPrefsKey(phone), Settings.System.NOTIFICATION_SOUND);
+        return !TextUtils.isEmpty(uriString) ? Uri.parse(uriString) : null;
     }
 
     /**
-     * Migrate settings from OLD_VIBRATE_WHEN_KEY to VOICEMAIL_NOTIFICATION_VIBRATE_KEY if the
-     * latter does not exist.
+     * Migrate voicemail settings from {@link #OLD_VIBRATE_WHEN_KEY} or
+     * {@link #OLD_VOICEMAIL_NOTIFICATION_VIBRATE_KEY}.
+     *
+     * TODO: Add helper which migrates settings from old version to new version.
      */
-    private static void migrateVoicemailVibrationSettingsIfNeeded(SharedPreferences prefs) {
-        if (!prefs.contains(VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY)) {
+    private static void migrateVoicemailVibrationSettingsIfNeeded(
+            Phone phone, SharedPreferences prefs) {
+        String key = getVoicemailVibrationSharedPrefsKey(phone);
+        TelephonyManager telephonyManager = TelephonyManager.from(phone.getContext());
+
+        // Skip if a preference exists, or if phone is MSIM.
+        if (prefs.contains(key) || telephonyManager.getPhoneCount() != 1) {
+            return;
+        }
+
+        if (prefs.contains(OLD_VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY)) {
+            boolean voicemailVibrate = prefs.getBoolean(
+                    OLD_VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY, false /* defValue */);
+
+            SharedPreferences.Editor editor = prefs.edit();
+            editor.putBoolean(key, voicemailVibrate)
+                    .remove(OLD_VOICEMAIL_VIBRATE_WHEN_SHARED_PREFS_KEY)
+                    .commit();
+        }
+
+        if (prefs.contains(OLD_VOICEMAIL_VIBRATE_WHEN_SHARED_PREFS_KEY)) {
             // If vibrateWhen is always, then voicemailVibrate should be true.
             // If it is "only in silent mode", or "never", then voicemailVibrate should be false.
             String vibrateWhen = prefs.getString(
@@ -66,32 +109,43 @@
             boolean voicemailVibrate = vibrateWhen.equals(OLD_VOICEMAIL_VIBRATION_ALWAYS);
 
             SharedPreferences.Editor editor = prefs.edit();
-            editor.putBoolean(VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY, voicemailVibrate)
-                    .remove(OLD_VOICEMAIL_VIBRATE_WHEN_SHARED_PREFS_KEY)
+            editor.putBoolean(key, voicemailVibrate)
+                    .remove(OLD_VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY)
                     .commit();
         }
     }
 
-    public static void setRingtoneUri(Context context, Uri ringtoneUri) {
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
-        String ringtoneUriStr = ringtoneUri != null ? ringtoneUri.toString() : "";
+    /**
+     * Migrate voicemail settings from OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY.
+     *
+     * TODO: Add helper which migrates settings from old version to new version.
+     */
+    private static void migrateVoicemailRingtoneSettingsIfNeeded(
+            Phone phone, SharedPreferences prefs) {
+        String key = getVoicemailRingtoneSharedPrefsKey(phone);
+        TelephonyManager telephonyManager = TelephonyManager.from(phone.getContext());
 
-        SharedPreferences.Editor editor = prefs.edit();
-        editor.putString(VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY, ringtoneUriStr);
-        editor.commit();
-    }
-
-    public static Uri getRingtoneUri(Context context) {
-        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
-        if (!prefs.contains(VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY)) {
-            return Settings.System.DEFAULT_NOTIFICATION_URI;
+        // Skip if a preference exists, or if phone is MSIM.
+        if (prefs.contains(key) || telephonyManager.getPhoneCount() != 1) {
+            return;
         }
-        String uriString = prefs.getString(
-                VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY, null /* defValue */);
-        return !TextUtils.isEmpty(uriString) ? Uri.parse(uriString) : null;
+
+        if (prefs.contains(OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY)) {
+            String uriString = prefs.getString(
+                    OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY, null /* defValue */);
+
+            SharedPreferences.Editor editor = prefs.edit();
+            editor.putString(key, uriString)
+                    .remove(OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY)
+                    .commit();
+        }
     }
 
-    public static String getRingtoneSharedPreferencesKey() {
-        return VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY;
+    private static String getVoicemailVibrationSharedPrefsKey(Phone phone) {
+        return VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY_PREFIX + phone.getSubId();
+    }
+
+    public static String getVoicemailRingtoneSharedPrefsKey(Phone phone) {
+        return VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY_PREFIX + phone.getSubId();
     }
 }
diff --git a/src/com/android/phone/settings/VoicemailRingtonePreference.java b/src/com/android/phone/settings/VoicemailRingtonePreference.java
index 48e5367..fa3cc70 100644
--- a/src/com/android/phone/settings/VoicemailRingtonePreference.java
+++ b/src/com/android/phone/settings/VoicemailRingtonePreference.java
@@ -10,6 +10,7 @@
 import android.preference.RingtonePreference;
 import android.util.AttributeSet;
 
+import com.android.internal.telephony.Phone;
 import com.android.phone.PhoneGlobals;
 import com.android.phone.common.util.SettingsUtil;
 
@@ -23,6 +24,8 @@
     private Runnable mVoicemailRingtoneLookupRunnable;
     private Handler mVoicemailRingtoneLookupComplete;
 
+    private Phone mPhone;
+
     public VoicemailRingtonePreference(Context context, AttributeSet attrs) {
         super(context, attrs);
 
@@ -38,6 +41,8 @@
         };
 
         final Preference preference = this;
+        final String preferenceKey =
+                VoicemailNotificationSettingsUtil.getVoicemailRingtoneSharedPrefsKey(mPhone);
         mVoicemailRingtoneLookupRunnable = new Runnable() {
             @Override
             public void run() {
@@ -45,7 +50,7 @@
                         preference.getContext(),
                         mVoicemailRingtoneLookupComplete,
                         RingtoneManager.TYPE_NOTIFICATION,
-                        VoicemailNotificationSettingsUtil.getRingtoneSharedPreferencesKey(),
+                        preferenceKey,
                         MSG_UPDATE_VOICEMAIL_RINGTONE_SUMMARY);
             }
         };
@@ -53,16 +58,20 @@
         updateRingtoneName();
     }
 
+    public void init(Phone phone) {
+        mPhone = phone;
+    }
+
     @Override
     protected Uri onRestoreRingtone() {
-        return VoicemailNotificationSettingsUtil.getRingtoneUri(getContext());
+        return VoicemailNotificationSettingsUtil.getRingtoneUri(mPhone);
     }
 
     @Override
     protected void onSaveRingtone(Uri ringtoneUri) {
         // Don't call superclass method because it uses the pref key as the SharedPreferences key.
         // Delegate to the voicemail notification utility to save the ringtone instead.
-        VoicemailNotificationSettingsUtil.setRingtoneUri(getContext(), ringtoneUri);
+        VoicemailNotificationSettingsUtil.setRingtoneUri(mPhone, ringtoneUri);
 
         updateRingtoneName();
     }