- Added option to reorder transactions list

- Fixed Toast when restoring backup
This commit is contained in:
Javier Varona 2018-04-11 21:37:49 -04:00
parent 6eb43f93be
commit 78fc4fbf0b
7 changed files with 270 additions and 18 deletions

View file

@ -24,6 +24,18 @@ public interface TransactionDao {
@Query("SELECT * FROM crypto_coin_transaction ORDER BY date DESC")
LivePagedListProvider<Integer, CryptoCoinTransaction> transactionsByDate();
@Query("SELECT * FROM crypto_coin_transaction ORDER BY amount DESC")
LivePagedListProvider<Integer, CryptoCoinTransaction> transactionsByAmount();
@Query("SELECT * FROM crypto_coin_transaction ORDER BY is_input DESC")
LivePagedListProvider<Integer, CryptoCoinTransaction> transactionsByIsInput();
@Query("SELECT * FROM crypto_coin_transaction ORDER BY `from` DESC")
LivePagedListProvider<Integer, CryptoCoinTransaction> transactionsByFrom();
@Query("SELECT * FROM crypto_coin_transaction ORDER BY `to` DESC")
LivePagedListProvider<Integer, CryptoCoinTransaction> transactionsByTo();
@Query("SELECT * FROM crypto_coin_transaction WHERE account_id = :idAccount ORDER BY date DESC")
LiveData<List<CryptoCoinTransaction>> getByIdAccountLiveData(long idAccount);

View file

@ -22,6 +22,7 @@ import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cy.agorise.crystalwallet.R;
import cy.agorise.crystalwallet.activities.IntroActivity;
import cy.agorise.crystalwallet.requestmanagers.FileServiceRequestListener;
import cy.agorise.crystalwallet.requestmanagers.FileServiceRequests;
import cy.agorise.crystalwallet.requestmanagers.ImportBackupRequest;
@ -127,17 +128,26 @@ public class ImportAccountOptionsFragment extends DialogFragment {
importBackupRequest.setListener(new FileServiceRequestListener() {
@Override
public void onCarryOut() {
if (importBackupRequest.getStatus() == ImportBackupRequest.StatusCode.SUCCEEDED){
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (importBackupRequest.getStatus() == ImportBackupRequest.StatusCode.SUCCEEDED) {
Toast toast = Toast.makeText(
getContext(), "Backup restored!", Toast.LENGTH_LONG);
toast.show();
} else if (importBackupRequest.getStatus() == ImportBackupRequest.StatusCode.FAILED){
Intent intent = new Intent(getContext(), IntroActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
} else if (importBackupRequest.getStatus() == ImportBackupRequest.StatusCode.FAILED) {
Toast toast = Toast.makeText(
getContext(), "An error ocurred while restoring the backup!", Toast.LENGTH_LONG);
toast.show();
}
}
});
}
});
FileServiceRequests.getInstance().addRequest(importBackupRequest);
}

View file

@ -12,7 +12,10 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Spinner;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
@ -21,16 +24,23 @@ import cy.agorise.crystalwallet.R;
import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
import cy.agorise.crystalwallet.viewmodels.TransactionListViewModel;
import cy.agorise.crystalwallet.views.TransactionListView;
import cy.agorise.crystalwallet.views.TransactionOrderSpinnerAdapter;
public class TransactionsFragment extends Fragment {
@BindView(R.id.vTransactionListView)
TransactionListView transactionListView;
@BindView(R.id.spTransactionsOrder)
Spinner spTransactionsOrder;
RecyclerView balanceRecyclerView;
FloatingActionButton fabSend;
FloatingActionButton fabReceive;
TransactionListViewModel transactionListViewModel;
LiveData<PagedList<CryptoCoinTransaction>> transactionsLiveData;
public TransactionsFragment() {
// Required empty public constructor
}
@ -83,8 +93,23 @@ public class TransactionsFragment extends Fragment {
}
});
TransactionListViewModel transactionListViewModel = ViewModelProviders.of(this).get(TransactionListViewModel.class);
LiveData<PagedList<CryptoCoinTransaction>> transactionsLiveData = transactionListViewModel.getTransactionList();
transactionListViewModel = ViewModelProviders.of(this).get(TransactionListViewModel.class);
initTransactionsOrderSpinner();
changeTransactionList();
return view;
}
public void changeTransactionList(){
TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem orderSelected =
(TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem)(spTransactionsOrder.getSelectedItem());
if (transactionsLiveData != null){
transactionsLiveData.removeObservers(this);
}
transactionListViewModel.initTransactionList(orderSelected.getField());
transactionsLiveData = transactionListViewModel.getTransactionList();
final Fragment fragment = this;
transactionsLiveData.observe(this, new Observer<PagedList<CryptoCoinTransaction>>() {
@ -93,7 +118,32 @@ public class TransactionsFragment extends Fragment {
transactionListView.setData(cryptoCoinTransactions, fragment);
}
});
}
return view;
public void initTransactionsOrderSpinner(){
List<TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem> spinnerValues = new ArrayList<TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem>();
spinnerValues.add(new TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem("date","Date",0,false));
spinnerValues.add(new TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem("amount","Amount",0,false));
spinnerValues.add(new TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem("is_input","In/Out",0,false));
spinnerValues.add(new TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem("from","From",0,false));
spinnerValues.add(new TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem("to","To",0,false));
TransactionOrderSpinnerAdapter transactionOrderSpinnerAdapter =
new TransactionOrderSpinnerAdapter(
getContext(), android.R.layout.simple_spinner_item,spinnerValues
);
spTransactionsOrder.setAdapter(transactionOrderSpinnerAdapter);
spTransactionsOrder.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
changeTransactionList();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
}
}

