com.crte.sipstackhome.ui.preferences.PreferencesWrapper.java Source code

Java tutorial

Introduction

Here is the source code for com.crte.sipstackhome.ui.preferences.PreferencesWrapper.java

Source

package com.crte.sipstackhome.ui.preferences;
/**
 * Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr)
 * This file is part of CSipSimple.
 * <p/>
 * CSipSimple is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * If you own a pjsip commercial license you can also redistribute it
 * and/or modify it under the terms of the GNU Lesser General Public License
 * as an android library.
 * <p/>
 * CSipSimple is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * <p/>
 * You should have received a copy of the GNU General Public License
 * along with CSipSimple.  If not, see <http://www.gnu.org/licenses/>.
 */

import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.text.TextUtils;

import com.crte.sipstackhome.api.SipConfigManager;
import com.crte.sipstackhome.utils.log.Log;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.util.HashMap;
import java.util.regex.Pattern;

public class PreferencesWrapper {

    //Internal use
    public static final String HAS_BEEN_QUIT = "has_been_quit"; // ?
    public static final String IS_ADVANCED_USER = "is_advanced_user";
    public static final String HAS_ALREADY_SETUP = "has_already_setup";
    public static final String HAS_ALREADY_SETUP_SERVICE = "has_already_setup_service";
    public static final String LAST_KNOWN_VERSION_PREF = "last_known_version";
    public static final String LAST_KNOWN_ANDROID_VERSION_PREF = "last_known_aos_version";

    private static final String THIS_FILE = "PreferencesWrapper";
    private SharedPreferences prefs;
    private ContentResolver resolver;
    private Context context;
    private Editor sharedEditor;

