Compromise on status line wrapping

Stephen Paul Weber created

Never wrap nickname
Only wrap at all for images past the minimum or oledblack sends

Change summary

src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java | 35 
src/main/res/layout/message_received.xml                            |  5 
src/main/res/layout/message_sent.xml                                |  6 
3 files changed, 34 insertions(+), 12 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java 🔗

@@ -25,6 +25,7 @@ import android.text.style.URLSpan;
 import android.util.DisplayMetrics;
 import android.util.LruCache;
 import android.view.accessibility.AccessibilityEvent;
+import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
@@ -86,6 +87,7 @@ import eu.siacs.conversations.services.MessageArchiveService;
 import eu.siacs.conversations.services.NotificationService;
 import eu.siacs.conversations.ui.ConversationFragment;
 import eu.siacs.conversations.ui.ConversationsActivity;
+import eu.siacs.conversations.ui.SettingsActivity;
 import eu.siacs.conversations.ui.XmppActivity;
 import eu.siacs.conversations.ui.service.AudioPlayer;
 import eu.siacs.conversations.ui.text.DividerSpan;
@@ -306,7 +308,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                 break;
             default:
                 if (mForceNames || multiReceived || (message.getTrueCounterpart() != null && message.getContact() != null)) {
-                    info = UIHelper.getMessageDisplayName(message);
+                    info = UIHelper.getMessageDisplayName(message).replace(' ', '\u00A0');
                 }
                 break;
         }
@@ -351,28 +353,28 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 
         final String formattedTime = UIHelper.readableTimeDifferenceFull(getContext(), message.getMergedTimeSent());
         final String bodyLanguage = message.getBodyLanguage();
-        final String bodyLanguageInfo = bodyLanguage == null ? "" : String.format(" \u00B7 %s", bodyLanguage.toUpperCase(Locale.US));
+        final String bodyLanguageInfo = bodyLanguage == null ? "" : String.format("\u00A0\u00B7 %s", bodyLanguage.toUpperCase(Locale.US));
         if (message.getStatus() <= Message.STATUS_RECEIVED) {
             if ((filesize != null) && (info != null)) {
-                viewHolder.time.setText(formattedTime + " \u00B7 " + filesize + " \u00B7 " + info + bodyLanguageInfo);
+                viewHolder.time.setText(formattedTime + "\u00A0\u00B7" + filesize + "\u00A0\u00B7 " + info + bodyLanguageInfo);
             } else if ((filesize == null) && (info != null)) {
-                viewHolder.time.setText(formattedTime + " \u00B7 " + info + bodyLanguageInfo);
+                viewHolder.time.setText(formattedTime + "\u00A0\u00B7 " + info + bodyLanguageInfo);
             } else if ((filesize != null) && (info == null)) {
-                viewHolder.time.setText(formattedTime + " \u00B7 " + filesize + bodyLanguageInfo);
+                viewHolder.time.setText(formattedTime + "\u00A0\u00B7 " + filesize + bodyLanguageInfo);
             } else {
                 viewHolder.time.setText(formattedTime + bodyLanguageInfo);
             }
         } else {
             if ((filesize != null) && (info != null)) {
-                viewHolder.time.setText(filesize + " \u00B7 " + info + bodyLanguageInfo);
+                viewHolder.time.setText(filesize + "\u00A0\u00B7 " + info + bodyLanguageInfo);
             } else if ((filesize == null) && (info != null)) {
                 if (error) {
-                    viewHolder.time.setText(info + " \u00B7 " + formattedTime + bodyLanguageInfo);
+                    viewHolder.time.setText(info + "\u00A0\u00B7 " + formattedTime + bodyLanguageInfo);
                 } else {
                     viewHolder.time.setText(info);
                 }
             } else if ((filesize != null) && (info == null)) {
-                viewHolder.time.setText(filesize + " \u00B7 " + formattedTime + bodyLanguageInfo);
+                viewHolder.time.setText(filesize + "\u00A0\u00B7 " + formattedTime + bodyLanguageInfo);
             } else {
                 viewHolder.time.setText(formattedTime + bodyLanguageInfo);
             }
@@ -882,6 +884,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                     break;
                 case SENT:
                     view = activity.getLayoutInflater().inflate(R.layout.message_sent, parent, false);
+                    viewHolder.status_line = view.findViewById(R.id.status_line);
+                    viewHolder.message_box_inner = view.findViewById(R.id.message_box_inner);
                     viewHolder.message_box = view.findViewById(R.id.message_box);
                     viewHolder.contact_picture = view.findViewById(R.id.message_photo);
                     viewHolder.download_button = view.findViewById(R.id.download_button);
@@ -897,6 +901,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                     break;
                 case RECEIVED:
                     view = activity.getLayoutInflater().inflate(R.layout.message_received, parent, false);
+                    viewHolder.status_line = view.findViewById(R.id.status_line);
+                    viewHolder.message_box_inner = view.findViewById(R.id.message_box_inner);
                     viewHolder.message_box = view.findViewById(R.id.message_box);
                     viewHolder.contact_picture = view.findViewById(R.id.message_photo);
                     viewHolder.download_button = view.findViewById(R.id.download_button);
@@ -1070,6 +1076,9 @@ public class MessageAdapter extends ArrayAdapter<Message> {
         });
         viewHolder.messageBody.setAccessibilityDelegate(null);
 