View file

@ -4,6 +4,7 @@ import android.app.Application;
import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.ViewModel;
import android.arch.paging.LivePagedListProvider;
import android.arch.paging.PagedList;
import android.content.Context;
@ -25,13 +26,46 @@ public class TransactionListViewModel extends AndroidViewModel {
public TransactionListViewModel(Application application) {
super(application);
this.db = CrystalDatabase.getAppDatabase(application.getApplicationContext());
transactionList = this.db.transactionDao().transactionsByDate().create(0,
/*transactionList = this.db.transactionDao().transactionsByDate().create(0,
new PagedList.Config.Builder()
.setEnablePlaceholders(true)
.setPageSize(10)
.setPrefetchDistance(10)
.build()
);*/
}
public void initTransactionList(String orderField){
LivePagedListProvider<Integer, CryptoCoinTransaction> livePagedListProvider = null;
switch (orderField){
case "date":
livePagedListProvider = this.db.transactionDao().transactionsByDate();
break;
case "amount":
livePagedListProvider = this.db.transactionDao().transactionsByAmount();
break;
case "is_input":
livePagedListProvider = this.db.transactionDao().transactionsByIsInput();
break;
case "from":
livePagedListProvider = this.db.transactionDao().transactionsByFrom();
break;
case "to":
livePagedListProvider = this.db.transactionDao().transactionsByTo();
break;
}
if (livePagedListProvider != null) {
this.transactionList = livePagedListProvider.create(0,
new PagedList.Config.Builder()
.setEnablePlaceholders(true)
.setPageSize(10)
.setPrefetchDistance(10)
.build()
);
} else {
this.transactionList = null;
}
}
public LiveData<PagedList<CryptoCoinTransaction>> getTransactionList(){

View file

@ -0,0 +1,86 @@
package cy.agorise.crystalwallet.views;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.List;
import cy.agorise.crystalwallet.R;
import cy.agorise.crystalwallet.models.CryptoCurrency;
/**
* Created by Henry Varona on 09/04/2018.
*
*/
public class TransactionOrderSpinnerAdapter extends ArrayAdapter<TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem> {
public static class TransactionOrderSpinnerItem {
private String field;
private String label;
private boolean ascending;
private int order;
public TransactionOrderSpinnerItem(String field, String label, int order, boolean ascending){
this.field = field;
this.label = label;
this.ascending = ascending;
this.order = order;
}
public void setAscending(boolean newValue){
this.ascending = newValue;
}
public void setOrder(int newValue){
this.order = newValue;
}
public String getField(){
return this.field;
}
public String getLabel(){
return this.label;
}
public int getOrder(){
return this.order;
}
public boolean getAscending(){
return this.ascending;
}
}
private List<TransactionOrderSpinnerItem> data;
public TransactionOrderSpinnerAdapter(Context context, int resource, List<TransactionOrderSpinnerItem> objects) {
super(context, resource, objects);
this.data = objects;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return getView(position, convertView, parent);
}
/*
* Creates the view for every element of the spinner
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.transactions_order_adapter_item, parent, false);
TextView tvTransactionOrderLabel = v.findViewById(R.id.tvTransactionOrderLabel);
TransactionOrderSpinnerItem transactionOrderSpinnerItem = getItem(position);
tvTransactionOrderLabel.setText(transactionOrderSpinnerItem.getLabel());
return v;
}
}

View file

@ -5,9 +5,38 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/rlTransactionToolsHeader"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<EditText
android:id="@+id/etTransactionSearch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
/>
<Button
android:id="@+id/btnTransactionsFilterDisplay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
<Spinner
android:id="@+id/spTransactionsOrder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="order"
/>
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/transactionListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/rlTransactionToolsHeader"
/>
</RelativeLayout>
</LinearLayout>

View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/ivTransactionOrderAscending"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/arrow_up_float" />
<TextView
android:id="@+id/tvTransactionOrderLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/ivTransactionOrderAscending"
android:ems="10"
android:text="Date" />
</RelativeLayout>
</LinearLayout>