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