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;
25baee2955f596f7b79971feb12fa21031a069677dTyler Gunnimport android.os.UserHandle;
26db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport android.preference.ListPreference;
27db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport android.preference.Preference;
284d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.PhoneAccountHandle;
294d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.TelecomManager;
30db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport android.util.AttributeSet;
31db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
32db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport java.util.List;
33db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport java.util.Objects;
34db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
35db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leepublic class AccountSelectionPreference extends ListPreference implements
36db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        Preference.OnPreferenceChangeListener {
37db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
38db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public interface AccountSelectionListener {
39db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        boolean onAccountSelected(AccountSelectionPreference pref, PhoneAccountHandle account);
40baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        void onAccountSelectionDialogShow(AccountSelectionPreference pref);
41ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        void onAccountChanged(AccountSelectionPreference pref);
42db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
43db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
44baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    private final Context mContext;
45db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    private AccountSelectionListener mListener;
46db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    private PhoneAccountHandle[] mAccounts;
47db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    private String[] mEntryValues;
48db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    private CharSequence[] mEntries;
49ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee    private boolean mShowSelectionInSummary = true;
50db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
51db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public AccountSelectionPreference(Context context) {
52ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        this(context, null);
53db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
54db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
55db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public AccountSelectionPreference(Context context, AttributeSet attrs) {
56db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        super(context, attrs);
57baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        mContext = context;
58db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        setOnPreferenceChangeListener(this);
59db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
60db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
61db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public void setListener(AccountSelectionListener listener) {
62db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mListener = listener;
63db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
64db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
65ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee    public void setShowSelectionInSummary(boolean value) {
66ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        mShowSelectionInSummary = value;
67ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee    }
68ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee
69db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public void setModel(
704d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunn            TelecomManager telecomManager,
71db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            List<PhoneAccountHandle> accountsList,
72db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            PhoneAccountHandle currentSelection,
73db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            CharSequence nullSelectionString) {
74db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
75db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mAccounts = accountsList.toArray(new PhoneAccountHandle[accountsList.size()]);
76db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mEntryValues = new String[mAccounts.length + 1];
77db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mEntries = new CharSequence[mAccounts.length + 1];
78db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
79db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        int selectedIndex = mAccounts.length;  // Points to nullSelectionString by default
80db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        int i = 0;
81db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        for ( ; i < mAccounts.length; i++) {
824d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunn            CharSequence label = telecomManager.getPhoneAccount(mAccounts[i]).getLabel();
83db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            mEntries[i] = label == null ? null : label.toString();
84db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            mEntryValues[i] = Integer.toString(i);
85db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            if (Objects.equals(currentSelection, mAccounts[i])) {
86db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee                selectedIndex = i;
87db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            }
88db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        }
89db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mEntryValues[i] = Integer.toString(i);
90db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mEntries[i] = nullSelectionString;
91db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
92db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        setEntryValues(mEntryValues);
93db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        setEntries(mEntries);
94db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        setValueIndex(selectedIndex);
95ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        if (mShowSelectionInSummary) {
96ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee            setSummary(mEntries[selectedIndex]);
97ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        }
98db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
99db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
100db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    @Override
101db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public boolean onPreferenceChange(Preference preference, Object newValue) {
102db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        if (mListener != null) {
103db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            int index = Integer.parseInt((String) newValue);
104db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            PhoneAccountHandle account = index < mAccounts.length ? mAccounts[index] : null;
105db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            if (mListener.onAccountSelected(this, account)) {
106ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                if (mShowSelectionInSummary) {
107ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                    setSummary(mEntries[index]);
108ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                }
109ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                if (index != findIndexOfValue(getValue())) {
110ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                    setValueIndex(index);
111ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                    mListener.onAccountChanged(this);
112ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                }
113db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee                return true;
114db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            }
115db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        }
116db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        return false;
117db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
118baee2955f596f7b79971feb12fa21031a069677dTyler Gunn
119baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    /**
120baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     * Modifies the dialog to change the default "Cancel" button to "Choose Accounts", which
121baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     * triggers the {@link PhoneAccountSelectionPreferenceActivity} to be shown.
122baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     *
123baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     * @param builder The {@code AlertDialog.Builder}.
124baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     */
125baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    @Override
126baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
127baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        // Notify the listener that the dialog is about to be built.  This is important so that the
128baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        // list of enabled accounts can be updated prior to showing the dialog.
129baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        mListener.onAccountSelectionDialogShow(this);
130baee2955f596f7b79971feb12fa21031a069677dTyler Gunn
131baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        super.onPrepareDialogBuilder(builder);
132baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    }
133db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee}
134