FairEmail/patches/SelectionTracker.patch

118 lines
6.4 KiB
Diff

--- /home/marcel/support/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java 2020-03-23 17:03:46.043122318 +0100
+++ app/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java 2020-06-26 16:48:04.938298254 +0200
@@ -379,6 +379,10 @@ public class DefaultSelectionTracker<K>
return mRange != null;
}
+ boolean isOverlapping(int position, int count) {
+ return (mRange != null && mRange.isOverlapping(position, count));
+ }
+
private boolean canSetState(@NonNull K key, boolean nextState) {
return mSelectionPredicate.canSetStateForKey(key, nextState);
}
@@ -390,7 +394,7 @@ public class DefaultSelectionTracker<K>
@SuppressWarnings({"WeakerAccess", "unchecked"}) /* synthetic access */
void onDataSetChanged() {
- mSelection.clearProvisionalSelection();
+ //mSelection.clearProvisionalSelection();
notifySelectionRefresh();
@@ -601,17 +605,21 @@ public class DefaultSelectionTracker<K>
@Override
public void onItemRangeInserted(int startPosition, int itemCount) {
- mSelectionTracker.endRange();
+ if (mSelectionTracker.isOverlapping(startPosition, itemCount))
+ mSelectionTracker.endRange();
}
@Override
public void onItemRangeRemoved(int startPosition, int itemCount) {
- mSelectionTracker.endRange();
+ if (mSelectionTracker.isOverlapping(startPosition, itemCount))
+ mSelectionTracker.endRange();
}
@Override
public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
- mSelectionTracker.endRange();
+ if (mSelectionTracker.isOverlapping(fromPosition, itemCount) ||
+ mSelectionTracker.isOverlapping(toPosition, itemCount))
+ mSelectionTracker.endRange();
}
}
}
--- /home/marcel/support/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/Range.java 2020-03-23 17:03:46.045122318 +0100
+++ app/src/main/java/androidx/recyclerview/selection/Range.java 2020-06-26 16:36:39.708283142 +0200
@@ -169,6 +169,11 @@ final class Range {
mCallbacks.updateForRange(begin, end, selected, type);
}
+ boolean isOverlapping(int position, int count) {
+ return (position >= mBegin && position <= mEnd) ||
+ (position + count >= mBegin && position + count <= mEnd);
+ }
+
@Override
public String toString() {
return "Range{begin=" + mBegin + ", end=" + mEnd + "}";
--- /home/marcel/support/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/SelectionTracker.java 2020-03-23 17:03:46.046122318 +0100
+++ app/src/main/java/androidx/recyclerview/selection/SelectionTracker.java 2020-04-24 21:08:55.544011257 +0200
@@ -503,7 +503,7 @@ public abstract class SelectionTracker<K
private OnContextClickListener mOnContextClickListener;
private BandPredicate mBandPredicate;
- private int mBandOverlayId = R.drawable.selection_band_overlay;
+ private int mBandOverlayId = eu.faircode.email.R.drawable.selection_band_overlay;
// TODO(b/144500333): Remove support for overriding gesture and pointer tooltypes.
private int[] mGestureToolTypes = new int[]{
@@ -815,7 +815,11 @@ public abstract class SelectionTracker<K
@Override
public void run() {
if (mSelectionPredicate.canSelectMultiple()) {
- gestureHelper.start();
+ try {
+ gestureHelper.start();
+ } catch (Throwable ex) {
+ eu.faircode.email.Log.e(ex);
+ }
}
}
},
--- a/app/src/main/java/androidx/recyclerview/selection/GestureRouter.java
+++ b/app/src/main/java/androidx/recyclerview/selection/GestureRouter.java
@@ -94,7 +94,28 @@ final class GestureRouter<T extends OnGestureListener & OnDoubleTapListener>
@Override
public void onLongPress(@NonNull MotionEvent e) {
- mDelegates.get(e).onLongPress(e);
+ try {
+ mDelegates.get(e).onLongPress(e);
+ } catch (Throwable ex) {
+ eu.faircode.email.Log.w(ex);
+ /*
+ java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling eu.faircode.email.FixedRecyclerView{239c688b VFED.... ........ 0,0-800,1162 #7f0a04da app:id/rvMessage}, adapter:eu.faircode.email.AdapterMessage@209415c5, layout:eu.faircode.email.FragmentMessages$7@190d7b1a, context:eu.faircode.email.ActivityView@3e8522fb
+ at androidx.recyclerview.widget.RecyclerView.assertNotInLayoutOrScroll(SourceFile:3)
+ at androidx.recyclerview.widget.RecyclerView$RecyclerViewDataObserver.onItemRangeChanged(SourceFile:1)
+ at androidx.recyclerview.widget.RecyclerView$AdapterDataObservable.notifyItemRangeChanged(SourceFile:3)
+ at androidx.recyclerview.widget.RecyclerView$Adapter.notifyItemChanged(SourceFile:2)
+ at androidx.recyclerview.selection.EventBridge$TrackerToAdapterBridge.onItemStateChanged(SourceFile:3)
+ at androidx.recyclerview.selection.DefaultSelectionTracker.notifyItemStateChanged(SourceFile:3)
+ at androidx.recyclerview.selection.DefaultSelectionTracker.select(SourceFile:8)
+ at androidx.recyclerview.selection.MotionInputHandler.selectItem(SourceFile:4)
+ at androidx.recyclerview.selection.TouchInputHandler.onLongPress(SourceFile:10)
+ at androidx.recyclerview.selection.GestureRouter.onLongPress(SourceFile:1)
+ at android.view.GestureDetector.dispatchLongPress(GestureDetector.java:700)
+ at android.view.GestureDetector.access$200(GestureDetector.java:40)
+ at android.view.GestureDetector$GestureHandler.handleMessage(GestureDetector.java:273)
+ at android.os.Handler.dispatchMessage(Handler.java:102)
+ */
+ }
}
@Override