    /**
     * ?<br/>
     * ?
     */
    public final static HashMap<String, String> STRING_PREFS = new HashMap<String, String>() {
        private static final long serialVersionUID = 1L;

        {
            // ?
            put(SipConfigManager.USER_AGENT, "CSipSimple"); /*  */
            put(SipConfigManager.LOG_LEVEL, "1");

            put(SipConfigManager.USE_SRTP, "0");
            put(SipConfigManager.USE_ZRTP, "1"); /* 1 is no zrtp */
            put(SipConfigManager.UDP_TRANSPORT_PORT, "0");
            put(SipConfigManager.TCP_TRANSPORT_PORT, "0");
            put(SipConfigManager.TLS_TRANSPORT_PORT, "0");
            put(SipConfigManager.KEEP_ALIVE_INTERVAL_WIFI, "80");
            put(SipConfigManager.KEEP_ALIVE_INTERVAL_MOBILE, "40");
            put(SipConfigManager.TCP_KEEP_ALIVE_INTERVAL_WIFI, "180");
            put(SipConfigManager.TCP_KEEP_ALIVE_INTERVAL_MOBILE, "120");
            put(SipConfigManager.TLS_KEEP_ALIVE_INTERVAL_WIFI, "180");
            put(SipConfigManager.TLS_KEEP_ALIVE_INTERVAL_MOBILE, "120");
            put(SipConfigManager.RTP_PORT, "4000");
            put(SipConfigManager.OVERRIDE_NAMESERVER, "");
            put(SipConfigManager.TIMER_MIN_SE, "90");
            put(SipConfigManager.TIMER_SESS_EXPIRES, "1800");
            put(SipConfigManager.TSX_T1_TIMEOUT, "-1");
            put(SipConfigManager.TSX_T2_TIMEOUT, "-1");
            put(SipConfigManager.TSX_T4_TIMEOUT, "-1");
            put(SipConfigManager.TSX_TD_TIMEOUT, "-1");

            put(SipConfigManager.SND_AUTO_CLOSE_TIME, "1");
            put(SipConfigManager.ECHO_CANCELLATION_TAIL, "200");
            put(SipConfigManager.ECHO_MODE, "3"); /* WEBRTC */
            put(SipConfigManager.SND_MEDIA_QUALITY, "4");
            put(SipConfigManager.SND_CLOCK_RATE, "16000");
            put(SipConfigManager.SND_PTIME, "20");
            put(SipConfigManager.SIP_AUDIO_MODE, "0");
            put(SipConfigManager.MICRO_SOURCE, "1");
            put(SipConfigManager.THREAD_COUNT, "0");
            put(SipConfigManager.MEDIA_THREAD_COUNT, "1");
            put(SipConfigManager.HEADSET_ACTION, "0");
            put(SipConfigManager.AUDIO_IMPLEMENTATION, "0");
            put(SipConfigManager.H264_PROFILE, "66");
            put(SipConfigManager.H264_LEVEL, "0");
            put(SipConfigManager.H264_BITRATE, "0");
            put(SipConfigManager.VIDEO_CAPTURE_SIZE, "");

            put(SipConfigManager.STUN_SERVER, "stun.counterpath.com");
            put(SipConfigManager.TURN_SERVER, "");
            put(SipConfigManager.TURN_USERNAME, "");
            put(SipConfigManager.TURN_PASSWORD, "");
            put(SipConfigManager.TURN_TRANSPORT, "0");
            put(SipConfigManager.TLS_SERVER_NAME, "");
            put(SipConfigManager.CA_LIST_FILE, "");
            put(SipConfigManager.CERT_FILE, "");
            put(SipConfigManager.PRIVKEY_FILE, "");
            put(SipConfigManager.TLS_PASSWORD, "");
            put(SipConfigManager.TLS_METHOD, "0");
            put(SipConfigManager.NETWORK_ROUTES_POLLING, "0");

            put(SipConfigManager.DSCP_VAL, "24");
            put(SipConfigManager.DSCP_RTP_VAL, "46");
            put(SipConfigManager.DTMF_MODE, "0");
            put(SipConfigManager.DTMF_PAUSE_TIME, "300");
            put(SipConfigManager.DTMF_WAIT_TIME, "2000");

            put(SipConfigManager.GSM_INTEGRATION_TYPE, Integer.toString(SipConfigManager.GENERIC_TYPE_PREVENT));
            put(SipConfigManager.DIAL_PRESS_TONE_MODE, Integer.toString(SipConfigManager.GENERIC_TYPE_AUTO));
            put(SipConfigManager.DIAL_PRESS_VIBRATE_MODE, Integer.toString(SipConfigManager.GENERIC_TYPE_AUTO));
            put(SipConfigManager.DTMF_PRESS_TONE_MODE, Integer.toString(SipConfigManager.GENERIC_TYPE_PREVENT));
            put(SipConfigManager.UNLOCKER_TYPE, Integer.toString(SipConfigManager.GENERIC_TYPE_AUTO));

            put(SipConfigManager.DEFAULT_CALLER_ID, "");
            put(SipConfigManager.THEME, "");
            put(SipConfigManager.CALL_UI_PACKAGE, "");
            put(SipConfigManager.RINGTONE, "");
        }
    };

