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