From 5dcd6e5a0dc8d63832c531e2b28e0ccd8f947a86 Mon Sep 17 00:00:00 2001 From: Grishka Date: Sun, 4 Jun 2023 04:50:40 +0300 Subject: [PATCH] Fix it again --- .../ui/text/ClickableLinksDelegate.java | 86 +++++-------------- 1 file changed, 23 insertions(+), 63 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/text/ClickableLinksDelegate.java b/mastodon/src/main/java/org/joinmastodon/android/ui/text/ClickableLinksDelegate.java index 83be4b7c4..46f955d6b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/text/ClickableLinksDelegate.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/text/ClickableLinksDelegate.java @@ -4,8 +4,7 @@ import android.graphics.Canvas; import android.graphics.CornerPathEffect; import android.graphics.Paint; import android.graphics.Path; -import android.graphics.Rect; -import android.graphics.RectF; +import android.os.Build; import android.text.Layout; import android.text.Spanned; import android.view.GestureDetector; @@ -33,7 +32,8 @@ public class ClickableLinksDelegate { hlPaint=new Paint(); hlPaint.setAntiAlias(true); hlPaint.setPathEffect(new CornerPathEffect(V.dp(3))); -// view.setHighlightColor(view.getResources().getColor(android.R.color.holo_blue_light)); + hlPaint.setStyle(Paint.Style.FILL_AND_STROKE); + hlPaint.setStrokeWidth(V.dp(4)); gestureDetector = new GestureDetector(view.getContext(), new LinkGestureListener(), view.getHandler()); } @@ -58,7 +58,7 @@ public class ClickableLinksDelegate { public void onDraw(Canvas canvas){ if(hlPath!=null){ canvas.save(); - canvas.translate(0, view.getPaddingTop()); + canvas.translate(view.getTotalPaddingLeft(), view.getTotalPaddingTop()); canvas.drawPath(hlPath, hlPaint); canvas.restore(); } @@ -73,69 +73,29 @@ public class ClickableLinksDelegate { private class LinkGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDown(@NonNull MotionEvent event) { - int line=-1; - Rect rect=new Rect(); - Layout l=view.getLayout(); - for(int i=0;iview.getWidth()-padRight || y>view.getHeight()-padBottom) return false; - } + x-=padLeft; + y-=padTop; + Layout l=view.getLayout(); + int line=l.getLineForVertical(Math.round(y)); + int position=l.getOffsetForHorizontal(line, x); + CharSequence text=view.getText(); if(text instanceof Spanned s){ LinkSpan[] spans=s.getSpans(0, s.length()-1, LinkSpan.class); - if(spans.length>0){ - for(LinkSpan span:spans){ - int start=s.getSpanStart(span); - int end=s.getSpanEnd(span); - int lstart=l.getLineForOffset(start); - int lend=l.getLineForOffset(end); - if(line>=lstart && line<=lend){ - boolean isRTL=l.getParagraphDirection(line)==-1; - if(line==lstart && ((!isRTL && event.getX()-view.getPaddingLeft()l.getPrimaryHorizontal(start)))){ - continue; - } - if(line==lend && ((!isRTL && event.getX()-view.getPaddingLeft()>l.getPrimaryHorizontal(end)) || (isRTL && event.getX()-view.getPaddingLeft()position){ + selectedSpan=span; + hlPath=new Path(); + l.getSelectionPath(start, end, hlPath); + hlPaint.setColor((span.getColor() & 0x00FFFFFF) | 0x33000000); + view.invalidate(); + return true; } } }