- Transaction search implemented

- Now the transaction list print contact name when the address match with that contact
This commit is contained in:
Javier Varona 2018-05-21 21:38:05 -04:00
parent 17dfc3e074
commit e9e495b366
9 changed files with 167 additions and 67 deletions

View file

@ -11,6 +11,7 @@ import java.util.Date;
import java.util.List;
import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
import cy.agorise.crystalwallet.models.CryptoCoinTransactionExtended;
/**
* Created by Henry Varona on 12/9/2017.
@ -18,23 +19,28 @@ import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
@Dao
public interface TransactionDao {
static final String transactionsQuery = "SELECT cct.*, cna.name AS user_account_name, c.name AS contact_name FROM crypto_coin_transaction cct " +
"LEFT JOIN crypto_net_account cna ON cct.account_id = cna.id " +
"LEFT JOIN contact c ON c.id = (SELECT ca.contact_id FROM contact_address ca WHERE ca.address LIKE (CASE is_input WHEN 1 THEN cct.\"from\" ELSE cct.\"to\" END) LIMIT 1) " +
"WHERE user_account_name LIKE '%'||:search||'%' OR contact_name LIKE '%'||:search||'%' OR cct.\"from\" LIKE '%'||:search||'%' OR cct.\"to\" LIKE '%'||:search||'%'";
@Query("SELECT * FROM crypto_coin_transaction")
LiveData<List<CryptoCoinTransaction>> getAll();
@Query("SELECT * FROM crypto_coin_transaction ORDER BY date DESC")
LivePagedListProvider<Integer, CryptoCoinTransaction> transactionsByDate();
@Query(transactionsQuery + " ORDER BY date DESC")
LivePagedListProvider<Integer, CryptoCoinTransactionExtended> transactionsByDate(String search);
@Query("SELECT * FROM crypto_coin_transaction ORDER BY amount DESC")
LivePagedListProvider<Integer, CryptoCoinTransaction> transactionsByAmount();
@Query(transactionsQuery + " ORDER BY amount DESC")
LivePagedListProvider<Integer, CryptoCoinTransactionExtended> transactionsByAmount(String search);
@Query("SELECT * FROM crypto_coin_transaction ORDER BY is_input DESC")
LivePagedListProvider<Integer, CryptoCoinTransaction> transactionsByIsInput();
@Query(transactionsQuery + " ORDER BY is_input DESC")
LivePagedListProvider<Integer, CryptoCoinTransactionExtended> transactionsByIsInput(String search);
@Query("SELECT * FROM crypto_coin_transaction ORDER BY `from` DESC")
LivePagedListProvider<Integer, CryptoCoinTransaction> transactionsByFrom();
@Query(transactionsQuery + " ORDER BY `from` DESC")
LivePagedListProvider<Integer, CryptoCoinTransactionExtended> transactionsByFrom(String search);
@Query("SELECT * FROM crypto_coin_transaction ORDER BY `to` DESC")
LivePagedListProvider<Integer, CryptoCoinTransaction> transactionsByTo();
@Query(transactionsQuery + " ORDER BY `to` DESC")
LivePagedListProvider<Integer, CryptoCoinTransactionExtended> transactionsByTo(String search);
@Query("SELECT * FROM crypto_coin_transaction WHERE account_id = :idAccount ORDER BY date DESC")
LiveData<List<CryptoCoinTransaction>> getByIdAccountLiveData(long idAccount);

View file

@ -25,11 +25,6 @@ import cy.agorise.crystalwallet.viewmodels.validators.PinSecurityValidator;
public class NoneSecurityFragment extends Fragment {
GeneralSetting passwordGeneralSetting = new GeneralSetting();
GeneralSetting patternGeneralSetting = new GeneralSetting();
GeneralSettingListViewModel generalSettingListViewModel;
public NoneSecurityFragment() {
// Required empty public constructor
}
@ -48,24 +43,6 @@ public class NoneSecurityFragment extends Fragment {
View v = inflater.inflate(R.layout.fragment_none_security, container, false);
ButterKnife.bind(this, v);
generalSettingListViewModel = ViewModelProviders.of(this).get(GeneralSettingListViewModel.class);
LiveData<List<GeneralSetting>> generalSettingsLiveData = generalSettingListViewModel.getGeneralSettingList();
generalSettingsLiveData.observe(this, new Observer<List<GeneralSetting>>() {
@Override
public void onChanged(@Nullable List<GeneralSetting> generalSettings) {
if (generalSettings != null){
for (GeneralSetting generalSetting:generalSettings) {
if (generalSetting.getName().equals(GeneralSetting.SETTING_PASSWORD)){
passwordGeneralSetting = generalSetting;
} else if (generalSetting.getName().equals(GeneralSetting.SETTING_PATTERN)){
patternGeneralSetting = generalSetting;
}
}
}
}
});
return v;
}
@ -73,14 +50,7 @@ public class NoneSecurityFragment extends Fragment {
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
setSecurityOff();
CrystalSecurityMonitor.getInstance(null).clearSecurity();
}
}
public void setSecurityOff(){
generalSettingListViewModel.deleteGeneralSettings(passwordGeneralSetting,patternGeneralSetting);
CrystalSecurityMonitor.getInstance(null).setPasswordSecurity("");
CrystalSecurityMonitor.getInstance(null).setPatternEncrypted("");
}
}

View file

@ -9,10 +9,12 @@ import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.Spinner;
import java.util.ArrayList;
@ -20,8 +22,10 @@ import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnTextChanged;
import cy.agorise.crystalwallet.R;
import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
import cy.agorise.crystalwallet.models.CryptoCoinTransactionExtended;
import cy.agorise.crystalwallet.viewmodels.TransactionListViewModel;
import cy.agorise.crystalwallet.views.TransactionListView;
import cy.agorise.crystalwallet.views.TransactionOrderSpinnerAdapter;
@ -34,12 +38,15 @@ public class TransactionsFragment extends Fragment {
@BindView(R.id.spTransactionsOrder)
Spinner spTransactionsOrder;
@BindView(R.id.etTransactionSearch)
EditText etTransactionSearch;
RecyclerView balanceRecyclerView;
FloatingActionButton fabSend;
FloatingActionButton fabReceive;
TransactionListViewModel transactionListViewModel;
LiveData<PagedList<CryptoCoinTransaction>> transactionsLiveData;
LiveData<PagedList<CryptoCoinTransactionExtended>> transactionsLiveData;
public TransactionsFragment() {
// Required empty public constructor
@ -108,18 +115,24 @@ public class TransactionsFragment extends Fragment {
if (transactionsLiveData != null){
transactionsLiveData.removeObservers(this);
}
transactionListViewModel.initTransactionList(orderSelected.getField());
transactionListViewModel.initTransactionList(orderSelected.getField(),etTransactionSearch.getText().toString());
transactionsLiveData = transactionListViewModel.getTransactionList();
final Fragment fragment = this;
transactionsLiveData.observe(this, new Observer<PagedList<CryptoCoinTransaction>>() {
transactionsLiveData.observe(this, new Observer<PagedList<CryptoCoinTransactionExtended>>() {
@Override
public void onChanged(@Nullable PagedList<CryptoCoinTransaction> cryptoCoinTransactions) {
public void onChanged(@Nullable PagedList<CryptoCoinTransactionExtended> cryptoCoinTransactions) {
transactionListView.setData(cryptoCoinTransactions, fragment);
}
});
}
@OnTextChanged(value = R.id.etTransactionSearch,
callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
void afterTransactionSearchChange(Editable editable) {
changeTransactionList();
}
public void initTransactionsOrderSpinner(){
List<TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem> spinnerValues = new ArrayList<TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem>();
spinnerValues.add(new TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem("date","Date",0,false));

View file

@ -0,0 +1,96 @@
package cy.agorise.crystalwallet.models;
import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Embedded;
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.ForeignKey;
import android.arch.persistence.room.Ignore;
import android.arch.persistence.room.Index;
import android.arch.persistence.room.PrimaryKey;
import android.support.annotation.NonNull;
import android.support.v7.recyclerview.extensions.DiffCallback;
import java.util.Date;
/**
* Represents a generic CryptoNet Transaction
*
* Created by Henry Varona on 15/5/2018.
*/
@Entity
public class CryptoCoinTransactionExtended {
@Embedded
public CryptoCoinTransaction cryptoCoinTransaction;
@ColumnInfo(name="user_account_name")
public String userAccountName;
@ColumnInfo(name="contact_name")
public String contactName;
public String getUserAccountName(){
return this.userAccountName;
}
public String getContactName(){
return this.contactName;
}
public String getFrom() { return this.cryptoCoinTransaction.getFrom(); }
public String getTo() { return this.cryptoCoinTransaction.getTo(); }
public long getAccountId() {
return this.cryptoCoinTransaction.getAccountId();
}
public CryptoNetAccount getAccount() {
return this.cryptoCoinTransaction.getAccount();
}
public long getId() {
return this.cryptoCoinTransaction.getId();
}
public Date getDate() {
return this.cryptoCoinTransaction.getDate();
}
public boolean getInput() {
return this.cryptoCoinTransaction.getInput();
}
public boolean isConfirmed() { return this.cryptoCoinTransaction.isConfirmed(); }
public long getAmount() { return this.cryptoCoinTransaction.getAmount(); }
public int getIdCurrency() { return this.cryptoCoinTransaction.getIdCurrency(); }
public static final DiffCallback<CryptoCoinTransactionExtended> DIFF_CALLBACK = new DiffCallback<CryptoCoinTransactionExtended>() {
@Override
public boolean areItemsTheSame(
@NonNull CryptoCoinTransactionExtended oldTransaction, @NonNull CryptoCoinTransactionExtended newTransaction) {
return oldTransaction.getId() == newTransaction.getId();
}
@Override
public boolean areContentsTheSame(
@NonNull CryptoCoinTransactionExtended oldTransaction, @NonNull CryptoCoinTransactionExtended newTransaction) {
return oldTransaction.equals(newTransaction);
}
};
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CryptoCoinTransactionExtended that = (CryptoCoinTransactionExtended) o;
if (this.cryptoCoinTransaction != null ? !this.cryptoCoinTransaction.equals(that.cryptoCoinTransaction) : that.cryptoCoinTransaction != null) return false;
if (this.userAccountName != null ? !this.userAccountName.equals(that.userAccountName) : that.userAccountName != null) return false;
if (this.contactName != null ? !this.contactName.equals(that.contactName) : that.contactName != null) return false;
return true;
}
}

