- Simplified TransactionsFragment view hierarchy and removed unused files.

- Improved TextViews that appear in both Contacts and Transactions when there are no items to display.
- Cleaned some unused code in different parts of the app.
This commit is contained in:
Severiano Jaramillo 2018-10-15 16:51:48 -05:00
parent d367373d8e
commit ed7dc5424e
10 changed files with 78 additions and 270 deletions

View file

@ -2,48 +2,23 @@ package cy.agorise.crystalwallet.activities;
import android.arch.lifecycle.ViewModelProviders;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.thekhaeng.pushdownanim.PushDownAnim;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cy.agorise.crystalwallet.R;
import cy.agorise.crystalwallet.apigenerator.GrapheneApiGenerator;
import cy.agorise.crystalwallet.application.CrystalApplication;
import cy.agorise.crystalwallet.dao.CrystalDatabase;
import cy.agorise.crystalwallet.dialogs.material.ToastIt;
import cy.agorise.crystalwallet.enums.CryptoNet;
import cy.agorise.crystalwallet.fragments.ImportAccountOptionsFragment;
import cy.agorise.crystalwallet.models.AccountSeed;
import cy.agorise.crystalwallet.models.CryptoCoinBalance;
import cy.agorise.crystalwallet.models.CryptoCoinTransaction;
import cy.agorise.crystalwallet.models.CryptoNetAccount;
import cy.agorise.crystalwallet.models.GeneralSetting;
import cy.agorise.crystalwallet.network.CryptoNetManager;
import cy.agorise.crystalwallet.randomdatagenerators.RandomCryptoCoinBalanceGenerator;
import cy.agorise.crystalwallet.randomdatagenerators.RandomCryptoNetAccountGenerator;
import cy.agorise.crystalwallet.randomdatagenerators.RandomSeedGenerator;
import cy.agorise.crystalwallet.randomdatagenerators.RandomTransactionsGenerator;
import cy.agorise.crystalwallet.application.CrystalSecurityMonitor;
import cy.agorise.crystalwallet.viewmodels.AccountSeedListViewModel;
import cy.agorise.crystalwallet.viewmodels.TransactionListViewModel;
import cy.agorise.crystalwallet.views.TransactionListView;
public class IntroActivity extends CustomActivity {

View file

@ -28,8 +28,8 @@ public class ContactsFragment extends Fragment {
@BindView(R.id.rvContacts)
RecyclerView rvContacts;
@BindView(R.id.tvNobalances)
public TextView tvNobalances;
@BindView(R.id.tvNoContacts)
TextView tvNoContacts;
ContactListAdapter adapter;
@ -91,12 +91,11 @@ public class ContactsFragment extends Fragment {
public void onChanged(@Nullable PagedList<Contact> contacts) {
adapter.submitList(contacts);
final int size = contacts.size();
if(size==0){
tvNobalances.setVisibility(View.VISIBLE);
if(contacts != null && contacts.size() > 0){
tvNoContacts.setVisibility(View.INVISIBLE);
}
else{
tvNobalances.setVisibility(View.INVISIBLE);
tvNoContacts.setVisibility(View.VISIBLE);
}
}
});

View file

@ -5,12 +5,13 @@ import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;
import android.arch.paging.PagedList;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -26,30 +27,30 @@ 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.TransactionListAdapter;
import cy.agorise.crystalwallet.views.TransactionOrderSpinnerAdapter;
public class TransactionsFragment extends Fragment {
@BindView(R.id.vTransactionListView)
TransactionListView transactionListView;
@BindView(R.id.spTransactionsOrder)
Spinner spTransactionsOrder;
@BindView(R.id.etTransactionSearch)
EditText etTransactionSearch;
@BindView(R.id.tvNobalances)
public TextView tvNobalances;
@BindView(R.id.tvNoTransactions)
TextView tvNoTransactions;
@BindView(R.id.rvTransactions)
RecyclerView rvTransactions;
RecyclerView balanceRecyclerView;
FloatingActionButton fabSend;
FloatingActionButton fabReceive;
TransactionListAdapter transactionListAdapter;
TransactionListViewModel transactionListViewModel;
LiveData<PagedList<CryptoCoinTransactionExtended>> transactionsLiveData;
@ -70,20 +71,22 @@ public class TransactionsFragment extends Fragment {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_transactions, container, false);
ButterKnife.bind(this, view);
// Gets the Balance RecyclerView
balanceRecyclerView = view.findViewById(R.id.transactionListView);
rvTransactions.setLayoutManager(new LinearLayoutManager(getContext()));
transactionListAdapter = new TransactionListAdapter(this);
rvTransactions.setAdapter(transactionListAdapter);
fabSend = getActivity().findViewById(R.id.fabSend);
fabReceive = getActivity().findViewById(R.id.fabReceive);
// TODO move this listener to the activity, to make this fragment reusable
// Adds listener to the RecyclerView to show and hide buttons at the bottom of the screen
balanceRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
rvTransactions.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx,int dy){
super.onScrolled(recyclerView, dx, dy);
@ -123,19 +126,16 @@ public class TransactionsFragment extends Fragment {
transactionListViewModel.initTransactionList(orderSelected.getField(),etTransactionSearch.getText().toString());
transactionsLiveData = transactionListViewModel.getTransactionList();
final Fragment fragment = this;
transactionsLiveData.observe(this, new Observer<PagedList<CryptoCoinTransactionExtended>>() {
@Override
public void onChanged(@Nullable PagedList<CryptoCoinTransactionExtended> cryptoCoinTransactions) {
Log.i("Transactions","Transactions have change! Count:"+cryptoCoinTransactions.size());
transactionListView.setData(cryptoCoinTransactions, fragment);
public void onChanged(@Nullable PagedList<CryptoCoinTransactionExtended> transactions) {
transactionListAdapter.submitList(transactions);
final int size = cryptoCoinTransactions.size();
if(size==0){
tvNobalances.setVisibility(View.VISIBLE);
if(transactions != null && transactions.size() > 0){
tvNoTransactions.setVisibility(View.INVISIBLE);
}
else{
tvNobalances.setVisibility(View.INVISIBLE);
tvNoTransactions.setVisibility(View.VISIBLE);
}
}
});
@ -148,7 +148,7 @@ public class TransactionsFragment extends Fragment {
}
public void initTransactionsOrderSpinner(){
List<TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem> spinnerValues = new ArrayList<TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem>();
List<TransactionOrderSpinnerAdapter.TransactionOrderSpinnerItem> spinnerValues = new ArrayList<>();
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));

View file

@ -3,19 +3,12 @@ package cy.agorise.crystalwallet.viewmodels;
import android.app.Application;
import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.ViewModel;
import android.arch.paging.DataSource;
import android.arch.paging.LivePagedListBuilder;
import android.arch.paging.LivePagedListProvider;
import android.arch.paging.PagedList;
import android.content.Context;
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;
/**
* Created by Henry Varona on 12/9/2017.

View file

@ -34,7 +34,7 @@ public class TransactionListAdapter extends PagedListAdapter<CryptoCoinTransacti
private Fragment fragment;
TransactionListAdapter(Fragment fragment) {
public TransactionListAdapter(Fragment fragment) {
super(CryptoCoinTransactionExtended.DIFF_CALLBACK);
this.fragment = fragment;
}

View file

@ -1,128 +0,0 @@
package cy.agorise.crystalwallet.views;
import android.arch.paging.PagedList;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
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;
/**
* Created by Henry Varona on 10/9/2017.
*
* A list view showing many crypto net account transactions elements
*/
public class TransactionListView extends RelativeLayout {
LayoutInflater mInflater;
/*
* The root view of this view
*/
View rootView;
/*
* The list view that holds every transaction item
*/
RecyclerView listView;
/*
* The adapter for the previous list view
*/
TransactionListAdapter listAdapter;
TransactionListViewModel transactionListViewModel;
/*
* how much transactions will remain to show before the list loads more
*/
private int visibleThreshold = 5;
/*
* if true, the transaction list will be loading new data
*/
private boolean loading = true;
/*
* One of three constructors needed to be inflated from a layout
*/
public TransactionListView(Context context){
super(context);
this.mInflater = LayoutInflater.from(context);
init();
}
/*
* One of three constructors needed to be inflated from a layout
*/
public TransactionListView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mInflater = LayoutInflater.from(context);
init();
}
/*
* One of three constructors needed to be inflated from a layout
*/
public TransactionListView(Context context, AttributeSet attrs, int defStyle){
super(context, attrs, defStyle);
this.mInflater = LayoutInflater.from(context);
init();
}
/*
* Initializes this view
*/
public void init(){
rootView = mInflater.inflate(R.layout.transaction_list, this, true);
this.listView = rootView.findViewById(R.id.transactionListView);
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this.getContext());
this.listView.setLayoutManager(linearLayoutManager);
//Prevents the list to start again when scrolling to the end
// this.listView.setNestedScrollingEnabled(false);
/*this.listView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if(!loading && linearLayoutManager.getItemCount() <= (linearLayoutManager.findLastVisibleItemPosition() + visibleThreshold)){
onLoadMore();
loading = true;
}
}
});*/
}
//public void onLoadMore(){
// listAdapter.add();
//}
/*
* Sets the elements data of this view
*
* @param data the transactions that will be showed to the user
*/
public void setData(PagedList<CryptoCoinTransactionExtended> data, Fragment fragment){
//Initializes the adapter of the transaction list
if (this.listAdapter == null) {
this.listAdapter = new TransactionListAdapter(fragment);
this.listView.setAdapter(this.listAdapter);
}
//Sets the data of the transaction list
if (data != null) {
this.listAdapter.submitList(data);
}
}
}

View file

@ -1,24 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_intro"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="cy.agorise.crystalwallet.activities.IntroActivity">
<cy.agorise.crystalwallet.views.TransactionListView
android:id="@+id/transaction_list"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</cy.agorise.crystalwallet.views.TransactionListView>
</RelativeLayout>
-->
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"

View file

@ -5,14 +5,14 @@
tools:context="cy.agorise.crystalwallet.fragments.ContactsFragment">
<TextView
android:id="@+id/tvNobalances"
android:id="@+id/tvNoContacts"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/You_dont_have_contacts"
android:textColor="@color/gray"
android:layout_marginTop="190dp"
android:layout_marginLeft="100dp"
android:textSize="15dp" />
android:layout_marginStart="100dp"
android:textSize="15sp" />
<android.support.v7.widget.RecyclerView
android:id="@+id/rvContacts"

View file

@ -1,22 +1,57 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="cy.agorise.crystalwallet.fragments.TransactionsFragment">
<TextView
android:id="@+id/tvNobalances"
<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"
android:layout_toStartOf="@+id/btnTransactionsFilterDisplay" />
<Button
android:id="@+id/btnTransactionsFilterDisplay"
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_alignParentTop="true"
android:layout_toStartOf="@+id/spTransactionsOrder"
android:visibility="gone" />
<Spinner
android:id="@+id/spTransactionsOrder"
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_alignParentEnd="true"
android:background="@drawable/sort_transactions_icon"/>
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/rvTransactions"
android:layout_width="match_parent"
android:layout_height="0dp"
android:padding="4dp"
android:clipToPadding="false"
app:layout_constraintTop_toBottomOf="@id/rlTransactionToolsHeader"
app:layout_constraintBottom_toBottomOf="parent"
tools:listitem="@layout/transaction_list_item" />
<TextView
android:id="@+id/tvNoTransactions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/You_dont_have_transactions"
android:textColor="@color/gray"
android:layout_marginTop="190dp"
android:layout_marginLeft="90dp"
android:textSize="15dp" />
android:textSize="15sp"
android:textAlignment="center"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<cy.agorise.crystalwallet.views.TransactionListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/vTransactionListView" />
</FrameLayout>
</android.support.constraint.ConstraintLayout>

View file

@ -1,46 +0,0 @@
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
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"
android:layout_toStartOf="@+id/btnTransactionsFilterDisplay" />
<Button
android:id="@+id/btnTransactionsFilterDisplay"
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_alignParentTop="true"
android:layout_toStartOf="@+id/spTransactionsOrder"
android:visibility="gone" />
<Spinner
android:id="@+id/spTransactionsOrder"
android:layout_width="40dip"
android:layout_height="40dip"
android:layout_alignParentEnd="true"
android:background="@drawable/sort_transactions_icon"
android:text="order" />
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/transactionListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:clipToPadding="false"
tools:listitem="@layout/transaction_list_item"
/>
</LinearLayout>