    private final static HashMap<String, Boolean> BOOLEAN_PREFS = new HashMap<String, Boolean>() {
        private static final long serialVersionUID = 1L;

        {
            //Network
            put(SipConfigManager.LOCK_WIFI, true);
            put(SipConfigManager.LOCK_WIFI_PERFS, false);
            put(SipConfigManager.ENABLE_TCP, true);
            put(SipConfigManager.ENABLE_UDP, true);
            put(SipConfigManager.ENABLE_TLS, false);
            put(SipConfigManager.USE_IPV6, false);
            put(SipConfigManager.ENABLE_DNS_SRV, false);
            put(SipConfigManager.ENABLE_ICE, false);
            put(SipConfigManager.ICE_AGGRESSIVE, true);
            put(SipConfigManager.ENABLE_TURN, false);
            put(SipConfigManager.ENABLE_STUN, false);
            put(SipConfigManager.ENABLE_STUN2, false);
            put(SipConfigManager.ENABLE_QOS, false);
            put(SipConfigManager.USE_COMPACT_FORM, false);
            put(SipConfigManager.USE_WIFI_IN, true);
            put(SipConfigManager.USE_WIFI_OUT, true);
            put(SipConfigManager.USE_OTHER_IN, true);
            put(SipConfigManager.USE_OTHER_OUT, true);
            put(SipConfigManager.USE_3G_IN, false);
            put(SipConfigManager.USE_3G_OUT, false);
            put(SipConfigManager.USE_GPRS_IN, false);
            put(SipConfigManager.USE_GPRS_OUT, false);
            put(SipConfigManager.USE_EDGE_IN, false);
            put(SipConfigManager.USE_EDGE_OUT, false);
            put(SipConfigManager.USE_ANYWAY_IN, false);
            put(SipConfigManager.USE_ANYWAY_OUT, false);
            put(SipConfigManager.USE_ROAMING_IN, true);
            put(SipConfigManager.USE_ROAMING_OUT, true);
            put(SipConfigManager.FORCE_NO_UPDATE, true);
            put(SipConfigManager.DISABLE_TCP_SWITCH, true);
            put(SipConfigManager.DISABLE_RPORT, false);
            put(SipConfigManager.ADD_BANDWIDTH_TIAS_IN_SDP, false);

            //Media
            put(SipConfigManager.ECHO_CANCELLATION, true);
            put(SipConfigManager.ENABLE_VAD, false);
            put(SipConfigManager.ENABLE_NOISE_SUPPRESSION, false);
            put(SipConfigManager.USE_SOFT_VOLUME, false);
            put(SipConfigManager.USE_ROUTING_API, false);
            put(SipConfigManager.USE_MODE_API, false);
            put(SipConfigManager.HAS_IO_QUEUE, true);
            put(SipConfigManager.SET_AUDIO_GENERATE_TONE, false);
            put(SipConfigManager.USE_SGS_CALL_HACK, false);
            put(SipConfigManager.USE_WEBRTC_HACK, false);
            put(SipConfigManager.DO_FOCUS_AUDIO, true);
            put(SipConfigManager.INTEGRATE_WITH_NATIVE_MUSIC, true);
            put(SipConfigManager.AUTO_CONNECT_BLUETOOTH, false);
            put(SipConfigManager.AUTO_CONNECT_SPEAKER, false);
            put(SipConfigManager.AUTO_DETECT_SPEAKER, false);
            put(SipConfigManager.CODECS_PER_BANDWIDTH, true);
            put(SipConfigManager.RESTART_AUDIO_ON_ROUTING_CHANGES, true);
            put(SipConfigManager.SETUP_AUDIO_BEFORE_INIT, true);

            //UI
            put(SipConfigManager.PREVENT_SCREEN_ROTATION, true);
            put(SipConfigManager.KEEP_AWAKE_IN_CALL, false);
            put(SipConfigManager.INVERT_PROXIMITY_SENSOR, false);
            put(SipConfigManager.ICON_IN_STATUS_BAR, true);
            put(SipConfigManager.USE_PARTIAL_WAKE_LOCK, false);
            put(SipConfigManager.ICON_IN_STATUS_BAR_NBR, false);
            put(SipConfigManager.INTEGRATE_WITH_CALLLOGS, true);
            put(SipConfigManager.INTEGRATE_WITH_DIALER, true);
            put(SipConfigManager.INTEGRATE_TEL_PRIVILEGED, false);
            put(HAS_BEEN_QUIT, false);
            put(HAS_ALREADY_SETUP_SERVICE, false);
            put(SipConfigManager.LOG_USE_DIRECT_FILE, false);
            put(SipConfigManager.START_WITH_TEXT_DIALER, false);
            put(SipConfigManager.REWRITE_RULES_DIALER, false);

            //Calls
            put(SipConfigManager.AUTO_RECORD_CALLS, false);
            put(SipConfigManager.SUPPORT_MULTIPLE_CALLS, false);
            put(SipConfigManager.USE_VIDEO, true);
            put(SipConfigManager.PLAY_WAITTONE_ON_HOLD, false);

            //Secure
            put(SipConfigManager.TLS_VERIFY_SERVER, false);
            put(SipConfigManager.TLS_VERIFY_CLIENT, false);
        }
    };

