SipSettings.java revision 788959e2d798da2d8a34cf89779421966d200f3d
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 com.android.internal.telephony.CallManager;
207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.Phone;
217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport com.android.internal.telephony.PhoneConstants;
227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.ActionBar;
247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.AlertDialog;
257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context;
267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface;
277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent;
287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.pm.ApplicationInfo;
297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.pm.PackageManager;
307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipErrorCode;
317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipException;
327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipManager;
337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipProfile;
347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipRegistrationListener;
357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle;
367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Parcelable;
377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Process;
387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.CheckBoxPreference;
397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.Preference;
407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.Preference.OnPreferenceClickListener;
417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceActivity;
427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceCategory;
437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.TextUtils;
447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log;
457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.Menu;
467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.MenuItem;
477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.io.IOException;
497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.Collections;
507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.Comparator;
517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.LinkedHashMap;
527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.List;
537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.Map;
547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/**
567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * The PreferenceActivity class for managing sip profile preferences.
577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */
587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class SipSettings extends PreferenceActivity {
59788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    private static final String PREFIX = "[SipSettings] ";
60788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    private static final boolean VERBOSE = true; /* STOP SHIP if true */
61788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public static final String SIP_SHARED_PREFERENCES = "SIP_PREFERENCES";
637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final int MENU_ADD_ACCOUNT = Menu.FIRST;
657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    static final String KEY_SIP_PROFILE = "sip_profile";
677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final String BUTTON_SIP_RECEIVE_CALLS =
697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            "sip_receive_calls_key";
707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final String PREF_SIP_LIST = "sip_account_list";
717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final int REQUEST_ADD_OR_EDIT_SIP_PROFILE = 1;
737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private PackageManager mPackageManager;
757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private SipManager mSipManager;
767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private CallManager mCallManager;
777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private SipProfileDb mProfileDb;
787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private SipProfile mProfile; // profile that's being edited
807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private CheckBoxPreference mButtonSipReceiveCalls;
827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private PreferenceCategory mSipListContainer;
837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private Map<String, SipPreference> mSipPreferenceMap;
847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private List<SipProfile> mSipProfileList;
857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private SipSharedPreferences mSipSharedPreferences;
867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private int mUid = Process.myUid();
877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private class SipPreference extends Preference {
897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        SipProfile mProfile;
907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        SipPreference(Context c, SipProfile p) {
917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            super(c);
927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            setProfile(p);
937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        SipProfile getProfile() {
967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            return mProfile;
977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        void setProfile(SipProfile p) {
1007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mProfile = p;
1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            setTitle(getProfileName(p));
1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            updateSummary(mSipSharedPreferences.isReceivingCallsEnabled()
1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    ? getString(R.string.registration_status_checking_status)
1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    : getString(R.string.registration_status_not_receiving));
1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        void updateSummary(String registrationStatus) {
1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            int profileUid = mProfile.getCallingUid();
1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            boolean isPrimary = mProfile.getUriString().equals(
1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mSipSharedPreferences.getPrimaryAccount());
111788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal            if (VERBOSE) {
112788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                log("SipPreference.updateSummary, profile uid: " + profileUid +
113788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                        " isPrimary: " + isPrimary +
114788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                        " registration: " + registrationStatus +
115788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                        " Primary: " + mSipSharedPreferences.getPrimaryAccount() +
116788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                        " status: " + registrationStatus);
117788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal            }
1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            String summary = "";
1197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if ((profileUid > 0) && (profileUid != mUid)) {
1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                // from third party apps
1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                summary = getString(R.string.third_party_account_summary,
1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        getPackageNameFromUid(profileUid));
1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else if (isPrimary) {
1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                summary = getString(R.string.primary_account_summary_with,
1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        registrationStatus);
1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else {
1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                summary = registrationStatus;
1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
1297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            setSummary(summary);
1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private String getPackageNameFromUid(int uid) {
1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        try {
1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            String[] pkgs = mPackageManager.getPackagesForUid(uid);
136788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal            ApplicationInfo ai = mPackageManager.getApplicationInfo(pkgs[0], 0);
1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            return ai.loadLabel(mPackageManager).toString();
1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        } catch (PackageManager.NameNotFoundException e) {
139788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal            log("getPackageNameFromUid, cannot find name of uid: " + uid + ", exception: " + e);
1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return "uid:" + uid;
1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public void onCreate(Bundle savedInstanceState) {
1467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onCreate(savedInstanceState);
1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipManager = SipManager.newInstance(this);
1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipSharedPreferences = new SipSharedPreferences(this);
1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mProfileDb = new SipProfileDb(this);
1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPackageManager = getPackageManager();
1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        setContentView(R.layout.sip_settings_ui);
1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        addPreferencesFromResource(R.xml.sip_setting);
1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipListContainer = (PreferenceCategory) findPreference(PREF_SIP_LIST);
1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        registerForReceiveCallsCheckBox();
1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mCallManager = CallManager.getInstance();
1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        updateProfilesStatus();
1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        ActionBar actionBar = getActionBar();
1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (actionBar != null) {
1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            actionBar.setDisplayHomeAsUpEnabled(true);
1647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public void onResume() {
1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onResume();
1707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (mCallManager.getState() != PhoneConstants.State.IDLE) {
1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mButtonSipReceiveCalls.setEnabled(false);
1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        } else {
1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mButtonSipReceiveCalls.setEnabled(true);
1757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected void onDestroy() {
1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onDestroy();
1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        unregisterForContextMenu(getListView());
1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected void onActivityResult(final int requestCode, final int resultCode,
1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            final Intent intent) {
1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (resultCode != RESULT_OK && resultCode != RESULT_FIRST_USER) return;
1887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        new Thread() {
1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void run() {
1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                try {
1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    if (mProfile != null) {
193788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                        if (VERBOSE) log("onActivityResult, remove: " + mProfile.getProfileName());
1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        deleteProfile(mProfile);
1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    }
1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    SipProfile profile = intent.getParcelableExtra(KEY_SIP_PROFILE);
1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    if (resultCode == RESULT_OK) {
199788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                        if (VERBOSE) log("onActivityResult, new: " + profile.getProfileName());
2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        addProfile(profile);
2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    }
2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    updateProfilesStatus();
2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                } catch (IOException e) {
204788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                    log("onActivityResult, can not handle the profile:  " + e);
2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }.start();
2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void registerForReceiveCallsCheckBox() {
2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mButtonSipReceiveCalls = (CheckBoxPreference) findPreference
2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                (BUTTON_SIP_RECEIVE_CALLS);
2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mButtonSipReceiveCalls.setChecked(
2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mSipSharedPreferences.isReceivingCallsEnabled());
2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mButtonSipReceiveCalls.setOnPreferenceClickListener(
2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                new OnPreferenceClickListener() {
2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    public boolean onPreferenceClick(Preference preference) {
218788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                        final boolean enabled = ((CheckBoxPreference) preference).isChecked();
2197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        new Thread(new Runnable() {
2207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                public void run() {
2217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                    handleSipReceiveCallsOption(enabled);
2227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                }
2237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        }).start();
2247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        return true;
2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    }
2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                });
2277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private synchronized void handleSipReceiveCallsOption(boolean enabled) {
2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipSharedPreferences.setReceivingCallsEnabled(enabled);
2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        List<SipProfile> sipProfileList = mProfileDb.retrieveSipProfileList();
2327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        for (SipProfile p : sipProfileList) {
2337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            String sipUri = p.getUriString();
2347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            p = updateAutoRegistrationFlag(p, enabled);
2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            try {
2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (enabled) {
237788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                    mSipManager.open(p, SipUtil.createIncomingCallPendingIntent(this), null);
2387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                } else {
2397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mSipManager.close(sipUri);
2407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    if (mSipSharedPreferences.isPrimaryAccount(sipUri)) {
2417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        // re-open in order to make calls
2427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        mSipManager.open(p);
2437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    }
2447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
2457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } catch (Exception e) {
246788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                log("handleSipReceiveCallsOption, register failed: " + e);
2477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        updateProfilesStatus();
2507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private SipProfile updateAutoRegistrationFlag(
2537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            SipProfile p, boolean enabled) {
2547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        SipProfile newProfile = new SipProfile.Builder(p)
2557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .setAutoRegistration(enabled)
2567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .build();
2577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        try {
2587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mProfileDb.deleteProfile(p);
2597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mProfileDb.saveProfile(newProfile);
2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        } catch (Exception e) {
261788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal            log("updateAutoRegistrationFlag, exception: " + e);
2627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return newProfile;
2647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void updateProfilesStatus() {
2677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        new Thread(new Runnable() {
2687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
2697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void run() {
2707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                try {
2717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    retrieveSipLists();
2727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                } catch (Exception e) {
273788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                    log("updateProfilesStatus, exception: " + e);
2747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
2757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }).start();
2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private String getProfileName(SipProfile profile) {
2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        String profileName = profile.getProfileName();
2817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (TextUtils.isEmpty(profileName)) {
2827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            profileName = profile.getUserName() + "@" + profile.getSipDomain();
2837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return profileName;
2857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void retrieveSipLists() {
2887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipPreferenceMap = new LinkedHashMap<String, SipPreference>();
2897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipProfileList = mProfileDb.retrieveSipProfileList();
2907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        processActiveProfilesFromSipService();
2917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        Collections.sort(mSipProfileList, new Comparator<SipProfile>() {
2927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
2937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public int compare(SipProfile p1, SipProfile p2) {
2947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                return getProfileName(p1).compareTo(getProfileName(p2));
2957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public boolean equals(SipProfile p) {
2987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                // not used
2997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                return false;
3007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
3017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        });
3027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipListContainer.removeAll();
3037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        for (SipProfile p : mSipProfileList) {
3047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            addPreferenceFor(p);
3057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
3067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (!mSipSharedPreferences.isReceivingCallsEnabled()) return;
3087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        for (SipProfile p : mSipProfileList) {
3097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (mUid == p.getCallingUid()) {
3107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                try {
3117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mSipManager.setRegistrationListener(
3127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            p.getUriString(), createRegistrationListener());
3137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                } catch (SipException e) {
314788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                    log("retrieveSipLists, cannot set registration listener: " + e);
3157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
3167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
3177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
3187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void processActiveProfilesFromSipService() {
3217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        SipProfile[] activeList = mSipManager.getListOfProfiles();
3227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        for (SipProfile activeProfile : activeList) {
3237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            SipProfile profile = getProfileFromList(activeProfile);
3247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (profile == null) {
3257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mSipProfileList.add(activeProfile);
3267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else {
3277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                profile.setCallingUid(activeProfile.getCallingUid());
3287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
3297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
3307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private SipProfile getProfileFromList(SipProfile activeProfile) {
3337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        for (SipProfile p : mSipProfileList) {
3347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (p.getUriString().equals(activeProfile.getUriString())) {
3357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                return p;
3367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
3377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
3387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return null;
3397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void addPreferenceFor(SipProfile p) {
3427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        String status;
343788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("addPreferenceFor, profile uri: " + p.getUri());
3447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        SipPreference pref = new SipPreference(this, p);
3457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipPreferenceMap.put(p.getUriString(), pref);
3467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipListContainer.addPreference(pref);
3477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        pref.setOnPreferenceClickListener(
3497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                new Preference.OnPreferenceClickListener() {
3507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    @Override
3517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    public boolean onPreferenceClick(Preference pref) {
3527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        handleProfileClick(((SipPreference) pref).mProfile);
3537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        return true;
3547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    }
3557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                });
3567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void handleProfileClick(final SipProfile profile) {
3597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        int uid = profile.getCallingUid();
3607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (uid == mUid || uid == 0) {
3617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            startSipEditor(profile);
3627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            return;
3637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
3647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        new AlertDialog.Builder(this)
3657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .setTitle(R.string.alert_dialog_close)
3667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .setIconAttribute(android.R.attr.alertDialogIcon)
3677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .setPositiveButton(R.string.close_profile,
3687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        new DialogInterface.OnClickListener() {
3697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            @Override
3707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            public void onClick(DialogInterface dialog, int w) {
3717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                deleteProfile(profile);
3727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                unregisterProfile(profile);
3737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            }
3747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        })
3757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .setNegativeButton(android.R.string.cancel, null)
3767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .show();
3777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void unregisterProfile(final SipProfile p) {
3807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // run it on background thread for better UI response
3817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        new Thread(new Runnable() {
3827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
3837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void run() {
3847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                try {
3857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mSipManager.close(p.getUriString());
3867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                } catch (Exception e) {
387788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                    log("unregisterProfile, unregister failed, SipService died? Exception: " + e);
3887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
3897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
3907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }, "unregisterProfile").start();
3917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    void deleteProfile(SipProfile p) {
3947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipProfileList.remove(p);
3957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        SipPreference pref = mSipPreferenceMap.remove(p.getUriString());
3967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipListContainer.removePreference(pref);
3977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void addProfile(SipProfile p) throws IOException {
4007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        try {
4017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mSipManager.setRegistrationListener(p.getUriString(),
4027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    createRegistrationListener());
4037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        } catch (Exception e) {
404788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal            log("addProfile, cannot set registration listener: " + e);
4057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
4067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipProfileList.add(p);
4077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        addPreferenceFor(p);
4087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
4097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
4107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void startSipEditor(final SipProfile profile) {
4117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mProfile = profile;
4127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        Intent intent = new Intent(this, SipEditor.class);
4137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        intent.putExtra(KEY_SIP_PROFILE, (Parcelable) profile);
4147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        startActivityForResult(intent, REQUEST_ADD_OR_EDIT_SIP_PROFILE);
4157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
4167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
4177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void showRegistrationMessage(final String profileUri,
4187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            final String message) {
4197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        runOnUiThread(new Runnable() {
4207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
4217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void run() {
4227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                SipPreference pref = mSipPreferenceMap.get(profileUri);
4237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (pref != null) {
4247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    pref.updateSummary(message);
4257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
4267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
4277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        });
4287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
4297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
4307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private SipRegistrationListener createRegistrationListener() {
4317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return new SipRegistrationListener() {
4327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
4337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void onRegistrationDone(String profileUri, long expiryTime) {
4347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                showRegistrationMessage(profileUri, getString(
4357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        R.string.registration_status_done));
4367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
4377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
4387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
4397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void onRegistering(String profileUri) {
4407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                showRegistrationMessage(profileUri, getString(
4417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        R.string.registration_status_registering));
4427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
4437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
4447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
4457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void onRegistrationFailed(String profileUri, int errorCode,
4467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    String message) {
4477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                switch (errorCode) {
4487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    case SipErrorCode.IN_PROGRESS:
4497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        showRegistrationMessage(profileUri, getString(
4507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                R.string.registration_status_still_trying));
4517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        break;
4527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    case SipErrorCode.INVALID_CREDENTIALS:
4537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        showRegistrationMessage(profileUri, getString(
4547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                R.string.registration_status_invalid_credentials));
4557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        break;
4567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    case SipErrorCode.SERVER_UNREACHABLE:
4577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        showRegistrationMessage(profileUri, getString(
4587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                R.string.registration_status_server_unreachable));
4597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        break;
4607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    case SipErrorCode.DATA_CONNECTION_LOST:
4617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        if (SipManager.isSipWifiOnly(getApplicationContext())){
4627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            showRegistrationMessage(profileUri, getString(
4637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                    R.string.registration_status_no_wifi_data));
4647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        } else {
4657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            showRegistrationMessage(profileUri, getString(
4667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                    R.string.registration_status_no_data));
4677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        }
4687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        break;
4697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    case SipErrorCode.CLIENT_ERROR:
4707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        showRegistrationMessage(profileUri, getString(
4717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                R.string.registration_status_not_running));
4727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        break;
4737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    default:
4747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        showRegistrationMessage(profileUri, getString(
4757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                R.string.registration_status_failed_try_later,
4767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                message));
4777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
4787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
4797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        };
4807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
4817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
4827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
4837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public boolean onCreateOptionsMenu(Menu menu) {
4847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onCreateOptionsMenu(menu);
4857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        menu.add(0, MENU_ADD_ACCOUNT, 0, R.string.add_sip_account)
4867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
4877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return true;
4887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
4897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
4907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
4917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public boolean onPrepareOptionsMenu(Menu menu) {
4927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        menu.findItem(MENU_ADD_ACCOUNT).setEnabled(
4937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mCallManager.getState() == PhoneConstants.State.IDLE);
4947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return super.onPrepareOptionsMenu(menu);
4957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
4967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
4977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
4987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public boolean onOptionsItemSelected(MenuItem item) {
4997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        final int itemId = item.getItemId();
5007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        switch (itemId) {
5017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            case MENU_ADD_ACCOUNT: {
5027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                startSipEditor(null);
5037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                return true;
5047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
5057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
5067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return super.onOptionsItemSelected(item);
5077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
508788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
509788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    private static void log(String msg) {
510788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        Log.d(SipUtil.LOG_TAG, PREFIX + msg);
511788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
5127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon}
513