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;
295b9cb1fe85b258b735730486fd965f27f6f03b6bHall Liuimport android.telecom.PhoneAccount;
304d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.PhoneAccountHandle;
314d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunnimport android.telecom.TelecomManager;
325b9cb1fe85b258b735730486fd965f27f6f03b6bHall Liuimport android.text.TextUtils;
33db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport android.util.AttributeSet;
34db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
35db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport java.util.List;
36db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leeimport java.util.Objects;
37db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
38db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Leepublic class AccountSelectionPreference extends ListPreference implements
39db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        Preference.OnPreferenceChangeListener {
40db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
41db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public interface AccountSelectionListener {
42db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        boolean onAccountSelected(AccountSelectionPreference pref, PhoneAccountHandle account);
43baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        void onAccountSelectionDialogShow(AccountSelectionPreference pref);
44ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        void onAccountChanged(AccountSelectionPreference pref);
45db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
46db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
47baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    private final Context mContext;
48db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    private AccountSelectionListener mListener;
49db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    private PhoneAccountHandle[] mAccounts;
50db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    private String[] mEntryValues;
51db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    private CharSequence[] mEntries;
52ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee    private boolean mShowSelectionInSummary = true;
53db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
54db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public AccountSelectionPreference(Context context) {
55ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        this(context, null);
56db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
57db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
58db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public AccountSelectionPreference(Context context, AttributeSet attrs) {
59db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        super(context, attrs);
60baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        mContext = context;
61db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        setOnPreferenceChangeListener(this);
62db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
63db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
64db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public void setListener(AccountSelectionListener listener) {
65db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mListener = listener;
66db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
67db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
68ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee    public void setShowSelectionInSummary(boolean value) {
69ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        mShowSelectionInSummary = value;
70ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee    }
71ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee
72db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public void setModel(
734d45d1cf58a2003378fd35912d6d73a00001bf06Tyler Gunn            TelecomManager telecomManager,
74db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            List<PhoneAccountHandle> accountsList,
75db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            PhoneAccountHandle currentSelection,
76db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            CharSequence nullSelectionString) {
77db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
78db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mAccounts = accountsList.toArray(new PhoneAccountHandle[accountsList.size()]);
79db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mEntryValues = new String[mAccounts.length + 1];
80db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mEntries = new CharSequence[mAccounts.length + 1];
81db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
827b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charlton        PackageManager pm = mContext.getPackageManager();
837b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charlton
84db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        int selectedIndex = mAccounts.length;  // Points to nullSelectionString by default
85db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        int i = 0;
86db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        for ( ; i < mAccounts.length; i++) {
875b9cb1fe85b258b735730486fd965f27f6f03b6bHall Liu            PhoneAccount account = telecomManager.getPhoneAccount(mAccounts[i]);
885b9cb1fe85b258b735730486fd965f27f6f03b6bHall Liu            CharSequence label = account.getLabel();
897b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charlton            if (label != null) {
907b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charlton                label = pm.getUserBadgedLabel(label, mAccounts[i].getUserHandle());
917b2c6e230ef6df2ae7863dc61b632a25393707eeEvan Charlton            }
925b9cb1fe85b258b735730486fd965f27f6f03b6bHall Liu            boolean isSimAccount =
935b9cb1fe85b258b735730486fd965f27f6f03b6bHall Liu                    account.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION);
945b9cb1fe85b258b735730486fd965f27f6f03b6bHall Liu            mEntries[i] = (TextUtils.isEmpty(label) && isSimAccount)
955b9cb1fe85b258b735730486fd965f27f6f03b6bHall Liu                    ? mContext.getString(R.string.phone_accounts_default_account_label)
965b9cb1fe85b258b735730486fd965f27f6f03b6bHall Liu                    : String.valueOf(label);
97db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            mEntryValues[i] = Integer.toString(i);
98db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            if (Objects.equals(currentSelection, mAccounts[i])) {
99db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee                selectedIndex = i;
100db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            }
101db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        }
102db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mEntryValues[i] = Integer.toString(i);
103db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        mEntries[i] = nullSelectionString;
104db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
105db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        setEntryValues(mEntryValues);
106db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        setEntries(mEntries);
107db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        setValueIndex(selectedIndex);
108ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        if (mShowSelectionInSummary) {
109ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee            setSummary(mEntries[selectedIndex]);
110ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee        }
111db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
112db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee
113db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    @Override
114db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    public boolean onPreferenceChange(Preference preference, Object newValue) {
115db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        if (mListener != null) {
116db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            int index = Integer.parseInt((String) newValue);
117db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            PhoneAccountHandle account = index < mAccounts.length ? mAccounts[index] : null;
118db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            if (mListener.onAccountSelected(this, account)) {
119ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                if (mShowSelectionInSummary) {
120ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                    setSummary(mEntries[index]);
121ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                }
122ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                if (index != findIndexOfValue(getValue())) {
123ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                    setValueIndex(index);
124ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                    mListener.onAccountChanged(this);
125ce8ae2af29acbf5cfa9509b0770615e317ff03a0Andrew Lee                }
126db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee                return true;
127db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee            }
128db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        }
129db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee        return false;
130db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee    }
131baee2955f596f7b79971feb12fa21031a069677dTyler Gunn
132baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    /**
133baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     * Modifies the dialog to change the default "Cancel" button to "Choose Accounts", which
134baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     * triggers the {@link PhoneAccountSelectionPreferenceActivity} to be shown.
135baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     *
136baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     * @param builder The {@code AlertDialog.Builder}.
137baee2955f596f7b79971feb12fa21031a069677dTyler Gunn     */
138baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    @Override
139baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
140baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        // Notify the listener that the dialog is about to be built.  This is important so that the
141baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        // list of enabled accounts can be updated prior to showing the dialog.
142baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        mListener.onAccountSelectionDialogShow(this);
143baee2955f596f7b79971feb12fa21031a069677dTyler Gunn
144baee2955f596f7b79971feb12fa21031a069677dTyler Gunn        super.onPrepareDialogBuilder(builder);
145baee2955f596f7b79971feb12fa21031a069677dTyler Gunn    }
146db2fe56ec1c1d8654506dd1c87dd91d5b6236dc6Andrew Lee}
147