    private final static HashMap<String, Float> FLOAT_PREFS = new HashMap<String, Float>() {
        private static final long serialVersionUID = 1L;

        {
            put(SipConfigManager.SND_MIC_LEVEL, (float) 1.0);
            put(SipConfigManager.SND_SPEAKER_LEVEL, (float) 1.0);
            put(SipConfigManager.SND_BT_MIC_LEVEL, (float) 1.0);
            put(SipConfigManager.SND_BT_SPEAKER_LEVEL, (float) 1.0);
            put(SipConfigManager.SND_STREAM_LEVEL, (float) 8.0);
        }
    };

    /**
     * ??
     */
    private static boolean HAS_MANAGED_VERSION_UPGRADE = false;

    public PreferencesWrapper(Context aContext) {
        context = aContext;
        prefs = PreferenceManager.getDefaultSharedPreferences(aContext);
        resolver = aContext.getContentResolver();

        // Check if we need an upgrade here
        // BUNDLE MODE -- upgrade settings
        //      if(!HAS_MANAGED_VERSION_UPGRADE) {
        //            forceCheckUpgrade();
        //      }
    }

    /**
     * ?
     */
    //   public void forceCheckUpgrade() {
    //       Integer runningVersion = needUpgrade();
    //        if (runningVersion != null) {
    //            Editor editor = prefs.edit();
    //            editor.putInt(LAST_KNOWN_VERSION_PREF, runningVersion);
    //            editor.commit();
    //        }
    //        HAS_MANAGED_VERSION_UPGRADE = true;
    //   }

    /**
     * Check wether an upgrade is needed <br/>
     * ???
     *
     * @return null if not needed, else the new version to upgrade to
     */
    //    private Integer needUpgrade() {
    //        Integer runningVersion = null;
    //        // Application upgrade
    //        PackageInfo pinfo = PreferencesProviderWrapper.getCurrentPackageInfos(context);
    //        if (pinfo != null) {
    //            runningVersion = pinfo.versionCode;
    //            int lastSeenVersion = prefs.getInt(LAST_KNOWN_VERSION_PREF, 0);
    //
    //            Log.d(THIS_FILE, "Last known version is " + lastSeenVersion
    //                    + " and currently we are running " + runningVersion);
    //            if (lastSeenVersion != runningVersion) {
    //                Compatibility.updateVersion(this, lastSeenVersion, runningVersion);
    //            } else {
    //                runningVersion = null;
    //            }
    //        }
    //
    //        // Android upgrade
    //        if(prefs != null){
    //            int lastSeenVersion = prefs.getInt(LAST_KNOWN_ANDROID_VERSION_PREF, 0);
    //            Log.d(THIS_FILE, "Last known android version " + lastSeenVersion);
    //            if (lastSeenVersion != Compatibility.getApiLevel()) {
    //                Compatibility.updateApiVersion(this, lastSeenVersion, Compatibility.getApiLevel());
    //                Editor editor = prefs.edit();
    //                editor.putInt(LAST_KNOWN_ANDROID_VERSION_PREF, Compatibility.getApiLevel());
    //                editor.commit();
    //            }
    //        }
    //        return runningVersion;
    //    }

    /**
     * Enter in edit mode
     * To use for bulk modifications <br/>
     * ?<br/>
     * ?
     */
    public void startEditing() {
        sharedEditor = prefs.edit();
    }

    /**
     * Leave edit mode
     */
    public void endEditing() {
        if (sharedEditor != null) {
            sharedEditor.commit();
            sharedEditor = null;
        }
    }

    //Public setters

    /**
     * Set a preference string value
     *
     * @param key   the preference key to set
     * @param value the value for this key
     */
    public void setPreferenceStringValue(String key, String value) {
        if (sharedEditor == null) {
            Editor editor = prefs.edit();
            editor.putString(key, value);
            editor.commit();
        } else {
            sharedEditor.putString(key, value);
        }
    }

