/** * 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.content.Intent; import android.net.Uri; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.LinearLayout; import android.widget.TextView; import com.csipsimple.R; import com.csipsimple.api.SipConfigManager; import com.csipsimple.api.SipProfile; import com.csipsimple.models.Filter; import com.csipsimple.utils.Log; import com.csipsimple.utils.PreferencesWrapper; import com.csipsimple.wizards.utils.AccountCreationFirstView; import com.csipsimple.wizards.utils.AccountCreationFirstView.OnAccountCreationFirstViewListener; import com.csipsimple.wizards.utils.AccountCreationWebview; import com.csipsimple.wizards.utils.AccountCreationWebview.OnAccountCreationDoneListener; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpRequestBase; import java.io.IOException; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.regex.Pattern; public class OneWorld extends SimpleImplementation implements OnAccountCreationDoneListener, OnAccountCreationFirstViewListener { private LinearLayout customWizard; private TextView customWizardText; private AccountCreationWebview extAccCreator; private ViewGroup settingsContainer; private ViewGroup validationBar; @Override protected String getDomain() { return "sip.1worldtelecom.mobi"; } @Override protected String getDefaultName() { return "1WorldTelecom"; } @Override public void fillLayout(SipProfile account) { super.fillLayout(account); // Get wizard specific row customWizardText = (TextView) parent.findViewById(R.id.custom_wizard_text); customWizard = (LinearLayout) parent.findViewById(R.id.custom_wizard_row); settingsContainer = (ViewGroup) parent.findViewById(R.id.settings_container); validationBar = (ViewGroup) parent.findViewById(R.id.validation_bar); updateAccountInfos(account); extAccCreator = new AccountCreationWebview(parent, "http://www.1worldsip.com/webregister.php", this); } private AccountBalanceHelper accountBalanceHelper = new AccountBalance(this); private AccountCreationFirstView firstView; private void setFirstViewVisibility(boolean visible) { if(firstView != null) { firstView.setVisibility(visible ? View.VISIBLE : View.GONE); } validationBar.setVisibility(visible ? View.GONE : View.VISIBLE); settingsContainer.setVisibility(visible ? View.GONE : View.VISIBLE); } private void updateAccountInfos(final SipProfile acc) { if (acc != null && acc.id != SipProfile.INVALID_ID) { setFirstViewVisibility(false); customWizard.setVisibility(View.VISIBLE); customWizard.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String url = "http://www.1worldsip.com"; Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); parent.startActivity(i); } }); accountBalanceHelper.launchRequest(acc); } else { if(firstView == null) { firstView = new AccountCreationFirstView(parent); ViewGroup globalContainer = (ViewGroup) settingsContainer.getParent(); firstView.setOnAccountCreationFirstViewListener(this); globalContainer.addView(firstView); } setFirstViewVisibility(true); } } private static final String THIS_FILE = "1world"; private static class AccountBalance extends AccountBalanceHelper { WeakReference<OneWorld> w; AccountBalance(OneWorld wizard){ w = new WeakReference<OneWorld>(wizard); } /** * {@inheritDoc} */ @Override public HttpRequestBase getRequest(SipProfile acc) throws IOException { String requestURL = "https://1worldsip.com/c5/balance.php?" + "pin=" + acc.username + "&pwd=" + acc.data ; HttpGet req = new HttpGet(requestURL); req.addHeader("User-Agent", "SMSSync-Android/1.0)"); return req; } /** * {@inheritDoc} */ @Override public String parseResponseLine(String line) { try { float value = Float.parseFloat(line.trim()); if (value >= 0) { return "Bal : " + Math.round(value * 100.0) / 100.0; } } catch (NumberFormatException e) { Log.e(THIS_FILE, "Can't get value for line"); } return null; } @Override public void applyResultError() { OneWorld wizard = w.get(); if(wizard != null) { wizard.customWizard.setVisibility(View.GONE); } } @Override public void applyResultSuccess(String balanceText) { OneWorld wizard = w.get(); if(wizard != null) { wizard.customWizardText.setText(balanceText); wizard.customWizard.setVisibility(View.VISIBLE); } } }; @Override public void setDefaultParams(PreferencesWrapper prefs) { super.setDefaultParams(prefs); // Stun prefs.setPreferenceBooleanValue(SipConfigManager.ENABLE_STUN, true); prefs.addStunServer("stun01.1worldtelecom.mobi"); prefs.addStunServer("stun02.1worldtelecom.mobi"); // User agent -- useful? //prefs.setPreferenceStringValue(SipConfigManager.USER_AGENT, "1WorldVoip"); // Codecs -- Assume they have legal rights to provide g729 to each users // As they activate it by default in their forked app. // For Narrowband prefs.setCodecPriority("PCMU/8000/1", SipConfigManager.CODEC_NB, "100"); prefs.setCodecPriority("PCMA/8000/1", SipConfigManager.CODEC_NB, "150"); prefs.setCodecPriority("speex/8000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("speex/16000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("speex/32000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("GSM/8000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("G722/16000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("G729/8000/1", SipConfigManager.CODEC_NB, "200"); prefs.setCodecPriority("iLBC/8000/1", SipConfigManager.CODEC_NB, "0"); /* * Disable * by * default */ prefs.setCodecPriority("SILK/8000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("SILK/12000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("SILK/16000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("SILK/24000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("CODEC2/8000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("G7221/16000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("G7221/32000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("ISAC/16000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("ISAC/32000/1", SipConfigManager.CODEC_NB, "0"); prefs.setCodecPriority("AMR/8000/1", SipConfigManager.CODEC_NB, "0"); // For Wideband prefs.setCodecPriority("PCMU/8000/1", SipConfigManager.CODEC_WB, "100"); prefs.setCodecPriority("PCMA/8000/1", SipConfigManager.CODEC_WB, "150"); prefs.setCodecPriority("speex/8000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("speex/16000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("speex/32000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("GSM/8000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("G722/16000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("G729/8000/1", SipConfigManager.CODEC_WB, "200"); prefs.setCodecPriority("iLBC/8000/1", SipConfigManager.CODEC_WB, "0"); /* * Disable * by * default */ prefs.setCodecPriority("SILK/8000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("SILK/12000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("SILK/16000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("SILK/24000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("CODEC2/8000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("G7221/16000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("G7221/32000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("ISAC/16000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("ISAC/32000/1", SipConfigManager.CODEC_WB, "0"); prefs.setCodecPriority("AMR/8000/1", SipConfigManager.CODEC_WB, "0"); } @Override public SipProfile buildAccount(SipProfile account) { SipProfile acc = super.buildAccount(account); String regUri = "sip:" + getDomain() + ":55061"; acc.reg_uri = regUri; acc.proxies = new String[] { regUri }; return acc; } @Override public List<Filter> getDefaultFilters(SipProfile acc) { ArrayList<Filter> filters = new ArrayList<Filter>(); Filter f; // Remove unwanted leadings numbers String[] removableLeadings = new String[] { "+", "001", "011", "0" }; for (String removable : removableLeadings) { f = getFilterRemoveLeading(removable); f.account = (int) acc.id; filters.add(f); } String countryCodeNbr = null; if (Locale.getDefault() != null && !TextUtils.isEmpty(Locale.getDefault().getCountry())) { String countryCode = Locale.getDefault().getCountry().toUpperCase(); if (countryCodeNbrs.containsKey(countryCode)) { countryCodeNbr = countryCodeNbrs.get(countryCode); } } if (!TextUtils.isEmpty(countryCodeNbr)) { String[] prefixableLeadings = new String[] { "0", "888" }; for (String removable : prefixableLeadings) { // Autoreplace country code wherever it's necessary f = getFilterRemoveReplaceLeading(removable, countryCodeNbr); f.account = (int) acc.id; filters.add(f); } } return filters; } private Filter getFilterRemoveLeading(String prefix) { return getFilterRemoveReplaceLeading(prefix, ""); } private Filter getFilterRemoveReplaceLeading(String prefix, String replace) { Filter f = new Filter(); f.action = Filter.ACTION_REPLACE; f.matchPattern = "^" + Pattern.quote(prefix) + "(.*)$"; f.replacePattern = replace + "$1"; f.matchType = Filter.MATCHER_STARTS; return f; } private final static Map<String, String> countryCodeNbrs; static { countryCodeNbrs = new HashMap<String, String>(); countryCodeNbrs.put("AF", "93"); countryCodeNbrs.put("AL", "355"); countryCodeNbrs.put("DZ", "213"); countryCodeNbrs.put("AD", "376"); countryCodeNbrs.put("AO", "244"); countryCodeNbrs.put("AQ", "672"); countryCodeNbrs.put("AR", "54"); countryCodeNbrs.put("AM", "374"); countryCodeNbrs.put("AW", "297"); countryCodeNbrs.put("AU", "61"); countryCodeNbrs.put("AT", "43"); countryCodeNbrs.put("AZ", "994"); countryCodeNbrs.put("BH", "973"); countryCodeNbrs.put("BD", "880"); countryCodeNbrs.put("BY", "375"); countryCodeNbrs.put("BE", "32"); countryCodeNbrs.put("BZ", "501"); countryCodeNbrs.put("BJ", "229"); countryCodeNbrs.put("BT", "975"); countryCodeNbrs.put("BO", "591"); countryCodeNbrs.put("BA", "387"); countryCodeNbrs.put("BW", "267"); countryCodeNbrs.put("BR", "55"); countryCodeNbrs.put("BN", "673"); countryCodeNbrs.put("BG", "359"); countryCodeNbrs.put("BF", "226"); countryCodeNbrs.put("MM", "95"); countryCodeNbrs.put("BI", "257"); countryCodeNbrs.put("KH", "855"); countryCodeNbrs.put("CM", "237"); countryCodeNbrs.put("CA", "1"); countryCodeNbrs.put("CV", "238"); countryCodeNbrs.put("CF", "236"); countryCodeNbrs.put("TD", "235"); countryCodeNbrs.put("CL", "56"); countryCodeNbrs.put("CN", "86"); countryCodeNbrs.put("CX", "61"); countryCodeNbrs.put("CC", "61"); countryCodeNbrs.put("CO", "57"); countryCodeNbrs.put("KM", "269"); countryCodeNbrs.put("CG", "242"); countryCodeNbrs.put("CD", "243"); countryCodeNbrs.put("CK", "682"); countryCodeNbrs.put("CR", "506"); countryCodeNbrs.put("HR", "385"); countryCodeNbrs.put("CU", "53"); countryCodeNbrs.put("CY", "357"); countryCodeNbrs.put("CZ", "420"); countryCodeNbrs.put("DK", "45"); countryCodeNbrs.put("DJ", "253"); countryCodeNbrs.put("TL", "670"); countryCodeNbrs.put("EC", "593"); countryCodeNbrs.put("EG", "20"); countryCodeNbrs.put("SV", "503"); countryCodeNbrs.put("GQ", "240"); countryCodeNbrs.put("ER", "291"); countryCodeNbrs.put("EE", "372"); countryCodeNbrs.put("ET", "251"); countryCodeNbrs.put("FK", "500"); countryCodeNbrs.put("FO", "298"); countryCodeNbrs.put("FJ", "679"); countryCodeNbrs.put("FI", "358"); countryCodeNbrs.put("FR", "33"); countryCodeNbrs.put("PF", "689"); countryCodeNbrs.put("GA", "241"); countryCodeNbrs.put("GM", "220"); countryCodeNbrs.put("GE", "995"); countryCodeNbrs.put("DE", "49"); countryCodeNbrs.put("GH", "233"); countryCodeNbrs.put("GI", "350"); countryCodeNbrs.put("GR", "30"); countryCodeNbrs.put("GL", "299"); countryCodeNbrs.put("GT", "502"); countryCodeNbrs.put("GN", "224"); countryCodeNbrs.put("GW", "245"); countryCodeNbrs.put("GY", "592"); countryCodeNbrs.put("HT", "509"); countryCodeNbrs.put("HN", "504"); countryCodeNbrs.put("HK", "852"); countryCodeNbrs.put("HU", "36"); countryCodeNbrs.put("IN", "91"); countryCodeNbrs.put("ID", "62"); countryCodeNbrs.put("IR", "98"); countryCodeNbrs.put("IQ", "964"); countryCodeNbrs.put("IE", "353"); countryCodeNbrs.put("IM", "44"); countryCodeNbrs.put("IL", "972"); countryCodeNbrs.put("IT", "39"); countryCodeNbrs.put("CI", "225"); countryCodeNbrs.put("JP", "81"); countryCodeNbrs.put("JO", "962"); countryCodeNbrs.put("KZ", "7"); countryCodeNbrs.put("KE", "254"); countryCodeNbrs.put("KI", "686"); countryCodeNbrs.put("KW", "965"); countryCodeNbrs.put("KG", "996"); countryCodeNbrs.put("LA", "856"); countryCodeNbrs.put("LV", "371"); countryCodeNbrs.put("LB", "961"); countryCodeNbrs.put("LS", "266"); countryCodeNbrs.put("LR", "231"); countryCodeNbrs.put("LY", "218"); countryCodeNbrs.put("LI", "423"); countryCodeNbrs.put("LT", "370"); countryCodeNbrs.put("LU", "352"); countryCodeNbrs.put("MO", "853"); countryCodeNbrs.put("MK", "389"); countryCodeNbrs.put("MG", "261"); countryCodeNbrs.put("MW", "265"); countryCodeNbrs.put("MY", "60"); countryCodeNbrs.put("MV", "960"); countryCodeNbrs.put("ML", "223"); countryCodeNbrs.put("MT", "356"); countryCodeNbrs.put("MH", "692"); countryCodeNbrs.put("MR", "222"); countryCodeNbrs.put("MU", "230"); countryCodeNbrs.put("YT", "262"); countryCodeNbrs.put("MX", "52"); countryCodeNbrs.put("FM", "691"); countryCodeNbrs.put("MD", "373"); countryCodeNbrs.put("MC", "377"); countryCodeNbrs.put("MN", "976"); countryCodeNbrs.put("ME", "382"); countryCodeNbrs.put("MA", "212"); countryCodeNbrs.put("MZ", "258"); countryCodeNbrs.put("NA", "264"); countryCodeNbrs.put("NR", "674"); countryCodeNbrs.put("NP", "977"); countryCodeNbrs.put("NL", "31"); countryCodeNbrs.put("AN", "599"); countryCodeNbrs.put("NC", "687"); countryCodeNbrs.put("NZ", "64"); countryCodeNbrs.put("NI", "505"); countryCodeNbrs.put("NE", "227"); countryCodeNbrs.put("NG", "234"); countryCodeNbrs.put("NU", "683"); countryCodeNbrs.put("KP", "850"); countryCodeNbrs.put("NO", "47"); countryCodeNbrs.put("OM", "968"); countryCodeNbrs.put("PK", "92"); countryCodeNbrs.put("PW", "680"); countryCodeNbrs.put("PA", "507"); countryCodeNbrs.put("PG", "675"); countryCodeNbrs.put("PY", "595"); countryCodeNbrs.put("PE", "51"); countryCodeNbrs.put("PH", "63"); countryCodeNbrs.put("PN", "870"); countryCodeNbrs.put("PL", "48"); countryCodeNbrs.put("PT", "351"); countryCodeNbrs.put("PR", "1"); countryCodeNbrs.put("QA", "974"); countryCodeNbrs.put("RO", "40"); countryCodeNbrs.put("RU", "7"); countryCodeNbrs.put("RW", "250"); countryCodeNbrs.put("BL", "590"); countryCodeNbrs.put("WS", "685"); countryCodeNbrs.put("SM", "378"); countryCodeNbrs.put("ST", "239"); countryCodeNbrs.put("SA", "966"); countryCodeNbrs.put("SN", "221"); countryCodeNbrs.put("RS", "381"); countryCodeNbrs.put("SC", "248"); countryCodeNbrs.put("SL", "232"); countryCodeNbrs.put("SG", "65"); countryCodeNbrs.put("SK", "421"); countryCodeNbrs.put("SI", "386"); countryCodeNbrs.put("SB", "677"); countryCodeNbrs.put("SO", "252"); countryCodeNbrs.put("ZA", "27"); countryCodeNbrs.put("KR", "82"); countryCodeNbrs.put("ES", "34"); countryCodeNbrs.put("LK", "94"); countryCodeNbrs.put("SH", "290"); countryCodeNbrs.put("PM", "508"); countryCodeNbrs.put("SD", "249"); countryCodeNbrs.put("SR", "597"); countryCodeNbrs.put("SZ", "268"); countryCodeNbrs.put("SE", "46"); countryCodeNbrs.put("CH", "41"); countryCodeNbrs.put("SY", "963"); countryCodeNbrs.put("TW", "886"); countryCodeNbrs.put("TJ", "992"); countryCodeNbrs.put("TZ", "255"); countryCodeNbrs.put("TH", "66"); countryCodeNbrs.put("TG", "228"); countryCodeNbrs.put("TK", "690"); countryCodeNbrs.put("TO", "676"); countryCodeNbrs.put("TN", "216"); countryCodeNbrs.put("TR", "90"); countryCodeNbrs.put("TM", "993"); countryCodeNbrs.put("TV", "688"); countryCodeNbrs.put("AE", "971"); countryCodeNbrs.put("UG", "256"); countryCodeNbrs.put("GB", "44"); countryCodeNbrs.put("UA", "380"); countryCodeNbrs.put("UY", "598"); countryCodeNbrs.put("US", "1"); countryCodeNbrs.put("UZ", "998"); countryCodeNbrs.put("VU", "678"); countryCodeNbrs.put("VA", "39"); countryCodeNbrs.put("VE", "58"); countryCodeNbrs.put("VN", "84"); countryCodeNbrs.put("WF", "681"); countryCodeNbrs.put("YE", "967"); countryCodeNbrs.put("ZM", "260"); countryCodeNbrs.put("ZW", "263"); } /** * {@inheritDoc} */ @Override public void onAccountCreationDone(String username, String password) { // Actually useless here as they do a weird way to go back in the // application // Probably necessary for iPhone but absolutely useless in android as we // can inject // A javascript api to the webview so that user experience is better ! ;) setUsername(username); setPassword(password); } /** * {@inheritDoc} */ @Override public void onAccountCreationDone(String username, String password, String extra) { onAccountCreationDone(username, password); } @Override public boolean saveAndQuit() { if (canSave()) { parent.saveAndFinish(); return true; } return false; } @Override public void onCreateAccountRequested() { setFirstViewVisibility(false); extAccCreator.show(); } @Override public void onEditAccountRequested() { setFirstViewVisibility(false); } }