diff --git a/app/build.gradle b/app/build.gradle index ee8967e..9796bbe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -113,10 +113,12 @@ dependencies { implementation 'dnsjava:dnsjava:2.1.8' implementation 'org.jitsi:dnssecjava:1.1.3' implementation 'org.slf4j:slf4j-nop:1.7.25' + implementation 'com.github.brnunes:swipeablerecyclerview:1.0.2' testImplementation "junit:junit:$rootProject.ext.junitVersion" testImplementation "org.mockito:mockito-all:$rootProject.ext.mockitoVersion" testImplementation "com.squareup.okhttp3:mockwebserver:$rootProject.ext.okHttpVersion" - testImplementation 'org.json:json:20140107' - testImplementation 'net.jodah:concurrentunit:0.4.2' + //testImplementation 'org.json:json:20140107' + //testImplementation 'net.jodah:concurrentunit:0.4.2' + } diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java index 6794159..a077cbe 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java @@ -144,6 +144,9 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste } else { streetMode = 0; } + final WalletFragment walletFragment = (WalletFragment) + getSupportFragmentManager().findFragmentByTag(WalletFragment.class.getName()); + if (walletFragment != null) walletFragment.resetDismissedTransactions(); updateAccountsBalance(); forceUpdate(); } @@ -286,7 +289,6 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste showNet(); } invalidateOptionsMenu(); - } private void onEnableStreetMode() { diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java index e9e6fa7..6c635e4 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletFragment.java @@ -38,6 +38,7 @@ import android.widget.ProgressBar; import android.widget.Spinner; import android.widget.TextView; +import com.github.brnunes.swipeablerecyclerview.SwipeableRecyclerViewTouchListener; import com.m2049r.xmrwallet.layout.TransactionInfoAdapter; import com.m2049r.xmrwallet.model.TransactionInfo; import com.m2049r.xmrwallet.model.Wallet; @@ -73,6 +74,12 @@ public class WalletFragment extends Fragment private Spinner sCurrency; + private List dismissedTransactions = new ArrayList<>(); + + public void resetDismissedTransactions() { + dismissedTransactions.clear(); + } + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -116,9 +123,44 @@ public class WalletFragment extends Fragment RecyclerView recyclerView = view.findViewById(R.id.list); - this.adapter = new TransactionInfoAdapter(getActivity(), this); + adapter = new TransactionInfoAdapter(getActivity(), this); recyclerView.setAdapter(adapter); + SwipeableRecyclerViewTouchListener swipeTouchListener = + new SwipeableRecyclerViewTouchListener(recyclerView, + new SwipeableRecyclerViewTouchListener.SwipeListener() { + @Override + public boolean canSwipeLeft(int position) { + return activityCallback.isStreetMode(); + } + + @Override + public boolean canSwipeRight(int position) { + return activityCallback.isStreetMode(); + } + + @Override + public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) { + for (int position : reverseSortedPositions) { + dismissedTransactions.add(adapter.getItem(position).hash); + adapter.removeItem(position); + } + adapter.notifyDataSetChanged(); + } + + @Override + public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) { + for (int position : reverseSortedPositions) { + dismissedTransactions.add(adapter.getItem(position).hash); + adapter.removeItem(position); + } + adapter.notifyDataSetChanged(); + } + }); + + recyclerView.addOnItemTouchListener(swipeTouchListener); + + bSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -294,7 +336,9 @@ public class WalletFragment extends Fragment Timber.d("StreetHeight=%d", streetHeight); for (TransactionInfo info : wallet.getHistory().getAll()) { Timber.d("TxHeight=%d", info.blockheight); - if (info.isPending || (info.blockheight >= streetHeight)) list.add(info); + if ((info.isPending || (info.blockheight >= streetHeight)) + && !dismissedTransactions.contains(info.hash)) + list.add(info); } adapter.setInfos(list); adapter.notifyDataSetChanged(); diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java index 8d1e508..6c38f3e 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java +++ b/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java @@ -91,7 +91,7 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter data) { // TODO do stuff with data so we can really recycle elements (i.e. add only new tx) // as the TransactionInfo items are always recreated, we cannot recycle - this.infoItems.clear(); + infoItems.clear(); if (data != null) { Timber.d("setInfos %s", data.size()); infoItems.addAll(data); @@ -102,6 +102,15 @@ public class TransactionInfoAdapter extends RecyclerView.Adapter