12587d9c6437b680911e252efecc73788e876de76Chung-yih Wang/**
22587d9c6437b680911e252efecc73788e876de76Chung-yih Wang * Copyright (C) 2010 The Android Open Source Project
32587d9c6437b680911e252efecc73788e876de76Chung-yih Wang *
42587d9c6437b680911e252efecc73788e876de76Chung-yih Wang * Licensed under the Apache License, Version 2.0 (the "License");
52587d9c6437b680911e252efecc73788e876de76Chung-yih Wang * you may not use this file except in compliance with the License.
62587d9c6437b680911e252efecc73788e876de76Chung-yih Wang * You may obtain a copy of the License at
72587d9c6437b680911e252efecc73788e876de76Chung-yih Wang *
82587d9c6437b680911e252efecc73788e876de76Chung-yih Wang *      http://www.apache.org/licenses/LICENSE-2.0
92587d9c6437b680911e252efecc73788e876de76Chung-yih Wang *
102587d9c6437b680911e252efecc73788e876de76Chung-yih Wang * Unless required by applicable law or agreed to in writing, software
112587d9c6437b680911e252efecc73788e876de76Chung-yih Wang * distributed under the License is distributed on an "AS IS" BASIS,
122587d9c6437b680911e252efecc73788e876de76Chung-yih Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132587d9c6437b680911e252efecc73788e876de76Chung-yih Wang * See the License for the specific language governing permissions and
142587d9c6437b680911e252efecc73788e876de76Chung-yih Wang * limitations under the License.
152587d9c6437b680911e252efecc73788e876de76Chung-yih Wang */
162587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
172587d9c6437b680911e252efecc73788e876de76Chung-yih Wangpackage com.android.phone;
182587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
1926f26634f535c87a82965c3fde8af16fbe8a1822Hung-ying Tyanimport com.android.internal.telephony.CallManager;
2026f26634f535c87a82965c3fde8af16fbe8a1822Hung-ying Tyanimport com.android.internal.telephony.Phone;
2126f26634f535c87a82965c3fde8af16fbe8a1822Hung-ying Tyanimport com.android.internal.telephony.PhoneFactory;
227e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyanimport com.android.phone.sip.SipProfileDb;
2326f26634f535c87a82965c3fde8af16fbe8a1822Hung-ying Tyanimport com.android.phone.sip.SipSettings;
2426f26634f535c87a82965c3fde8af16fbe8a1822Hung-ying Tyanimport com.android.phone.sip.SipSharedPreferences;
2526f26634f535c87a82965c3fde8af16fbe8a1822Hung-ying Tyan
262587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport android.app.Activity;
272587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport android.app.AlertDialog;
282587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport android.app.Dialog;
29f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wangimport android.content.Context;
302587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport android.content.DialogInterface;
312587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport android.content.Intent;
32122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wangimport android.net.ConnectivityManager;
33122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wangimport android.net.NetworkInfo;
3475e3711d82d0c98444f6c438437cad41d862fca6David Brownimport android.net.Uri;
3526f26634f535c87a82965c3fde8af16fbe8a1822Hung-ying Tyanimport android.net.sip.SipException;
362587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport android.net.sip.SipManager;
372587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport android.net.sip.SipProfile;
382587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport android.os.Bundle;
3975e3711d82d0c98444f6c438437cad41d862fca6David Brownimport android.os.SystemProperties;
402587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport android.provider.Settings;
412587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport android.telephony.PhoneNumberUtils;
422587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport android.util.Log;
43f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wangimport android.view.LayoutInflater;
442587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport android.view.View;
4531c051e8b44e84e9c25317de4eed3e03d2a5e926Hung-ying Tyanimport android.view.WindowManager;
46f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wangimport android.widget.CheckBox;
47f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wangimport android.widget.CompoundButton;
48f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wangimport android.widget.TextView;
492587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
502587d9c6437b680911e252efecc73788e876de76Chung-yih Wangimport java.util.List;
512587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
522587d9c6437b680911e252efecc73788e876de76Chung-yih Wang/**
5375e3711d82d0c98444f6c438437cad41d862fca6David Brown * Activity that selects the proper phone type for an outgoing call.
5475e3711d82d0c98444f6c438437cad41d862fca6David Brown *
5575e3711d82d0c98444f6c438437cad41d862fca6David Brown * This activity determines which Phone type (SIP or PSTN) should be used
5675e3711d82d0c98444f6c438437cad41d862fca6David Brown * for an outgoing phone call, depending on the outgoing "number" (which
5775e3711d82d0c98444f6c438437cad41d862fca6David Brown * may be either a PSTN number or a SIP address) as well as the user's SIP
5875e3711d82d0c98444f6c438437cad41d862fca6David Brown * preferences.  In some cases this activity has no interaction with the
5975e3711d82d0c98444f6c438437cad41d862fca6David Brown * user, but in other cases it may (by bringing up a dialog if the user's
6075e3711d82d0c98444f6c438437cad41d862fca6David Brown * preference is "Ask for each call".)
61f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang */
62aebb42c6501f3a1e4c000328bb164c864ad0732eHung-ying Tyanpublic class SipCallOptionHandler extends Activity implements
63f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        DialogInterface.OnClickListener, DialogInterface.OnCancelListener,
64f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        CompoundButton.OnCheckedChangeListener {
652587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    static final String TAG = "SipCallOptionHandler";
6675e3711d82d0c98444f6c438437cad41d862fca6David Brown    private static final boolean DBG =
6775e3711d82d0c98444f6c438437cad41d862fca6David Brown            (PhoneApp.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1);
6875e3711d82d0c98444f6c438437cad41d862fca6David Brown
692587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    static final int DIALOG_SELECT_PHONE_TYPE = 0;
702587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    static final int DIALOG_SELECT_OUTGOING_SIP_PHONE = 1;
712587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    static final int DIALOG_START_SIP_SETTINGS = 2;
72122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang    static final int DIALOG_NO_INTERNET_ERROR = 3;
73b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan    static final int DIALOG_NO_VOIP = 4;
74b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan    static final int DIALOG_SIZE = 5;
752587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
762587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private Intent mIntent;
772587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private List<SipProfile> mProfileList;
782587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private String mCallOption;
792587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private String mNumber;
802587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private SipSharedPreferences mSipSharedPreferences;
81e67c35f45f52ca59704bd4b8a639ddac045b604cChung-yih Wang    private SipProfileDb mSipProfileDb;
822587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private Dialog[] mDialogs = new Dialog[DIALOG_SIZE];
83f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang    private SipProfile mOutgoingSipProfile;
84f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang    private TextView mUnsetPriamryHint;
852587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private boolean mUseSipPhone = false;
86f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang    private boolean mMakePrimary = false;
872587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
882587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    @Override
892587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    public void onCreate(Bundle savedInstanceState) {
902587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        super.onCreate(savedInstanceState);
912587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
9275e3711d82d0c98444f6c438437cad41d862fca6David Brown        Intent intent = getIntent();
9375e3711d82d0c98444f6c438437cad41d862fca6David Brown        String action = intent.getAction();
9475e3711d82d0c98444f6c438437cad41d862fca6David Brown
9575e3711d82d0c98444f6c438437cad41d862fca6David Brown        // This activity is only ever launched with the
9675e3711d82d0c98444f6c438437cad41d862fca6David Brown        // ACTION_SIP_SELECT_PHONE action.
9775e3711d82d0c98444f6c438437cad41d862fca6David Brown        if (!OutgoingCallBroadcaster.ACTION_SIP_SELECT_PHONE.equals(action)) {
9875e3711d82d0c98444f6c438437cad41d862fca6David Brown            Log.wtf(TAG, "onCreate: got intent action '" + action + "', expected "
9975e3711d82d0c98444f6c438437cad41d862fca6David Brown                    + OutgoingCallBroadcaster.ACTION_SIP_SELECT_PHONE);
100a841177ae2676d3ad92f82f8d378bc4915f238c9David Brown            finish();
101a841177ae2676d3ad92f82f8d378bc4915f238c9David Brown            return;
10275e3711d82d0c98444f6c438437cad41d862fca6David Brown        }
10375e3711d82d0c98444f6c438437cad41d862fca6David Brown
10475e3711d82d0c98444f6c438437cad41d862fca6David Brown        // mIntent is a copy of the original CALL intent that started the
10575e3711d82d0c98444f6c438437cad41d862fca6David Brown        // whole outgoing-call sequence.  This intent will ultimately be
10675e3711d82d0c98444f6c438437cad41d862fca6David Brown        // passed to CallController.placeCall() after displaying the SIP
10775e3711d82d0c98444f6c438437cad41d862fca6David Brown        // call options dialog (if necessary).
10875e3711d82d0c98444f6c438437cad41d862fca6David Brown        mIntent = (Intent) intent.getParcelableExtra(OutgoingCallBroadcaster.EXTRA_NEW_CALL_INTENT);
1092587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        if (mIntent == null) {
1102587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            finish();
1112587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            return;
1122587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }
1132587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
11475e3711d82d0c98444f6c438437cad41d862fca6David Brown        // Allow this activity to be visible in front of the keyguard.
11575e3711d82d0c98444f6c438437cad41d862fca6David Brown        // (This is only necessary for obscure scenarios like the user
11675e3711d82d0c98444f6c438437cad41d862fca6David Brown        // initiating a call and then immediately pressing the Power
11775e3711d82d0c98444f6c438437cad41d862fca6David Brown        // button.)
118e7047b76710892ba666bd5072a19e20200024845Hung-ying Tyan        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
119e7047b76710892ba666bd5072a19e20200024845Hung-ying Tyan
1202587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        // If we're trying to make a SIP call, return a SipPhone if one is
1212587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        // available.
1222587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //
1232587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        // - If it's a sip: URI, this is definitely a SIP call, regardless
1242587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //   of whether the data is a SIP address or a regular phone
1252587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //   number.
1262587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //
1272587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        // - If this is a tel: URI but the data contains an "@" character
1282587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //   (see PhoneNumberUtils.isUriNumber()) we consider that to be a
1292587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //   SIP number too.
1302587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //
1312587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        // TODO: Eventually we may want to disallow that latter case
1322587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //       (e.g. "tel:foo@example.com").
1332587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //
1342587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        // TODO: We should also consider moving this logic into the
1352587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //       CallManager, where it could be made more generic.
1362587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //       (For example, each "telephony provider" could be allowed
1372587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //       to register the URI scheme(s) that it can handle, and the
1382587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //       CallManager would then find the best match for every
1392587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        //       outgoing call.)
1402587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
14158a62f78a11fdb9c772a8544ad302603fd58bdebHung-ying Tyan        boolean voipSupported = PhoneUtils.isVoipSupported();
14275e3711d82d0c98444f6c438437cad41d862fca6David Brown        if (DBG) Log.v(TAG, "voipSupported: " + voipSupported);
143e67c35f45f52ca59704bd4b8a639ddac045b604cChung-yih Wang        mSipProfileDb = new SipProfileDb(this);
1442587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        mSipSharedPreferences = new SipSharedPreferences(this);
1452587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        mCallOption = mSipSharedPreferences.getSipCallOption();
14675e3711d82d0c98444f6c438437cad41d862fca6David Brown        if (DBG) Log.v(TAG, "Call option: " + mCallOption);
1472587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        Uri uri = mIntent.getData();
1482587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        String scheme = uri.getScheme();
1492587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        mNumber = PhoneNumberUtils.getNumberFromIntent(mIntent, this);
150f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang        boolean isInCellNetwork = PhoneApp.getInstance().phoneMgr.isRadioOn();
15165454c803eb305c4740885ad4995a871b034a58aDavid Brown        boolean isKnownCallScheme = Constants.SCHEME_TEL.equals(scheme)
15265454c803eb305c4740885ad4995a871b034a58aDavid Brown                || Constants.SCHEME_SIP.equals(scheme);
15365454c803eb305c4740885ad4995a871b034a58aDavid Brown        boolean isRegularCall = Constants.SCHEME_TEL.equals(scheme)
15465454c803eb305c4740885ad4995a871b034a58aDavid Brown                && !PhoneNumberUtils.isUriNumber(mNumber);
1552587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
15627e36a876affc4c95d188a61b5d1c173f69d9346Chung-yih Wang        // Bypass the handler if the call scheme is not sip or tel.
15727e36a876affc4c95d188a61b5d1c173f69d9346Chung-yih Wang        if (!isKnownCallScheme) {
15827e36a876affc4c95d188a61b5d1c173f69d9346Chung-yih Wang            setResultAndFinish();
15927e36a876affc4c95d188a61b5d1c173f69d9346Chung-yih Wang            return;
16027e36a876affc4c95d188a61b5d1c173f69d9346Chung-yih Wang        }
16127e36a876affc4c95d188a61b5d1c173f69d9346Chung-yih Wang
162f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang        // Check if VoIP feature is supported.
163f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang        if (!voipSupported) {
164f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang            if (!isRegularCall) {
165f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                showDialog(DIALOG_NO_VOIP);
166f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang            } else {
167f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                setResultAndFinish();
168f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang            }
1692587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            return;
1702587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }
171f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang
172f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang        // Since we are not sure if anyone has touched the number during
173f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang        // the NEW_OUTGOING_CALL broadcast, we just check if the provider
174f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang        // put their gateway information in the intent. If so, it means
175f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang        // someone has changed the destination number. We then make the
176f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang        // call via the default pstn network. However, if one just alters
177f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang        // the destination directly, then we still let it go through the
178f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang        // Internet call option process.
179f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang        if (!PhoneUtils.hasPhoneProviderExtras(mIntent)) {
180f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang            if (!isNetworkConnected()) {
181f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                if (!isRegularCall) {
182f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                    showDialog(DIALOG_NO_INTERNET_ERROR);
183f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                    return;
184f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                }
185f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang            } else {
186f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                if (mCallOption.equals(Settings.System.SIP_ASK_ME_EACH_TIME)
187f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                        && isRegularCall && isInCellNetwork) {
188f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                    showDialog(DIALOG_SELECT_PHONE_TYPE);
189f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                    return;
190f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                }
191f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                if (!mCallOption.equals(Settings.System.SIP_ADDRESS_ONLY)
192f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                        || !isRegularCall) {
193f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                    mUseSipPhone = true;
194f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                }
195f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang            }
1962587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }
197f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang
1982587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        if (mUseSipPhone) {
199f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang            // If there is no sip profile and it is a regular call, then we
200f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang            // should use pstn network instead.
201f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang            if ((mSipProfileDb.getProfilesCount() > 0) || !isRegularCall) {
202b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan                startGetPrimarySipPhoneThread();
203f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                return;
204b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan            } else {
205f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang                mUseSipPhone = false;
206b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan            }
2072587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }
208f59d780498dc32051d0afdae8e76897262b59613Chung-yih Wang        setResultAndFinish();
2092587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    }
2102587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
2112587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    @Override
2122587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    public void onPause() {
2132587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        super.onPause();
214f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        if (isFinishing()) return;
2152587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        for (Dialog dialog : mDialogs) {
2162587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            if (dialog != null) dialog.dismiss();
2172587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }
2182587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        finish();
2192587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    }
2202587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
2212587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    protected Dialog onCreateDialog(int id) {
2222587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        Dialog dialog;
2232587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        switch(id) {
2242587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        case DIALOG_SELECT_PHONE_TYPE:
2252587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            dialog = new AlertDialog.Builder(this)
2264969ec954e54a743c6c61bffac0d4766c2a4ae12Chung-yih Wang                    .setTitle(R.string.pick_outgoing_call_phone_type)
227237bc810571500ef543e5f7422bea119edfe923fHung-ying Tyan                    .setIcon(android.R.drawable.ic_dialog_alert)
2282587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                    .setSingleChoiceItems(R.array.phone_type_values, -1, this)
2297395d9c6d825194669335edf26d72ce8b7fcbf2aJohn Wang                    .setNegativeButton(android.R.string.cancel, this)
230aebb42c6501f3a1e4c000328bb164c864ad0732eHung-ying Tyan                    .setOnCancelListener(this)
2312587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                    .create();
2322587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            break;
2332587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        case DIALOG_SELECT_OUTGOING_SIP_PHONE:
2342587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            dialog = new AlertDialog.Builder(this)
2357395d9c6d825194669335edf26d72ce8b7fcbf2aJohn Wang                    .setTitle(R.string.pick_outgoing_sip_phone)
236aebb42c6501f3a1e4c000328bb164c864ad0732eHung-ying Tyan                    .setIcon(android.R.drawable.ic_dialog_alert)
2372587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                    .setSingleChoiceItems(getProfileNameArray(), -1, this)
2387395d9c6d825194669335edf26d72ce8b7fcbf2aJohn Wang                    .setNegativeButton(android.R.string.cancel, this)
239aebb42c6501f3a1e4c000328bb164c864ad0732eHung-ying Tyan                    .setOnCancelListener(this)
2402587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                    .create();
241f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang            addMakeDefaultCheckBox(dialog);
2422587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            break;
2432587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        case DIALOG_START_SIP_SETTINGS:
2442587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            dialog = new AlertDialog.Builder(this)
245aebb42c6501f3a1e4c000328bb164c864ad0732eHung-ying Tyan                    .setTitle(R.string.no_sip_account_found_title)
2467395d9c6d825194669335edf26d72ce8b7fcbf2aJohn Wang                    .setMessage(R.string.no_sip_account_found)
247aebb42c6501f3a1e4c000328bb164c864ad0732eHung-ying Tyan                    .setIcon(android.R.drawable.ic_dialog_alert)
2487395d9c6d825194669335edf26d72ce8b7fcbf2aJohn Wang                    .setPositiveButton(R.string.sip_menu_add, this)
2492587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                    .setNegativeButton(android.R.string.cancel, this)
250aebb42c6501f3a1e4c000328bb164c864ad0732eHung-ying Tyan                    .setOnCancelListener(this)
2512587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                    .create();
2522587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            break;
253122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang        case DIALOG_NO_INTERNET_ERROR:
254237bc810571500ef543e5f7422bea119edfe923fHung-ying Tyan            boolean wifiOnly = SipManager.isSipWifiOnly(this);
255122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang            dialog = new AlertDialog.Builder(this)
256237bc810571500ef543e5f7422bea119edfe923fHung-ying Tyan                    .setTitle(wifiOnly ? R.string.no_wifi_available_title
257237bc810571500ef543e5f7422bea119edfe923fHung-ying Tyan                                       : R.string.no_internet_available_title)
258237bc810571500ef543e5f7422bea119edfe923fHung-ying Tyan                    .setMessage(wifiOnly ? R.string.no_wifi_available
259237bc810571500ef543e5f7422bea119edfe923fHung-ying Tyan                                         : R.string.no_internet_available)
260237bc810571500ef543e5f7422bea119edfe923fHung-ying Tyan                    .setIcon(android.R.drawable.ic_dialog_alert)
261122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang                    .setPositiveButton(android.R.string.ok, this)
262122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang                    .setOnCancelListener(this)
263122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang                    .create();
264122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang            break;
265b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan        case DIALOG_NO_VOIP:
266b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan            dialog = new AlertDialog.Builder(this)
267b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan                    .setTitle(R.string.no_voip)
268b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan                    .setIcon(android.R.drawable.ic_dialog_alert)
269b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan                    .setPositiveButton(android.R.string.ok, this)
270b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan                    .setOnCancelListener(this)
271b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan                    .create();
272b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan            break;
2732587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        default:
2742587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            dialog = null;
2752587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }
2762587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        if (dialog != null) {
2772587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            mDialogs[id] = dialog;
2782587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }
2792587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        return dialog;
2802587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    }
2812587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
282f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang    private void addMakeDefaultCheckBox(Dialog dialog) {
283f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        LayoutInflater inflater = (LayoutInflater) getSystemService(
284f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                Context.LAYOUT_INFLATER_SERVICE);
285f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        View view = inflater.inflate(
286f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                com.android.internal.R.layout.always_use_checkbox, null);
287f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        CheckBox makePrimaryCheckBox =
288f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                (CheckBox)view.findViewById(com.android.internal.R.id.alwaysUse);
289f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        makePrimaryCheckBox.setText(R.string.remember_my_choice);
290f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        makePrimaryCheckBox.setOnCheckedChangeListener(this);
291f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        mUnsetPriamryHint = (TextView)view.findViewById(
292f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                com.android.internal.R.id.clearDefaultHint);
293f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        mUnsetPriamryHint.setText(R.string.reset_my_choice_hint);
294f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        mUnsetPriamryHint.setVisibility(View.GONE);
295f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        ((AlertDialog)dialog).setView(view);
296f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang    }
297f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang
2982587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private CharSequence[] getProfileNameArray() {
2992587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        CharSequence[] entries = new CharSequence[mProfileList.size()];
3002587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        int i = 0;
3012587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        for (SipProfile p : mProfileList) {
3022587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            entries[i++] = p.getProfileName();
3032587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }
3042587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        return entries;
3052587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    }
3062587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
3072587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    public void onClick(DialogInterface dialog, int id) {
3087395d9c6d825194669335edf26d72ce8b7fcbf2aJohn Wang        if (id == DialogInterface.BUTTON_NEGATIVE) {
3097395d9c6d825194669335edf26d72ce8b7fcbf2aJohn Wang            // button negative is cancel
3107395d9c6d825194669335edf26d72ce8b7fcbf2aJohn Wang            finish();
3117395d9c6d825194669335edf26d72ce8b7fcbf2aJohn Wang            return;
3127395d9c6d825194669335edf26d72ce8b7fcbf2aJohn Wang        } else if(dialog == mDialogs[DIALOG_SELECT_PHONE_TYPE]) {
3132587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            String selection = getResources().getStringArray(
3142587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                    R.array.phone_type_values)[id];
31575e3711d82d0c98444f6c438437cad41d862fca6David Brown            if (DBG) Log.v(TAG, "User pick phone " + selection);
3162587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            if (selection.equals(getString(R.string.internet_phone))) {
3172587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                mUseSipPhone = true;
3182587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                startGetPrimarySipPhoneThread();
3192587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                return;
3202587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            }
3212587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        } else if (dialog == mDialogs[DIALOG_SELECT_OUTGOING_SIP_PHONE]) {
322f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang            mOutgoingSipProfile = mProfileList.get(id);
323b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan        } else if ((dialog == mDialogs[DIALOG_NO_INTERNET_ERROR])
324b1ebb4f7d314cdb376586d45a4d83172569f10e9Hung-ying Tyan                || (dialog == mDialogs[DIALOG_NO_VOIP])) {
325122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang            finish();
326122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang            return;
3272587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        } else {
3282587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            if (id == DialogInterface.BUTTON_POSITIVE) {
3292587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                // Redirect to sip settings and drop the call.
3302587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                Intent newIntent = new Intent(this, SipSettings.class);
3312587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
3322587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                startActivity(newIntent);
3332587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            }
3342587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            finish();
3352587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            return;
3362587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }
3372587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        setResultAndFinish();
3382587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    }
3392587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
340aebb42c6501f3a1e4c000328bb164c864ad0732eHung-ying Tyan    public void onCancel(DialogInterface dialog) {
341aebb42c6501f3a1e4c000328bb164c864ad0732eHung-ying Tyan        finish();
342aebb42c6501f3a1e4c000328bb164c864ad0732eHung-ying Tyan    }
343aebb42c6501f3a1e4c000328bb164c864ad0732eHung-ying Tyan
344f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
345f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        mMakePrimary = isChecked;
346f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        if (isChecked) {
347f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang            mUnsetPriamryHint.setVisibility(View.VISIBLE);
348f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        } else {
349f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang            mUnsetPriamryHint.setVisibility(View.INVISIBLE);
350f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        }
351f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang    }
352f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang
3532587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private void createSipPhoneIfNeeded(SipProfile p) {
3542587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        CallManager cm = PhoneApp.getInstance().mCM;
3552587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        if (PhoneUtils.getSipPhoneFromUri(cm, p.getUriString()) != null) return;
3562587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
3572587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        // Create the phone since we can not find it in CallManager
3582587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        try {
35985faf0d2e1a764a050f038f61ab5d5524ce2791dHung-ying Tyan            SipManager.newInstance(this).open(p);
3602587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            Phone phone = PhoneFactory.makeSipPhone(p.getUriString());
3612587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            if (phone != null) {
3622587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                cm.registerPhone(phone);
3632587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            } else {
3642587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                Log.e(TAG, "cannot make sipphone profile" + p);
3652587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            }
3662587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        } catch (SipException e) {
3672587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            Log.e(TAG, "cannot open sip profile" + p, e);
3682587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }
3692587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    }
3702587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
3712587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private void setResultAndFinish() {
3722587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        runOnUiThread(new Runnable() {
3732587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            public void run() {
374f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                if (mOutgoingSipProfile != null) {
375122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang                    if (!isNetworkConnected()) {
376122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang                        showDialog(DIALOG_NO_INTERNET_ERROR);
377122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang                        return;
378122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang                    }
37975e3711d82d0c98444f6c438437cad41d862fca6David Brown                    if (DBG) Log.v(TAG, "primary SIP URI is " +
380f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                            mOutgoingSipProfile.getUriString());
381f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                    createSipPhoneIfNeeded(mOutgoingSipProfile);
3822587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                    mIntent.putExtra(OutgoingCallBroadcaster.EXTRA_SIP_PHONE_URI,
383f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                            mOutgoingSipProfile.getUriString());
384f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                    if (mMakePrimary) {
385f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                        mSipSharedPreferences.setPrimaryAccount(
386f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                                mOutgoingSipProfile.getUriString());
387f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                    }
3882587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                }
38975e3711d82d0c98444f6c438437cad41d862fca6David Brown
390f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang                if (mUseSipPhone && mOutgoingSipProfile == null) {
3912587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                    showDialog(DIALOG_START_SIP_SETTINGS);
3922587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                    return;
3932587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                } else {
39475e3711d82d0c98444f6c438437cad41d862fca6David Brown                    // Woo hoo -- it's finally OK to initiate the outgoing call!
39575e3711d82d0c98444f6c438437cad41d862fca6David Brown                    PhoneApp.getInstance().callController.placeCall(mIntent);
3962587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                }
3972587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                finish();
3982587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            }
3992587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        });
4002587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    }
4012587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
402122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang    private boolean isNetworkConnected() {
403122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang        ConnectivityManager cm = (ConnectivityManager) getSystemService(
404122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang                Context.CONNECTIVITY_SERVICE);
405122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang        if (cm != null) {
406122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang            NetworkInfo ni = cm.getActiveNetworkInfo();
407237bc810571500ef543e5f7422bea119edfe923fHung-ying Tyan            if ((ni == null) || !ni.isConnected()) return false;
408237bc810571500ef543e5f7422bea119edfe923fHung-ying Tyan
409237bc810571500ef543e5f7422bea119edfe923fHung-ying Tyan            return ((ni.getType() == ConnectivityManager.TYPE_WIFI)
410237bc810571500ef543e5f7422bea119edfe923fHung-ying Tyan                    || !SipManager.isSipWifiOnly(this));
411122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang        }
412122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang        return false;
413122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang    }
414122a325545761dc9621ba7d5088b5ae6b99c3df9Chung-yih Wang
4152587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private void startGetPrimarySipPhoneThread() {
4162587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        new Thread(new Runnable() {
4172587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            public void run() {
4182587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                getPrimarySipPhone();
4192587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            }
4202587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }).start();
4212587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    }
4222587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
4232587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private void getPrimarySipPhone() {
4242587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        String primarySipUri = mSipSharedPreferences.getPrimaryAccount();
4252587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
426f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        mOutgoingSipProfile = getPrimaryFromExistingProfiles(primarySipUri);
427f2adde87c7c1e6d28b0bacd859d06ad9c8d92434Chung-yih Wang        if (mOutgoingSipProfile == null) {
4282587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            if ((mProfileList != null) && (mProfileList.size() > 0)) {
4292587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                runOnUiThread(new Runnable() {
4302587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                    public void run() {
4312587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                        showDialog(DIALOG_SELECT_OUTGOING_SIP_PHONE);
4322587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                    }
4332587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                });
4342587d9c6437b680911e252efecc73788e876de76Chung-yih Wang                return;
4352587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            }
4362587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }
4372587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        setResultAndFinish();
4382587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    }
4392587d9c6437b680911e252efecc73788e876de76Chung-yih Wang
4402587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    private SipProfile getPrimaryFromExistingProfiles(String primarySipUri) {
441e67c35f45f52ca59704bd4b8a639ddac045b604cChung-yih Wang        mProfileList = mSipProfileDb.retrieveSipProfileList();
4422587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        if (mProfileList == null) return null;
4432587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        for (SipProfile p : mProfileList) {
4442587d9c6437b680911e252efecc73788e876de76Chung-yih Wang            if (p.getUriString().equals(primarySipUri)) return p;
4452587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        }
4462587d9c6437b680911e252efecc73788e876de76Chung-yih Wang        return null;
4472587d9c6437b680911e252efecc73788e876de76Chung-yih Wang    }
4482587d9c6437b680911e252efecc73788e876de76Chung-yih Wang}
449