    /**
     * Set a preference boolean value
     *
     * @param key   the preference key to set
     * @param value the value for this key
     */
    public void setPreferenceBooleanValue(String key, boolean value) {
        if (sharedEditor == null) {
            Editor editor = prefs.edit();
            editor.putBoolean(key, value);
            editor.commit();
        } else {
            sharedEditor.putBoolean(key, value);
        }
    }

    /**
     * Set a preference float value
     *
     * @param key   the preference key to set
     * @param value the value for this key
     */
    public void setPreferenceFloatValue(String key, float value) {
        if (sharedEditor == null) {
            Editor editor = prefs.edit();
            editor.putFloat(key, value);
            editor.commit();
        } else {
            sharedEditor.putFloat(key, value);
        }
    }

    /**
     * ?
     *
     * @param aPrefs
     * @param key
     * @return
     */
    private static String gPrefStringValue(SharedPreferences aPrefs, String key) {
        if (aPrefs == null) {
            return STRING_PREFS.get(key);
        }
        if (STRING_PREFS.containsKey(key)) {
            return aPrefs.getString(key, STRING_PREFS.get(key));
        }
        return aPrefs.getString(key, (String) null);
    }

    /**
     * boolean?
     *
     * @param aPrefs
     * @param key
     * @return
     */
    private static Boolean gPrefBooleanValue(SharedPreferences aPrefs, String key) {
        if (aPrefs == null) {
            return BOOLEAN_PREFS.get(key);
        }
        if (BOOLEAN_PREFS.containsKey(key)) {
            return aPrefs.getBoolean(key, BOOLEAN_PREFS.get(key));
        }
        if (aPrefs.contains(key)) {
            return aPrefs.getBoolean(key, false);
        }
        return null;
    }

    /**
     * float?
     *
     * @param aPrefs
     * @param key
     * @return
     */
    private static Float gPrefFloatValue(SharedPreferences aPrefs, String key) {
        if (aPrefs == null) {
            return FLOAT_PREFS.get(key);
        }
        if (FLOAT_PREFS.containsKey(key)) {
            return aPrefs.getFloat(key, FLOAT_PREFS.get(key));
        }
        if (aPrefs.contains(key)) {
            return aPrefs.getFloat(key, 0.0f);
        }
        return null;
    }

    public static Class<?> gPrefClass(String key) {
        if (STRING_PREFS.containsKey(key)) {
            return String.class;
        } else if (BOOLEAN_PREFS.containsKey(key)) {
            return Boolean.class;
        } else if (FLOAT_PREFS.containsKey(key)) {
            return Float.class;
        }
        return null;
    }

    /**
     * Get string preference value
     *
     * @param key the key preference to retrieve
     * @return the value
     */
    public String getPreferenceStringValue(String key) {
        return gPrefStringValue(prefs, key);
    }

    /**
     * Get boolean preference value
     *
     * @param key the key preference to retrieve
     * @return the value
     */
    public Boolean getPreferenceBooleanValue(String key) {
        return gPrefBooleanValue(prefs, key);
    }

    /**
     * Get float preference value
     *
     * @param key the key preference to retrieve
     * @return the value
     */
    public Float getPreferenceFloatValue(String key) {
        return gPrefFloatValue(prefs, key);
    }

    /**
     * Get integer preference value
     *
     * @param key the key preference to retrieve
     * @return the value
     */
    public Integer getPreferenceIntegerValue(String key) {
        try {
            return Integer.parseInt(getPreferenceStringValue(key));
        } catch (NumberFormatException e) {
            Log.d(THIS_FILE, "Invalid " + key + " format : expect a int");
        }
        String val = STRING_PREFS.get(key);
        if (val != null) {
            return Integer.parseInt(val);
        }
        return null;
    }

