1fad09042967550e13affd57f139f375e2948b8afChung-yih Wang/* 2fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * Copyright (C) 2010 The Android Open Source Project 3fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * 4fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * you may not use this file except in compliance with the License. 6fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * You may obtain a copy of the License at 7fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * 8fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * http://www.apache.org/licenses/LICENSE-2.0 9fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * 10fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * Unless required by applicable law or agreed to in writing, software 11fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * distributed under the License is distributed on an "AS IS" BASIS, 12fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * See the License for the specific language governing permissions and 14fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * limitations under the License. 15fad09042967550e13affd57f139f375e2948b8afChung-yih Wang */ 16fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 17fad09042967550e13affd57f139f375e2948b8afChung-yih Wangpackage com.android.phone.sip; 18fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 19ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wangimport com.android.internal.telephony.CallManager; 20ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wangimport com.android.internal.telephony.Phone; 21b0f85b4a78abead921c363f9c8e247d5bdd20c74Wink Savilleimport com.android.internal.telephony.PhoneConstants; 222c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport com.android.phone.CallFeaturesSetting; 23fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport com.android.phone.R; 240fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyanimport com.android.phone.SipUtil; 25fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 262c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport android.app.ActionBar; 270c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wangimport android.app.AlertDialog; 28fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.content.Context; 29fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.content.DialogInterface; 30fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.content.Intent; 310c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wangimport android.content.pm.ApplicationInfo; 320c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wangimport android.content.pm.PackageManager; 331d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyanimport android.net.sip.SipErrorCode; 342c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport android.net.sip.SipException; 35fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.net.sip.SipManager; 362c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport android.net.sip.SipProfile; 37fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.net.sip.SipRegistrationListener; 38fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.os.Bundle; 39fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.os.Parcelable; 400c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wangimport android.os.Process; 41fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.preference.CheckBoxPreference; 42fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.preference.Preference; 43fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.preference.Preference.OnPreferenceClickListener; 44fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.preference.PreferenceActivity; 45a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wangimport android.preference.PreferenceCategory; 4639f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyanimport android.text.TextUtils; 47fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.util.Log; 48c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawaimport android.view.Menu; 49fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.view.MenuItem; 50fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 51fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport java.io.IOException; 52fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport java.util.Collections; 53fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport java.util.Comparator; 54fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport java.util.LinkedHashMap; 55fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport java.util.List; 56fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport java.util.Map; 57fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 58fad09042967550e13affd57f139f375e2948b8afChung-yih Wang/** 59fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * The PreferenceActivity class for managing sip profile preferences. 60fad09042967550e13affd57f139f375e2948b8afChung-yih Wang */ 61fad09042967550e13affd57f139f375e2948b8afChung-yih Wangpublic class SipSettings extends PreferenceActivity { 62ea0af6a6335bff37f7179e229902f7fe1af12430Chung-yih Wang public static final String SIP_SHARED_PREFERENCES = "SIP_PREFERENCES"; 63ea0af6a6335bff37f7179e229902f7fe1af12430Chung-yih Wang 64c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa private static final int MENU_ADD_ACCOUNT = Menu.FIRST; 65c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa 66fad09042967550e13affd57f139f375e2948b8afChung-yih Wang static final String KEY_SIP_PROFILE = "sip_profile"; 67fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 68a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang private static final String BUTTON_SIP_RECEIVE_CALLS = 69a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang "sip_receive_calls_key"; 70fad09042967550e13affd57f139f375e2948b8afChung-yih Wang private static final String PREF_SIP_LIST = "sip_account_list"; 71fad09042967550e13affd57f139f375e2948b8afChung-yih Wang private static final String TAG = "SipSettings"; 72fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 73fad09042967550e13affd57f139f375e2948b8afChung-yih Wang private static final int REQUEST_ADD_OR_EDIT_SIP_PROFILE = 1; 74fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 750c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang private PackageManager mPackageManager; 76fad09042967550e13affd57f139f375e2948b8afChung-yih Wang private SipManager mSipManager; 77ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang private CallManager mCallManager; 787e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan private SipProfileDb mProfileDb; 79fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 807e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan private SipProfile mProfile; // profile that's being edited 81fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 82a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang private CheckBoxPreference mButtonSipReceiveCalls; 83a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang private PreferenceCategory mSipListContainer; 84fad09042967550e13affd57f139f375e2948b8afChung-yih Wang private Map<String, SipPreference> mSipPreferenceMap; 85fad09042967550e13affd57f139f375e2948b8afChung-yih Wang private List<SipProfile> mSipProfileList; 863e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang private SipSharedPreferences mSipSharedPreferences; 870c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang private int mUid = Process.myUid(); 880c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang 89fad09042967550e13affd57f139f375e2948b8afChung-yih Wang private class SipPreference extends Preference { 90fad09042967550e13affd57f139f375e2948b8afChung-yih Wang SipProfile mProfile; 91fad09042967550e13affd57f139f375e2948b8afChung-yih Wang SipPreference(Context c, SipProfile p) { 92fad09042967550e13affd57f139f375e2948b8afChung-yih Wang super(c); 93fad09042967550e13affd57f139f375e2948b8afChung-yih Wang setProfile(p); 94fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 95fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 960c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang SipProfile getProfile() { 970c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang return mProfile; 980c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } 990c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang 100fad09042967550e13affd57f139f375e2948b8afChung-yih Wang void setProfile(SipProfile p) { 101fad09042967550e13affd57f139f375e2948b8afChung-yih Wang mProfile = p; 10239f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan setTitle(getProfileName(p)); 1031d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan updateSummary(mSipSharedPreferences.isReceivingCallsEnabled() 1041d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan ? getString(R.string.registration_status_checking_status) 1051d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan : getString(R.string.registration_status_not_receiving)); 1060c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } 1070c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang 1081d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan void updateSummary(String registrationStatus) { 1090c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang int profileUid = mProfile.getCallingUid(); 1103e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang boolean isPrimary = mProfile.getUriString().equals( 1113e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang mSipSharedPreferences.getPrimaryAccount()); 1121d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan Log.v(TAG, "profile uid is " + profileUid + " isPrimary:" 1131d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan + isPrimary + " registration:" + registrationStatus 1141d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan + " Primary:" + mSipSharedPreferences.getPrimaryAccount() 1151d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan + " status:" + registrationStatus); 1161d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan String summary = ""; 1171d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan if ((profileUid > 0) && (profileUid != mUid)) { 1181d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan // from third party apps 1191d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan summary = getString(R.string.third_party_account_summary, 1201d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan getPackageNameFromUid(profileUid)); 1211d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan } else if (isPrimary) { 1221d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan summary = getString(R.string.primary_account_summary_with, 1231d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan registrationStatus); 1241d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan } else { 1251d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan summary = registrationStatus; 1263e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang } 1273e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang setSummary(summary); 1280c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } 129fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 130fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 1310c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang private String getPackageNameFromUid(int uid) { 1320c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang try { 1330c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang String[] pkgs = mPackageManager.getPackagesForUid(uid); 1340c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang ApplicationInfo ai = 1350c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang mPackageManager.getApplicationInfo(pkgs[0], 0); 1360c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang return ai.loadLabel(mPackageManager).toString(); 1370c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } catch (PackageManager.NameNotFoundException e) { 1380c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang Log.e(TAG, "cannot find name of uid " + uid, e); 1390c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } 1400c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang return "uid:" + uid; 1410c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } 1420c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang 143fad09042967550e13affd57f139f375e2948b8afChung-yih Wang @Override 144fad09042967550e13affd57f139f375e2948b8afChung-yih Wang public void onCreate(Bundle savedInstanceState) { 145fad09042967550e13affd57f139f375e2948b8afChung-yih Wang super.onCreate(savedInstanceState); 146fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 147dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan mSipManager = SipManager.newInstance(this); 1483e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang mSipSharedPreferences = new SipSharedPreferences(this); 1497e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan mProfileDb = new SipProfileDb(this); 150dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan 1510c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang mPackageManager = getPackageManager(); 152fad09042967550e13affd57f139f375e2948b8afChung-yih Wang setContentView(R.layout.sip_settings_ui); 153fad09042967550e13affd57f139f375e2948b8afChung-yih Wang addPreferencesFromResource(R.xml.sip_setting); 154a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang mSipListContainer = (PreferenceCategory) findPreference(PREF_SIP_LIST); 155a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang registerForReceiveCallsCheckBox(); 156ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang mCallManager = CallManager.getInstance(); 157fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 158fad09042967550e13affd57f139f375e2948b8afChung-yih Wang updateProfilesStatus(); 1592c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa 1602c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa ActionBar actionBar = getActionBar(); 1612c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa if (actionBar != null) { 1622c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa // android.R.id.home will be triggered in onOptionsItemSelected() 1632c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa actionBar.setDisplayHomeAsUpEnabled(true); 1642c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa } 165fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 166fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 1670c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang @Override 1680c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang public void onResume() { 1690c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang super.onResume(); 170ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang 171b0f85b4a78abead921c363f9c8e247d5bdd20c74Wink Saville if (mCallManager.getState() != PhoneConstants.State.IDLE) { 172ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang mButtonSipReceiveCalls.setEnabled(false); 173ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang } else { 174ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang mButtonSipReceiveCalls.setEnabled(true); 175ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang } 176fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 177fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 1780c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang @Override 1790c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang protected void onDestroy() { 1800c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang super.onDestroy(); 1810c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang unregisterForContextMenu(getListView()); 182fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 183fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 1840c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang @Override 1850c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang protected void onActivityResult(final int requestCode, final int resultCode, 1860c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang final Intent intent) { 1870c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang if (resultCode != RESULT_OK && resultCode != RESULT_FIRST_USER) return; 1880c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang new Thread() { 18950480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa @Override 1900c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang public void run() { 19150480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa try { 19250480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa if (mProfile != null) { 19350480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa Log.v(TAG, "Removed Profile:" + mProfile.getProfileName()); 19450480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa deleteProfile(mProfile); 19550480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa } 196dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan 19750480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa SipProfile profile = intent.getParcelableExtra(KEY_SIP_PROFILE); 19850480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa if (resultCode == RESULT_OK) { 19950480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa Log.v(TAG, "New Profile Name:" + profile.getProfileName()); 20050480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa addProfile(profile); 20150480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa } 20250480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa updateProfilesStatus(); 20350480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa } catch (IOException e) { 20450480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa Log.v(TAG, "Can not handle the profile : " + e.getMessage()); 2050c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } 2060c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } 20750480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa }.start(); 208fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 209fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 210a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang private void registerForReceiveCallsCheckBox() { 211a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang mButtonSipReceiveCalls = (CheckBoxPreference) findPreference 212a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang (BUTTON_SIP_RECEIVE_CALLS); 213a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang mButtonSipReceiveCalls.setChecked( 214a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang mSipSharedPreferences.isReceivingCallsEnabled()); 215a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang mButtonSipReceiveCalls.setOnPreferenceClickListener( 216a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang new OnPreferenceClickListener() { 217a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang public boolean onPreferenceClick(Preference preference) { 218a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang final boolean enabled = 219a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang ((CheckBoxPreference) preference).isChecked(); 220a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang new Thread(new Runnable() { 221a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang public void run() { 222a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang handleSipReceiveCallsOption(enabled); 223a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang } 224a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang }).start(); 225a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang return true; 226a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang } 227a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang }); 228a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang } 229a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang 230a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang private synchronized void handleSipReceiveCallsOption(boolean enabled) { 231a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang mSipSharedPreferences.setReceivingCallsEnabled(enabled); 2327e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan List<SipProfile> sipProfileList = mProfileDb.retrieveSipProfileList(); 233a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang for (SipProfile p : sipProfileList) { 234a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang String sipUri = p.getUriString(); 235a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang p = updateAutoRegistrationFlag(p, enabled); 236a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang try { 2370fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan if (enabled) { 2380fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan mSipManager.open(p, 2390fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan SipUtil.createIncomingCallPendingIntent(), null); 2400fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan } else { 2410fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan mSipManager.close(sipUri); 2420fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan if (mSipSharedPreferences.isPrimaryAccount(sipUri)) { 2430fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan // re-open in order to make calls 2440fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan mSipManager.open(p); 2450fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan } 246a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang } 247a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang } catch (Exception e) { 248a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang Log.e(TAG, "register failed", e); 249a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang } 250a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang } 251a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang updateProfilesStatus(); 252a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang } 253a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang 254a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang private SipProfile updateAutoRegistrationFlag( 255a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang SipProfile p, boolean enabled) { 256a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang SipProfile newProfile = new SipProfile.Builder(p) 257a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang .setAutoRegistration(enabled) 258a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang .build(); 259a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang try { 2607e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan mProfileDb.deleteProfile(p); 2617e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan mProfileDb.saveProfile(newProfile); 262a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang } catch (Exception e) { 263a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang Log.e(TAG, "updateAutoRegistrationFlag error", e); 264a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang } 265a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang return newProfile; 266a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang } 267a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang 268fad09042967550e13affd57f139f375e2948b8afChung-yih Wang private void updateProfilesStatus() { 269fad09042967550e13affd57f139f375e2948b8afChung-yih Wang new Thread(new Runnable() { 27050480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa @Override 271fad09042967550e13affd57f139f375e2948b8afChung-yih Wang public void run() { 272fad09042967550e13affd57f139f375e2948b8afChung-yih Wang try { 2730c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang retrieveSipLists(); 274fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } catch (Exception e) { 275fad09042967550e13affd57f139f375e2948b8afChung-yih Wang Log.e(TAG, "isRegistered", e); 276fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 277fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 278fad09042967550e13affd57f139f375e2948b8afChung-yih Wang }).start(); 279fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 280fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 28139f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan private String getProfileName(SipProfile profile) { 28239f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan String profileName = profile.getProfileName(); 28339f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan if (TextUtils.isEmpty(profileName)) { 28439f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan profileName = profile.getUserName() + "@" + profile.getSipDomain(); 28539f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan } 28639f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan return profileName; 28739f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan } 28839f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan 2890c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang private void retrieveSipLists() { 2900c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang mSipPreferenceMap = new LinkedHashMap<String, SipPreference>(); 2917e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan mSipProfileList = mProfileDb.retrieveSipProfileList(); 2920c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang processActiveProfilesFromSipService(); 2930c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang Collections.sort(mSipProfileList, new Comparator<SipProfile>() { 29450480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa @Override 295fad09042967550e13affd57f139f375e2948b8afChung-yih Wang public int compare(SipProfile p1, SipProfile p2) { 29639f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan return getProfileName(p1).compareTo(getProfileName(p2)); 297fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 298fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 299fad09042967550e13affd57f139f375e2948b8afChung-yih Wang public boolean equals(SipProfile p) { 300fad09042967550e13affd57f139f375e2948b8afChung-yih Wang // not used 301fad09042967550e13affd57f139f375e2948b8afChung-yih Wang return false; 302fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 303fad09042967550e13affd57f139f375e2948b8afChung-yih Wang }); 304fad09042967550e13affd57f139f375e2948b8afChung-yih Wang mSipListContainer.removeAll(); 305fad09042967550e13affd57f139f375e2948b8afChung-yih Wang for (SipProfile p : mSipProfileList) { 3060c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang addPreferenceFor(p); 3075cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan } 3085cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan 3095cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan if (!mSipSharedPreferences.isReceivingCallsEnabled()) return; 3105cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan for (SipProfile p : mSipProfileList) { 3111d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan if (mUid == p.getCallingUid()) { 3120c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang try { 3130c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang mSipManager.setRegistrationListener( 3141d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan p.getUriString(), createRegistrationListener()); 3150c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } catch (SipException e) { 3160c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang Log.e(TAG, "cannot set registration listener", e); 317fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 318fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 3191d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan } 3201d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan } 3211d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan 3221d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan private void processActiveProfilesFromSipService() { 3231d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan SipProfile[] activeList = mSipManager.getListOfProfiles(); 3241d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan for (SipProfile activeProfile : activeList) { 3250c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang SipProfile profile = getProfileFromList(activeProfile); 3260c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang if (profile == null) { 3270c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang mSipProfileList.add(activeProfile); 3280c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } else { 3291d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan profile.setCallingUid(activeProfile.getCallingUid()); 3300c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } 331fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 332fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 333fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 3340c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang private SipProfile getProfileFromList(SipProfile activeProfile) { 3350c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang for (SipProfile p : mSipProfileList) { 3360c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang if (p.getUriString().equals(activeProfile.getUriString())) { 3370c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang return p; 3380c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } 339fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 3400c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang return null; 3410c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } 3420c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang 3430c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang private void addPreferenceFor(SipProfile p) { 3440c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang String status; 3450c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang Log.v(TAG, "addPreferenceFor profile uri" + p.getUri()); 346fad09042967550e13affd57f139f375e2948b8afChung-yih Wang SipPreference pref = new SipPreference(this, p); 347fad09042967550e13affd57f139f375e2948b8afChung-yih Wang mSipPreferenceMap.put(p.getUriString(), pref); 3480c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang mSipListContainer.addPreference(pref); 349fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 350fad09042967550e13affd57f139f375e2948b8afChung-yih Wang pref.setOnPreferenceClickListener( 351fad09042967550e13affd57f139f375e2948b8afChung-yih Wang new Preference.OnPreferenceClickListener() { 35250480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa @Override 353fad09042967550e13affd57f139f375e2948b8afChung-yih Wang public boolean onPreferenceClick(Preference pref) { 3540c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang handleProfileClick(((SipPreference) pref).mProfile); 355fad09042967550e13affd57f139f375e2948b8afChung-yih Wang return true; 356fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 357fad09042967550e13affd57f139f375e2948b8afChung-yih Wang }); 358fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 359fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 3600c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang private void handleProfileClick(final SipProfile profile) { 3610c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang int uid = profile.getCallingUid(); 3622a9da944442552ff52f38799d1eeda2af209b35bHung-ying Tyan if (uid == mUid || uid == 0) { 3630c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang startSipEditor(profile); 3640c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang return; 3650c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } 3660c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang new AlertDialog.Builder(this) 3670c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang .setTitle(R.string.alert_dialog_close) 36850480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa .setIconAttribute(android.R.attr.alertDialogIcon) 3690c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang .setPositiveButton(R.string.close_profile, 3700c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang new DialogInterface.OnClickListener() { 37150480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa @Override 3720c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang public void onClick(DialogInterface dialog, int w) { 373dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan deleteProfile(profile); 374b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan unregisterProfile(profile); 3750c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang } 3760c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang }) 3770c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang .setNegativeButton(android.R.string.cancel, null) 3780c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang .show(); 379fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 380fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 381b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan private void unregisterProfile(final SipProfile p) { 382b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan // run it on background thread for better UI response 383b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan new Thread(new Runnable() { 38450480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa @Override 385b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan public void run() { 386b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan try { 387b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan mSipManager.close(p.getUriString()); 388b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan } catch (Exception e) { 389b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan Log.e(TAG, "unregister failed, SipService died?", e); 390b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan } 391b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan } 392b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan }, "unregisterProfile").start(); 393b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan } 394b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan 395dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan void deleteProfile(SipProfile p) { 396fad09042967550e13affd57f139f375e2948b8afChung-yih Wang mSipProfileList.remove(p); 397fad09042967550e13affd57f139f375e2948b8afChung-yih Wang SipPreference pref = mSipPreferenceMap.remove(p.getUriString()); 398fad09042967550e13affd57f139f375e2948b8afChung-yih Wang mSipListContainer.removePreference(pref); 399fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 400fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 4017e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan private void addProfile(SipProfile p) throws IOException { 402dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan try { 403dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan mSipManager.setRegistrationListener(p.getUriString(), 404dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan createRegistrationListener()); 405dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan } catch (Exception e) { 406dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan Log.e(TAG, "cannot set registration listener", e); 407dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan } 408fad09042967550e13affd57f139f375e2948b8afChung-yih Wang mSipProfileList.add(p); 4090c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang addPreferenceFor(p); 410fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 411fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 412fad09042967550e13affd57f139f375e2948b8afChung-yih Wang private void startSipEditor(final SipProfile profile) { 413fad09042967550e13affd57f139f375e2948b8afChung-yih Wang mProfile = profile; 414fad09042967550e13affd57f139f375e2948b8afChung-yih Wang Intent intent = new Intent(this, SipEditor.class); 415fad09042967550e13affd57f139f375e2948b8afChung-yih Wang intent.putExtra(KEY_SIP_PROFILE, (Parcelable) profile); 416fad09042967550e13affd57f139f375e2948b8afChung-yih Wang startActivityForResult(intent, REQUEST_ADD_OR_EDIT_SIP_PROFILE); 417fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 418fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 4191d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan private void showRegistrationMessage(final String profileUri, 420fad09042967550e13affd57f139f375e2948b8afChung-yih Wang final String message) { 421fad09042967550e13affd57f139f375e2948b8afChung-yih Wang runOnUiThread(new Runnable() { 42250480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa @Override 423fad09042967550e13affd57f139f375e2948b8afChung-yih Wang public void run() { 4241d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan SipPreference pref = mSipPreferenceMap.get(profileUri); 4251d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan if (pref != null) { 4261d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan pref.updateSummary(message); 427fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 428fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 429fad09042967550e13affd57f139f375e2948b8afChung-yih Wang }); 430fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 431fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 432fad09042967550e13affd57f139f375e2948b8afChung-yih Wang private SipRegistrationListener createRegistrationListener() { 433fad09042967550e13affd57f139f375e2948b8afChung-yih Wang return new SipRegistrationListener() { 43450480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa @Override 435fad09042967550e13affd57f139f375e2948b8afChung-yih Wang public void onRegistrationDone(String profileUri, long expiryTime) { 4361d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan showRegistrationMessage(profileUri, getString( 4371d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan R.string.registration_status_done)); 438fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 439fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 44050480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa @Override 4410c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang public void onRegistering(String profileUri) { 4421d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan showRegistrationMessage(profileUri, getString( 4431d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan R.string.registration_status_registering)); 444fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 445fad09042967550e13affd57f139f375e2948b8afChung-yih Wang 44650480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa @Override 447c03dd756e3fbe7a83074030ff156da35d12138c0Hung-ying Tyan public void onRegistrationFailed(String profileUri, int errorCode, 448c03dd756e3fbe7a83074030ff156da35d12138c0Hung-ying Tyan String message) { 44958c606391d60568a965e3108d4281bf3ed944192Hung-ying Tyan switch (errorCode) { 450c03dd756e3fbe7a83074030ff156da35d12138c0Hung-ying Tyan case SipErrorCode.IN_PROGRESS: 4511d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan showRegistrationMessage(profileUri, getString( 4521d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan R.string.registration_status_still_trying)); 4531d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan break; 454c03dd756e3fbe7a83074030ff156da35d12138c0Hung-ying Tyan case SipErrorCode.INVALID_CREDENTIALS: 4551d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan showRegistrationMessage(profileUri, getString( 4562b63e3c8c6f79106ccb41401f80fa6b55f2cdfa9Hung-ying Tyan R.string.registration_status_invalid_credentials)); 4571d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan break; 45868d060b8f52c6c1176d5c55358250b18d14f2b51Hung-ying Tyan case SipErrorCode.SERVER_UNREACHABLE: 45968d060b8f52c6c1176d5c55358250b18d14f2b51Hung-ying Tyan showRegistrationMessage(profileUri, getString( 46068d060b8f52c6c1176d5c55358250b18d14f2b51Hung-ying Tyan R.string.registration_status_server_unreachable)); 46168d060b8f52c6c1176d5c55358250b18d14f2b51Hung-ying Tyan break; 4625cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan case SipErrorCode.DATA_CONNECTION_LOST: 46319ae0fffd55eef95634c0ff233981899c58179d7John Wang if (SipManager.isSipWifiOnly(getApplicationContext())){ 46419ae0fffd55eef95634c0ff233981899c58179d7John Wang showRegistrationMessage(profileUri, getString( 46519ae0fffd55eef95634c0ff233981899c58179d7John Wang R.string.registration_status_no_wifi_data)); 46619ae0fffd55eef95634c0ff233981899c58179d7John Wang } else { 46719ae0fffd55eef95634c0ff233981899c58179d7John Wang showRegistrationMessage(profileUri, getString( 46819ae0fffd55eef95634c0ff233981899c58179d7John Wang R.string.registration_status_no_data)); 46919ae0fffd55eef95634c0ff233981899c58179d7John Wang } 4705cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan break; 4715cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan case SipErrorCode.CLIENT_ERROR: 4725cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan showRegistrationMessage(profileUri, getString( 4735cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan R.string.registration_status_not_running)); 4745cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan break; 4751d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan default: 4761d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan showRegistrationMessage(profileUri, getString( 4771d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan R.string.registration_status_failed_try_later, 4781d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan message)); 4791d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan } 480fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 481fad09042967550e13affd57f139f375e2948b8afChung-yih Wang }; 482fad09042967550e13affd57f139f375e2948b8afChung-yih Wang } 4832c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa 4842c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa @Override 485c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa public boolean onCreateOptionsMenu(Menu menu) { 486c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa super.onCreateOptionsMenu(menu); 487c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa menu.add(0, MENU_ADD_ACCOUNT, 0, R.string.add_sip_account) 488c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 489c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa return true; 490c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa } 491c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa 492c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa @Override 493c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa public boolean onPrepareOptionsMenu(Menu menu) { 494b0f85b4a78abead921c363f9c8e247d5bdd20c74Wink Saville menu.findItem(MENU_ADD_ACCOUNT).setEnabled( 495b0f85b4a78abead921c363f9c8e247d5bdd20c74Wink Saville mCallManager.getState() == PhoneConstants.State.IDLE); 496c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa return super.onPrepareOptionsMenu(menu); 497c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa } 498c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa 499c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa @Override 5002c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa public boolean onOptionsItemSelected(MenuItem item) { 5012c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa final int itemId = item.getItemId(); 502c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa switch (itemId) { 503c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa case android.R.id.home: { 504c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa CallFeaturesSetting.goUpToTopLevelSetting(this); 505c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa return true; 506c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa } 507c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa case MENU_ADD_ACCOUNT: { 508c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa startSipEditor(null); 509c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa return true; 510c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa } 5112c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa } 5122c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa return super.onOptionsItemSelected(item); 5132c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa } 514fad09042967550e13affd57f139f375e2948b8afChung-yih Wang} 515