+        final String theme = activity == null ? null : PreferenceManager.getDefaultSharedPreferences(activity).getString(SettingsActivity.THEME, activity.getResources().getString(R.string.theme));
+        boolean footerWrap = type == SENT && "oledblack".equals(theme);
+
         final Transferable transferable = message.getTransferable();
         final boolean unInitiatedButKnownSize = MessageUtils.unInitiatedButKnownSize(message);
         if (unInitiatedButKnownSize || message.isDeleted() || (transferable != null && transferable.getStatus() != Transferable.STATUS_UPLOADING)) {
@@ -1083,6 +1092,9 @@ public class MessageAdapter extends ArrayAdapter<Message> {
         } else if (message.isFileOrImage() && message.getEncryption() != Message.ENCRYPTION_PGP && message.getEncryption() != Message.ENCRYPTION_DECRYPTION_FAILED) {
             if (message.getFileParams().width > 0 && message.getFileParams().height > 0) {
                 displayMediaPreviewMessage(viewHolder, message, darkBackground, type);
+                if (!"oledblack".equals(theme) && viewHolder.image.getLayoutParams().width > metrics.density * 110) {
+                    footerWrap = true;
+                }
             } else if (message.getFileParams().runtime > 0) {
                 displayAudioMessage(viewHolder, message, darkBackground, type);
             } else if ("application/xdc+zip".equals(message.getFileParams().getMediaType()) && message.getConversation() instanceof Conversation && message.getThread() != null && !message.getFileParams().getCids().isEmpty()) {
@@ -1134,6 +1146,11 @@ public class MessageAdapter extends ArrayAdapter<Message> {
             }
         }
 
+        viewHolder.message_box_inner.setMinimumWidth(footerWrap ? (int) (110 * metrics.density) : 0);
+        LinearLayout.LayoutParams statusParams = (LinearLayout.LayoutParams) viewHolder.status_line.getLayoutParams();
+        statusParams.width = footerWrap ? ViewGroup.LayoutParams.MATCH_PARENT : ViewGroup.LayoutParams.WRAP_CONTENT;
+        viewHolder.status_line.setLayoutParams(statusParams);
+
         if (type == RECEIVED) {
             if (commands != null && conversation instanceof Conversation) {
                 CommandButtonAdapter adapter = new CommandButtonAdapter(activity);
@@ -1279,7 +1296,9 @@ public class MessageAdapter extends ArrayAdapter<Message> {
         public Button load_more_messages;
         public ImageView edit_indicator;
         public RelativeLayout audioPlayer;
+        protected View status_line;
         protected LinearLayout message_box;
+        protected View message_box_inner;
         protected Button download_button;
         protected ImageView image;
         protected ImageView indicator;

src/main/res/layout/message_received.xml 🔗

@@ -36,7 +36,7 @@
         android:minHeight="53dp">
 
         <LinearLayout
-            android:minWidth="110dp"
+            android:id="@+id/message_box_inner"
             android:layout_width="wrap_content"
             android:layout_height="fill_parent"
             android:gravity="center_vertical"
@@ -49,7 +49,8 @@
                 layout="@layout/message_content" />
 
             <com.wefika.flowlayout.FlowLayout
-                android:layout_width="match_parent"
+                android:id="@+id/status_line"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_gravity="left"
                 android:orientation="horizontal"

src/main/res/layout/message_sent.xml 🔗

@@ -37,7 +37,7 @@
         android:minHeight="53dp">
 
         <LinearLayout
-            android:minWidth="111dp"
+            android:id="@+id/message_box_inner"
             android:layout_width="wrap_content"
             android:layout_height="fill_parent"
             android:gravity="center_vertical"
@@ -50,9 +50,11 @@
                 layout="@layout/message_content" />
 
             <com.wefika.flowlayout.FlowLayout
-                android:layout_width="match_parent"
+                android:id="@+id/status_line"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:gravity="top|right"
+                android:layout_gravity="right"
                 android:orientation="horizontal"
                 android:paddingBottom="2dp">