package com.seafile.seadroid2.ui;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;
import android.support.v7.widget.AppCompatAutoCompleteTextView;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Patterns;
import android.widget.ArrayAdapter;
import com.seafile.seadroid2.R;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/**
* Automatically fills in email accounts
*/
public class EmailAutoCompleteTextView extends AppCompatAutoCompleteTextView {
public EmailAutoCompleteTextView(Context context) {
super(context);
init();
}
public EmailAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public EmailAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
if (isInEditMode()) { return; }
retrieveAccounts();
}
/**
* Manually retrieve the accounts, typically used for API 23+ after getting the permission. Called automatically
* on creation, but needs to be recalled if the permission is granted later
*/
public void retrieveAccounts() {
Collection<String> accounts = getEmailAccounts();
if (accounts != null && !accounts.isEmpty()) {
ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(),
R.layout.support_simple_spinner_dropdown_item,
new ArrayList<>(accounts));
setAdapter(adapter);
}
}
/**
* Get all the accounts that appear to be email accounts. HashSet so that we do not get duplicates
* @return list of email accounts
*/
private Set<String> getEmailAccounts() {
HashSet<String> emailAccounts = new HashSet<>();
AccountManager manager = (AccountManager) getContext().getSystemService(Context.ACCOUNT_SERVICE);
final Account[] accounts = manager.getAccounts();
for (Account account : accounts) {
if (!TextUtils.isEmpty(account.name) && Patterns.EMAIL_ADDRESS.matcher(account.name).matches()) {
emailAccounts.add(account.name);
}
}
ArrayList<String> accountlist = new com.seafile.seadroid2.account.AccountManager(getContext()).getAccountAutoCompleteTexts();
if (accountlist != null) {
for (String account : accountlist) {
emailAccounts.add(account);
}
}
return emailAccounts;
}
}