View file

@ -12,6 +12,7 @@ import java.util.List;
import cy.agorise.crystalwallet.dao.CrystalDatabase;
import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
import cy.agorise.crystalwallet.models.CryptoCoinTransactionExtended;
import cy.agorise.crystalwallet.views.TransactionListView;
/**
@ -20,7 +21,7 @@ import cy.agorise.crystalwallet.views.TransactionListView;
public class TransactionListViewModel extends AndroidViewModel {
private LiveData<PagedList<CryptoCoinTransaction>> transactionList;
private LiveData<PagedList<CryptoCoinTransactionExtended>> transactionList;
private CrystalDatabase db;
public TransactionListViewModel(Application application) {
@ -35,25 +36,27 @@ public class TransactionListViewModel extends AndroidViewModel {
);*/
}
public void initTransactionList(String orderField){
LivePagedListProvider<Integer, CryptoCoinTransaction> livePagedListProvider = null;
public void initTransactionList(String orderField, String search){
LivePagedListProvider<Integer, CryptoCoinTransactionExtended> livePagedListProvider = null;
switch (orderField){
case "date":
livePagedListProvider = this.db.transactionDao().transactionsByDate();
livePagedListProvider = this.db.transactionDao().transactionsByDate(search);
break;
case "amount":
livePagedListProvider = this.db.transactionDao().transactionsByAmount();
livePagedListProvider = this.db.transactionDao().transactionsByAmount(search);
break;
case "is_input":
livePagedListProvider = this.db.transactionDao().transactionsByIsInput();
livePagedListProvider = this.db.transactionDao().transactionsByIsInput(search);
break;
case "from":
livePagedListProvider = this.db.transactionDao().transactionsByFrom();
livePagedListProvider = this.db.transactionDao().transactionsByFrom(search);
break;
case "to":
livePagedListProvider = this.db.transactionDao().transactionsByTo();
livePagedListProvider = this.db.transactionDao().transactionsByTo(search);
break;
default:
livePagedListProvider = this.db.transactionDao().transactionsByDate(search);
}
if (livePagedListProvider != null) {
this.transactionList = livePagedListProvider.create(0,
@ -68,7 +71,7 @@ public class TransactionListViewModel extends AndroidViewModel {
}
}
public LiveData<PagedList<CryptoCoinTransaction>> getTransactionList(){
public LiveData<PagedList<CryptoCoinTransactionExtended>> getTransactionList(){
return this.transactionList;
}
}

View file

@ -19,6 +19,7 @@ import java.util.List;
import cy.agorise.crystalwallet.R;
import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
import cy.agorise.crystalwallet.models.CryptoCoinTransactionExtended;
/**
* Created by Henry Varona on 11/9/2017.
@ -29,12 +30,12 @@ import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
* that will be extended with the scroll of the user
*/
public class TransactionListAdapter extends PagedListAdapter<CryptoCoinTransaction, TransactionViewHolder> {
public class TransactionListAdapter extends PagedListAdapter<CryptoCoinTransactionExtended, TransactionViewHolder> {
Fragment fragment;
public TransactionListAdapter(Fragment fragment) {
super(CryptoCoinTransaction.DIFF_CALLBACK);
super(CryptoCoinTransactionExtended.DIFF_CALLBACK);
this.fragment = fragment;
}
@ -48,7 +49,7 @@ public class TransactionListAdapter extends PagedListAdapter<CryptoCoinTransacti
@Override
public void onBindViewHolder(TransactionViewHolder holder, int position) {
CryptoCoinTransaction transaction = getItem(position);
CryptoCoinTransactionExtended transaction = getItem(position);
if (transaction != null) {
holder.bindTo(transaction);
} else {

View file

@ -12,6 +12,7 @@ import android.widget.RelativeLayout;
import cy.agorise.crystalwallet.R;
import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
import cy.agorise.crystalwallet.models.CryptoCoinTransactionExtended;
import cy.agorise.crystalwallet.viewmodels.TransactionListViewModel;
/**
@ -110,7 +111,7 @@ public class TransactionListView extends RelativeLayout {
*
* @param data the transactions that will be showed to the user
*/
public void setData(PagedList<CryptoCoinTransaction> data, Fragment fragment){
public void setData(PagedList<CryptoCoinTransactionExtended> data, Fragment fragment){
//Initializes the adapter of the transaction list
if (this.listAdapter == null) {
this.listAdapter = new TransactionListAdapter(fragment);

View file

@ -21,6 +21,7 @@ import java.util.TimeZone;
import cy.agorise.crystalwallet.R;
import cy.agorise.crystalwallet.activities.CryptoCoinTransactionReceiptActivity;
import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
import cy.agorise.crystalwallet.models.CryptoCoinTransactionExtended;
import cy.agorise.crystalwallet.models.CryptoCurrency;
import cy.agorise.crystalwallet.models.CryptoNetAccount;
import cy.agorise.crystalwallet.models.GeneralSetting;
@ -112,7 +113,7 @@ public class TransactionViewHolder extends RecyclerView.ViewHolder {
/*
* Binds a transaction object with this element view
*/
public void bindTo(final CryptoCoinTransaction transaction/*, final OnTransactionClickListener listener*/) {
public void bindTo(final CryptoCoinTransactionExtended transaction/*, final OnTransactionClickListener listener*/) {
if (transaction == null){
clear();
} else {
@ -147,16 +148,24 @@ public class TransactionViewHolder extends RecyclerView.ViewHolder {
LiveData<CryptoNetAccount> cryptoNetAccountLiveData = cryptoNetAccountViewModel.getCryptoNetAccount();
cryptoNetAccountLiveData.observe(this.fragment, new Observer<CryptoNetAccount>() {
@Override
public void onChanged(@Nullable CryptoNetAccount cryptoNetAccount) {
//cryptoNetAccountLiveData.observe(this.fragment, new Observer<CryptoNetAccount>() {
// @Override
// public void onChanged(@Nullable CryptoNetAccount cryptoNetAccount) {
if (transaction.getInput()){
tvTo.setText(cryptoNetAccount.getName());
tvTo.setText(transaction.getUserAccountName());
if ((transaction.getContactName() != null)&&(!transaction.equals(""))){
tvFrom.setText(transaction.getContactName());
}
} else {
tvFrom.setText(cryptoNetAccount.getName());
tvFrom.setText(transaction.getUserAccountName());
if ((transaction.getContactName() != null)&&(!transaction.equals(""))){
tvTo.setText(transaction.getContactName());
}
}
}
});
// }
//});
String finalAmountText = "";
if (transaction.getInput()) {

View file

@ -26,7 +26,8 @@
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_alignParentTop="true"
android:layout_toStartOf="@+id/spTransactionsOrder" />
android:layout_toStartOf="@+id/spTransactionsOrder"
android:visibility="gone" />
<Spinner
android:id="@+id/spTransactionsOrder"