/** * Copyright (c) 2012, Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.mail.compose; import android.content.Context; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.Spinner; import com.android.mail.providers.Account; import com.android.mail.providers.Message; import com.android.mail.providers.ReplyFromAccount; import com.android.mail.utils.AccountUtils; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import java.util.List; public class FromAddressSpinner extends Spinner implements OnItemSelectedListener { private List mAccounts; private ReplyFromAccount mAccount; private final List mReplyFromAccounts = Lists.newArrayList(); private OnAccountChangedListener mAccountChangedListener; public FromAddressSpinner(Context context) { this(context, null); } public FromAddressSpinner(Context context, AttributeSet set) { super(context, set); } public void setCurrentAccount(ReplyFromAccount account) { mAccount = account; selectCurrentAccount(); } private void selectCurrentAccount() { if (mAccount == null) { return; } int currentIndex = 0; for (ReplyFromAccount acct : mReplyFromAccounts) { if (TextUtils.equals(mAccount.name, acct.name) && TextUtils.equals(mAccount.address, acct.address)) { setSelection(currentIndex, true); break; } currentIndex++; } } public ReplyFromAccount getMatchingReplyFromAccount(String accountString) { if (!TextUtils.isEmpty(accountString)) { for (ReplyFromAccount acct : mReplyFromAccounts) { if (accountString.equals(acct.address)) { return acct; } } } return null; } public ReplyFromAccount getCurrentAccount() { return mAccount; } /** * @param action Action being performed; if this is COMPOSE, show all * accounts. Otherwise, show just the account this was launched * with. * @param currentAccount Account used to launch activity. * @param syncingAccounts */ public void initialize(int action, Account currentAccount, Account[] syncingAccounts, Message refMessage) { final List accounts = AccountUtils.mergeAccountLists(mAccounts, syncingAccounts, true /* prioritizeAccountList */); if (action == ComposeActivity.COMPOSE) { mAccounts = accounts; } else { // First assume that we are going to use the current account as the reply account Account replyAccount = currentAccount; if (refMessage != null && refMessage.accountUri != null) { // This is a reply or forward of a message access through the "combined" account. // We want to make sure that the real account is in the spinner for (Account account : accounts) { if (account.uri.equals(refMessage.accountUri)) { replyAccount = account; break; } } } mAccounts = ImmutableList.of(replyAccount); } initFromSpinner(); } @VisibleForTesting protected void initFromSpinner() { // If there are not yet any accounts in the cached synced accounts // because this is the first time mail was opened, and it was opened // directly to the compose activity, don't bother populating the reply // from spinner yet. if (mAccounts == null || mAccounts.size() == 0) { return; } FromAddressSpinnerAdapter adapter = new FromAddressSpinnerAdapter(getContext()); mReplyFromAccounts.clear(); for (Account account : mAccounts) { mReplyFromAccounts.addAll(account.getReplyFroms()); } adapter.addAccounts(mReplyFromAccounts); setAdapter(adapter); selectCurrentAccount(); setOnItemSelectedListener(this); } public List getReplyFromAccounts() { return mReplyFromAccounts; } public void setOnAccountChangedListener(OnAccountChangedListener listener) { mAccountChangedListener = listener; } @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { ReplyFromAccount selection = (ReplyFromAccount) getItemAtPosition(position); if (!selection.address.equals(mAccount.address)) { mAccount = selection; mAccountChangedListener.onAccountChanged(); } } @Override public void onNothingSelected(AdapterView parent) { // Do nothing. } /** * Classes that want to know when a different account in the * FromAddressSpinner has been selected should implement this interface. * Note: if the user chooses the same account as the one that has already * been selected, this method will not be called. */ public static interface OnAccountChangedListener { public void onAccountChanged(); } }