    /**
     * Set all values to default
     */
    //   public void resetAllDefaultValues() {
    //      for(String key : STRING_PREFS.keySet() ) {
    //         setPreferenceStringValue(key, STRING_PREFS.get(key));
    //      }
    //      for(String key : BOOLEAN_PREFS.keySet() ) {
    //         setPreferenceBooleanValue(key, BOOLEAN_PREFS.get(key));
    //      }
    //      for(String key : FLOAT_PREFS.keySet() ) {
    //         setPreferenceFloatValue(key, FLOAT_PREFS.get(key));
    //      }
    //      Compatibility.setFirstRunParameters(this);
    //      setPreferenceBooleanValue(PreferencesProviderWrapper.HAS_ALREADY_SETUP_SERVICE, true);
    //   }
    public JSONObject serializeSipSettings() {
        JSONObject jsonSipSettings = new JSONObject();
        for (String key : STRING_PREFS.keySet()) {
            try {
                jsonSipSettings.put(key, getPreferenceStringValue(key));
            } catch (JSONException e) {
                Log.e(THIS_FILE, "Not able to add preference " + key);
            }
        }
        for (String key : BOOLEAN_PREFS.keySet()) {
            try {
                jsonSipSettings.put(key, getPreferenceBooleanValue(key));
            } catch (JSONException e) {
                Log.e(THIS_FILE, "Not able to add preference " + key);
            }
        }
        for (String key : FLOAT_PREFS.keySet()) {
            try {
                jsonSipSettings.put(key, getPreferenceFloatValue(key).doubleValue());
            } catch (JSONException e) {
                Log.e(THIS_FILE, "Not able to add preference " + key);
            }
        }

        // And get latest known version so that restore will be able to apply necessary patches
        int lastSeenVersion = prefs.getInt(LAST_KNOWN_VERSION_PREF, 0);
        try {
            jsonSipSettings.put(LAST_KNOWN_VERSION_PREF, lastSeenVersion);
        } catch (JSONException e) {
            Log.e(THIS_FILE, "Not able to add last known version pref");
        }
        return jsonSipSettings;
    }

    /**
     * Restore settings from a json object
     *
     * @param jsonSipSettings the json objet to restore from
     */
    public void restoreSipSettings(JSONObject jsonSipSettings) {

        startEditing();
        for (String key : STRING_PREFS.keySet()) {
            try {
                String val = jsonSipSettings.getString(key);
                if (val != null) {
                    setPreferenceStringValue(key, val);
                }
            } catch (JSONException e) {
                Log.e(THIS_FILE, "Not able to get preference " + key);
            }
        }
        for (String key : BOOLEAN_PREFS.keySet()) {
            try {
                Boolean val = jsonSipSettings.getBoolean(key);
                if (val != null) {
                    setPreferenceBooleanValue(key, val);
                }
            } catch (JSONException e) {
                Log.e(THIS_FILE, "Not able to get preference " + key);
            }
        }
        for (String key : FLOAT_PREFS.keySet()) {
            try {
                Double val = jsonSipSettings.getDouble(key);
                if (val != null) {
                    setPreferenceFloatValue(key, val.floatValue());
                }
            } catch (JSONException e) {
                Log.e(THIS_FILE, "Not able to get preference " + key);
            }

            getPreferenceFloatValue(key);
        }

        // And get latest known version so that restore will be able to apply necessary patches
        try {
            Integer lastSeenVersion = jsonSipSettings.getInt(LAST_KNOWN_VERSION_PREF);
            if (lastSeenVersion != null) {
                sharedEditor.putInt(LAST_KNOWN_VERSION_PREF, lastSeenVersion);
            }
        } catch (JSONException e) {
            Log.e(THIS_FILE, "Not able to add last known version pref");
        }

        endEditing();
    }

    private boolean hasStunServer(String string) {
        String[] servers = getPreferenceStringValue(SipConfigManager.STUN_SERVER).split(",");
        for (String server : servers) {
            if (server.equalsIgnoreCase(string)) {
                return true;
            }
        }

        return false;
    }

