From c3205156b47671eb2e6a27a4174284c00df19039 Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 9 Jan 2022 22:43:28 +0100 Subject: [PATCH] It is a long shot --- .../eu/faircode/email/FragmentMessages.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index f5239d44aa..fec637b08f 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -65,6 +65,7 @@ import android.net.NetworkRequest; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.CancellationSignal; import android.os.Debug; import android.os.OperationCanceledException; import android.os.Parcel; @@ -99,6 +100,8 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; +import android.view.ScrollCaptureCallback; +import android.view.ScrollCaptureSession; import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; @@ -232,6 +235,7 @@ import java.util.Properties; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; +import java.util.function.Consumer; import javax.mail.Address; import javax.mail.MessageRemovedException; @@ -677,6 +681,62 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. rvMessage.addItemDecoration(itemDecorator); } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + // https://developer.android.com/reference/android/view/ScrollCaptureCallback + rvMessage.setScrollCaptureHint(android.view.View.SCROLL_CAPTURE_HINT_EXCLUDE_DESCENDANTS); + rvMessage.setScrollCaptureCallback(new ScrollCaptureCallback() { + private View child; + private Rect rect; + + @Override + public void onScrollCaptureSearch(@NonNull CancellationSignal signal, @NonNull Consumer onReady) { + rect = new Rect(); + List expanded = values.get("expanded"); + Log.i("Capture expanded=" + (expanded == null ? null : expanded.size())); + if (expanded != null && expanded.size() == 1) { + int pos = adapter.getPositionForKey(expanded.get(0)); + Log.i("Capture pos=" + pos); + child = llm.findViewByPosition(pos); + Log.i("Capture child=" + child); + if (child != null) + rect.set(0, 0, child.getWidth(), child.getHeight()); + } + Log.i("Capture search=" + rect); + onReady.accept(rect); + } + + @Override + public void onScrollCaptureStart(@NonNull ScrollCaptureSession session, @NonNull CancellationSignal signal, @NonNull Runnable onReady) { + Log.i("Capture selected scroll=" + session.getScrollBounds()); + onReady.run(); + } + + @Override + public void onScrollCaptureImageRequest(@NonNull ScrollCaptureSession session, @NonNull CancellationSignal signal, @NonNull Rect captureArea, @NonNull Consumer onComplete) { + Canvas canvas = session.getSurface().lockCanvas(rect); + Log.i("Capture draw=" + captureArea + " scroll=" + session.getScrollBounds()); + try { + canvas.save(); + canvas.translate(-captureArea.left, -captureArea.top - session.getScrollBounds().bottom); + child.draw(canvas); + canvas.restore(); + } finally { + session.getSurface().unlockCanvasAndPost(canvas); + } + + onComplete.accept(captureArea); + } + + @Override + public void onScrollCaptureEnd(@NonNull Runnable onReady) { + Log.i("Capture end"); + child = null; + rect = null; + onReady.run(); + } + }); + } + View inGroup = view.findViewById(R.id.inGroup); TextView tvFixedCategory = inGroup.findViewById(R.id.tvCategory); TextView tvFixedDate = inGroup.findViewById(R.id.tvDate);