1db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee/*
2db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee * Copyright (C) 2014 The Android Open Source Project
3db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee *
4db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee * Licensed under the Apache License, Version 2.0 (the "License");
5db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee * you may not use this file except in compliance with the License.
6db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee * You may obtain a copy of the License at
7db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee *
8db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee *      http://www.apache.org/licenses/LICENSE-2.0
9db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee *
10db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee * Unless required by applicable law or agreed to in writing, software
11db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee * distributed under the License is distributed on an "AS IS" BASIS,
12db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee * See the License for the specific language governing permissions and
14db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee * limitations under the License
15db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee */
16db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
17db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leepackage com.android.phone.settings;
18db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
19baee2955f596f7b79971feb12fa21031a069677dTyler Gunnimport com.android.phone.R;
20baee2955f596f7b79971feb12fa21031a069677dTyler Gunn
21baee2955f596f7b79971feb12fa21031a069677dTyler Gunnimport android.app.AlertDialog;
22db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport android.content.Context;
23baee2955f596f7b79971feb12fa21031a069677dTyler Gunnimport android.content.DialogInterface;
24baee2955f596f7b79971feb12fa21031a069677dTyler Gunnimport android.content.Intent;
257b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charltonimport android.content.pm.PackageManager;
26baee2955f596f7b79971feb12fa21031a069677dTyler Gunnimport android.os.UserHandle;
27db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport android.preference.ListPreference;
28db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport android.preference.Preference;
294d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.PhoneAccountHandle;
304d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.TelecomManager;
31db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport android.util.AttributeSet;
32db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
33db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport java.util.List;
34db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport java.util.Objects;
35db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
36db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leepublic class AccountSelectionPreference extends ListPreference implements
37db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        Preference.OnPreferenceChangeListener {
38db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
39db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public interface AccountSelectionListener {
40db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        boolean onAccountSelected(AccountSelectionPreference pref, PhoneAccountHandle account);
41baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        void onAccountSelectionDialogShow(AccountSelectionPreference pref);
42ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        void onAccountChanged(AccountSelectionPreference pref);
43db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
44db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
45baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    private final Context mContext;
46db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    private AccountSelectionListener mListener;
47db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    private PhoneAccountHandle[] mAccounts;
48db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    private String[] mEntryValues;
49db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    private CharSequence[] mEntries;
50ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee    private boolean mShowSelectionInSummary = true;
51db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
52db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public AccountSelectionPreference(Context context) {
53ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        this(context, null);
54db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
55db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
56db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public AccountSelectionPreference(Context context, AttributeSet attrs) {
57db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        super(context, attrs);
58baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        mContext = context;
59db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        setOnPreferenceChangeListener(this);
60db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
61db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
62db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public void setListener(AccountSelectionListener listener) {
63db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mListener = listener;
64db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
65db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
66ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee    public void setShowSelectionInSummary(boolean value) {
67ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        mShowSelectionInSummary = value;
68ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee    }
69ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee
70db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public void setModel(
714d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunn            TelecomManager telecomManager,
72db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            List<PhoneAccountHandle> accountsList,
73db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            PhoneAccountHandle currentSelection,
74db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            CharSequence nullSelectionString) {
75db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
76db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mAccounts = accountsList.toArray(new PhoneAccountHandle[accountsList.size()]);
77db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mEntryValues = new String[mAccounts.length + 1];
78db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mEntries = new CharSequence[mAccounts.length + 1];
79db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
807b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charlton        PackageManager pm = mContext.getPackageManager();
817b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charlton
82db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        int selectedIndex = mAccounts.length;  // Points to nullSelectionString by default
83db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        int i = 0;
84db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        for ( ; i < mAccounts.length; i++) {
854d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunn            CharSequence label = telecomManager.getPhoneAccount(mAccounts[i]).getLabel();
867b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charlton            if (label != null) {
877b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charlton                label = pm.getUserBadgedLabel(label, mAccounts[i].getUserHandle());
887b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charlton            }
89db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            mEntries[i] = label == null ? null : label.toString();
90db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            mEntryValues[i] = Integer.toString(i);
91db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            if (Objects.equals(currentSelection, mAccounts[i])) {
92db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee                selectedIndex = i;
93db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            }
94db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        }
95db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mEntryValues[i] = Integer.toString(i);
96db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mEntries[i] = nullSelectionString;
97db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
98db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        setEntryValues(mEntryValues);
99db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        setEntries(mEntries);
100db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        setValueIndex(selectedIndex);
101ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        if (mShowSelectionInSummary) {
102ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee            setSummary(mEntries[selectedIndex]);
103ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        }
104db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
105db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
106db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    @Override
107db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public boolean onPreferenceChange(Preference preference, Object newValue) {
108db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        if (mListener != null) {
109db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            int index = Integer.parseInt((String) newValue);
110db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            PhoneAccountHandle account = index < mAccounts.length ? mAccounts[index] : null;
111db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            if (mListener.onAccountSelected(this, account)) {
112ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                if (mShowSelectionInSummary) {
113ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                    setSummary(mEntries[index]);
114ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                }
115ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                if (index != findIndexOfValue(getValue())) {
116ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                    setValueIndex(index);
117ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                    mListener.onAccountChanged(this);
118ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                }
119db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee                return true;
120db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            }
121db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        }
122db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        return false;
123db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
124baee2955f596f7b79971feb12fa21031a069677dTyler Gunn
125baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    /**
126baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     * Modifies the dialog to change the default "Cancel" button to "Choose Accounts", which
127baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     * triggers the {@link PhoneAccountSelectionPreferenceActivity} to be shown.
128baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     *
129baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     * @param builder The {@code AlertDialog.Builder}.
130baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     */
131baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    @Override
132baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
133baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        // Notify the listener that the dialog is about to be built.  This is important so that the
134baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        // list of enabled accounts can be updated prior to showing the dialog.
135baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        mListener.onAccountSelectionDialogShow(this);
136baee2955f596f7b79971feb12fa21031a069677dTyler Gunn
137baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        super.onPrepareDialogBuilder(builder);
138baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    }
139db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee}
140