diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 02c8576a9291fa4a9ff00159a15a34c8ca9889c8..4ba15d9946948bf0812dfbf79b8eadec91b85c6c 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -598,6 +598,7 @@ public class MessageAdapter extends ArrayAdapter { private void displayTextMessage( final ViewHolder viewHolder, final Message message, final BubbleColor bubbleColor, final int type) { + viewHolder.inReplyToQuote.setVisibility(View.GONE); viewHolder.download_button.setVisibility(View.GONE); viewHolder.image.setVisibility(View.GONE); viewHolder.audioPlayer.setVisibility(View.GONE); @@ -609,6 +610,10 @@ public class MessageAdapter extends ArrayAdapter { layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; viewHolder.messageBody.setLayoutParams(layoutParams); + final ViewGroup.LayoutParams qlayoutParams = viewHolder.inReplyToQuote.getLayoutParams(); + qlayoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; + viewHolder.messageBody.setLayoutParams(qlayoutParams); + viewHolder.messageBody.setTypeface(null, Typeface.NORMAL); if (message.getBody() != null && !message.getBody().equals("")) { @@ -636,9 +641,19 @@ public class MessageAdapter extends ArrayAdapter { for (final android.text.style.QuoteSpan quote : body.getSpans(0, body.length(), android.text.style.QuoteSpan.class)) { int start = body.getSpanStart(quote); int end = body.getSpanEnd(quote); - if (start == 0) startsWithQuote = true; body.removeSpan(quote); applyQuoteSpan(viewHolder.messageBody, body, start, end, bubbleColor, true); + if (start == 0) { + if (message.getInReplyTo() == null) { + startsWithQuote = true; + } else { + viewHolder.inReplyToQuote.setText(body.subSequence(start, end)); + viewHolder.inReplyToQuote.setVisibility(View.VISIBLE); + body.delete(start, end); + while (body.length() > start && body.charAt(start) == '\n') body.delete(start, 1); // Newlines after quote + continue; + } + } } startsWithQuote = (processMarkup ? handleTextQuotes(viewHolder.messageBody, body, bubbleColor, true) : false) || startsWithQuote; if (!message.isPrivateMessage()) { @@ -739,6 +754,7 @@ public class MessageAdapter extends ArrayAdapter { viewHolder.messageBody.setAutoLinkMask(0); viewHolder.messageBody.setText(body); + if (body.length() <= 0) viewHolder.messageBody.setVisibility(View.GONE); BetterLinkMovementMethod method = new BetterLinkMovementMethod() { @Override protected void dispatchUrlLongClick(TextView tv, ClickableSpan span) { @@ -813,7 +829,7 @@ public class MessageAdapter extends ArrayAdapter { if (height < 1) height = 1080; viewHolder.image.setVisibility(View.VISIBLE); - imagePreviewLayout(width, height, viewHolder.image, true, type, viewHolder); + imagePreviewLayout(width, height, viewHolder.image, message.getInReplyTo() != null, true, type, viewHolder); activity.loadBitmap(message, viewHolder.image); viewHolder.image.setOnClickListener(v -> ConversationFragment.downloadFile(activity, message)); @@ -928,12 +944,12 @@ public class MessageAdapter extends ArrayAdapter { viewHolder.audioPlayer.setVisibility(View.GONE); viewHolder.image.setVisibility(View.VISIBLE); final FileParams params = message.getFileParams(); - imagePreviewLayout(params.width, params.height, viewHolder.image, viewHolder.messageBody.getVisibility() != View.GONE, type, viewHolder); + imagePreviewLayout(params.width, params.height, viewHolder.image, message.getInReplyTo() != null, viewHolder.messageBody.getVisibility() != View.GONE, type, viewHolder); activity.loadBitmap(message, viewHolder.image); viewHolder.image.setOnClickListener(v -> openDownloadable(message)); } - private void imagePreviewLayout(int w, int h, ShapeableImageView image, boolean withOther, int type, ViewHolder viewHolder) { + private void imagePreviewLayout(int w, int h, ShapeableImageView image, boolean otherAbove, boolean otherBelow, int type, ViewHolder viewHolder) { final float target = activity.getResources().getDimension(R.dimen.image_preview_width); final int scaledW; final int scaledH; @@ -950,15 +966,22 @@ public class MessageAdapter extends ArrayAdapter { scaledW = (int) target; scaledH = (int) (h / ((double) w / target)); } - final var small = withOther ? scaledW < target : scaledW < 110 * metrics.density; + final var bodyWidth = Math.max(viewHolder.messageBody.getWidth(), viewHolder.download_button.getWidth()); + var targetImageWidth = 200 * metrics.density; + if (!otherBelow) targetImageWidth = 110 * metrics.density; + if (bodyWidth > 0 && bodyWidth < targetImageWidth) targetImageWidth = bodyWidth; + final var small = scaledW < targetImageWidth; final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(scaledW, scaledH); image.setLayoutParams(layoutParams); final var bubbleRadius = activity.getResources().getDimension(R.dimen.bubble_radius); - var shape = new ShapeAppearanceModel.Builder().setTopRightCorner(CornerFamily.ROUNDED, bubbleRadius); - if (type == SENT) { - shape = shape.setTopLeftCorner(CornerFamily.ROUNDED, bubbleRadius); + var shape = new ShapeAppearanceModel.Builder(); + if (!otherAbove) { + shape = shape.setTopRightCorner(CornerFamily.ROUNDED, bubbleRadius); + if (type == SENT) { + shape = shape.setTopLeftCorner(CornerFamily.ROUNDED, bubbleRadius); + } } if (small) { final var imageRadius = activity.getResources().getDimension(R.dimen.image_radius); @@ -971,8 +994,12 @@ public class MessageAdapter extends ArrayAdapter { if (!small) { final ViewGroup.LayoutParams blayoutParams = viewHolder.messageBody.getLayoutParams(); - blayoutParams.width = (int) (target - (22 * metrics.density)); + blayoutParams.width = (int) (scaledW - (22 * metrics.density)); viewHolder.messageBody.setLayoutParams(blayoutParams); + + final ViewGroup.LayoutParams qlayoutParams = viewHolder.inReplyToQuote.getLayoutParams(); + qlayoutParams.width = (int) (scaledW - (22 * metrics.density)); + viewHolder.messageBody.setLayoutParams(qlayoutParams); } } @@ -1078,6 +1105,7 @@ public class MessageAdapter extends ArrayAdapter { viewHolder.subject = view.findViewById(R.id.message_subject); viewHolder.inReplyTo = view.findViewById(R.id.in_reply_to); viewHolder.inReplyToBox = view.findViewById(R.id.in_reply_to_box); + viewHolder.inReplyToQuote = view.findViewById(R.id.in_reply_to_quote); viewHolder.indicatorReceived = view.findViewById(R.id.indicator_received); viewHolder.audioPlayer = view.findViewById(R.id.audio_player); viewHolder.thread_identicon = view.findViewById(R.id.thread_identicon); @@ -1096,6 +1124,7 @@ public class MessageAdapter extends ArrayAdapter { viewHolder.time = view.findViewById(R.id.message_time); viewHolder.subject = view.findViewById(R.id.message_subject); viewHolder.inReplyTo = view.findViewById(R.id.in_reply_to); + viewHolder.inReplyToQuote = view.findViewById(R.id.in_reply_to_quote); viewHolder.inReplyToBox = view.findViewById(R.id.in_reply_to_box); viewHolder.indicatorReceived = view.findViewById(R.id.indicator_received); viewHolder.encryption = view.findViewById(R.id.message_encryption); @@ -1481,6 +1510,7 @@ public class MessageAdapter extends ArrayAdapter { viewHolder.inReplyToBox.setVisibility(View.VISIBLE); viewHolder.inReplyTo.setText(UIHelper.getMessageDisplayName(message.getInReplyTo())); viewHolder.inReplyTo.setOnClickListener((v) -> mConversationFragment.jumpTo(message.getInReplyTo())); + viewHolder.inReplyToQuote.setOnClickListener((v) -> mConversationFragment.jumpTo(message.getInReplyTo())); setTextColor(viewHolder.inReplyTo, bubbleColor); } } @@ -1703,6 +1733,7 @@ public class MessageAdapter extends ArrayAdapter { protected TextView time; protected TextView subject; protected TextView inReplyTo; + protected TextView inReplyToQuote; protected LinearLayout inReplyToBox; protected TextView messageBody; protected ImageView contact_picture; diff --git a/src/main/res/layout/item_message_content.xml b/src/main/res/layout/item_message_content.xml index 36e69fd2f65128414037b6bce4979cee6f47164b..7a9dfa00cc95838ee7bb2a320771feb3bbe01a6b 100644 --- a/src/main/res/layout/item_message_content.xml +++ b/src/main/res/layout/item_message_content.xml @@ -4,23 +4,6 @@ - - - - - + + + + + + +