mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-22 18:00:02 +01:00
Fix expanding captions.
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package org.thoughtcrime.securesms.components.emoji;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
@@ -18,6 +19,8 @@ import android.text.method.TransformationMethod;
|
||||
import android.text.style.CharacterStyle;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.TypedValue;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.ColorInt;
|
||||
@@ -25,6 +28,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.AppCompatTextView;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.view.GestureDetectorCompat;
|
||||
import androidx.core.view.ViewKt;
|
||||
import androidx.core.widget.TextViewCompat;
|
||||
|
||||
@@ -315,6 +319,12 @@ public class EmojiTextView extends AppCompatTextView {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
public void bindGestureListener() {
|
||||
GestureDetectorCompat gestureDetectorCompat = new GestureDetectorCompat(getContext(), new OnGestureListener());
|
||||
setOnTouchListener((v, event) -> gestureDetectorCompat.onTouchEvent(event));
|
||||
}
|
||||
|
||||
private void ellipsizeAnyTextForMaxLength() {
|
||||
if (maxLength > 0 && getText().length() > maxLength + 1) {
|
||||
SpannableStringBuilder newContent = new SpannableStringBuilder();
|
||||
@@ -465,4 +475,32 @@ public class EmojiTextView extends AppCompatTextView {
|
||||
mentionRendererDelegate.setTint(mentionBackgroundTint);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Due to some peculiarities in how TextView deals with touch events, it's really easy to accidentally trigger
|
||||
* a click (say, when you try to scroll but you're at the bottom of a view.) Because of this, we handle these
|
||||
* events manually.
|
||||
*/
|
||||
private class OnGestureListener extends GestureDetector.SimpleOnGestureListener {
|
||||
@Override
|
||||
public boolean onDown(@NonNull MotionEvent e) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onScroll(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float distanceX, float distanceY) {
|
||||
if (!canScrollVertically((int) distanceY)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
int maxScrollDistance = computeVerticalScrollRange() - computeHorizontalScrollExtent();
|
||||
scrollTo(0, Util.clamp(getScrollY() + (int) distanceY, 0, maxScrollDistance));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onSingleTapConfirmed(@NonNull MotionEvent e) {
|
||||
return performClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ class ExpandingCaptionView @JvmOverloads constructor(
|
||||
val overflow = SpannableString(context.getString(R.string.MediaPreviewFragment_read_more_overflow_text))
|
||||
overflow.setSpan(StyleSpan(Typeface.BOLD), 0, overflow.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
setOverflowText(overflow)
|
||||
bindGestureListener()
|
||||
}
|
||||
|
||||
private fun toggleExpansion() {
|
||||
|
||||
@@ -180,7 +180,7 @@ class StoryViewerPageFragment :
|
||||
val cardWrapper: TouchInterceptingFrameLayout = view.findViewById(R.id.story_content_card_touch_interceptor)
|
||||
val card: MaterialCardView = view.findViewById(R.id.story_content_card)
|
||||
val caption: EmojiTextView = view.findViewById(R.id.story_caption)
|
||||
val largeCaption: TextView = view.findViewById(R.id.story_large_caption)
|
||||
val largeCaption: EmojiTextView = view.findViewById(R.id.story_large_caption)
|
||||
val largeCaptionOverlay: View = view.findViewById(R.id.story_large_caption_overlay)
|
||||
val reactionAnimationView: OnReactionSentView = view.findViewById(R.id.on_reaction_sent_view)
|
||||
val storyGradientTop: View = view.findViewById(R.id.story_gradient_top)
|
||||
@@ -188,6 +188,8 @@ class StoryViewerPageFragment :
|
||||
val storyVolumeOverlayView: StoryVolumeOverlayView = view.findViewById(R.id.story_volume_overlay)
|
||||
val addToGroupStoryButtonWrapper: View = view.findViewById(R.id.add_wrapper)
|
||||
|
||||
largeCaption.bindGestureListener()
|
||||
|
||||
storyNormalBottomGradient = view.findViewById(R.id.story_gradient_bottom)
|
||||
storyCaptionBottomGradient = view.findViewById(R.id.story_caption_gradient)
|
||||
storyPageContainer = view.findViewById(R.id.story_page_container)
|
||||
@@ -819,7 +821,7 @@ class StoryViewerPageFragment :
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
private fun presentCaption(caption: EmojiTextView, largeCaption: TextView, largeCaptionOverlay: View, storyPost: StoryPost) {
|
||||
private fun presentCaption(caption: EmojiTextView, largeCaption: EmojiTextView, largeCaptionOverlay: View, storyPost: StoryPost) {
|
||||
val displayBody: CharSequence = if (storyPost.content is StoryPost.Content.AttachmentContent) {
|
||||
val displayBodySpan = SpannableString(storyPost.content.attachment.caption ?: "")
|
||||
val ranges: BodyRangeList? = storyPost.conversationMessage.messageRecord.messageRanges
|
||||
@@ -843,6 +845,7 @@ class StoryViewerPageFragment :
|
||||
caption.setOverflowText(getString(R.string.StoryViewerPageFragment__see_more))
|
||||
caption.maxLines = 5
|
||||
caption.text = displayBody
|
||||
caption.setMaxLength(280)
|
||||
|
||||
if (caption.text.length == displayBody.length) {
|
||||
caption.setOnClickListener(null)
|
||||
|
||||
Reference in New Issue
Block a user