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.telephony.PhoneNumberUtils;
22import android.text.TextUtils;
23import android.util.Log;
24
25import com.android.internal.telephony.CallForwardInfo;
26import com.android.internal.telephony.CommandsInterface;
27import com.android.phone.PhoneGlobals;
28
29public class VoicemailProviderSettingsUtil {
30    private static final String LOG_TAG = VoicemailProviderSettingsUtil.class.getSimpleName();
31    private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
32
33    private static final String VM_NUMBERS_SHARED_PREFERENCES_NAME = "vm_numbers";
34
35    // Suffix appended to provider key for storing vm number
36    private static final String VM_NUMBER_TAG = "#VMNumber";
37    // Suffix appended to forward settings key for storing an individual setting
38    private static final String FWD_SETTING_TAG = "#Setting";
39    // Suffix appended to provider key for storing forwarding settings
40    private static final String FWD_SETTINGS_TAG = "#FWDSettings";
41    // Suffix appended to forward settings key for storing length of settings array
42    private static final String FWD_SETTINGS_LENGTH_TAG = "#Length";
43
44    // Suffixes appended to forward setting key for storing an individual setting properties
45    private static final String FWD_SETTING_STATUS = "#Status";
46    private static final String FWD_SETTING_REASON = "#Reason";
47    private static final String FWD_SETTING_NUMBER = "#Number";
48    private static final String FWD_SETTING_TIME = "#Time";
49
50    /**
51     * Returns settings previously stored for the currently selected voice mail provider. If no
52     * setting is stored for the voice mail provider, return null.
53     */
54    public static VoicemailProviderSettings load(Context context, String key) {
55        SharedPreferences prefs = getPrefs(context);
56
57        String vmNumberSetting = prefs.getString(key + VM_NUMBER_TAG, null);
58        if (vmNumberSetting == null) {
59            Log.w(LOG_TAG, "VoiceMailProvider settings for the key \"" + key + "\""
60                    + " were not found. Returning null.");
61            return null;
62        }
63
64        CallForwardInfo[] cfi = VoicemailProviderSettings.NO_FORWARDING;
65        String fwdKey = key + FWD_SETTINGS_TAG;
66        int fwdLen = prefs.getInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
67        if (fwdLen > 0) {
68            cfi = new CallForwardInfo[fwdLen];
69            for (int i = 0; i < cfi.length; i++) {
70                String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
71                cfi[i] = new CallForwardInfo();
72                cfi[i].status = prefs.getInt(settingKey + FWD_SETTING_STATUS, 0);
73                cfi[i].reason = prefs.getInt(
74                        settingKey + FWD_SETTING_REASON,
75                        CommandsInterface.CF_REASON_ALL_CONDITIONAL);
76                cfi[i].serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
77                cfi[i].toa = PhoneNumberUtils.TOA_International;
78                cfi[i].number = prefs.getString(settingKey + FWD_SETTING_NUMBER, "");
79                cfi[i].timeSeconds = prefs.getInt(settingKey + FWD_SETTING_TIME, 20);
80            }
81        }
82
83        VoicemailProviderSettings settings = new VoicemailProviderSettings(vmNumberSetting, cfi);
84        if (DBG) log("Loaded settings for " + key + ": " + settings.toString());
85        return settings;
86    }
87
88    /**
89     * Saves new VM provider settings and associates them with the currently selected provider if
90     * the settings are different than the ones already stored for this provider.
91     *
92     * These will be used later when the user switches a provider.
93     */
94    public static void save(Context context, String key, VoicemailProviderSettings newSettings) {
95        VoicemailProviderSettings curSettings = load(context, key);
96        if (newSettings.equals(curSettings)) {
97            if (DBG) log("save: Not saving setting for " + key + " since they have not changed");
98            return;
99        }
100
101        if (DBG) log("Saving settings for " + key + ": " + newSettings.toString());
102
103        SharedPreferences prefs = getPrefs(context);
104        SharedPreferences.Editor editor = prefs.edit();
105        editor.putString(key + VM_NUMBER_TAG, newSettings.getVoicemailNumber());
106        String fwdKey = key + FWD_SETTINGS_TAG;
107
108        CallForwardInfo[] s = newSettings.getForwardingSettings();
109        if (s != VoicemailProviderSettings.NO_FORWARDING) {
110            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, s.length);
111            for (int i = 0; i < s.length; i++) {
112                String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
113                CallForwardInfo fi = s[i];
114                editor.putInt(settingKey + FWD_SETTING_STATUS, fi.status);
115                editor.putInt(settingKey + FWD_SETTING_REASON, fi.reason);
116                editor.putString(settingKey + FWD_SETTING_NUMBER, fi.number);
117                editor.putInt(settingKey + FWD_SETTING_TIME, fi.timeSeconds);
118            }
119        } else {
120            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
121        }
122
123        editor.apply();
124    }
125
126    /**
127     * Deletes settings for the provider identified by this key.
128     */
129    public static void delete(Context context, String key) {
130        if (DBG) log("Deleting settings for" + key);
131
132        if (TextUtils.isEmpty(key)) {
133            return;
134        }
135
136        SharedPreferences prefs = getPrefs(context);
137        prefs.edit()
138                .putString(key + VM_NUMBER_TAG, null)
139                .putInt(key + FWD_SETTINGS_TAG + FWD_SETTINGS_LENGTH_TAG, 0)
140                .commit();
141    }
142
143    private static SharedPreferences getPrefs(Context context) {
144        return context.getSharedPreferences(
145                VM_NUMBERS_SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
146    }
147
148    private static void log(String msg) {
149        Log.d(LOG_TAG, msg);
150    }
151}
152