package co.touchlab.droidconandroid.ui;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import co.touchlab.android.threading.eventbus.EventBusExt;
import co.touchlab.android.threading.tasks.BaseTaskQueue;
import co.touchlab.android.threading.tasks.Task;
import co.touchlab.android.threading.tasks.TaskQueue;
import co.touchlab.droidconandroid.network.dao.UserAccount;
import co.touchlab.droidconandroid.tasks.SearchUsersTask;
/**
* Created by kgalligan on 7/27/14.
*/
public class EmailAccountsEditText extends AutoCompleteTextView
{
public static final String GOOGLE_ACCOUNT_TYPE = "com.google";
public EmailAccountsEditText(Context context)
{
super(context);
init();
}
public EmailAccountsEditText(Context context, AttributeSet attrs)
{
super(context, attrs);
init();
}
public EmailAccountsEditText(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
}
private void init()
{
setThreshold(3);
addTextChangedListener(new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
TaskQueue taskQueue = TaskQueue.loadQueueNetwork(getContext());
taskQueue.query(new BaseTaskQueue.QueueQuery()
{
@Override
public void query(BaseTaskQueue queue, Task task)
{
if(task instanceof SearchUsersTask)
{
((SearchUsersTask) task).cancel();
}
}
});
taskQueue.execute(new SearchUsersTask(s.toString()));
}
@Override
public void afterTextChanged(Editable s)
{
}
});
setOnEditorActionListener(new OnEditorActionListener()
{
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
{
TaskQueue taskQueue = TaskQueue.loadQueueNetwork(getContext());
taskQueue.query(new BaseTaskQueue.QueueQuery()
{
@Override
public void query(BaseTaskQueue queue, Task task)
{
if(task instanceof SearchUsersTask)
{
((SearchUsersTask) task).cancel();
}
}
});
taskQueue.execute(new SearchUsersTask(v.getText().toString()));
return true;
}
});
}
@Override
protected void onAttachedToWindow()
{
super.onAttachedToWindow();
EventBusExt.getDefault().register(this);
}
@Override
protected void onDetachedFromWindow()
{
super.onDetachedFromWindow();
EventBusExt.getDefault().unregister(this);
}
@SuppressWarnings("unused")
public void onEventMainThread(SearchUsersTask task)
{
//TODO: Probably not have this be an array
UserAccount[] results;
if(task.getUserSearchResponse() != null && task.getUserSearchResponse().getResults() != null)
{
final List<UserAccount> r = task.getUserSearchResponse().getResults();
results = r.toArray(new UserAccount[r.size()]);
}
else
{
results = new UserAccount[0];
}
setAdapter(new ResultsAdapter(getContext(), results));
showDropDown();
}
public static class ResultsAdapter extends ArrayAdapter<UserAccount>
{
public ResultsAdapter(Context context, UserAccount[] objects)
{
super(context, android.R.layout.simple_list_item_1, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View row = LayoutInflater.from(getContext())
.inflate(android.R.layout.simple_list_item_1, null);
((TextView)row.findViewById(android.R.id.text1)).setText(getItem(position).getName());
return row;
}
}
private List<String> findEmailAccounts()
{
List<String> emails = new ArrayList<String>();
AccountManager accountManager = AccountManager.get(getContext());
Account[] accounts = accountManager.getAccountsByType(GOOGLE_ACCOUNT_TYPE);
for (Account account : accounts)
{
if (isValidEmail(account.name))
emails.add(account.name);
}
return emails;
}
private static boolean isValidEmail(CharSequence target)
{
return target != null && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
}