188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee/**
288b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee * Copyright (C) 2014 The Android Open Source Project
388b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee *
488b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee * Licensed under the Apache License, Version 2.0 (the "License");
588b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee * you may not use this file except in compliance with the License.
688b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee * You may obtain a copy of the License at
788b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee *
888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee *      http://www.apache.org/licenses/LICENSE-2.0
988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee *
1088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee * Unless required by applicable law or agreed to in writing, software
1188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee * distributed under the License is distributed on an "AS IS" BASIS,
1288b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1388b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee * See the License for the specific language governing permissions and
1488b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee * limitations under the License.
1588b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee */
1688b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
1788b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Leepackage com.android.phone.settings;
1888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
1988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Leeimport android.content.Context;
2088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Leeimport android.content.SharedPreferences;
2188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Leeimport android.telephony.PhoneNumberUtils;
2264e5c9dc774344f88b536589bd05d171ef5e3062Andrew Leeimport android.text.TextUtils;
2388b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Leeimport android.util.Log;
2488b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
2588b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Leeimport com.android.internal.telephony.CallForwardInfo;
2688b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Leeimport com.android.internal.telephony.CommandsInterface;
2788b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Leeimport com.android.phone.PhoneGlobals;
2888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
2988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Leepublic class VoicemailProviderSettingsUtil {
3088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    private static final String LOG_TAG = VoicemailProviderSettingsUtil.class.getSimpleName();
3188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
3288b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
3388b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    private static final String VM_NUMBERS_SHARED_PREFERENCES_NAME = "vm_numbers";
3488b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
3588b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    // Suffix appended to provider key for storing vm number
3688b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    private static final String VM_NUMBER_TAG = "#VMNumber";
3788b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    // Suffix appended to forward settings key for storing an individual setting
3888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    private static final String FWD_SETTING_TAG = "#Setting";
3988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    // Suffix appended to provider key for storing forwarding settings
4088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    private static final String FWD_SETTINGS_TAG = "#FWDSettings";
4188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    // Suffix appended to forward settings key for storing length of settings array
4288b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    private static final String FWD_SETTINGS_LENGTH_TAG = "#Length";
4388b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
4488b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    // Suffixes appended to forward setting key for storing an individual setting properties
4588b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    private static final String FWD_SETTING_STATUS = "#Status";
4688b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    private static final String FWD_SETTING_REASON = "#Reason";
4788b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    private static final String FWD_SETTING_NUMBER = "#Number";
4888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    private static final String FWD_SETTING_TIME = "#Time";
4988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
5088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    /**
5188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee     * Returns settings previously stored for the currently selected voice mail provider. If no
5288b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee     * setting is stored for the voice mail provider, return null.
5388b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee     */
546950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee    public static VoicemailProviderSettings load(Context context, String key) {
556950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee        SharedPreferences prefs = getPrefs(context);
566950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee
576950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee        String vmNumberSetting = prefs.getString(key + VM_NUMBER_TAG, null);
5888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        if (vmNumberSetting == null) {
5988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee            Log.w(LOG_TAG, "VoiceMailProvider settings for the key \"" + key + "\""
6088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                    + " were not found. Returning null.");
6188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee            return null;
6288b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        }
6388b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
6488b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        CallForwardInfo[] cfi = VoicemailProviderSettings.NO_FORWARDING;
6588b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        String fwdKey = key + FWD_SETTINGS_TAG;
666950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee        int fwdLen = prefs.getInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
6788b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        if (fwdLen > 0) {
6888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee            cfi = new CallForwardInfo[fwdLen];
6988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee            for (int i = 0; i < cfi.length; i++) {
7088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
7188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                cfi[i] = new CallForwardInfo();
726950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee                cfi[i].status = prefs.getInt(settingKey + FWD_SETTING_STATUS, 0);
736950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee                cfi[i].reason = prefs.getInt(
7488b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                        settingKey + FWD_SETTING_REASON,
7588b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                        CommandsInterface.CF_REASON_ALL_CONDITIONAL);
7688b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                cfi[i].serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
7788b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                cfi[i].toa = PhoneNumberUtils.TOA_International;
786950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee                cfi[i].number = prefs.getString(settingKey + FWD_SETTING_NUMBER, "");
796950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee                cfi[i].timeSeconds = prefs.getInt(settingKey + FWD_SETTING_TIME, 20);
8088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee            }
8188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        }
8288b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
8388b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        VoicemailProviderSettings settings = new VoicemailProviderSettings(vmNumberSetting, cfi);
8488b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        if (DBG) log("Loaded settings for " + key + ": " + settings.toString());
8588b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        return settings;
8688b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    }
8788b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
8888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    /**
8988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee     * Saves new VM provider settings and associates them with the currently selected provider if
9088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee     * the settings are different than the ones already stored for this provider.
9188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee     *
9288b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee     * These will be used later when the user switches a provider.
9388b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee     */
946950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee    public static void save(Context context, String key, VoicemailProviderSettings newSettings) {
956950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee        VoicemailProviderSettings curSettings = load(context, key);
9688b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        if (newSettings.equals(curSettings)) {
9788b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee            if (DBG) log("save: Not saving setting for " + key + " since they have not changed");
9888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee            return;
9988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        }
10088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
10188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        if (DBG) log("Saving settings for " + key + ": " + newSettings.toString());
10288b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
1036950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee        SharedPreferences prefs = getPrefs(context);
1046950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee        SharedPreferences.Editor editor = prefs.edit();
10588b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        editor.putString(key + VM_NUMBER_TAG, newSettings.getVoicemailNumber());
10688b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        String fwdKey = key + FWD_SETTINGS_TAG;
10788b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
10888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        CallForwardInfo[] s = newSettings.getForwardingSettings();
10988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        if (s != VoicemailProviderSettings.NO_FORWARDING) {
11088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, s.length);
11188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee            for (int i = 0; i < s.length; i++) {
11288b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
11388b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                CallForwardInfo fi = s[i];
11488b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                editor.putInt(settingKey + FWD_SETTING_STATUS, fi.status);
11588b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                editor.putInt(settingKey + FWD_SETTING_REASON, fi.reason);
11688b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                editor.putString(settingKey + FWD_SETTING_NUMBER, fi.number);
11788b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                editor.putInt(settingKey + FWD_SETTING_TIME, fi.timeSeconds);
11888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee            }
11988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        } else {
12088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
12188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        }
12288b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
12388b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        editor.apply();
12488b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    }
12588b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
12688b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    /**
12788b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee     * Deletes settings for the provider identified by this key.
12888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee     */
1296950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee    public static void delete(Context context, String key) {
13088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        if (DBG) log("Deleting settings for" + key);
13188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
13264e5c9dc774344f88b536589bd05d171ef5e3062Andrew Lee        if (TextUtils.isEmpty(key)) {
13364e5c9dc774344f88b536589bd05d171ef5e3062Andrew Lee            return;
13464e5c9dc774344f88b536589bd05d171ef5e3062Andrew Lee        }
13564e5c9dc774344f88b536589bd05d171ef5e3062Andrew Lee
1366950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee        SharedPreferences prefs = getPrefs(context);
1376950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee        prefs.edit()
13888b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                .putString(key + VM_NUMBER_TAG, null)
13988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                .putInt(key + FWD_SETTINGS_TAG + FWD_SETTINGS_LENGTH_TAG, 0)
14088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee                .commit();
14188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    }
14288b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee
1436950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee    private static SharedPreferences getPrefs(Context context) {
1446950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee        return context.getSharedPreferences(
1456950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee                VM_NUMBERS_SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
1466950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee    }
1476950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee
1486950c6cb7bc1e7db1b1b30dc53711261b4352934Andrew Lee    private static void log(String msg) {
14988b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee        Log.d(LOG_TAG, msg);
15088b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee    }
15188b51e2bf554e086b9cb49dd76ccb52c80e4f503Andrew Lee}
152