Swipe to remove filter criteria

pull/996/head
Alex Baker 4 years ago
parent 410af772f2
commit 17e3750419

@ -1,12 +1,22 @@
package com.todoroo.astrid.core package com.todoroo.astrid.core
import android.content.Context
import android.graphics.Canvas
import android.graphics.drawable.ColorDrawable
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import org.tasks.Callback
import org.tasks.Callback2 import org.tasks.Callback2
import org.tasks.R
class CustomFilterItemTouchHelper(private val onMove: Callback2<Int, Int>, private val onClear: Runnable) : ItemTouchHelper.Callback() { class CustomFilterItemTouchHelper(
private val context: Context,
private val onMove: Callback2<Int, Int>,
private val onDelete: Callback<Int>,
private val onClear: Runnable) : ItemTouchHelper.Callback() {
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int { override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
return if (viewHolder.adapterPosition > 0) makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0) else 0 return if (viewHolder.adapterPosition > 0) makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) else 0
} }
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
@ -27,6 +37,27 @@ class CustomFilterItemTouchHelper(private val onMove: Callback2<Int, Int>, priva
return true return true
} }
override fun getSwipeEscapeVelocity(defaultValue: Float): Float {
return defaultValue * 3
}
override fun getSwipeVelocityThreshold(defaultValue: Float): Float {
return .6f
}
override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) {
val itemView = viewHolder.itemView
val background = ColorDrawable(ContextCompat.getColor(context, R.color.overdue))
if (dX > 0) {
background.setBounds(0, itemView.top, itemView.left + dX.toInt(), itemView.bottom)
} else if (dX < 0) {
background.setBounds(itemView.right + dX.toInt(), itemView.top, itemView.right, itemView.bottom)
}
background.draw(c)
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
super.clearView(recyclerView, viewHolder) super.clearView(recyclerView, viewHolder)
@ -35,5 +66,7 @@ class CustomFilterItemTouchHelper(private val onMove: Callback2<Int, Int>, priva
onClear.run() onClear.run()
} }
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {} override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
onDelete.call(viewHolder.adapterPosition)
}
} }

@ -118,10 +118,9 @@ public class FilterSettingsActivity extends BaseListSettingsActivity {
criteria.add(instance); criteria.add(instance);
} }
adapter = new CustomFilterAdapter(criteria, locale, this::onClick); adapter = new CustomFilterAdapter(criteria, locale, this::onClick);
recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
new ItemTouchHelper(new CustomFilterItemTouchHelper(this::onMove, this::updateList)) new ItemTouchHelper(new CustomFilterItemTouchHelper(this, this::onMove, this::onDelete, this::updateList))
.attachToRecyclerView(recyclerView); .attachToRecyclerView(recyclerView);
fab.setExtended(isNew() || adapter.getItemCount() <= 1); fab.setExtended(isNew() || adapter.getItemCount() <= 1);
@ -131,6 +130,11 @@ public class FilterSettingsActivity extends BaseListSettingsActivity {
updateTheme(); updateTheme();
} }
private void onDelete(int index) {
criteria.remove(index);
updateList();
}
private void onMove(int from, int to) { private void onMove(int from, int to) {
CriterionInstance criterion = criteria.remove(from); CriterionInstance criterion = criteria.remove(from);
criteria.add(to, criterion); criteria.add(to, criterion);
@ -156,11 +160,6 @@ public class FilterSettingsActivity extends BaseListSettingsActivity {
updateList(); updateList();
}) })
.show(); .show();
view.findViewById(R.id.delete).setOnClickListener(v -> {
d.dismiss();
criteria.remove(criterionInstance);
updateList();
});
view.findViewById(R.id.reconfigure).setOnClickListener(v -> { view.findViewById(R.id.reconfigure).setOnClickListener(v -> {
d.dismiss(); d.dismiss();
addCriteria(criterionInstance); addCriteria(criterionInstance);

@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/window_background" android:background="@color/window_background">
android:orientation="vertical">
<RelativeLayout <RelativeLayout
android:id="@+id/row" android:id="@+id/row"
@ -50,4 +49,4 @@
</RelativeLayout> </RelativeLayout>
</LinearLayout> </FrameLayout>

@ -45,9 +45,4 @@
style="@style/TagSettingsRow" style="@style/TagSettingsRow"
android:text="@string/choose_new_criteria" /> android:text="@string/choose_new_criteria" />
<TextView
android:id="@+id/delete"
style="@style/TagSettingsRow"
android:text="@string/delete" />
</LinearLayout> </LinearLayout>
Loading…
Cancel
Save