Java程序  |  152行  |  6.42 KB

/**
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.phone.settings;

import android.content.Context;
import android.content.SharedPreferences;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.Log;

import com.android.internal.telephony.CallForwardInfo;
import com.android.internal.telephony.CommandsInterface;
import com.android.phone.PhoneGlobals;

public class VoicemailProviderSettingsUtil {
    private static final String LOG_TAG = VoicemailProviderSettingsUtil.class.getSimpleName();
    private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);

    private static final String VM_NUMBERS_SHARED_PREFERENCES_NAME = "vm_numbers";

    // Suffix appended to provider key for storing vm number
    private static final String VM_NUMBER_TAG = "#VMNumber";
    // Suffix appended to forward settings key for storing an individual setting
    private static final String FWD_SETTING_TAG = "#Setting";
    // Suffix appended to provider key for storing forwarding settings
    private static final String FWD_SETTINGS_TAG = "#FWDSettings";
    // Suffix appended to forward settings key for storing length of settings array
    private static final String FWD_SETTINGS_LENGTH_TAG = "#Length";

    // Suffixes appended to forward setting key for storing an individual setting properties
    private static final String FWD_SETTING_STATUS = "#Status";
    private static final String FWD_SETTING_REASON = "#Reason";
    private static final String FWD_SETTING_NUMBER = "#Number";
    private static final String FWD_SETTING_TIME = "#Time";

    /**
     * Returns settings previously stored for the currently selected voice mail provider. If no
     * setting is stored for the voice mail provider, return null.
     */
    public static VoicemailProviderSettings load(Context context, String key) {
        SharedPreferences prefs = getPrefs(context);

        String vmNumberSetting = prefs.getString(key + VM_NUMBER_TAG, null);
        if (vmNumberSetting == null) {
            Log.w(LOG_TAG, "VoiceMailProvider settings for the key \"" + key + "\""
                    + " were not found. Returning null.");
            return null;
        }

        CallForwardInfo[] cfi = VoicemailProviderSettings.NO_FORWARDING;
        String fwdKey = key + FWD_SETTINGS_TAG;
        int fwdLen = prefs.getInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
        if (fwdLen > 0) {
            cfi = new CallForwardInfo[fwdLen];
            for (int i = 0; i < cfi.length; i++) {
                String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
                cfi[i] = new CallForwardInfo();
                cfi[i].status = prefs.getInt(settingKey + FWD_SETTING_STATUS, 0);
                cfi[i].reason = prefs.getInt(
                        settingKey + FWD_SETTING_REASON,
                        CommandsInterface.CF_REASON_ALL_CONDITIONAL);
                cfi[i].serviceClass = CommandsInterface.SERVICE_CLASS_VOICE;
                cfi[i].toa = PhoneNumberUtils.TOA_International;
                cfi[i].number = prefs.getString(settingKey + FWD_SETTING_NUMBER, "");
                cfi[i].timeSeconds = prefs.getInt(settingKey + FWD_SETTING_TIME, 20);
            }
        }

        VoicemailProviderSettings settings = new VoicemailProviderSettings(vmNumberSetting, cfi);
        if (DBG) log("Loaded settings for " + key + ": " + settings.toString());
        return settings;
    }

    /**
     * Saves new VM provider settings and associates them with the currently selected provider if
     * the settings are different than the ones already stored for this provider.
     *
     * These will be used later when the user switches a provider.
     */
    public static void save(Context context, String key, VoicemailProviderSettings newSettings) {
        VoicemailProviderSettings curSettings = load(context, key);
        if (newSettings.equals(curSettings)) {
            if (DBG) log("save: Not saving setting for " + key + " since they have not changed");
            return;
        }

        if (DBG) log("Saving settings for " + key + ": " + newSettings.toString());

        SharedPreferences prefs = getPrefs(context);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(key + VM_NUMBER_TAG, newSettings.getVoicemailNumber());
        String fwdKey = key + FWD_SETTINGS_TAG;

        CallForwardInfo[] s = newSettings.getForwardingSettings();
        if (s != VoicemailProviderSettings.NO_FORWARDING) {
            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, s.length);
            for (int i = 0; i < s.length; i++) {
                String settingKey = fwdKey + FWD_SETTING_TAG + String.valueOf(i);
                CallForwardInfo fi = s[i];
                editor.putInt(settingKey + FWD_SETTING_STATUS, fi.status);
                editor.putInt(settingKey + FWD_SETTING_REASON, fi.reason);
                editor.putString(settingKey + FWD_SETTING_NUMBER, fi.number);
                editor.putInt(settingKey + FWD_SETTING_TIME, fi.timeSeconds);
            }
        } else {
            editor.putInt(fwdKey + FWD_SETTINGS_LENGTH_TAG, 0);
        }

        editor.apply();
    }

    /**
     * Deletes settings for the provider identified by this key.
     */
    public static void delete(Context context, String key) {
        if (DBG) log("Deleting settings for" + key);

        if (TextUtils.isEmpty(key)) {
            return;
        }

        SharedPreferences prefs = getPrefs(context);
        prefs.edit()
                .putString(key + VM_NUMBER_TAG, null)
                .putInt(key + FWD_SETTINGS_TAG + FWD_SETTINGS_LENGTH_TAG, 0)
                .commit();
    }

    private static SharedPreferences getPrefs(Context context) {
        return context.getSharedPreferences(
                VM_NUMBERS_SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
    }

    private static void log(String msg) {
        Log.d(LOG_TAG, msg);
    }
}