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.PendingIntent; 206556a09daab949853c384b385bc7618a6c75d9ddSantos Cordonimport android.content.ComponentName; 217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context; 227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent; 23a3d9425d041a5f4df28583d086c1837e0d8b0b6fSantos Cordonimport android.graphics.drawable.Icon; 24baee2955f596f7b79971feb12fa21031a069677dTyler Gunnimport android.net.Uri; 257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipManager; 26baee2955f596f7b79971feb12fa21031a069677dTyler Gunnimport android.net.sip.SipProfile; 274b42eb54b05fbc5585055457dceff13292158a04Srikanth Chintalaimport android.os.Bundle; 28baee2955f596f7b79971feb12fa21031a069677dTyler Gunnimport android.provider.Settings; 294d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.PhoneAccount; 304d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.PhoneAccountHandle; 314d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.TelecomManager; 3205bbb0d8103430f56e3d98c259e219068540de9eTyler Gunnimport android.text.TextUtils; 334d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Leeimport android.util.Log; 347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 353fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebingerimport com.android.phone.PhoneGlobals; 36e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordonimport com.android.phone.R; 373fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebingerimport com.android.server.sip.SipService; 38e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon 39b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebingerimport java.io.IOException; 40959ff8a226d53ed198891ad820db816df82d5aa3Yorke Leeimport java.util.ArrayList; 414d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Leeimport java.util.List; 42baee2955f596f7b79971feb12fa21031a069677dTyler Gunn 437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class SipUtil { 441344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal static final String LOG_TAG = "SIP"; 451344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal static final String EXTRA_INCOMING_CALL_INTENT = 461344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal "com.android.services.telephony.sip.incoming_call_intent"; 476556a09daab949853c384b385bc7618a6c75d9ddSantos Cordon static final String EXTRA_PHONE_ACCOUNT = 486556a09daab949853c384b385bc7618a6c75d9ddSantos Cordon "com.android.services.telephony.sip.phone_account"; 49788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal 507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon private SipUtil() { 517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon 53788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal public static boolean isVoipSupported(Context context) { 54baee2955f596f7b79971feb12fa21031a069677dTyler Gunn return SipManager.isVoipSupported(context) && 55baee2955f596f7b79971feb12fa21031a069677dTyler Gunn context.getResources().getBoolean( 56baee2955f596f7b79971feb12fa21031a069677dTyler Gunn com.android.internal.R.bool.config_built_in_sip_phone) && 57baee2955f596f7b79971feb12fa21031a069677dTyler Gunn context.getResources().getBoolean( 58baee2955f596f7b79971feb12fa21031a069677dTyler Gunn com.android.internal.R.bool.config_voice_capable); 59788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal } 60788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal 616556a09daab949853c384b385bc7618a6c75d9ddSantos Cordon static PendingIntent createIncomingCallPendingIntent( 62f1b726aca6d599c93843fe1339b140a1690e683bBrad Ebinger Context context, String sipProfileName) { 63286261208d91f50797ff34dcd7cafbf7bfc8411eBrad Ebinger Intent intent = new Intent(context, SipIncomingCallReceiver.class); 647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon intent.setAction(SipManager.ACTION_SIP_INCOMING_CALL); 65f1b726aca6d599c93843fe1339b140a1690e683bBrad Ebinger intent.putExtra(EXTRA_PHONE_ACCOUNT, SipUtil.createAccountHandle(context, sipProfileName)); 666556a09daab949853c384b385bc7618a6c75d9ddSantos Cordon return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon } 681344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal 694d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee public static boolean isPhoneIdle(Context context) { 704d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunn TelecomManager manager = (TelecomManager) context.getSystemService( 714d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunn Context.TELECOM_SERVICE); 721344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal if (manager != null) { 7303a77b08656c80d124f167b5e96ee594e4787fcdNancy Chen return !manager.isInCall(); 741344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal } 751344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal return true; 761344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal } 776556a09daab949853c384b385bc7618a6c75d9ddSantos Cordon 786556a09daab949853c384b385bc7618a6c75d9ddSantos Cordon /** 79e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon * Creates a {@link PhoneAccountHandle} from the specified SIP profile name. 806556a09daab949853c384b385bc7618a6c75d9ddSantos Cordon */ 81e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon static PhoneAccountHandle createAccountHandle(Context context, String sipProfileName) { 826556a09daab949853c384b385bc7618a6c75d9ddSantos Cordon return new PhoneAccountHandle( 83e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon new ComponentName(context, SipConnectionService.class), sipProfileName); 846556a09daab949853c384b385bc7618a6c75d9ddSantos Cordon } 85baee2955f596f7b79971feb12fa21031a069677dTyler Gunn 86baee2955f596f7b79971feb12fa21031a069677dTyler Gunn /** 87e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon * Determines the SIP profile name for a specified {@link PhoneAccountHandle}. 8805bbb0d8103430f56e3d98c259e219068540de9eTyler Gunn * 8905bbb0d8103430f56e3d98c259e219068540de9eTyler Gunn * @param phoneAccountHandle The {@link PhoneAccountHandle}. 90e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon * @return The SIP profile name. 9105bbb0d8103430f56e3d98c259e219068540de9eTyler Gunn */ 92e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon static String getSipProfileNameFromPhoneAccount(PhoneAccountHandle phoneAccountHandle) { 9305bbb0d8103430f56e3d98c259e219068540de9eTyler Gunn if (phoneAccountHandle == null) { 9405bbb0d8103430f56e3d98c259e219068540de9eTyler Gunn return null; 9505bbb0d8103430f56e3d98c259e219068540de9eTyler Gunn } 9605bbb0d8103430f56e3d98c259e219068540de9eTyler Gunn 97e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon String sipProfileName = phoneAccountHandle.getId(); 98e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon if (TextUtils.isEmpty(sipProfileName)) { 9905bbb0d8103430f56e3d98c259e219068540de9eTyler Gunn return null; 10005bbb0d8103430f56e3d98c259e219068540de9eTyler Gunn } 101e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon return sipProfileName; 10205bbb0d8103430f56e3d98c259e219068540de9eTyler Gunn } 10305bbb0d8103430f56e3d98c259e219068540de9eTyler Gunn 10405bbb0d8103430f56e3d98c259e219068540de9eTyler Gunn /** 105baee2955f596f7b79971feb12fa21031a069677dTyler Gunn * Creates a PhoneAccount for a SipProfile. 106baee2955f596f7b79971feb12fa21031a069677dTyler Gunn * 107baee2955f596f7b79971feb12fa21031a069677dTyler Gunn * @param context The context 108baee2955f596f7b79971feb12fa21031a069677dTyler Gunn * @param profile The SipProfile. 109baee2955f596f7b79971feb12fa21031a069677dTyler Gunn * @return The PhoneAccount. 110baee2955f596f7b79971feb12fa21031a069677dTyler Gunn */ 111baee2955f596f7b79971feb12fa21031a069677dTyler Gunn static PhoneAccount createPhoneAccount(Context context, SipProfile profile) { 1124592755c194e8691d0cafd717a258860dc05cca8Tyler Gunn // Build a URI to represent the SIP account. Does not use SipProfile#getUriString() since 1134592755c194e8691d0cafd717a258860dc05cca8Tyler Gunn // that prototype can include transport information which we do not want to see in the 1144592755c194e8691d0cafd717a258860dc05cca8Tyler Gunn // phone account. 1154592755c194e8691d0cafd717a258860dc05cca8Tyler Gunn String sipAddress = profile.getUserName() + "@" + profile.getSipDomain(); 116e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon Uri sipUri = Uri.parse(profile.getUriString()); 1174592755c194e8691d0cafd717a258860dc05cca8Tyler Gunn 118baee2955f596f7b79971feb12fa21031a069677dTyler Gunn PhoneAccountHandle accountHandle = 119e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon SipUtil.createAccountHandle(context, profile.getProfileName()); 120baee2955f596f7b79971feb12fa21031a069677dTyler Gunn 121959ff8a226d53ed198891ad820db816df82d5aa3Yorke Lee final ArrayList<String> supportedUriSchemes = new ArrayList<String>(); 122959ff8a226d53ed198891ad820db816df82d5aa3Yorke Lee supportedUriSchemes.add(PhoneAccount.SCHEME_SIP); 123baee2955f596f7b79971feb12fa21031a069677dTyler Gunn if (useSipForPstnCalls(context)) { 124baee2955f596f7b79971feb12fa21031a069677dTyler Gunn supportedUriSchemes.add(PhoneAccount.SCHEME_TEL); 125baee2955f596f7b79971feb12fa21031a069677dTyler Gunn } 126baee2955f596f7b79971feb12fa21031a069677dTyler Gunn 1274b42eb54b05fbc5585055457dceff13292158a04Srikanth Chintala Bundle phoneAccountExtras = new Bundle(); 1284b42eb54b05fbc5585055457dceff13292158a04Srikanth Chintala phoneAccountExtras.putBoolean(PhoneAccount.EXTRA_ALWAYS_USE_VOIP_AUDIO_MODE, 1294b42eb54b05fbc5585055457dceff13292158a04Srikanth Chintala true); 1304b42eb54b05fbc5585055457dceff13292158a04Srikanth Chintala 131baee2955f596f7b79971feb12fa21031a069677dTyler Gunn PhoneAccount.Builder builder = PhoneAccount.builder(accountHandle, profile.getDisplayName()) 1327b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charlton .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER 1337b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charlton | PhoneAccount.CAPABILITY_MULTI_USER) 1344592755c194e8691d0cafd717a258860dc05cca8Tyler Gunn .setAddress(sipUri) 1354592755c194e8691d0cafd717a258860dc05cca8Tyler Gunn .setShortDescription(sipAddress) 136a3d9425d041a5f4df28583d086c1837e0d8b0b6fSantos Cordon .setIcon(Icon.createWithResource( 137a3d9425d041a5f4df28583d086c1837e0d8b0b6fSantos Cordon context.getResources(), R.drawable.ic_dialer_sip_black_24dp)) 1384b42eb54b05fbc5585055457dceff13292158a04Srikanth Chintala .setExtras(phoneAccountExtras) 139baee2955f596f7b79971feb12fa21031a069677dTyler Gunn .setSupportedUriSchemes(supportedUriSchemes); 140baee2955f596f7b79971feb12fa21031a069677dTyler Gunn 141baee2955f596f7b79971feb12fa21031a069677dTyler Gunn return builder.build(); 142baee2955f596f7b79971feb12fa21031a069677dTyler Gunn } 143baee2955f596f7b79971feb12fa21031a069677dTyler Gunn 144baee2955f596f7b79971feb12fa21031a069677dTyler Gunn /** 145b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger * Upon migration from M->N, the SIP Profile database will be moved into DE storage. This will 146b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger * not be a problem for non-FBE enabled devices, since DE and CE storage is available at the 147b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger * same time. This will be a problem for backup/restore, however if the SIP Profile DB is 148b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger * restored onto a new FBE enabled device. 149b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger * 150b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger * Checks if the Sip Db is in DE storage. If it is, the Db is moved to CE storage and 151b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger * deleted. 152b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger */ 1533fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger private static void possiblyMigrateSipDb(Context context) { 154b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger SipProfileDb dbDeStorage = new SipProfileDb(context); 155b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger dbDeStorage.accessDEStorageForMigration(); 156b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger List<SipProfile> profilesDeStorage = dbDeStorage.retrieveSipProfileList(); 157b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger if(profilesDeStorage.size() != 0) { 158b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger Log.i(LOG_TAG, "Migrating SIP Profiles over!"); 159b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger SipProfileDb dbCeStorage = new SipProfileDb(context); 160b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger //Perform Profile Migration 161b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger for (SipProfile profileToMove : profilesDeStorage) { 162b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger if (dbCeStorage.retrieveSipProfileFromName( 163b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger profileToMove.getProfileName()) == null) { 164b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger try { 165b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger dbCeStorage.saveProfile(profileToMove); 166b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger } catch (IOException e) { 167b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger Log.w(LOG_TAG, "Error Migrating file to CE: " + 168b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger profileToMove.getProfileName(), e); 169b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger } 170b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger } 171b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger Log.i(LOG_TAG, "(Migration) Deleting SIP profile: " + 172b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger profileToMove.getProfileName()); 17352823033626ee55474d942d5b9ea24e0f07dbb66Brad Ebinger try { 17452823033626ee55474d942d5b9ea24e0f07dbb66Brad Ebinger dbDeStorage.deleteProfile(profileToMove); 17552823033626ee55474d942d5b9ea24e0f07dbb66Brad Ebinger } catch (IOException e) { 17652823033626ee55474d942d5b9ea24e0f07dbb66Brad Ebinger Log.w(LOG_TAG, "Error Deleting file: " + 17752823033626ee55474d942d5b9ea24e0f07dbb66Brad Ebinger profileToMove.getProfileName(), e); 17852823033626ee55474d942d5b9ea24e0f07dbb66Brad Ebinger } 179b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger } 180b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger } 181b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger // Delete supporting structures if they exist 182b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger dbDeStorage.cleanupUponMigration(); 183b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger } 184b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger 185b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger /** 1863fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger * Migrates the DB files over from CE->DE storage and starts the SipService. 1873fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger */ 1883fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger public static void startSipService() { 1893fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger Context phoneGlobalsContext = PhoneGlobals.getInstance(); 1903fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger // Migrate SIP database from DE->CE storage if the device has just upgraded. 1913fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger possiblyMigrateSipDb(phoneGlobalsContext); 1923fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger // Wait until boot complete to start SIP so that it has access to CE storage. 1933fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger SipService.start(phoneGlobalsContext); 1943fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger } 1953fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger 1963fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger /** 197baee2955f596f7b79971feb12fa21031a069677dTyler Gunn * Determines if the user has chosen to use SIP for PSTN calls as well as SIP calls. 198baee2955f596f7b79971feb12fa21031a069677dTyler Gunn * @param context The context. 199baee2955f596f7b79971feb12fa21031a069677dTyler Gunn * @return {@code True} if SIP should be used for PSTN calls. 200baee2955f596f7b79971feb12fa21031a069677dTyler Gunn */ 201baee2955f596f7b79971feb12fa21031a069677dTyler Gunn private static boolean useSipForPstnCalls(Context context) { 202b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger final SipPreferences sipPreferences = new SipPreferences(context); 203b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger return sipPreferences.getSipCallOption().equals(Settings.System.SIP_ALWAYS); 204baee2955f596f7b79971feb12fa21031a069677dTyler Gunn } 2054d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee 2064d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee /** 2074d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee * Updates SIP accounts to indicate whether they are enabled to receive incoming SIP calls. 2084d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee * 2094d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee * @param isEnabled {@code True} if receiving incoming SIP calls. 2104d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee */ 2114d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee public static void useSipToReceiveIncomingCalls(Context context, boolean isEnabled) { 2124d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee SipProfileDb profileDb = new SipProfileDb(context); 2134d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee 2144d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee // Mark all profiles as auto-register if we are now receiving calls. 2154d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee List<SipProfile> sipProfileList = profileDb.retrieveSipProfileList(); 2164d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee for (SipProfile p : sipProfileList) { 2174d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee updateAutoRegistrationFlag(p, profileDb, isEnabled); 2184d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee } 2194d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee } 2204d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee 2214d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee private static void updateAutoRegistrationFlag( 2224d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee SipProfile p, SipProfileDb db, boolean isEnabled) { 2234d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee SipProfile newProfile = new SipProfile.Builder(p).setAutoRegistration(isEnabled).build(); 2244d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee 2254d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee try { 2264d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee // Note: The profile is updated, but the associated PhoneAccount is left alone since 2274d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee // the only thing that changed is the auto-registration flag, which is not part of the 2284d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee // PhoneAccount. 2294d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee db.deleteProfile(p); 2304d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee db.saveProfile(newProfile); 2314d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee } catch (Exception e) { 2324d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee Log.d(LOG_TAG, "updateAutoRegistrationFlag, exception: " + e); 2334d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee } 2344d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee } 2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon} 236