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