From f110e817d54838d733cf75d05bec3b1f9566a49d Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 21 Feb 2019 17:13:36 +0100 Subject: [PATCH] Improved chat message display --- .../linphone/chat/ChatMessageViewHolder.java | 169 ++++++++++-------- .../linphone/chat/ChatMessagesAdapter.java | 25 +-- .../java/org/linphone/chat/ImdnFragment.java | 3 +- app/src/main/res/layout/chat.xml | 4 +- app/src/main/res/layout/chat_bubble.xml | 30 ++-- .../main/res/layout/chat_bubble_content.xml | 6 +- 6 files changed, 119 insertions(+), 118 deletions(-) diff --git a/app/src/main/java/org/linphone/chat/ChatMessageViewHolder.java b/app/src/main/java/org/linphone/chat/ChatMessageViewHolder.java index 987bbd808..a065c750f 100644 --- a/app/src/main/java/org/linphone/chat/ChatMessageViewHolder.java +++ b/app/src/main/java/org/linphone/chat/ChatMessageViewHolder.java @@ -76,10 +76,10 @@ public class ChatMessageViewHolder extends RecyclerView.ViewHolder implements Vi public final ImageView outgoingImdn; public final TextView messageText; - public final FlexboxLayout pictures; + public final FlexboxLayout multiFileContents; + public final RelativeLayout singleFileContent; - public final CheckBox deleteEvent; - public final CheckBox deleteMessage; + public final CheckBox delete; private Context mContext; private ChatMessageViewHolderClickListener mListener; @@ -111,10 +111,10 @@ public class ChatMessageViewHolder extends RecyclerView.ViewHolder implements Vi outgoingImdn = view.findViewById(R.id.imdn); messageText = view.findViewById(R.id.message); - pictures = view.findViewById(R.id.pictures); + singleFileContent = view.findViewById(R.id.single_content); + multiFileContents = view.findViewById(R.id.multi_content); - deleteEvent = view.findViewById(R.id.delete_event); - deleteMessage = view.findViewById(R.id.delete_message); + delete = view.findViewById(R.id.delete_event); } @Override @@ -135,8 +135,8 @@ public class ChatMessageViewHolder extends RecyclerView.ViewHolder implements Vi avatarLayout.setVisibility(View.GONE); sendInProgress.setVisibility(View.GONE); downloadInProgress.setVisibility(View.GONE); - pictures.setVisibility(View.GONE); - pictures.removeAllViews(); + singleFileContent.setVisibility(View.GONE); + multiFileContents.setVisibility(View.GONE); ChatMessage.State status = message.getState(); Address remoteSender = message.getFromAddress(); @@ -174,7 +174,7 @@ public class ChatMessageViewHolder extends RecyclerView.ViewHolder implements Vi // Can't anchor incoming messages, setting this to align max width with LIME icon bubbleLayout.setPadding( - 0, 0, (int) ImageUtils.dpToPixels(LinphoneActivity.instance(), 16), 0); + 0, 0, (int) ImageUtils.dpToPixels(LinphoneActivity.instance(), 18), 0); if (status == ChatMessage.State.InProgress) { downloadInProgress.setVisibility(View.VISIBLE); @@ -217,87 +217,98 @@ public class ChatMessageViewHolder extends RecyclerView.ViewHolder implements Vi } } - if (fileContents.size() > 0) { - pictures.setVisibility(View.VISIBLE); + if (fileContents.size() == 1) { + singleFileContent.setVisibility(View.VISIBLE); + displayContent(message, fileContents.get(0), singleFileContent, false); + } else if (fileContents.size() > 1) { + multiFileContents.removeAllViews(); + multiFileContents.setVisibility(View.VISIBLE); + for (Content c : fileContents) { View content = LayoutInflater.from(mContext) .inflate(R.layout.chat_bubble_content, null, false); - if (c.isFile() || (c.isFileTransfer() && message.isOutgoing())) { - // If message is outgoing, even if content - // is file transfer we have the file available - String filePath = c.getFilePath(); + displayContent(message, c, content, true); - View v; - if (FileUtils.isExtensionImage(filePath)) { - if (fileContents.size() == 1 - && mContext.getResources() - .getBoolean( - R.bool.use_big_pictures_to_preview_images_file_transfers)) { - v = content.findViewById(R.id.bigImage); - loadBitmap(c.getFilePath(), ((ImageView) v)); - } else { - v = content.findViewById(R.id.image); - loadBitmap(c.getFilePath(), ((ImageView) v)); - } - } else { - v = content.findViewById(R.id.file); - ((TextView) v).setText(FileUtils.getNameFromFilePath(filePath)); - } - v.setVisibility(View.VISIBLE); - v.setTag(c.getFilePath()); - v.setOnClickListener( - new View.OnClickListener() { - @Override - public void onClick(View v) { - openFile((String) v.getTag()); - } - }); + multiFileContents.addView(content); + } + } + } + + private void displayContent( + final ChatMessage message, Content c, View content, boolean isMultiContent) { + Button download = content.findViewById(R.id.download); + download.setVisibility(View.GONE); + + if (c.isFile() || (c.isFileTransfer() && message.isOutgoing())) { + // If message is outgoing, even if content + // is file transfer we have the file available + final String filePath = c.getFilePath(); + + View v; + if (FileUtils.isExtensionImage(filePath)) { + if (!isMultiContent + && mContext.getResources() + .getBoolean( + R.bool.use_big_pictures_to_preview_images_file_transfers)) { + v = content.findViewById(R.id.bigImage); + loadBitmap(c.getFilePath(), ((ImageView) v)); } else { - Button download = content.findViewById(R.id.download); - download.setVisibility(View.VISIBLE); - - if (mContext.getPackageManager() - .checkPermission( - Manifest.permission.WRITE_EXTERNAL_STORAGE, - mContext.getPackageName()) - == PackageManager.PERMISSION_GRANTED) { - String filename = c.getName(); - File file = new File(FileUtils.getStorageDirectory(mContext), filename); - - int prefix = 1; - while (file.exists()) { - file = - new File( - FileUtils.getStorageDirectory(mContext), - prefix + "_" + filename); - Log.w( - "File with that name already exists, renamed to " - + prefix - + "_" - + filename); - prefix += 1; + v = content.findViewById(R.id.image); + loadBitmap(c.getFilePath(), ((ImageView) v)); + } + } else { + v = content.findViewById(R.id.file); + ((TextView) v).setText(FileUtils.getNameFromFilePath(filePath)); + } + v.setVisibility(View.VISIBLE); + v.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + openFile(filePath); } + }); + } else { + download.setVisibility(View.VISIBLE); - download.setTag(c); - c.setFilePath(file.getPath()); - download.setOnClickListener( - new View.OnClickListener() { - @Override - public void onClick(View v) { - Content c = (Content) v.getTag(); - message.downloadContent(c); - } - }); - } else { - Log.w( - "WRITE_EXTERNAL_STORAGE permission not granted, won't be able to store the downloaded file"); - LinphoneActivity.instance().checkAndRequestExternalStoragePermission(); - } + if (mContext.getPackageManager() + .checkPermission( + Manifest.permission.WRITE_EXTERNAL_STORAGE, + mContext.getPackageName()) + == PackageManager.PERMISSION_GRANTED) { + String filename = c.getName(); + File file = new File(FileUtils.getStorageDirectory(mContext), filename); + + int prefix = 1; + while (file.exists()) { + file = + new File( + FileUtils.getStorageDirectory(mContext), + prefix + "_" + filename); + Log.w( + "File with that name already exists, renamed to " + + prefix + + "_" + + filename); + prefix += 1; } - pictures.addView(content); + download.setTag(c); + c.setFilePath(file.getPath()); + download.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + Content c = (Content) v.getTag(); + message.downloadContent(c); + } + }); + } else { + Log.w( + "WRITE_EXTERNAL_STORAGE permission not granted, won't be able to store the downloaded file"); + LinphoneActivity.instance().checkAndRequestExternalStoragePermission(); } } } diff --git a/app/src/main/java/org/linphone/chat/ChatMessagesAdapter.java b/app/src/main/java/org/linphone/chat/ChatMessagesAdapter.java index fe00e10a3..ac09e016a 100644 --- a/app/src/main/java/org/linphone/chat/ChatMessagesAdapter.java +++ b/app/src/main/java/org/linphone/chat/ChatMessagesAdapter.java @@ -106,30 +106,29 @@ public class ChatMessagesAdapter extends SelectableAdapter diff --git a/app/src/main/res/layout/chat_bubble.xml b/app/src/main/res/layout/chat_bubble.xml index ca5336dc6..b3993dced 100644 --- a/app/src/main/res/layout/chat_bubble.xml +++ b/app/src/main/res/layout/chat_bubble.xml @@ -5,15 +5,15 @@ + + + + + + - - @@ -15,8 +14,7 @@