    public void addStunServer(String server) {
        if (!hasStunServer(server)) {
            String oldStuns = getPreferenceStringValue(SipConfigManager.STUN_SERVER);
            Log.d(THIS_FILE, "Old stun > " + oldStuns + " vs " + STRING_PREFS.get(SipConfigManager.STUN_SERVER));
            if (oldStuns.equalsIgnoreCase(STRING_PREFS.get(SipConfigManager.STUN_SERVER))) {
                oldStuns = "";
            } else {
                oldStuns += ",";
            }

            setPreferenceStringValue(SipConfigManager.STUN_SERVER, oldStuns + server);
        }

    }

    // Codec
    public short getCodecPriority(String codecName, String type, String defaultValue) {
        String key = SipConfigManager.getCodecKey(codecName, type);
        if (key != null) {
            try {
                return (short) Integer.parseInt(prefs.getString(key, defaultValue));
            } catch (NumberFormatException e) {
                Log.e(THIS_FILE, "Invalid codec priority", e);
            }
        }
        return (short) Integer.parseInt(defaultValue);
    }

    public void setCodecPriority(String codecName, String type, String newValue) {
        String key = SipConfigManager.getCodecKey(codecName, type);
        if (key != null) {
            setPreferenceStringValue(key, newValue);
        }
        //TODO : else raise error
    }

    // ----
    // UI related
    // ----
    public boolean dialPressTone(boolean inCall) {
        Integer mode = getPreferenceIntegerValue(
                inCall ? SipConfigManager.DTMF_PRESS_TONE_MODE : SipConfigManager.DIAL_PRESS_TONE_MODE);
        if (mode == null) {
            mode = inCall ? SipConfigManager.GENERIC_TYPE_PREVENT : SipConfigManager.GENERIC_TYPE_AUTO;
        }
        switch (mode) {
        case SipConfigManager.GENERIC_TYPE_AUTO:
            return Settings.System.getInt(resolver, Settings.System.DTMF_TONE_WHEN_DIALING, 1) == 1;
        case SipConfigManager.GENERIC_TYPE_FORCE:
            return true;
        case SipConfigManager.GENERIC_TYPE_PREVENT:
            return false;
        default:
            break;
        }
        return false;
    }

    public boolean dialPressVibrate() {
        int mode = getPreferenceIntegerValue(SipConfigManager.DIAL_PRESS_VIBRATE_MODE);
        switch (mode) {
        case SipConfigManager.GENERIC_TYPE_AUTO:
            return Settings.System.getInt(resolver, Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) == 1;
        case SipConfigManager.GENERIC_TYPE_FORCE:
            return true;
        case SipConfigManager.GENERIC_TYPE_PREVENT:
            return false;
        default:
            break;
        }
        return false;
    }

    private final static String CONFIG_FOLDER = "configs";
    private final static String RECORDS_FOLDER = "records";
    private final static String LOGS_FOLDER = "logs";

    /**
     * 
     * @param ctxt
     * @param preferCache
     * @return
     */
    private static File getStorageFolder(Context ctxt, boolean preferCache) {
        File root = Environment.getExternalStorageDirectory();
        if (!root.canWrite() || preferCache) {
            root = ctxt.getCacheDir();
        }

        if (root.canWrite()) {
            File dir = new File(root.getAbsolutePath() + File.separator
                    + /*CustomDistribution.getSDCardFolder()*/ "SipStackHome");
            if (!dir.exists()) {
                dir.mkdirs();
                Log.d(THIS_FILE, " " + dir.getAbsolutePath());
            }
            return dir;
        }
        return null;
    }

    /**
     * 
     * @param ctxt
     * @param subFolder
     * @param preferCache
     * @return
     */
    private static File getSubFolder(Context ctxt, String subFolder, boolean preferCache) {
        File root = getStorageFolder(ctxt, preferCache);
        if (root != null) {
            File dir = new File(root.getAbsoluteFile() + File.separator + subFolder);
            dir.mkdirs();
            return dir;
        }
        return null;
    }

    //   public static File getConfigFolder(Context ctxt) {
    //      return getSubFolder(ctxt, CONFIG_FOLDER, false);
    //   }

    /**
     * 
     * @param ctxt
     * @return
     */
    public static File getRecordsFolder(Context ctxt) {
        return getSubFolder(ctxt, RECORDS_FOLDER, false);
    }

