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