package com.code44.finance.utils.transaction; import android.content.Context; import android.database.Cursor; import android.os.Handler; import android.os.Looper; import com.code44.finance.common.model.TransactionState; import com.code44.finance.common.model.TransactionType; import com.code44.finance.data.db.Tables; import com.code44.finance.data.model.Account; import com.code44.finance.data.model.Category; import com.code44.finance.data.model.Tag; import com.code44.finance.data.model.Transaction; import com.code44.finance.data.providers.TransactionsProvider; import java.util.Arrays; import java.util.List; import java.util.concurrent.Executor; public class LastTransactionAutoComplete extends TransactionAutoComplete { public LastTransactionAutoComplete(Context context, Executor executor) { super(context, executor); } @Override protected void onTransactionLoaded(Transaction transaction) { getExecutor().execute(new QueryRunnable(getContext(), this, transaction)); } @Override protected void onTransactionTypeChanged(Transaction transaction, TransactionType transactionType) { onTransactionLoaded(transaction); } @Override protected void onDateChanged(Transaction transaction, long date) { } @Override protected void onAmountChanged(Transaction transaction, long amount) { } @Override protected void onAccountFromChanged(Transaction transaction, Account account) { } @Override protected void onAccountToChanged(Transaction transaction, Account account) { } @Override protected void onCategoryChanged(Transaction transaction, Category category) { } @Override protected void onTagsChanged(Transaction transaction, List<Tag> tags) { } @Override protected void onNoteChanged(Transaction transaction, String note) { } private void onTransactionQueryFinished(Cursor cursor) { if (!cursor.moveToFirst()) { return; } final Transaction transaction = Transaction.from(cursor); if (transaction.getAccountFrom() != null) { autoCompleteAccountsFrom(Arrays.asList(transaction.getAccountFrom())); } if (transaction.getAccountTo() != null) { autoCompleteAccountsTo(Arrays.asList(transaction.getAccountTo())); } autoCompleteAmounts(Arrays.asList(transaction.getAmount())); if (transaction.getCategory() != null) { autoCompleteCategories(Arrays.asList(transaction.getCategory())); } autoCompleteTags(transaction.getTags()); } private static class QueryRunnable implements Runnable { private final Context context; private final LastTransactionAutoComplete transactionAutoComplete; private final Transaction transaction; private QueryRunnable(Context context, LastTransactionAutoComplete transactionAutoComplete, Transaction transaction) { this.context = context; this.transactionAutoComplete = transactionAutoComplete; this.transaction = transaction; } @Override public void run() { final Cursor cursor = Tables.Transactions.getQuery() .selection(" and " + Tables.Transactions.STATE + "=?", TransactionState.Confirmed.asString()) .selection(" and " + Tables.Transactions.TYPE + "=?", transaction.getTransactionType().asString()) .limit(1) .from(context, TransactionsProvider.uriTransactions()) .execute(); final Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { transactionAutoComplete.onTransactionQueryFinished(cursor); } }); } } }