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 17788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepalpackage com.android.services.telephony.sip; 187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.ActionBar; 207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.AlertDialog; 217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context; 227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface; 237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent; 247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.pm.ApplicationInfo; 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.pm.PackageManager; 267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipErrorCode; 277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipException; 287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipManager; 297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipProfile; 307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipRegistrationListener; 317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle; 327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Parcelable; 337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Process; 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.Preference; 357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceActivity; 367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceCategory; 377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.TextUtils; 387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log; 397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.Menu; 407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.MenuItem; 417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.io.IOException; 437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.Collections; 447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.Comparator; 457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.LinkedHashMap; 467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.List; 477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.Map; 487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 49b2eba2d966529e4f6bb9c8ec9b43a3b5e0e884deAndrew Leeimport com.android.phone.R; 50b2eba2d966529e4f6bb9c8ec9b43a3b5e0e884deAndrew Lee 517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/** 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * The PreferenceActivity class for managing sip profile preferences. 537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */ 547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class SipSettings extends PreferenceActivity { 557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public static final String SIP_SHARED_PREFERENCES = "SIP_PREFERENCES"; 567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon static final String KEY_SIP_PROFILE = "sip_profile"; 586781b0c2375a905614781f8503bfd601f4020340Santos Cordon static final int REQUEST_ADD_OR_EDIT_SIP_PROFILE = 1; 597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 606781b0c2375a905614781f8503bfd601f4020340Santos Cordon private static final String PREFIX = "[SipSettings] "; 616781b0c2375a905614781f8503bfd601f4020340Santos Cordon private static final boolean VERBOSE = false; /* STOP SHIP if true */ 626781b0c2375a905614781f8503bfd601f4020340Santos Cordon private static final int MENU_ADD_ACCOUNT = Menu.FIRST; 637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private static final String PREF_SIP_LIST = "sip_account_list"; 647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private PackageManager mPackageManager; 667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipManager mSipManager; 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipProfileDb mProfileDb; 687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipProfile mProfile; // profile that's being edited 697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private PreferenceCategory mSipListContainer; 707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private Map<String, SipPreference> mSipPreferenceMap; 717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private List<SipProfile> mSipProfileList; 72b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger private SipPreferences mSipPreferences; 737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private int mUid = Process.myUid(); 747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private class SipPreference extends Preference { 767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipProfile mProfile; 777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipPreference(Context c, SipProfile p) { 787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super(c); 797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setProfile(p); 807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipProfile getProfile() { 837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return mProfile; 847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void setProfile(SipProfile p) { 877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProfile = p; 887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setTitle(getProfileName(p)); 89b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger updateSummary(mSipPreferences.isReceivingCallsEnabled() 907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ? getString(R.string.registration_status_checking_status) 917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon : getString(R.string.registration_status_not_receiving)); 927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void updateSummary(String registrationStatus) { 957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int profileUid = mProfile.getCallingUid(); 96788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal if (VERBOSE) { 97788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal log("SipPreference.updateSummary, profile uid: " + profileUid + 98788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal " registration: " + registrationStatus + 99788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal " status: " + registrationStatus); 100788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal } 1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String summary = ""; 1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if ((profileUid > 0) && (profileUid != mUid)) { 1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // from third party apps 1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon summary = getString(R.string.third_party_account_summary, 1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon getPackageNameFromUid(profileUid)); 1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon summary = registrationStatus; 1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setSummary(summary); 1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private String getPackageNameFromUid(int uid) { 1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String[] pkgs = mPackageManager.getPackagesForUid(uid); 116788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal ApplicationInfo ai = mPackageManager.getApplicationInfo(pkgs[0], 0); 1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return ai.loadLabel(mPackageManager).toString(); 1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (PackageManager.NameNotFoundException e) { 119788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal log("getPackageNameFromUid, cannot find name of uid: " + uid + ", exception: " + e); 1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return "uid:" + uid; 1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onCreate(Bundle savedInstanceState) { 1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onCreate(savedInstanceState); 1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipManager = SipManager.newInstance(this); 129b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger mSipPreferences = new SipPreferences(this); 1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProfileDb = new SipProfileDb(this); 1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mPackageManager = getPackageManager(); 1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon setContentView(R.layout.sip_settings_ui); 1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon addPreferencesFromResource(R.xml.sip_setting); 1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipListContainer = (PreferenceCategory) findPreference(PREF_SIP_LIST); 1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon ActionBar actionBar = getActionBar(); 1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (actionBar != null) { 1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon actionBar.setDisplayHomeAsUpEnabled(true); 1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onResume() { 1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onResume(); 1466781b0c2375a905614781f8503bfd601f4020340Santos Cordon updateProfilesStatus(); 1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onDestroy() { 1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onDestroy(); 1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon unregisterForContextMenu(getListView()); 1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon protected void onActivityResult(final int requestCode, final int resultCode, 1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final Intent intent) { 1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (resultCode != RESULT_OK && resultCode != RESULT_FIRST_USER) return; 1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new Thread() { 1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (mProfile != null) { 164788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal if (VERBOSE) log("onActivityResult, remove: " + mProfile.getProfileName()); 1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon deleteProfile(mProfile); 1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipProfile profile = intent.getParcelableExtra(KEY_SIP_PROFILE); 1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (resultCode == RESULT_OK) { 170788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal if (VERBOSE) log("onActivityResult, new: " + profile.getProfileName()); 1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon addProfile(profile); 1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon updateProfilesStatus(); 1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (IOException e) { 175788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal log("onActivityResult, can not handle the profile: " + e); 1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }.start(); 1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void updateProfilesStatus() { 1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new Thread(new Runnable() { 1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon retrieveSipLists(); 1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (Exception e) { 188788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal log("updateProfilesStatus, exception: " + e); 1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }).start(); 1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private String getProfileName(SipProfile profile) { 1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String profileName = profile.getProfileName(); 1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (TextUtils.isEmpty(profileName)) { 1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon profileName = profile.getUserName() + "@" + profile.getSipDomain(); 1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return profileName; 2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void retrieveSipLists() { 2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipPreferenceMap = new LinkedHashMap<String, SipPreference>(); 2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipProfileList = mProfileDb.retrieveSipProfileList(); 2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon processActiveProfilesFromSipService(); 2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Collections.sort(mSipProfileList, new Comparator<SipProfile>() { 2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public int compare(SipProfile p1, SipProfile p2) { 2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return getProfileName(p1).compareTo(getProfileName(p2)); 2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean equals(SipProfile p) { 2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // not used 2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return false; 2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }); 2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipListContainer.removeAll(); 2182c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee if (mSipProfileList.isEmpty()) { 2192c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee getPreferenceScreen().removePreference(mSipListContainer); 2202c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee } else { 2212c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee getPreferenceScreen().addPreference(mSipListContainer); 2222c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee for (SipProfile p : mSipProfileList) { 2232c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee addPreferenceFor(p); 2242c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee } 2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 227b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger if (!mSipPreferences.isReceivingCallsEnabled()) return; 2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (SipProfile p : mSipProfileList) { 22990f2ffdd00b47e2cd863d4361204c1a6fb31e3a0Nancy Chen if (mUid == p.getCallingUid()) { 2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipManager.setRegistrationListener( 2327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon p.getUriString(), createRegistrationListener()); 2337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (SipException e) { 234788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal log("retrieveSipLists, cannot set registration listener: " + e); 2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void processActiveProfilesFromSipService() { 2413fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger SipProfile[] activeList = {}; 2423fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger try { 2433fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger activeList = mSipManager.getListOfProfiles(); 2443fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger } catch (SipException e) { 2453fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger log("SipManager could not retrieve SIP profiles: " + e); 2463fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger } 2477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (SipProfile activeProfile : activeList) { 2487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipProfile profile = getProfileFromList(activeProfile); 2497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (profile == null) { 2507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipProfileList.add(activeProfile); 2517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 2527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon profile.setCallingUid(activeProfile.getCallingUid()); 2537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipProfile getProfileFromList(SipProfile activeProfile) { 2587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon for (SipProfile p : mSipProfileList) { 2597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (p.getUriString().equals(activeProfile.getUriString())) { 2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return p; 2617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return null; 2647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void addPreferenceFor(SipProfile p) { 2677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String status; 268788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal if (VERBOSE) log("addPreferenceFor, profile uri: " + p.getUri()); 2697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipPreference pref = new SipPreference(this, p); 2707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipPreferenceMap.put(p.getUriString(), pref); 2717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipListContainer.addPreference(pref); 2727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon pref.setOnPreferenceClickListener( 2747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new Preference.OnPreferenceClickListener() { 2757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onPreferenceClick(Preference pref) { 2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon handleProfileClick(((SipPreference) pref).mProfile); 2787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 2797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }); 2817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 2837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void handleProfileClick(final SipProfile profile) { 2847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon int uid = profile.getCallingUid(); 2857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (uid == mUid || uid == 0) { 2867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon startSipEditor(profile); 2877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return; 2887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new AlertDialog.Builder(this) 2907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setTitle(R.string.alert_dialog_close) 2917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setIconAttribute(android.R.attr.alertDialogIcon) 2927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setPositiveButton(R.string.close_profile, 2937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new DialogInterface.OnClickListener() { 2947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 2957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onClick(DialogInterface dialog, int w) { 2967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon deleteProfile(profile); 2977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon unregisterProfile(profile); 2987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 2997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }) 3007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .setNegativeButton(android.R.string.cancel, null) 3017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon .show(); 3027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void unregisterProfile(final SipProfile p) { 3057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon // run it on background thread for better UI response 3067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon new Thread(new Runnable() { 3077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 3097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 3107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipManager.close(p.getUriString()); 3117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (Exception e) { 312788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal log("unregisterProfile, unregister failed, SipService died? Exception: " + e); 3137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }, "unregisterProfile").start(); 3167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon void deleteProfile(SipProfile p) { 3197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipProfileList.remove(p); 3207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipPreference pref = mSipPreferenceMap.remove(p.getUriString()); 321e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon if (pref != null) { 322e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon mSipListContainer.removePreference(pref); 323e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon } 3247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void addProfile(SipProfile p) throws IOException { 3277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon try { 3287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipManager.setRegistrationListener(p.getUriString(), 3297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon createRegistrationListener()); 3307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } catch (Exception e) { 331788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal log("addProfile, cannot set registration listener: " + e); 3327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mSipProfileList.add(p); 3347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon addPreferenceFor(p); 3357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void startSipEditor(final SipProfile profile) { 3387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon mProfile = profile; 3397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon Intent intent = new Intent(this, SipEditor.class); 3407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intent.putExtra(KEY_SIP_PROFILE, (Parcelable) profile); 3417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon startActivityForResult(intent, REQUEST_ADD_OR_EDIT_SIP_PROFILE); 3427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private void showRegistrationMessage(final String profileUri, 3457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final String message) { 3467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon runOnUiThread(new Runnable() { 3477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void run() { 3497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon SipPreference pref = mSipPreferenceMap.get(profileUri); 3507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (pref != null) { 3517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon pref.updateSummary(message); 3527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }); 3557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipRegistrationListener createRegistrationListener() { 3587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return new SipRegistrationListener() { 3597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onRegistrationDone(String profileUri, long expiryTime) { 3617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 3627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_done)); 3637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onRegistering(String profileUri) { 3677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 3687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_registering)); 3697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 3717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 3727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public void onRegistrationFailed(String profileUri, int errorCode, 3737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon String message) { 3747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (errorCode) { 3757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case SipErrorCode.IN_PROGRESS: 3767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 3777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_still_trying)); 3787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case SipErrorCode.INVALID_CREDENTIALS: 3807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 3817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_invalid_credentials)); 3827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case SipErrorCode.SERVER_UNREACHABLE: 3847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 3857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_server_unreachable)); 3867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case SipErrorCode.DATA_CONNECTION_LOST: 3887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon if (SipManager.isSipWifiOnly(getApplicationContext())){ 3897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 3907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_no_wifi_data)); 3917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } else { 3927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 3937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_no_data)); 3947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 3957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 3967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case SipErrorCode.CLIENT_ERROR: 3977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 3987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_not_running)); 3997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon break; 4007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon default: 4017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon showRegistrationMessage(profileUri, getString( 4027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon R.string.registration_status_failed_try_later, 4037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon message)); 4047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon }; 4077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 4107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onCreateOptionsMenu(Menu menu) { 4117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon super.onCreateOptionsMenu(menu); 412b2eba2d966529e4f6bb9c8ec9b43a3b5e0e884deAndrew Lee MenuItem addAccountMenuItem = menu.add(0, MENU_ADD_ACCOUNT, 0, R.string.add_sip_account); 413b2eba2d966529e4f6bb9c8ec9b43a3b5e0e884deAndrew Lee addAccountMenuItem.setIcon(R.drawable.ic_add_24dp); 414b2eba2d966529e4f6bb9c8ec9b43a3b5e0e884deAndrew Lee addAccountMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 4157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 4167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 4197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onPrepareOptionsMenu(Menu menu) { 4201344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal menu.findItem(MENU_ADD_ACCOUNT).setEnabled(SipUtil.isPhoneIdle(this)); 4217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onPrepareOptionsMenu(menu); 4227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 4247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon @Override 4257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon public boolean onOptionsItemSelected(MenuItem item) { 4267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon final int itemId = item.getItemId(); 4277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon switch (itemId) { 4287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon case MENU_ADD_ACCOUNT: { 4297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon startSipEditor(null); 4307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return true; 4317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4324d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee case android.R.id.home: { 4334d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee onBackPressed(); 4344d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee return true; 4354d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee } 4367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 4377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon return super.onOptionsItemSelected(item); 4387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 439788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal 440788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal private static void log(String msg) { 441788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal Log.d(SipUtil.LOG_TAG, PREFIX + msg); 442788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal } 4437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 444