17d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/*
27d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Copyright (C) 2010 The Android Open Source Project
37d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon *
47d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License");
57d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * you may not use this file except in compliance with the License.
67d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * You may obtain a copy of the License at
77d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon *
87d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon *      http://www.apache.org/licenses/LICENSE-2.0
97d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon *
107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * Unless required by applicable law or agreed to in writing, software
117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS,
127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * See the License for the specific language governing permissions and
147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * limitations under the License.
157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */
167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
17788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepalpackage com.android.services.telephony.sip;
187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.ActionBar;
207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.app.AlertDialog;
217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Context;
227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.DialogInterface;
237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.Intent;
247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.pm.ApplicationInfo;
257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.content.pm.PackageManager;
267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipErrorCode;
277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipException;
287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipManager;
297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipProfile;
307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.net.sip.SipRegistrationListener;
317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Bundle;
327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Parcelable;
337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.os.Process;
347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.Preference;
357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceActivity;
367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.preference.PreferenceCategory;
377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.text.TextUtils;
387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.util.Log;
397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.Menu;
407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport android.view.MenuItem;
417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.io.IOException;
437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.Collections;
447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.Comparator;
457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.LinkedHashMap;
467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.List;
477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonimport java.util.Map;
487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
49b2eba2d966529e4f6bb9c8ec9b43a3b5e0e884deAndrew Leeimport com.android.phone.R;
50b2eba2d966529e4f6bb9c8ec9b43a3b5e0e884deAndrew Lee
517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon/**
527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon * The PreferenceActivity class for managing sip profile preferences.
537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon */
547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordonpublic class SipSettings extends PreferenceActivity {
557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public static final String SIP_SHARED_PREFERENCES = "SIP_PREFERENCES";
567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    static final String KEY_SIP_PROFILE = "sip_profile";
586781b0c2375a905614781f8503bfd601f4020340Santos Cordon    static final int REQUEST_ADD_OR_EDIT_SIP_PROFILE = 1;
597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
606781b0c2375a905614781f8503bfd601f4020340Santos Cordon    private static final String PREFIX = "[SipSettings] ";
616781b0c2375a905614781f8503bfd601f4020340Santos Cordon    private static final boolean VERBOSE = false; /* STOP SHIP if true */
626781b0c2375a905614781f8503bfd601f4020340Santos Cordon    private static final int MENU_ADD_ACCOUNT = Menu.FIRST;
637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private static final String PREF_SIP_LIST = "sip_account_list";
647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private PackageManager mPackageManager;
667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private SipManager mSipManager;
677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private SipProfileDb mProfileDb;
687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private SipProfile mProfile; // profile that's being edited
697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private PreferenceCategory mSipListContainer;
707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private Map<String, SipPreference> mSipPreferenceMap;
717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private List<SipProfile> mSipProfileList;
72b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger    private SipPreferences mSipPreferences;
737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private int mUid = Process.myUid();
747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private class SipPreference extends Preference {
767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        SipProfile mProfile;
777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        SipPreference(Context c, SipProfile p) {
787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            super(c);
797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            setProfile(p);
807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        SipProfile getProfile() {
837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            return mProfile;
847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        void setProfile(SipProfile p) {
877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mProfile = p;
887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            setTitle(getProfileName(p));
89b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger            updateSummary(mSipPreferences.isReceivingCallsEnabled()
907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    ? getString(R.string.registration_status_checking_status)
917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    : getString(R.string.registration_status_not_receiving));
927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        void updateSummary(String registrationStatus) {
957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            int profileUid = mProfile.getCallingUid();
96788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal            if (VERBOSE) {
97788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                log("SipPreference.updateSummary, profile uid: " + profileUid +
98788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                        " registration: " + registrationStatus +
99788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                        " status: " + registrationStatus);
100788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal            }
1017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            String summary = "";
1027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if ((profileUid > 0) && (profileUid != mUid)) {
1037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                // from third party apps
1047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                summary = getString(R.string.third_party_account_summary,
1057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        getPackageNameFromUid(profileUid));
1067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else {
1077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                summary = registrationStatus;
1087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
1097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            setSummary(summary);
1107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private String getPackageNameFromUid(int uid) {
1147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        try {
1157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            String[] pkgs = mPackageManager.getPackagesForUid(uid);
116788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal            ApplicationInfo ai = mPackageManager.getApplicationInfo(pkgs[0], 0);
1177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            return ai.loadLabel(mPackageManager).toString();
1187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        } catch (PackageManager.NameNotFoundException e) {
119788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal            log("getPackageNameFromUid, cannot find name of uid: " + uid + ", exception: " + e);
1207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return "uid:" + uid;
1227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
1257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public void onCreate(Bundle savedInstanceState) {
1267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onCreate(savedInstanceState);
1277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipManager = SipManager.newInstance(this);
129b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger        mSipPreferences = new SipPreferences(this);
1307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mProfileDb = new SipProfileDb(this);
1317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mPackageManager = getPackageManager();
1337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        setContentView(R.layout.sip_settings_ui);
1347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        addPreferencesFromResource(R.xml.sip_setting);
1357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipListContainer = (PreferenceCategory) findPreference(PREF_SIP_LIST);
1367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        ActionBar actionBar = getActionBar();
1387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (actionBar != null) {
1397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            actionBar.setDisplayHomeAsUpEnabled(true);
1407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
1447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public void onResume() {
1457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onResume();
1466781b0c2375a905614781f8503bfd601f4020340Santos Cordon        updateProfilesStatus();
1477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
1507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected void onDestroy() {
1517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onDestroy();
1527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        unregisterForContextMenu(getListView());
1537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
1567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    protected void onActivityResult(final int requestCode, final int resultCode,
1577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            final Intent intent) {
1587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (resultCode != RESULT_OK && resultCode != RESULT_FIRST_USER) return;
1597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        new Thread() {
1607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
1617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void run() {
1627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                try {
1637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    if (mProfile != null) {
164788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                        if (VERBOSE) log("onActivityResult, remove: " + mProfile.getProfileName());
1657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        deleteProfile(mProfile);
1667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    }
1677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    SipProfile profile = intent.getParcelableExtra(KEY_SIP_PROFILE);
1697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    if (resultCode == RESULT_OK) {
170788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                        if (VERBOSE) log("onActivityResult, new: " + profile.getProfileName());
1717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        addProfile(profile);
1727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    }
1737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    updateProfilesStatus();
1747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                } catch (IOException e) {
175788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                    log("onActivityResult, can not handle the profile:  " + e);
1767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
1777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
1787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }.start();
1797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void updateProfilesStatus() {
1827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        new Thread(new Runnable() {
1837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
1847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void run() {
1857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                try {
1867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    retrieveSipLists();
1877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                } catch (Exception e) {
188788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                    log("updateProfilesStatus, exception: " + e);
1897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
1907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
1917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }).start();
1927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
1937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
1947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private String getProfileName(SipProfile profile) {
1957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        String profileName = profile.getProfileName();
1967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (TextUtils.isEmpty(profileName)) {
1977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            profileName = profile.getUserName() + "@" + profile.getSipDomain();
1987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
1997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return profileName;
2007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void retrieveSipLists() {
2037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipPreferenceMap = new LinkedHashMap<String, SipPreference>();
2047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipProfileList = mProfileDb.retrieveSipProfileList();
2057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        processActiveProfilesFromSipService();
2067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        Collections.sort(mSipProfileList, new Comparator<SipProfile>() {
2077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
2087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public int compare(SipProfile p1, SipProfile p2) {
2097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                return getProfileName(p1).compareTo(getProfileName(p2));
2107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2127d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public boolean equals(SipProfile p) {
2137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                // not used
2147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                return false;
2157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        });
2177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipListContainer.removeAll();
2182c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee        if (mSipProfileList.isEmpty()) {
2192c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee            getPreferenceScreen().removePreference(mSipListContainer);
2202c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee        } else {
2212c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee            getPreferenceScreen().addPreference(mSipListContainer);
2222c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee            for (SipProfile p : mSipProfileList) {
2232c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee                addPreferenceFor(p);
2242c951c45e83441e1a760d8bf99a67d2e4e94975bAndrew Lee            }
2257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
227b64b0a8e1f203b7628b6eeca9d0186803beaff7bBrad Ebinger        if (!mSipPreferences.isReceivingCallsEnabled()) return;
2287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        for (SipProfile p : mSipProfileList) {
22990f2ffdd00b47e2cd863d4361204c1a6fb31e3a0Nancy Chen            if (mUid == p.getCallingUid()) {
2307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                try {
2317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mSipManager.setRegistrationListener(
2327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            p.getUriString(), createRegistrationListener());
2337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                } catch (SipException e) {
234788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                    log("retrieveSipLists, cannot set registration listener: " + e);
2357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
2367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void processActiveProfilesFromSipService() {
2413fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger        SipProfile[] activeList = {};
2423fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger        try {
2433fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger            activeList = mSipManager.getListOfProfiles();
2443fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger        } catch (SipException e) {
2453fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger            log("SipManager could not retrieve SIP profiles: " + e);
2463fa4346096855f6f721cad3c091da63e62c3bb1aBrad Ebinger        }
2477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        for (SipProfile activeProfile : activeList) {
2487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            SipProfile profile = getProfileFromList(activeProfile);
2497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (profile == null) {
2507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                mSipProfileList.add(activeProfile);
2517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            } else {
2527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                profile.setCallingUid(activeProfile.getCallingUid());
2537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private SipProfile getProfileFromList(SipProfile activeProfile) {
2587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        for (SipProfile p : mSipProfileList) {
2597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            if (p.getUriString().equals(activeProfile.getUriString())) {
2607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                return p;
2617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
2627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return null;
2647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void addPreferenceFor(SipProfile p) {
2677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        String status;
268788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        if (VERBOSE) log("addPreferenceFor, profile uri: " + p.getUri());
2697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        SipPreference pref = new SipPreference(this, p);
2707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipPreferenceMap.put(p.getUriString(), pref);
2717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipListContainer.addPreference(pref);
2727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        pref.setOnPreferenceClickListener(
2747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                new Preference.OnPreferenceClickListener() {
2757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    @Override
2767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    public boolean onPreferenceClick(Preference pref) {
2777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        handleProfileClick(((SipPreference) pref).mProfile);
2787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        return true;
2797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    }
2807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                });
2817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
2827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
2837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void handleProfileClick(final SipProfile profile) {
2847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        int uid = profile.getCallingUid();
2857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        if (uid == mUid || uid == 0) {
2867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            startSipEditor(profile);
2877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            return;
2887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
2897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        new AlertDialog.Builder(this)
2907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .setTitle(R.string.alert_dialog_close)
2917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .setIconAttribute(android.R.attr.alertDialogIcon)
2927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .setPositiveButton(R.string.close_profile,
2937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        new DialogInterface.OnClickListener() {
2947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            @Override
2957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            public void onClick(DialogInterface dialog, int w) {
2967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                deleteProfile(profile);
2977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                unregisterProfile(profile);
2987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            }
2997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        })
3007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .setNegativeButton(android.R.string.cancel, null)
3017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                .show();
3027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void unregisterProfile(final SipProfile p) {
3057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        // run it on background thread for better UI response
3067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        new Thread(new Runnable() {
3077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
3087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void run() {
3097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                try {
3107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    mSipManager.close(p.getUriString());
3117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                } catch (Exception e) {
312788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal                    log("unregisterProfile, unregister failed, SipService died? Exception: " + e);
3137d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
3147d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
3157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }, "unregisterProfile").start();
3167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    void deleteProfile(SipProfile p) {
3197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipProfileList.remove(p);
3207d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        SipPreference pref = mSipPreferenceMap.remove(p.getUriString());
321e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon        if (pref != null) {
322e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon            mSipListContainer.removePreference(pref);
323e50b1903f2e84de2d23c035f8444cb83e1ae6226Santos Cordon        }
3247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void addProfile(SipProfile p) throws IOException {
3277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        try {
3287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            mSipManager.setRegistrationListener(p.getUriString(),
3297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    createRegistrationListener());
3307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        } catch (Exception e) {
331788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal            log("addProfile, cannot set registration listener: " + e);
3327d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
3337d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mSipProfileList.add(p);
3347d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        addPreferenceFor(p);
3357d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void startSipEditor(final SipProfile profile) {
3387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        mProfile = profile;
3397d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        Intent intent = new Intent(this, SipEditor.class);
3407d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        intent.putExtra(KEY_SIP_PROFILE, (Parcelable) profile);
3417d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        startActivityForResult(intent, REQUEST_ADD_OR_EDIT_SIP_PROFILE);
3427d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3447d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private void showRegistrationMessage(final String profileUri,
3457d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            final String message) {
3467d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        runOnUiThread(new Runnable() {
3477d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
3487d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void run() {
3497d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                SipPreference pref = mSipPreferenceMap.get(profileUri);
3507d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                if (pref != null) {
3517d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    pref.updateSummary(message);
3527d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
3537d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
3547d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        });
3557d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
3567d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3577d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    private SipRegistrationListener createRegistrationListener() {
3587d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return new SipRegistrationListener() {
3597d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
3607d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void onRegistrationDone(String profileUri, long expiryTime) {
3617d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                showRegistrationMessage(profileUri, getString(
3627d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        R.string.registration_status_done));
3637d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
3647d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3657d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
3667d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void onRegistering(String profileUri) {
3677d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                showRegistrationMessage(profileUri, getString(
3687d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        R.string.registration_status_registering));
3697d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
3707d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
3717d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            @Override
3727d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            public void onRegistrationFailed(String profileUri, int errorCode,
3737d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    String message) {
3747d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                switch (errorCode) {
3757d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    case SipErrorCode.IN_PROGRESS:
3767d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        showRegistrationMessage(profileUri, getString(
3777d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                R.string.registration_status_still_trying));
3787d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        break;
3797d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    case SipErrorCode.INVALID_CREDENTIALS:
3807d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        showRegistrationMessage(profileUri, getString(
3817d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                R.string.registration_status_invalid_credentials));
3827d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        break;
3837d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    case SipErrorCode.SERVER_UNREACHABLE:
3847d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        showRegistrationMessage(profileUri, getString(
3857d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                R.string.registration_status_server_unreachable));
3867d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        break;
3877d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    case SipErrorCode.DATA_CONNECTION_LOST:
3887d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        if (SipManager.isSipWifiOnly(getApplicationContext())){
3897d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            showRegistrationMessage(profileUri, getString(
3907d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                    R.string.registration_status_no_wifi_data));
3917d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        } else {
3927d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                            showRegistrationMessage(profileUri, getString(
3937d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                    R.string.registration_status_no_data));
3947d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        }
3957d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        break;
3967d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    case SipErrorCode.CLIENT_ERROR:
3977d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        showRegistrationMessage(profileUri, getString(
3987d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                R.string.registration_status_not_running));
3997d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        break;
4007d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                    default:
4017d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                        showRegistrationMessage(profileUri, getString(
4027d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                R.string.registration_status_failed_try_later,
4037d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                                message));
4047d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                }
4057d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
4067d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        };
4077d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
4087d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
4097d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
4107d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public boolean onCreateOptionsMenu(Menu menu) {
4117d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        super.onCreateOptionsMenu(menu);
412b2eba2d966529e4f6bb9c8ec9b43a3b5e0e884deAndrew Lee        MenuItem addAccountMenuItem = menu.add(0, MENU_ADD_ACCOUNT, 0, R.string.add_sip_account);
413b2eba2d966529e4f6bb9c8ec9b43a3b5e0e884deAndrew Lee        addAccountMenuItem.setIcon(R.drawable.ic_add_24dp);
414b2eba2d966529e4f6bb9c8ec9b43a3b5e0e884deAndrew Lee        addAccountMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
4157d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return true;
4167d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
4177d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
4187d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
4197d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public boolean onPrepareOptionsMenu(Menu menu) {
4201344f67ea331f9a485f54c4b5e26d62a5cfad3fbSailesh Nepal        menu.findItem(MENU_ADD_ACCOUNT).setEnabled(SipUtil.isPhoneIdle(this));
4217d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return super.onPrepareOptionsMenu(menu);
4227d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
4237d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon
4247d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    @Override
4257d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    public boolean onOptionsItemSelected(MenuItem item) {
4267d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        final int itemId = item.getItemId();
4277d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        switch (itemId) {
4287d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            case MENU_ADD_ACCOUNT: {
4297d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                startSipEditor(null);
4307d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon                return true;
4317d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon            }
4324d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee            case android.R.id.home: {
4334d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee                onBackPressed();
4344d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee                return true;
4354d37f5279f2896d16ec3d4e10ec4dcba63e86c3cAndrew Lee            }
4367d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        }
4377d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon        return super.onOptionsItemSelected(item);
4387d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon    }
439788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal
440788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    private static void log(String msg) {
441788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal        Log.d(SipUtil.LOG_TAG, PREFIX + msg);
442788959e2d798da2d8a34cf89779421966d200f3dSailesh Nepal    }
4437d4ddf6dc0d7c8158bac3a5dec7936e837e95bddSantos Cordon}
444