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