1fad09042967550e13affd57f139f375e2948b8afChung-yih Wang/*
2fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * Copyright (C) 2010 The Android Open Source Project
3fad09042967550e13affd57f139f375e2948b8afChung-yih Wang *
4fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * Licensed under the Apache License, Version 2.0 (the "License");
5fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * you may not use this file except in compliance with the License.
6fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * You may obtain a copy of the License at
7fad09042967550e13affd57f139f375e2948b8afChung-yih Wang *
8fad09042967550e13affd57f139f375e2948b8afChung-yih Wang *      http://www.apache.org/licenses/LICENSE-2.0
9fad09042967550e13affd57f139f375e2948b8afChung-yih Wang *
10fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * Unless required by applicable law or agreed to in writing, software
11fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * distributed under the License is distributed on an "AS IS" BASIS,
12fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * See the License for the specific language governing permissions and
14fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * limitations under the License.
15fad09042967550e13affd57f139f375e2948b8afChung-yih Wang */
16fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
17fad09042967550e13affd57f139f375e2948b8afChung-yih Wangpackage com.android.phone.sip;
18fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
19ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wangimport com.android.internal.telephony.CallManager;
20ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wangimport com.android.internal.telephony.Phone;
21b0f85b4a78abead921c363f9c8e247d5bdd20c74Wink Savilleimport com.android.internal.telephony.PhoneConstants;
222c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport com.android.phone.CallFeaturesSetting;
23fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport com.android.phone.R;
240fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyanimport com.android.phone.SipUtil;
25fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
262c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport android.app.ActionBar;
270c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wangimport android.app.AlertDialog;
28fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.content.Context;
29fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.content.DialogInterface;
30fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.content.Intent;
310c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wangimport android.content.pm.ApplicationInfo;
320c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wangimport android.content.pm.PackageManager;
331d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyanimport android.net.sip.SipErrorCode;
342c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport android.net.sip.SipException;
35fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.net.sip.SipManager;
362c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawaimport android.net.sip.SipProfile;
37fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.net.sip.SipRegistrationListener;
38fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.os.Bundle;
39fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.os.Parcelable;
400c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wangimport android.os.Process;
41fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.preference.CheckBoxPreference;
42fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.preference.Preference;
43fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.preference.Preference.OnPreferenceClickListener;
44fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.preference.PreferenceActivity;
45a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wangimport android.preference.PreferenceCategory;
4639f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyanimport android.text.TextUtils;
47fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.util.Log;
48c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawaimport android.view.Menu;
49fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport android.view.MenuItem;
50fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
51fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport java.io.IOException;
52fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport java.util.Collections;
53fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport java.util.Comparator;
54fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport java.util.LinkedHashMap;
55fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport java.util.List;
56fad09042967550e13affd57f139f375e2948b8afChung-yih Wangimport java.util.Map;
57fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
58fad09042967550e13affd57f139f375e2948b8afChung-yih Wang/**
59fad09042967550e13affd57f139f375e2948b8afChung-yih Wang * The PreferenceActivity class for managing sip profile preferences.
60fad09042967550e13affd57f139f375e2948b8afChung-yih Wang */
61fad09042967550e13affd57f139f375e2948b8afChung-yih Wangpublic class SipSettings extends PreferenceActivity {
62ea0af6a6335bff37f7179e229902f7fe1af12430Chung-yih Wang    public static final String SIP_SHARED_PREFERENCES = "SIP_PREFERENCES";
63ea0af6a6335bff37f7179e229902f7fe1af12430Chung-yih Wang
64c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa    private static final int MENU_ADD_ACCOUNT = Menu.FIRST;
65c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa
66fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    static final String KEY_SIP_PROFILE = "sip_profile";
67fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
68a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang    private static final String BUTTON_SIP_RECEIVE_CALLS =
69a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang            "sip_receive_calls_key";
70fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    private static final String PREF_SIP_LIST = "sip_account_list";
71fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    private static final String TAG = "SipSettings";
72fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
73fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    private static final int REQUEST_ADD_OR_EDIT_SIP_PROFILE = 1;
74fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
750c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    private PackageManager mPackageManager;
76fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    private SipManager mSipManager;
77ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang    private CallManager mCallManager;
787e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan    private SipProfileDb mProfileDb;
79fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
807e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan    private SipProfile mProfile; // profile that's being edited
81fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
82a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang    private CheckBoxPreference mButtonSipReceiveCalls;
83a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang    private PreferenceCategory mSipListContainer;
84fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    private Map<String, SipPreference> mSipPreferenceMap;
85fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    private List<SipProfile> mSipProfileList;
863e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang    private SipSharedPreferences mSipSharedPreferences;
870c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    private int mUid = Process.myUid();
880c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang
89fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    private class SipPreference extends Preference {
90fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        SipProfile mProfile;
91fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        SipPreference(Context c, SipProfile p) {
92fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            super(c);
93fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            setProfile(p);
94fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        }
95fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
960c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        SipProfile getProfile() {
970c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            return mProfile;
980c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        }
990c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang
100fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        void setProfile(SipProfile p) {
101fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            mProfile = p;
10239f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan            setTitle(getProfileName(p));
1031d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan            updateSummary(mSipSharedPreferences.isReceivingCallsEnabled()
1041d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                    ? getString(R.string.registration_status_checking_status)
1051d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                    : getString(R.string.registration_status_not_receiving));
1060c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        }
1070c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang
1081d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan        void updateSummary(String registrationStatus) {
1090c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            int profileUid = mProfile.getCallingUid();
1103e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang            boolean isPrimary = mProfile.getUriString().equals(
1113e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang                    mSipSharedPreferences.getPrimaryAccount());
1121d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan            Log.v(TAG, "profile uid is " + profileUid + " isPrimary:"
1131d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                    + isPrimary + " registration:" + registrationStatus
1141d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                    + " Primary:" + mSipSharedPreferences.getPrimaryAccount()
1151d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                    + " status:" + registrationStatus);
1161d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan            String summary = "";
1171d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan            if ((profileUid > 0) && (profileUid != mUid)) {
1181d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                // from third party apps
1191d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                summary = getString(R.string.third_party_account_summary,
1201d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                        getPackageNameFromUid(profileUid));
1211d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan            } else if (isPrimary) {
1221d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                summary = getString(R.string.primary_account_summary_with,
1231d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                        registrationStatus);
1241d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan            } else {
1251d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                summary = registrationStatus;
1263e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang            }
1273e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang            setSummary(summary);
1280c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        }
129fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
130fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
1310c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    private String getPackageNameFromUid(int uid) {
1320c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        try {
1330c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            String[] pkgs = mPackageManager.getPackagesForUid(uid);
1340c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            ApplicationInfo ai =
1350c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                    mPackageManager.getApplicationInfo(pkgs[0], 0);
1360c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            return ai.loadLabel(mPackageManager).toString();
1370c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        } catch (PackageManager.NameNotFoundException e) {
1380c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            Log.e(TAG, "cannot find name of uid " + uid, e);
1390c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        }
1400c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        return "uid:" + uid;
1410c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    }
1420c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang
143fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    @Override
144fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    public void onCreate(Bundle savedInstanceState) {
145fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        super.onCreate(savedInstanceState);
146fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
147dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan        mSipManager = SipManager.newInstance(this);
1483e57e4fa1ada973b011cba5d5153127cd12464d2Chung-yih Wang        mSipSharedPreferences = new SipSharedPreferences(this);
1497e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan        mProfileDb = new SipProfileDb(this);
150dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan
1510c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        mPackageManager = getPackageManager();
152fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        setContentView(R.layout.sip_settings_ui);
153fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        addPreferencesFromResource(R.xml.sip_setting);
154a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        mSipListContainer = (PreferenceCategory) findPreference(PREF_SIP_LIST);
155a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        registerForReceiveCallsCheckBox();
156ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang        mCallManager = CallManager.getInstance();
157fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
158fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        updateProfilesStatus();
1592c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa
1602c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        ActionBar actionBar = getActionBar();
1612c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        if (actionBar != null) {
1622c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa            // android.R.id.home will be triggered in onOptionsItemSelected()
1632c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa            actionBar.setDisplayHomeAsUpEnabled(true);
1642c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        }
165fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
166fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
1670c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    @Override
1680c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    public void onResume() {
1690c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        super.onResume();
170ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang
171b0f85b4a78abead921c363f9c8e247d5bdd20c74Wink Saville        if (mCallManager.getState() != PhoneConstants.State.IDLE) {
172ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang            mButtonSipReceiveCalls.setEnabled(false);
173ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang        } else {
174ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang            mButtonSipReceiveCalls.setEnabled(true);
175ba635a36a0f955f4851eaf088a3a2f3a5262e23aChung-yih Wang        }
176fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
177fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
1780c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    @Override
1790c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    protected void onDestroy() {
1800c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        super.onDestroy();
1810c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        unregisterForContextMenu(getListView());
182fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
183fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
1840c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    @Override
1850c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    protected void onActivityResult(final int requestCode, final int resultCode,
1860c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            final Intent intent) {
1870c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        if (resultCode != RESULT_OK && resultCode != RESULT_FIRST_USER) return;
1880c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        new Thread() {
18950480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa            @Override
1900c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            public void run() {
19150480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                try {
19250480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                    if (mProfile != null) {
19350480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                        Log.v(TAG, "Removed Profile:" + mProfile.getProfileName());
19450480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                        deleteProfile(mProfile);
19550480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                    }
196dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan
19750480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                    SipProfile profile = intent.getParcelableExtra(KEY_SIP_PROFILE);
19850480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                    if (resultCode == RESULT_OK) {
19950480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                        Log.v(TAG, "New Profile Name:" + profile.getProfileName());
20050480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                        addProfile(profile);
20150480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                    }
20250480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                    updateProfilesStatus();
20350480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                } catch (IOException e) {
20450480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                    Log.v(TAG, "Can not handle the profile : " + e.getMessage());
2050c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                }
2060c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            }
20750480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa        }.start();
208fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
209fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
210a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang    private void registerForReceiveCallsCheckBox() {
211a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        mButtonSipReceiveCalls = (CheckBoxPreference) findPreference
212a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                (BUTTON_SIP_RECEIVE_CALLS);
213a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        mButtonSipReceiveCalls.setChecked(
214a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                mSipSharedPreferences.isReceivingCallsEnabled());
215a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        mButtonSipReceiveCalls.setOnPreferenceClickListener(
216a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                new OnPreferenceClickListener() {
217a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                    public boolean onPreferenceClick(Preference preference) {
218a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                        final boolean enabled =
219a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                                ((CheckBoxPreference) preference).isChecked();
220a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                        new Thread(new Runnable() {
221a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                                public void run() {
222a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                                    handleSipReceiveCallsOption(enabled);
223a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                                }
224a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                        }).start();
225a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                        return true;
226a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                    }
227a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                });
228a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang    }
229a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang
230a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang    private synchronized void handleSipReceiveCallsOption(boolean enabled) {
231a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        mSipSharedPreferences.setReceivingCallsEnabled(enabled);
2327e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan        List<SipProfile> sipProfileList = mProfileDb.retrieveSipProfileList();
233a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        for (SipProfile p : sipProfileList) {
234a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang            String sipUri = p.getUriString();
235a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang            p = updateAutoRegistrationFlag(p, enabled);
236a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang            try {
2370fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan                if (enabled) {
2380fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan                    mSipManager.open(p,
2390fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan                            SipUtil.createIncomingCallPendingIntent(), null);
2400fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan                } else {
2410fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan                    mSipManager.close(sipUri);
2420fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan                    if (mSipSharedPreferences.isPrimaryAccount(sipUri)) {
2430fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan                        // re-open in order to make calls
2440fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan                        mSipManager.open(p);
2450fb4528c4fcbdc5c0be69ba11dbdf4f8f27d55afHung-ying Tyan                    }
246a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                }
247a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang            } catch (Exception e) {
248a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                Log.e(TAG, "register failed", e);
249a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang            }
250a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        }
251a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        updateProfilesStatus();
252a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang    }
253a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang
254a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang    private SipProfile updateAutoRegistrationFlag(
255a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang            SipProfile p, boolean enabled) {
256a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        SipProfile newProfile = new SipProfile.Builder(p)
257a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                .setAutoRegistration(enabled)
258a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang                .build();
259a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        try {
2607e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan            mProfileDb.deleteProfile(p);
2617e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan            mProfileDb.saveProfile(newProfile);
262a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        } catch (Exception e) {
263a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang            Log.e(TAG, "updateAutoRegistrationFlag error", e);
264a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        }
265a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang        return newProfile;
266a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang    }
267a1cd07af3c05425e1bce8dd748bb26b7c5af3277Chung-yih Wang
268fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    private void updateProfilesStatus() {
269fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        new Thread(new Runnable() {
27050480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa            @Override
271fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            public void run() {
272fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                try {
2730c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                    retrieveSipLists();
274fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                } catch (Exception e) {
275fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                    Log.e(TAG, "isRegistered", e);
276fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                }
277fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            }
278fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        }).start();
279fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
280fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
28139f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan    private String getProfileName(SipProfile profile) {
28239f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan        String profileName = profile.getProfileName();
28339f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan        if (TextUtils.isEmpty(profileName)) {
28439f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan            profileName = profile.getUserName() + "@" + profile.getSipDomain();
28539f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan        }
28639f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan        return profileName;
28739f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan    }
28839f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan
2890c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    private void retrieveSipLists() {
2900c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        mSipPreferenceMap = new LinkedHashMap<String, SipPreference>();
2917e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan        mSipProfileList = mProfileDb.retrieveSipProfileList();
2920c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        processActiveProfilesFromSipService();
2930c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        Collections.sort(mSipProfileList, new Comparator<SipProfile>() {
29450480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa            @Override
295fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            public int compare(SipProfile p1, SipProfile p2) {
29639f7cda3aa62a38f9f6d7c34ed90bc65e27af27cHung-ying Tyan                return getProfileName(p1).compareTo(getProfileName(p2));
297fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            }
298fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
299fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            public boolean equals(SipProfile p) {
300fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                // not used
301fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                return false;
302fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            }
303fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        });
304fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        mSipListContainer.removeAll();
305fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        for (SipProfile p : mSipProfileList) {
3060c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            addPreferenceFor(p);
3075cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan        }
3085cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan
3095cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan        if (!mSipSharedPreferences.isReceivingCallsEnabled()) return;
3105cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan        for (SipProfile p : mSipProfileList) {
3111d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan            if (mUid == p.getCallingUid()) {
3120c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                try {
3130c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                    mSipManager.setRegistrationListener(
3141d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                            p.getUriString(), createRegistrationListener());
3150c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                } catch (SipException e) {
3160c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                    Log.e(TAG, "cannot set registration listener", e);
317fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                }
318fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            }
3191d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan        }
3201d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan    }
3211d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan
3221d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan    private void processActiveProfilesFromSipService() {
3231d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan        SipProfile[] activeList = mSipManager.getListOfProfiles();
3241d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan        for (SipProfile activeProfile : activeList) {
3250c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            SipProfile profile = getProfileFromList(activeProfile);
3260c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            if (profile == null) {
3270c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                mSipProfileList.add(activeProfile);
3280c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            } else {
3291d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                profile.setCallingUid(activeProfile.getCallingUid());
3300c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            }
331fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        }
332fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
333fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
3340c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    private SipProfile getProfileFromList(SipProfile activeProfile) {
3350c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        for (SipProfile p : mSipProfileList) {
3360c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            if (p.getUriString().equals(activeProfile.getUriString())) {
3370c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                return p;
3380c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            }
339fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        }
3400c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        return null;
3410c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    }
3420c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang
3430c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    private void addPreferenceFor(SipProfile p) {
3440c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        String status;
3450c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        Log.v(TAG, "addPreferenceFor profile uri" + p.getUri());
346fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        SipPreference pref = new SipPreference(this, p);
347fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        mSipPreferenceMap.put(p.getUriString(), pref);
3480c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        mSipListContainer.addPreference(pref);
349fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
350fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        pref.setOnPreferenceClickListener(
351fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                new Preference.OnPreferenceClickListener() {
35250480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                    @Override
353fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                    public boolean onPreferenceClick(Preference pref) {
3540c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                        handleProfileClick(((SipPreference) pref).mProfile);
355fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                        return true;
356fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                    }
357fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                });
358fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
359fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
3600c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang    private void handleProfileClick(final SipProfile profile) {
3610c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        int uid = profile.getCallingUid();
3622a9da944442552ff52f38799d1eeda2af209b35bHung-ying Tyan        if (uid == mUid || uid == 0) {
3630c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            startSipEditor(profile);
3640c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            return;
3650c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        }
3660c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        new AlertDialog.Builder(this)
3670c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                .setTitle(R.string.alert_dialog_close)
36850480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                .setIconAttribute(android.R.attr.alertDialogIcon)
3690c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                .setPositiveButton(R.string.close_profile,
3700c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                        new DialogInterface.OnClickListener() {
37150480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa                            @Override
3720c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                            public void onClick(DialogInterface dialog, int w) {
373dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan                                deleteProfile(profile);
374b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan                                unregisterProfile(profile);
3750c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                            }
3760c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                        })
3770c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                .setNegativeButton(android.R.string.cancel, null)
3780c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang                .show();
379fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
380fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
381b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan    private void unregisterProfile(final SipProfile p) {
382b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan        // run it on background thread for better UI response
383b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan        new Thread(new Runnable() {
38450480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa            @Override
385b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan            public void run() {
386b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan                try {
387b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan                    mSipManager.close(p.getUriString());
388b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan                } catch (Exception e) {
389b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan                    Log.e(TAG, "unregister failed, SipService died?", e);
390b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan                }
391b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan            }
392b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan        }, "unregisterProfile").start();
393b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan    }
394b8214da0e3b3fce647cd960e59a7900e0981b3a3Hung-ying Tyan
395dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan    void deleteProfile(SipProfile p) {
396fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        mSipProfileList.remove(p);
397fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        SipPreference pref = mSipPreferenceMap.remove(p.getUriString());
398fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        mSipListContainer.removePreference(pref);
399fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
400fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
4017e4022a85e51589b409de8fd0e9d2b17e3b4a4f7Hung-ying Tyan    private void addProfile(SipProfile p) throws IOException {
402dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan        try {
403dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan            mSipManager.setRegistrationListener(p.getUriString(),
404dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan                    createRegistrationListener());
405dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan        } catch (Exception e) {
406dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan            Log.e(TAG, "cannot set registration listener", e);
407dad85ef297bfb5fb97a94379d4d4e5b411030379Hung-ying Tyan        }
408fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        mSipProfileList.add(p);
4090c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang        addPreferenceFor(p);
410fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
411fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
412fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    private void startSipEditor(final SipProfile profile) {
413fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        mProfile = profile;
414fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        Intent intent = new Intent(this, SipEditor.class);
415fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        intent.putExtra(KEY_SIP_PROFILE, (Parcelable) profile);
416fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        startActivityForResult(intent, REQUEST_ADD_OR_EDIT_SIP_PROFILE);
417fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
418fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
4191d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan    private void showRegistrationMessage(final String profileUri,
420fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            final String message) {
421fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        runOnUiThread(new Runnable() {
42250480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa            @Override
423fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            public void run() {
4241d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                SipPreference pref = mSipPreferenceMap.get(profileUri);
4251d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                if (pref != null) {
4261d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                    pref.updateSummary(message);
427fad09042967550e13affd57f139f375e2948b8afChung-yih Wang                }
428fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            }
429fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        });
430fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
431fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
432fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    private SipRegistrationListener createRegistrationListener() {
433fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        return new SipRegistrationListener() {
43450480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa            @Override
435fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            public void onRegistrationDone(String profileUri, long expiryTime) {
4361d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                showRegistrationMessage(profileUri, getString(
4371d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                        R.string.registration_status_done));
438fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            }
439fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
44050480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa            @Override
4410c86d42a9c4f17506b10730bb079cb0d85460fe0Chung-yih Wang            public void onRegistering(String profileUri) {
4421d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                showRegistrationMessage(profileUri, getString(
4431d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                        R.string.registration_status_registering));
444fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            }
445fad09042967550e13affd57f139f375e2948b8afChung-yih Wang
44650480073bf2394d5b065084f46b2223ab90fb7dcDaisuke Miyakawa            @Override
447c03dd756e3fbe7a83074030ff156da35d12138c0Hung-ying Tyan            public void onRegistrationFailed(String profileUri, int errorCode,
448c03dd756e3fbe7a83074030ff156da35d12138c0Hung-ying Tyan                    String message) {
44958c606391d60568a965e3108d4281bf3ed944192Hung-ying Tyan                switch (errorCode) {
450c03dd756e3fbe7a83074030ff156da35d12138c0Hung-ying Tyan                    case SipErrorCode.IN_PROGRESS:
4511d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                        showRegistrationMessage(profileUri, getString(
4521d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                                R.string.registration_status_still_trying));
4531d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                        break;
454c03dd756e3fbe7a83074030ff156da35d12138c0Hung-ying Tyan                    case SipErrorCode.INVALID_CREDENTIALS:
4551d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                        showRegistrationMessage(profileUri, getString(
4562b63e3c8c6f79106ccb41401f80fa6b55f2cdfa9Hung-ying Tyan                                R.string.registration_status_invalid_credentials));
4571d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                        break;
45868d060b8f52c6c1176d5c55358250b18d14f2b51Hung-ying Tyan                    case SipErrorCode.SERVER_UNREACHABLE:
45968d060b8f52c6c1176d5c55358250b18d14f2b51Hung-ying Tyan                        showRegistrationMessage(profileUri, getString(
46068d060b8f52c6c1176d5c55358250b18d14f2b51Hung-ying Tyan                                R.string.registration_status_server_unreachable));
46168d060b8f52c6c1176d5c55358250b18d14f2b51Hung-ying Tyan                        break;
4625cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan                    case SipErrorCode.DATA_CONNECTION_LOST:
46319ae0fffd55eef95634c0ff233981899c58179d7John Wang                        if (SipManager.isSipWifiOnly(getApplicationContext())){
46419ae0fffd55eef95634c0ff233981899c58179d7John Wang                            showRegistrationMessage(profileUri, getString(
46519ae0fffd55eef95634c0ff233981899c58179d7John Wang                                    R.string.registration_status_no_wifi_data));
46619ae0fffd55eef95634c0ff233981899c58179d7John Wang                        } else {
46719ae0fffd55eef95634c0ff233981899c58179d7John Wang                            showRegistrationMessage(profileUri, getString(
46819ae0fffd55eef95634c0ff233981899c58179d7John Wang                                    R.string.registration_status_no_data));
46919ae0fffd55eef95634c0ff233981899c58179d7John Wang                        }
4705cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan                        break;
4715cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan                    case SipErrorCode.CLIENT_ERROR:
4725cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan                        showRegistrationMessage(profileUri, getString(
4735cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan                                R.string.registration_status_not_running));
4745cf21694707b5fb9dc512abad2e7d320de7c4568Hung-ying Tyan                        break;
4751d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                    default:
4761d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                        showRegistrationMessage(profileUri, getString(
4771d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                                R.string.registration_status_failed_try_later,
4781d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                                message));
4791d0075e4a480a32e26a673c58b94bd706f997620Hung-ying Tyan                }
480fad09042967550e13affd57f139f375e2948b8afChung-yih Wang            }
481fad09042967550e13affd57f139f375e2948b8afChung-yih Wang        };
482fad09042967550e13affd57f139f375e2948b8afChung-yih Wang    }
4832c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa
4842c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa    @Override
485c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa    public boolean onCreateOptionsMenu(Menu menu) {
486c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa        super.onCreateOptionsMenu(menu);
487c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa        menu.add(0, MENU_ADD_ACCOUNT, 0, R.string.add_sip_account)
488c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
489c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa        return true;
490c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa    }
491c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa
492c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa    @Override
493c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa    public boolean onPrepareOptionsMenu(Menu menu) {
494b0f85b4a78abead921c363f9c8e247d5bdd20c74Wink Saville        menu.findItem(MENU_ADD_ACCOUNT).setEnabled(
495b0f85b4a78abead921c363f9c8e247d5bdd20c74Wink Saville                mCallManager.getState() == PhoneConstants.State.IDLE);
496c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa        return super.onPrepareOptionsMenu(menu);
497c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa    }
498c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa
499c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa    @Override
5002c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa    public boolean onOptionsItemSelected(MenuItem item) {
5012c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        final int itemId = item.getItemId();
502c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa        switch (itemId) {
503c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa            case android.R.id.home: {
504c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa                CallFeaturesSetting.goUpToTopLevelSetting(this);
505c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa                return true;
506c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa            }
507c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa            case MENU_ADD_ACCOUNT: {
508c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa                startSipEditor(null);
509c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa                return true;
510c420798f9eaf5f318d5a154028e6a97be1a7bb73Daisuke Miyakawa            }
5112c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        }
5122c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa        return super.onOptionsItemSelected(item);
5132c8c40738e9b8a8e767aa061721ebaa5b5591a4cDaisuke Miyakawa    }
514fad09042967550e13affd57f139f375e2948b8afChung-yih Wang}
515