/** * Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr) * This file is part of CSipSimple. * * 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. * * 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. * * You should have received a copy of the GNU General Public License * along with CSipSimple. If not, see <http://www.gnu.org/licenses/>. */ package com.csipsimple.wizards.impl; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.text.TextUtils; import com.csipsimple.R; import com.csipsimple.api.SipProfile; import com.csipsimple.utils.Log; import java.util.HashMap; public class Expert extends BaseImplementation { private static final String THIS_FILE = "Expert"; private EditTextPreference accountDisplayName; private EditTextPreference accountAccId; private EditTextPreference accountRegUri; private EditTextPreference accountUserName; private EditTextPreference accountData; private CheckBoxPreference accountInitAuth; private EditTextPreference accountAuthAlgo; private ListPreference accountDataType; private EditTextPreference accountRealm; private ListPreference accountScheme, accountDefaultUriScheme; private ListPreference accountTransport; private CheckBoxPreference accountPublishEnabled; private EditTextPreference accountRegTimeout; // private EditTextPreference accountKaInterval; private EditTextPreference accountForceContact; private CheckBoxPreference accountAllowContactRewrite; private CheckBoxPreference accountAllowViaRewrite; private CheckBoxPreference accountAllowSdpNatRewrite; private ListPreference accountContactRewriteMethod; private EditTextPreference accountProxy; private ListPreference accountUseSrtp; private ListPreference accountUseZrtp; private EditTextPreference accountRegDelayRefresh; private EditTextPreference accountVm; private CheckBoxPreference mwiEnabled; private CheckBoxPreference tryCleanRegisters; private CheckBoxPreference useRfc5626; private EditTextPreference rfc5626_regId; private EditTextPreference rfc5626_instanceId; private ListPreference vidOutAutoTransmit; private ListPreference vidInAutoShow; private ListPreference rtpEnableQos; private EditTextPreference rtpPort, rtpPublicAddr, rtpBoundAddr, rtpQosDscp; private ListPreference sipStunUse, mediaStunUse; private CheckBoxPreference iceCfgUse, iceCfgEnable, turnCfgUse, turnCfgEnable; private EditTextPreference turnCfgServer, turnCfgUser, turnCfgPassword; private CheckBoxPreference ipv6MediaEnable; private void bindFields() { accountDisplayName = (EditTextPreference) findPreference(SipProfile.FIELD_DISPLAY_NAME); accountAccId = (EditTextPreference) findPreference(SipProfile.FIELD_ACC_ID); accountRegUri = (EditTextPreference) findPreference(SipProfile.FIELD_REG_URI); accountRealm = (EditTextPreference) findPreference(SipProfile.FIELD_REALM); accountUserName = (EditTextPreference) findPreference(SipProfile.FIELD_USERNAME); accountData = (EditTextPreference) findPreference(SipProfile.FIELD_DATA); accountDataType = (ListPreference) findPreference(SipProfile.FIELD_DATATYPE); accountAuthAlgo = (EditTextPreference) findPreference(SipProfile.FIELD_AUTH_ALGO); accountInitAuth = (CheckBoxPreference) findPreference(SipProfile.FIELD_AUTH_INITIAL_AUTH); accountScheme = (ListPreference) findPreference(SipProfile.FIELD_SCHEME); accountTransport = (ListPreference) findPreference(SipProfile.FIELD_TRANSPORT); accountDefaultUriScheme = (ListPreference) findPreference(SipProfile.FIELD_DEFAULT_URI_SCHEME); accountUseSrtp = (ListPreference) findPreference(SipProfile.FIELD_USE_SRTP); accountUseZrtp = (ListPreference) findPreference(SipProfile.FIELD_USE_ZRTP); accountPublishEnabled = (CheckBoxPreference) findPreference(SipProfile.FIELD_PUBLISH_ENABLED); accountRegTimeout = (EditTextPreference) findPreference(SipProfile.FIELD_REG_TIMEOUT); accountRegDelayRefresh = (EditTextPreference) findPreference(SipProfile.FIELD_REG_DELAY_BEFORE_REFRESH); accountForceContact = (EditTextPreference) findPreference(SipProfile.FIELD_FORCE_CONTACT); accountAllowContactRewrite = (CheckBoxPreference) findPreference(SipProfile.FIELD_ALLOW_CONTACT_REWRITE); accountAllowViaRewrite = (CheckBoxPreference) findPreference(SipProfile.FIELD_ALLOW_VIA_REWRITE); accountAllowSdpNatRewrite = (CheckBoxPreference) findPreference(SipProfile.FIELD_ALLOW_SDP_NAT_REWRITE); accountContactRewriteMethod = (ListPreference) findPreference(SipProfile.FIELD_CONTACT_REWRITE_METHOD); accountProxy = (EditTextPreference) findPreference(SipProfile.FIELD_PROXY); accountVm = (EditTextPreference) findPreference(SipProfile.FIELD_VOICE_MAIL_NBR); mwiEnabled = (CheckBoxPreference) findPreference(SipProfile.FIELD_MWI_ENABLED); tryCleanRegisters = (CheckBoxPreference) findPreference(SipProfile.FIELD_TRY_CLEAN_REGISTERS); useRfc5626 = (CheckBoxPreference) findPreference(SipProfile.FIELD_USE_RFC5626); rfc5626_instanceId = (EditTextPreference) findPreference(SipProfile.FIELD_RFC5626_INSTANCE_ID); rfc5626_regId = (EditTextPreference) findPreference(SipProfile.FIELD_RFC5626_REG_ID); vidInAutoShow = (ListPreference) findPreference(SipProfile.FIELD_VID_IN_AUTO_SHOW); vidOutAutoTransmit = (ListPreference) findPreference(SipProfile.FIELD_VID_OUT_AUTO_TRANSMIT); rtpEnableQos = (ListPreference) findPreference(SipProfile.FIELD_RTP_ENABLE_QOS); rtpQosDscp = (EditTextPreference) findPreference(SipProfile.FIELD_RTP_QOS_DSCP); rtpPort = (EditTextPreference) findPreference(SipProfile.FIELD_RTP_PORT); rtpBoundAddr = (EditTextPreference) findPreference(SipProfile.FIELD_RTP_BOUND_ADDR); rtpPublicAddr = (EditTextPreference) findPreference(SipProfile.FIELD_RTP_PUBLIC_ADDR); sipStunUse = (ListPreference) findPreference(SipProfile.FIELD_SIP_STUN_USE); mediaStunUse = (ListPreference) findPreference(SipProfile.FIELD_MEDIA_STUN_USE); iceCfgUse = (CheckBoxPreference) findPreference(SipProfile.FIELD_ICE_CFG_USE); iceCfgEnable = (CheckBoxPreference) findPreference(SipProfile.FIELD_ICE_CFG_ENABLE); turnCfgUse = (CheckBoxPreference) findPreference(SipProfile.FIELD_TURN_CFG_USE); turnCfgEnable = (CheckBoxPreference) findPreference(SipProfile.FIELD_TURN_CFG_ENABLE); turnCfgServer = (EditTextPreference) findPreference(SipProfile.FIELD_TURN_CFG_SERVER); turnCfgUser = (EditTextPreference) findPreference(SipProfile.FIELD_TURN_CFG_USER); turnCfgPassword = (EditTextPreference) findPreference(SipProfile.FIELD_TURN_CFG_PASSWORD); ipv6MediaEnable = (CheckBoxPreference) findPreference(SipProfile.FIELD_IPV6_MEDIA_USE); } public void fillLayout(final SipProfile account) { bindFields(); accountDisplayName.setText(account.display_name); accountAccId.setText(account.acc_id); accountRegUri.setText(account.reg_uri); accountRealm.setText(account.realm); accountUserName.setText(account.username); accountData.setText(account.data); { String scheme = account.scheme; if (scheme != null && !scheme.equals("")) { accountScheme.setValue(scheme); } else { accountScheme.setValue(SipProfile.CRED_SCHEME_DIGEST); } } { int ctype = account.datatype; if (ctype == SipProfile.CRED_DATA_PLAIN_PASSWD) { accountDataType.setValueIndex(0); } else if (ctype == SipProfile.CRED_DATA_DIGEST) { accountDataType.setValueIndex(1); } //DISABLED SINCE NOT SUPPORTED YET /* else if (ctype ==SipProfile.CRED_CRED_DATA_EXT_AKA) { accountDataType.setValueIndex(2); } */else { accountDataType.setValueIndex(0); } } accountInitAuth.setChecked(account.initial_auth); accountAuthAlgo.setText(account.auth_algo); accountTransport.setValue(account.transport.toString()); if(!TextUtils.isEmpty(account.default_uri_scheme)) { accountDefaultUriScheme.setValue(account.default_uri_scheme); } accountPublishEnabled.setChecked((account.publish_enabled == 1)); accountRegTimeout.setText(Long.toString(account.reg_timeout)); accountRegDelayRefresh.setText(Long.toString(account.reg_delay_before_refresh)); accountForceContact.setText(account.force_contact); accountAllowContactRewrite.setChecked(account.allow_contact_rewrite); accountAllowViaRewrite.setChecked(account.allow_via_rewrite); accountAllowSdpNatRewrite.setChecked(account.allow_sdp_nat_rewrite); accountContactRewriteMethod.setValue(Integer.toString(account.contact_rewrite_method)); if(account.proxies != null) { accountProxy.setText(TextUtils.join(SipProfile.PROXIES_SEPARATOR, account.proxies)); }else { accountProxy.setText(""); } Log.d(THIS_FILE, "use srtp : " + account.use_srtp); accountUseSrtp.setValueIndex(account.use_srtp + 1); accountUseZrtp.setValueIndex(account.use_zrtp + 1); useRfc5626.setChecked(account.use_rfc5626); rfc5626_instanceId.setText(account.rfc5626_instance_id); rfc5626_regId.setText(account.rfc5626_reg_id); rtpEnableQos.setValue(Integer.toString(account.rtp_enable_qos)); rtpQosDscp.setText(Integer.toString(account.rtp_qos_dscp)); rtpPort.setText(Integer.toString(account.rtp_port)); rtpBoundAddr.setText(account.rtp_bound_addr); rtpPublicAddr.setText(account.rtp_public_addr); vidInAutoShow.setValue(Integer.toString(account.vid_in_auto_show)); vidOutAutoTransmit.setValue(Integer.toString(account.vid_out_auto_transmit)); accountVm.setText(account.vm_nbr); mwiEnabled.setChecked(account.mwi_enabled); tryCleanRegisters.setChecked(account.try_clean_registers != 0); sipStunUse.setValue(Integer.toString(account.sip_stun_use)); mediaStunUse.setValue(Integer.toString(account.media_stun_use)); iceCfgUse.setChecked(account.ice_cfg_use == 1); iceCfgEnable.setChecked(account.ice_cfg_enable == 1); turnCfgUse.setChecked(account.turn_cfg_use == 1); turnCfgEnable.setChecked(account.turn_cfg_enable == 1); turnCfgServer.setText(account.turn_cfg_server); turnCfgUser.setText(account.turn_cfg_user); turnCfgPassword.setText(account.turn_cfg_password); ipv6MediaEnable.setChecked(account.ipv6_media_use == 1); } public void updateDescriptions() { setStringFieldSummary(SipProfile.FIELD_DISPLAY_NAME); setStringFieldSummary(SipProfile.FIELD_ACC_ID); setStringFieldSummary(SipProfile.FIELD_REG_URI); setStringFieldSummary(SipProfile.FIELD_REALM); setStringFieldSummary(SipProfile.FIELD_USERNAME); setStringFieldSummary(SipProfile.FIELD_PROXY); setPasswordFieldSummary(SipProfile.FIELD_DATA); setListFieldSummary(SipProfile.FIELD_DATATYPE); setStringFieldSummary(SipProfile.FIELD_REG_DELAY_BEFORE_REFRESH); setListFieldSummary(SipProfile.FIELD_USE_SRTP); setListFieldSummary(SipProfile.FIELD_DEFAULT_URI_SCHEME); } private static HashMap<String, Integer>SUMMARIES = new HashMap<String, Integer>(){/** * */ private static final long serialVersionUID = -5469900404720631144L; { put(SipProfile.FIELD_DISPLAY_NAME, R.string.w_common_display_name_desc); put(SipProfile.FIELD_ACC_ID, R.string.w_expert_acc_id_desc); put(SipProfile.FIELD_REG_URI, R.string.w_expert_reg_uri_desc); put(SipProfile.FIELD_REALM, R.string.w_expert_realm_desc); put(SipProfile.FIELD_USERNAME, R.string.w_expert_username_desc); put(SipProfile.FIELD_PROXY, R.string.w_expert_proxy_desc); put(SipProfile.FIELD_DATA, R.string.w_expert_data_desc); put(SipProfile.FIELD_DATATYPE, R.string.w_expert_datatype_desc); put(SipProfile.FIELD_REG_DELAY_BEFORE_REFRESH, R.string.w_expert_reg_dbr_desc); put(SipProfile.FIELD_USE_SRTP, R.string.use_srtp_desc); put(SipProfile.FIELD_DEFAULT_URI_SCHEME, R.string.w_expert_default_uri_scheme_desc); }}; @Override public String getDefaultFieldSummary(String fieldName) { Integer res = SUMMARIES.get(fieldName); if(res != null) { return parent.getString( res ); } return ""; } public boolean canSave() { boolean isValid = true; isValid &= checkField(accountDisplayName, isEmpty(accountDisplayName)); isValid &= checkField(accountAccId, isEmpty(accountAccId) || !isMatching(accountAccId, "[^<]*<sip(s)?:[^@]*@[^@]*>")); isValid &= checkField(accountRegUri, !isEmpty(accountRegUri) && !isMatching(accountRegUri, "sip(s)?:.*")); isValid &= checkField(accountProxy, !isEmpty(accountProxy) && !isMatching(accountProxy, "sip(s)?:.*")); return isValid; } private static int getIntValue(ListPreference pref, int defaultValue) { try { return Integer.parseInt(pref.getValue()); }catch(NumberFormatException e) { Log.e(THIS_FILE, "List item is not a number"); } return defaultValue; } private static int getIntValue(EditTextPreference pref, int defaultValue) { try { return Integer.parseInt(pref.getText()); }catch(NumberFormatException e) { Log.e(THIS_FILE, "List item is not a number"); } return defaultValue; } public SipProfile buildAccount(SipProfile account) { account.display_name = accountDisplayName.getText(); account.transport = getIntValue(accountTransport, SipProfile.TRANSPORT_UDP); account.default_uri_scheme = accountDefaultUriScheme.getValue(); account.acc_id = getText(accountAccId); account.reg_uri = getText(accountRegUri); account.use_srtp = getIntValue(accountUseSrtp, -1); account.use_zrtp = getIntValue(accountUseZrtp, -1); if (!isEmpty(accountUserName)) { account.realm = getText(accountRealm); account.username = getText(accountUserName); account.data = getText(accountData); account.scheme = accountScheme.getValue(); String dataType = accountDataType.getValue(); if(dataType.equalsIgnoreCase("0")) { account.datatype = SipProfile.CRED_DATA_PLAIN_PASSWD; }else if(dataType.equalsIgnoreCase("1")){ account.datatype = SipProfile.CRED_DATA_DIGEST; } //DISABLED SINCE NOT SUPPORTED YET /*else if(dataType.equalsIgnoreCase("16")){ ci.setData_type(SipProfile.CRED_DATA_EXT_AKA); } */else { account.datatype = SipProfile.CRED_DATA_PLAIN_PASSWD; } } else { account.realm = ""; account.username = ""; account.data = ""; account.scheme = SipProfile.CRED_SCHEME_DIGEST; account.datatype = SipProfile.CRED_DATA_PLAIN_PASSWD; } account.initial_auth = accountInitAuth.isChecked(); account.auth_algo = accountAuthAlgo.getText(); account.publish_enabled = accountPublishEnabled.isChecked() ? 1 : 0; int regTo = getIntValue(accountRegTimeout, -1); if(regTo > 0) { account.reg_timeout = regTo; } int regDelay = getIntValue(accountRegDelayRefresh, -1); if(regDelay > 0) { account.reg_delay_before_refresh = regDelay; } account.contact_rewrite_method = getIntValue(accountContactRewriteMethod, 2); account.allow_contact_rewrite = accountAllowContactRewrite.isChecked(); account.allow_via_rewrite = accountAllowViaRewrite.isChecked(); account.allow_sdp_nat_rewrite = accountAllowSdpNatRewrite.isChecked(); String forceContact = getText(accountForceContact); if(!TextUtils.isEmpty(forceContact)) { account.force_contact = forceContact; }else { account.force_contact = ""; } if (!isEmpty(accountProxy)) { account.proxies = new String[] { accountProxy.getText() }; } else { account.proxies = null; } String vmNbr = getText(accountVm); if(!TextUtils.isEmpty(vmNbr)) { account.vm_nbr = vmNbr; }else { account.vm_nbr = ""; } account.mwi_enabled = mwiEnabled.isChecked(); account.try_clean_registers = (tryCleanRegisters.isChecked()) ? 1 : 0; account.use_rfc5626 = useRfc5626.isChecked(); account.rfc5626_instance_id = rfc5626_instanceId.getText(); account.rfc5626_reg_id = rfc5626_regId.getText(); account.vid_in_auto_show = getIntValue(vidInAutoShow, -1); account.vid_out_auto_transmit = getIntValue(vidOutAutoTransmit, -1); account.rtp_port = getIntValue(rtpPort, -1); account.rtp_bound_addr = rtpBoundAddr.getText(); account.rtp_public_addr = rtpPublicAddr.getText(); account.rtp_enable_qos = getIntValue(rtpEnableQos, -1); account.rtp_qos_dscp = getIntValue(rtpQosDscp, -1); account.sip_stun_use = getIntValue(sipStunUse, -1); account.media_stun_use = getIntValue(mediaStunUse, -1); account.ice_cfg_use = iceCfgUse.isChecked() ? 1 : -1; account.ice_cfg_enable = iceCfgEnable.isChecked() ? 1 : 0; account.turn_cfg_use = turnCfgUse.isChecked() ? 1 : -1; account.turn_cfg_enable = turnCfgEnable.isChecked() ? 1 : 0; account.turn_cfg_server = turnCfgServer.getText(); account.turn_cfg_user = turnCfgUser.getText(); account.turn_cfg_password = turnCfgPassword.getText(); account.ipv6_media_use = ipv6MediaEnable.isChecked() ? 1 : 0; return account; } @Override public int getBasePreferenceResource() { return R.xml.w_expert_preferences; } @Override public boolean needRestart() { return false; } }