SipSettings.java revision 7d4ddf6dc0d7c8158bac3a5dec7936e837e95bdd
17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/* 27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2010 The Android Open Source Project 37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License"); 57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * you may not use this file except in compliance with the License. 67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * You may obtain a copy of the License at 77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * http://www.apache.org/licenses/LICENSE-2.0 97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * 107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Unless required by applicable law or agreed to in writing, software 117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS, 127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * See the License for the specific language governing permissions and 147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * limitations under the License. 157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpackage com.android.phone.sip; 187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.CallManager; 207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Phone; 217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.PhoneConstants; 227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.phone.CallFeaturesSetting; 237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.phone.R; 247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.phone.SipUtil; 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.ActionBar; 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.AlertDialog; 287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context; 297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface; 307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent; 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.pm.ApplicationInfo; 327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.pm.PackageManager; 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipErrorCode; 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipException; 357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipManager; 367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipProfile; 377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipRegistrationListener; 387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle; 397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Parcelable; 407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Process; 417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.CheckBoxPreference; 427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.Preference; 437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.Preference.OnPreferenceClickListener; 447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceActivity; 457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceCategory; 467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.TextUtils; 477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.Menu; 497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.MenuItem; 507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.io.IOException; 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.Collections; 537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.Comparator; 547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.LinkedHashMap; 557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.List; 567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.Map; 577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/** 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * The PreferenceActivity class for managing sip profile preferences. 607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class SipSettings extends PreferenceActivity { 627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final String SIP_SHARED_PREFERENCES = "SIP_PREFERENCES"; 637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int MENU_ADD_ACCOUNT = Menu.FIRST; 657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon static final String KEY_SIP_PROFILE = "sip_profile"; 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String BUTTON_SIP_RECEIVE_CALLS = 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon "sip_receive_calls_key"; 707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String PREF_SIP_LIST = "sip_account_list"; 717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String TAG = "SipSettings"; 727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final int REQUEST_ADD_OR_EDIT_SIP_PROFILE = 1; 747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private PackageManager mPackageManager; 767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipManager mSipManager; 777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private CallManager mCallManager; 787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipProfileDb mProfileDb; 797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipProfile mProfile; // profile that's being edited 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private CheckBoxPreference mButtonSipReceiveCalls; 837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private PreferenceCategory mSipListContainer; 847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private Map<String, SipPreference> mSipPreferenceMap; 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private List<SipProfile> mSipProfileList; 867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipSharedPreferences mSipSharedPreferences; 877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private int mUid = Process.myUid(); 887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private class SipPreference extends Preference { 907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipProfile mProfile; 917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipPreference(Context c, SipProfile p) { 927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super(c); 937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setProfile(p); 947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipProfile getProfile() { 977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return mProfile; 987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void setProfile(SipProfile p) { 1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProfile = p; 1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setTitle(getProfileName(p)); 1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateSummary(mSipSharedPreferences.isReceivingCallsEnabled() 1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ? getString(R.string.registration_status_checking_status) 1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon : getString(R.string.registration_status_not_receiving)); 1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void updateSummary(String registrationStatus) { 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int profileUid = mProfile.getCallingUid(); 1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon boolean isPrimary = mProfile.getUriString().equals( 1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipSharedPreferences.getPrimaryAccount()); 1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.v(TAG, "profile uid is " + profileUid + " isPrimary:" 1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + isPrimary + " registration:" + registrationStatus 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + " Primary:" + mSipSharedPreferences.getPrimaryAccount() 1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon + " status:" + registrationStatus); 1167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String summary = ""; 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if ((profileUid > 0) && (profileUid != mUid)) { 1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // from third party apps 1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon summary = getString(R.string.third_party_account_summary, 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon getPackageNameFromUid(profileUid)); 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else if (isPrimary) { 1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon summary = getString(R.string.primary_account_summary_with, 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon registrationStatus); 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon summary = registrationStatus; 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setSummary(summary); 1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private String getPackageNameFromUid(int uid) { 1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String[] pkgs = mPackageManager.getPackagesForUid(uid); 1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ApplicationInfo ai = 1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPackageManager.getApplicationInfo(pkgs[0], 0); 1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return ai.loadLabel(mPackageManager).toString(); 1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (PackageManager.NameNotFoundException e) { 1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(TAG, "cannot find name of uid " + uid, e); 1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "uid:" + uid; 1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onCreate(Bundle savedInstanceState) { 1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onCreate(savedInstanceState); 1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipManager = SipManager.newInstance(this); 1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipSharedPreferences = new SipSharedPreferences(this); 1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProfileDb = new SipProfileDb(this); 1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPackageManager = getPackageManager(); 1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setContentView(R.layout.sip_settings_ui); 1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon addPreferencesFromResource(R.xml.sip_setting); 1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipListContainer = (PreferenceCategory) findPreference(PREF_SIP_LIST); 1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon registerForReceiveCallsCheckBox(); 1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mCallManager = CallManager.getInstance(); 1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateProfilesStatus(); 1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ActionBar actionBar = getActionBar(); 1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (actionBar != null) { 1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // android.R.id.home will be triggered in onOptionsItemSelected() 1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon actionBar.setDisplayHomeAsUpEnabled(true); 1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onResume() { 1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onResume(); 1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mCallManager.getState() != PhoneConstants.State.IDLE) { 1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonSipReceiveCalls.setEnabled(false); 1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonSipReceiveCalls.setEnabled(true); 1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onDestroy() { 1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onDestroy(); 1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon unregisterForContextMenu(getListView()); 1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onActivityResult(final int requestCode, final int resultCode, 1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final Intent intent) { 1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (resultCode != RESULT_OK && resultCode != RESULT_FIRST_USER) return; 1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new Thread() { 1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mProfile != null) { 1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.v(TAG, "Removed Profile:" + mProfile.getProfileName()); 1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon deleteProfile(mProfile); 1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipProfile profile = intent.getParcelableExtra(KEY_SIP_PROFILE); 1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (resultCode == RESULT_OK) { 1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.v(TAG, "New Profile Name:" + profile.getProfileName()); 2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon addProfile(profile); 2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateProfilesStatus(); 2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (IOException e) { 2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.v(TAG, "Can not handle the profile : " + e.getMessage()); 2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }.start(); 2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void registerForReceiveCallsCheckBox() { 2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonSipReceiveCalls = (CheckBoxPreference) findPreference 2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon (BUTTON_SIP_RECEIVE_CALLS); 2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonSipReceiveCalls.setChecked( 2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipSharedPreferences.isReceivingCallsEnabled()); 2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mButtonSipReceiveCalls.setOnPreferenceClickListener( 2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new OnPreferenceClickListener() { 2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onPreferenceClick(Preference preference) { 2187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final boolean enabled = 2197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ((CheckBoxPreference) preference).isChecked(); 2207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new Thread(new Runnable() { 2217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 2227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon handleSipReceiveCallsOption(enabled); 2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }).start(); 2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }); 2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private synchronized void handleSipReceiveCallsOption(boolean enabled) { 2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipSharedPreferences.setReceivingCallsEnabled(enabled); 2327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon List<SipProfile> sipProfileList = mProfileDb.retrieveSipProfileList(); 2337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (SipProfile p : sipProfileList) { 2347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String sipUri = p.getUriString(); 2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon p = updateAutoRegistrationFlag(p, enabled); 2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 2377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (enabled) { 2387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipManager.open(p, 2397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipUtil.createIncomingCallPendingIntent(), null); 2407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipManager.close(sipUri); 2427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mSipSharedPreferences.isPrimaryAccount(sipUri)) { 2437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // re-open in order to make calls 2447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipManager.open(p); 2457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (Exception e) { 2487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(TAG, "register failed", e); 2497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateProfilesStatus(); 2527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipProfile updateAutoRegistrationFlag( 2557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipProfile p, boolean enabled) { 2567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipProfile newProfile = new SipProfile.Builder(p) 2577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setAutoRegistration(enabled) 2587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .build(); 2597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProfileDb.deleteProfile(p); 2617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProfileDb.saveProfile(newProfile); 2627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (Exception e) { 2637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(TAG, "updateAutoRegistrationFlag error", e); 2647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return newProfile; 2667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void updateProfilesStatus() { 2697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new Thread(new Runnable() { 2707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 2727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 2737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon retrieveSipLists(); 2747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (Exception e) { 2757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(TAG, "isRegistered", e); 2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }).start(); 2797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private String getProfileName(SipProfile profile) { 2827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String profileName = profile.getProfileName(); 2837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (TextUtils.isEmpty(profileName)) { 2847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon profileName = profile.getUserName() + "@" + profile.getSipDomain(); 2857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return profileName; 2877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void retrieveSipLists() { 2907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipPreferenceMap = new LinkedHashMap<String, SipPreference>(); 2917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipProfileList = mProfileDb.retrieveSipProfileList(); 2927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon processActiveProfilesFromSipService(); 2937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Collections.sort(mSipProfileList, new Comparator<SipProfile>() { 2947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public int compare(SipProfile p1, SipProfile p2) { 2967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return getProfileName(p1).compareTo(getProfileName(p2)); 2977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean equals(SipProfile p) { 3007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // not used 3017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return false; 3027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }); 3047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipListContainer.removeAll(); 3057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (SipProfile p : mSipProfileList) { 3067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon addPreferenceFor(p); 3077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (!mSipSharedPreferences.isReceivingCallsEnabled()) return; 3107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (SipProfile p : mSipProfileList) { 3117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mUid == p.getCallingUid()) { 3127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 3137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipManager.setRegistrationListener( 3147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon p.getUriString(), createRegistrationListener()); 3157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (SipException e) { 3167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(TAG, "cannot set registration listener", e); 3177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void processActiveProfilesFromSipService() { 3237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipProfile[] activeList = mSipManager.getListOfProfiles(); 3247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (SipProfile activeProfile : activeList) { 3257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipProfile profile = getProfileFromList(activeProfile); 3267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (profile == null) { 3277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipProfileList.add(activeProfile); 3287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 3297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon profile.setCallingUid(activeProfile.getCallingUid()); 3307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipProfile getProfileFromList(SipProfile activeProfile) { 3357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (SipProfile p : mSipProfileList) { 3367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (p.getUriString().equals(activeProfile.getUriString())) { 3377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return p; 3387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return null; 3417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void addPreferenceFor(SipProfile p) { 3447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String status; 3457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.v(TAG, "addPreferenceFor profile uri" + p.getUri()); 3467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipPreference pref = new SipPreference(this, p); 3477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipPreferenceMap.put(p.getUriString(), pref); 3487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipListContainer.addPreference(pref); 3497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon pref.setOnPreferenceClickListener( 3517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new Preference.OnPreferenceClickListener() { 3527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onPreferenceClick(Preference pref) { 3547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon handleProfileClick(((SipPreference) pref).mProfile); 3557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 3567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }); 3587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void handleProfileClick(final SipProfile profile) { 3617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int uid = profile.getCallingUid(); 3627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (uid == mUid || uid == 0) { 3637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon startSipEditor(profile); 3647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 3657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new AlertDialog.Builder(this) 3677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setTitle(R.string.alert_dialog_close) 3687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setIconAttribute(android.R.attr.alertDialogIcon) 3697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setPositiveButton(R.string.close_profile, 3707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new DialogInterface.OnClickListener() { 3717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onClick(DialogInterface dialog, int w) { 3737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon deleteProfile(profile); 3747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon unregisterProfile(profile); 3757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }) 3777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setNegativeButton(android.R.string.cancel, null) 3787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .show(); 3797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void unregisterProfile(final SipProfile p) { 3827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // run it on background thread for better UI response 3837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new Thread(new Runnable() { 3847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 3867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 3877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipManager.close(p.getUriString()); 3887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (Exception e) { 3897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(TAG, "unregister failed, SipService died?", e); 3907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }, "unregisterProfile").start(); 3937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void deleteProfile(SipProfile p) { 3967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipProfileList.remove(p); 3977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipPreference pref = mSipPreferenceMap.remove(p.getUriString()); 3987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipListContainer.removePreference(pref); 3997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void addProfile(SipProfile p) throws IOException { 4027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 4037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipManager.setRegistrationListener(p.getUriString(), 4047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon createRegistrationListener()); 4057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (Exception e) { 4067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Log.e(TAG, "cannot set registration listener", e); 4077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipProfileList.add(p); 4097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon addPreferenceFor(p); 4107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void startSipEditor(final SipProfile profile) { 4137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProfile = profile; 4147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = new Intent(this, SipEditor.class); 4157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intent.putExtra(KEY_SIP_PROFILE, (Parcelable) profile); 4167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon startActivityForResult(intent, REQUEST_ADD_OR_EDIT_SIP_PROFILE); 4177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void showRegistrationMessage(final String profileUri, 4207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String message) { 4217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon runOnUiThread(new Runnable() { 4227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 4237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 4247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipPreference pref = mSipPreferenceMap.get(profileUri); 4257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (pref != null) { 4267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon pref.updateSummary(message); 4277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }); 4307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipRegistrationListener createRegistrationListener() { 4337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return new SipRegistrationListener() { 4347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 4357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onRegistrationDone(String profileUri, long expiryTime) { 4367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 4377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_done)); 4387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 4417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onRegistering(String profileUri) { 4427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 4437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_registering)); 4447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 4477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onRegistrationFailed(String profileUri, int errorCode, 4487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String message) { 4497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (errorCode) { 4507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case SipErrorCode.IN_PROGRESS: 4517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 4527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_still_trying)); 4537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 4547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case SipErrorCode.INVALID_CREDENTIALS: 4557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 4567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_invalid_credentials)); 4577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 4587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case SipErrorCode.SERVER_UNREACHABLE: 4597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 4607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_server_unreachable)); 4617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 4627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case SipErrorCode.DATA_CONNECTION_LOST: 4637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (SipManager.isSipWifiOnly(getApplicationContext())){ 4647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 4657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_no_wifi_data)); 4667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 4677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 4687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_no_data)); 4697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 4717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case SipErrorCode.CLIENT_ERROR: 4727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 4737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_not_running)); 4747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 4757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon default: 4767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 4777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_failed_try_later, 4787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon message)); 4797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }; 4827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 4857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onCreateOptionsMenu(Menu menu) { 4867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onCreateOptionsMenu(menu); 4877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon menu.add(0, MENU_ADD_ACCOUNT, 0, R.string.add_sip_account) 4887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 4897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 4907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 4937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onPrepareOptionsMenu(Menu menu) { 4947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon menu.findItem(MENU_ADD_ACCOUNT).setEnabled( 4957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mCallManager.getState() == PhoneConstants.State.IDLE); 4967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onPrepareOptionsMenu(menu); 4977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 5007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onOptionsItemSelected(MenuItem item) { 5017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final int itemId = item.getItemId(); 5027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (itemId) { 5037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case android.R.id.home: { 5047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon CallFeaturesSetting.goUpToTopLevelSetting(this); 5057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 5067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case MENU_ADD_ACCOUNT: { 5087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon startSipEditor(null); 5097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 5107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onOptionsItemSelected(item); 5137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 5147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 515