    //   public static File getLogsFolder(Context ctxt) {
    //      return getSubFolder(ctxt, LOGS_FOLDER, false);
    //   }

    //   public static File getLogsFile(Context ctxt, boolean isPjsip) {
    //        File dir = PreferencesWrapper.getLogsFolder(ctxt);
    //        File outFile = null;
    //        if( dir != null) {
    //            Date d = new Date();
    //            StringBuffer fileName = new StringBuffer();
    //            if(isPjsip) {
    //                fileName.append("pjsip");
    //            }
    //            fileName.append("logs_");
    //            fileName.append(DateFormat.format("yy-MM-dd_kkmmss", d));
    //            fileName.append(".txt");
    //            outFile = new File(dir.getAbsoluteFile() + File.separator + fileName.toString());
    //        }
    //
    //        return outFile;
    //   }

    public static File getZrtpFolder(Context ctxt) {
        return ctxt.getFilesDir();
        /*return getSubFolder(ctxt, ZRTP_FOLDER, true);*/
    }

    //   public static void cleanLogsFiles(Context ctxt) {
    //      File logsFolder = getLogsFolder(ctxt);
    //      if(logsFolder != null) {
    //         File[] files = logsFolder.listFiles();
    //         if(files != null) {
    //             for(File file: files) {
    //                if(file.isFile()) {
    //                   file.delete();
    //                }
    //             }
    //         }
    //      }
    //   }

    /**
     * Get current mode for the user
     * By default the user is a default user. If becomes an advanced user he will have access to expert mode.
     *
     * @return
     */
    public boolean isAdvancedUser() {
        return prefs.getBoolean(IS_ADVANCED_USER, false);
    }

    /**
     * Toogle the user into an expert user. It will give him access to expert settings if was an expert user
     */
    public void toogleExpertMode() {
        setPreferenceBooleanValue(IS_ADVANCED_USER, !isAdvancedUser());
    }

    /**
     * Turn the application as quited by user. It will not register anymore
     *
     * @param quit true if the app should be considered as finished.
     */
    public void setQuit(boolean quit) {
        setPreferenceBooleanValue(HAS_BEEN_QUIT, quit);
    }

    // Codec list management -- only internal use set at each start of the sip stack
    public static final String CODECS_SEPARATOR = "|";
    public static final String CODECS_LIST = "codecs_list";
    public static final String CODECS_VIDEO_LIST = "codecs_video_list";
    public static final String BACKUP_PREFIX = "backup_";
    public static final String LIB_CAP_TLS = "cap_tls";
    public static final String LIB_CAP_SRTP = "cap_srtp";

    /**
     * Get list of audio codecs registered in preference system
     *
     * @return List of possible audio codecs
     * @see PreferencesProviderWrapper#setCodecList(java.util.List)
     */
    public String[] getCodecList() {
        return TextUtils.split(prefs.getString(CODECS_LIST, ""), Pattern.quote(CODECS_SEPARATOR));
    }

    /**
     * Get list of video codecs registered in preference system by
     *
     * @return List of possible video codecs
     * @see PreferencesProviderWrapper#setVideoCodecList(java.util.List)
     */
    public String[] getVideoCodecList() {
        return TextUtils.split(prefs.getString(CODECS_VIDEO_LIST, ""), Pattern.quote(CODECS_SEPARATOR));
    }

    /**
     * Get the capability of the lib registered in preference system
     *
     * @param cap on of the lib capabilty. <br/>
     *            For now valid caps are
     *            {@link PreferencesProviderWrapper#LIB_CAP_SRTP} and
     *            {@link PreferencesProviderWrapper#LIB_CAP_TLS}
     * @return True if the lib if capable of this feature
     */
    public boolean getLibCapability(String cap) {
        return prefs.getBoolean(BACKUP_PREFIX + cap, false);
    }

    /**
     * Retrieve the context used for this preference wrapper
     *
     * @return an android context
     */
    public Context getContext() {
        return context;
    }

}