1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.phone.settings;
18
19import android.content.Context;
20import android.content.SharedPreferences;
21import android.net.Uri;
22import android.preference.PreferenceManager;
23import android.provider.Settings;
24import android.telephony.TelephonyManager;
25import android.text.TextUtils;
26
27import com.android.internal.telephony.Phone;
28import com.android.phone.R;
29
30public class VoicemailNotificationSettingsUtil {
31    private static final String VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY_PREFIX =
32            "voicemail_notification_ringtone_";
33    private static final String VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY_PREFIX =
34            "voicemail_notification_vibrate_";
35
36    // Old voicemail notification vibration string constants used for migration.
37    private static final String OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY =
38            "button_voicemail_notification_ringtone_key";
39    private static final String OLD_VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY =
40            "button_voicemail_notification_vibrate_key";
41    private static final String OLD_VOICEMAIL_VIBRATE_WHEN_SHARED_PREFS_KEY =
42            "button_voicemail_notification_vibrate_when_key";
43    private static final String OLD_VOICEMAIL_RINGTONE_SHARED_PREFS_KEY =
44            "button_voicemail_notification_ringtone_key";
45    private static final String OLD_VOICEMAIL_VIBRATION_ALWAYS = "always";
46    private static final String OLD_VOICEMAIL_VIBRATION_NEVER = "never";
47
48    public static void setVibrationEnabled(Phone phone, boolean isEnabled) {
49        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
50        SharedPreferences.Editor editor = prefs.edit();
51        editor.putBoolean(getVoicemailVibrationSharedPrefsKey(phone), isEnabled);
52        editor.commit();
53    }
54
55    public static boolean isVibrationEnabled(Phone phone) {
56        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
57        migrateVoicemailVibrationSettingsIfNeeded(phone, prefs);
58        return prefs.getBoolean(getVoicemailVibrationSharedPrefsKey(phone), false /* defValue */);
59    }
60
61   public static void setRingtoneUri(Phone phone, Uri ringtoneUri) {
62        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
63        String ringtoneUriStr = ringtoneUri != null ? ringtoneUri.toString() : "";
64
65        SharedPreferences.Editor editor = prefs.edit();
66        editor.putString(getVoicemailRingtoneSharedPrefsKey(phone), ringtoneUriStr);
67        editor.commit();
68    }
69
70    public static Uri getRingtoneUri(Phone phone) {
71        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
72        migrateVoicemailRingtoneSettingsIfNeeded(phone, prefs);
73        String uriString = prefs.getString(
74                getVoicemailRingtoneSharedPrefsKey(phone),
75                Settings.System.DEFAULT_NOTIFICATION_URI.toString());
76        return !TextUtils.isEmpty(uriString) ? Uri.parse(uriString) : null;
77    }
78
79    /**
80     * Migrate voicemail settings from {@link #OLD_VIBRATE_WHEN_KEY} or
81     * {@link #OLD_VOICEMAIL_NOTIFICATION_VIBRATE_KEY}.
82     *
83     * TODO: Add helper which migrates settings from old version to new version.
84     */
85    private static void migrateVoicemailVibrationSettingsIfNeeded(
86            Phone phone, SharedPreferences prefs) {
87        String key = getVoicemailVibrationSharedPrefsKey(phone);
88        TelephonyManager telephonyManager = TelephonyManager.from(phone.getContext());
89
90        // Skip if a preference exists, or if phone is MSIM.
91        if (prefs.contains(key) || telephonyManager.getPhoneCount() != 1) {
92            return;
93        }
94
95        if (prefs.contains(OLD_VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY)) {
96            boolean voicemailVibrate = prefs.getBoolean(
97                    OLD_VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY, false /* defValue */);
98
99            SharedPreferences.Editor editor = prefs.edit();
100            editor.putBoolean(key, voicemailVibrate)
101                    .remove(OLD_VOICEMAIL_VIBRATE_WHEN_SHARED_PREFS_KEY)
102                    .commit();
103        }
104
105        if (prefs.contains(OLD_VOICEMAIL_VIBRATE_WHEN_SHARED_PREFS_KEY)) {
106            // If vibrateWhen is always, then voicemailVibrate should be true.
107            // If it is "only in silent mode", or "never", then voicemailVibrate should be false.
108            String vibrateWhen = prefs.getString(
109                    OLD_VOICEMAIL_VIBRATE_WHEN_SHARED_PREFS_KEY, OLD_VOICEMAIL_VIBRATION_NEVER);
110            boolean voicemailVibrate = vibrateWhen.equals(OLD_VOICEMAIL_VIBRATION_ALWAYS);
111
112            SharedPreferences.Editor editor = prefs.edit();
113            editor.putBoolean(key, voicemailVibrate)
114                    .remove(OLD_VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY)
115                    .commit();
116        }
117    }
118
119    /**
120     * Migrate voicemail settings from OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY.
121     *
122     * TODO: Add helper which migrates settings from old version to new version.
123     */
124    private static void migrateVoicemailRingtoneSettingsIfNeeded(
125            Phone phone, SharedPreferences prefs) {
126        String key = getVoicemailRingtoneSharedPrefsKey(phone);
127        TelephonyManager telephonyManager = TelephonyManager.from(phone.getContext());
128
129        // Skip if a preference exists, or if phone is MSIM.
130        if (prefs.contains(key) || telephonyManager.getPhoneCount() != 1) {
131            return;
132        }
133
134        if (prefs.contains(OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY)) {
135            String uriString = prefs.getString(
136                    OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY, null /* defValue */);
137
138            SharedPreferences.Editor editor = prefs.edit();
139            editor.putString(key, uriString)
140                    .remove(OLD_VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY)
141                    .commit();
142        }
143    }
144
145    private static String getVoicemailVibrationSharedPrefsKey(Phone phone) {
146        return VOICEMAIL_NOTIFICATION_VIBRATION_SHARED_PREFS_KEY_PREFIX + phone.getSubId();
147    }
148
149    public static String getVoicemailRingtoneSharedPrefsKey(Phone phone) {
150        return VOICEMAIL_NOTIFICATION_RINGTONE_SHARED_PREFS_KEY_PREFIX + phone.getSubId();
151    }
152}
153