From b585ba7a8b92477a13e0dde41242a1991633ca65 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 3 Nov 2023 11:06:02 +0100 Subject: [PATCH] Updated chat bubbles to display images grid --- app/build.gradle | 3 ++ .../linphone/ui/call/view/GridBoxLayout.kt | 3 +- .../ui/main/chat/model/ChatMessageModel.kt | 9 +++- .../org/linphone/utils/DataBindingUtils.kt | 6 +++ .../main/res/layout/chat_bubble_content.xml | 43 +++++++++++++------ .../layout/chat_bubble_content_grid_cell.xml | 5 +-- app/src/main/res/values/dimen.xml | 1 + 7 files changed, 50 insertions(+), 20 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c759e3d48..21cc6eb3f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -90,6 +90,9 @@ dependencies { implementation "androidx.emoji2:emoji2:$emoji_version" implementation "androidx.emoji2:emoji2-emojipicker:$emoji_version" + // https://github.com/google/flexbox-layout/blob/main/LICENSE Apache v2.0 + implementation 'com.google.android.flexbox:flexbox:3.0.0' + // https://github.com/material-components/material-components-android/blob/master/LICENSE Apache v2.0 implementation 'com.google.android.material:material:1.10.0' diff --git a/app/src/main/java/org/linphone/ui/call/view/GridBoxLayout.kt b/app/src/main/java/org/linphone/ui/call/view/GridBoxLayout.kt index dec41081b..e45230c08 100644 --- a/app/src/main/java/org/linphone/ui/call/view/GridBoxLayout.kt +++ b/app/src/main/java/org/linphone/ui/call/view/GridBoxLayout.kt @@ -77,9 +77,8 @@ class GridBoxLayout : GridLayout { val maxChild = placementMatrix[0].size if (childCount > maxChild) { - val maxMosaicParticipants = 6 Log.e( - "$TAG $childCount children but placementMatrix only knows how to display $maxChild (max allowed participants for grid layout in settings is $maxMosaicParticipants)" + "$TAG $childCount children but placementMatrix only knows how to display $maxChild (max allowed participants for grid layout in settings is 6)" ) return } diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt index e42004185..9efde75c2 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt @@ -65,8 +65,6 @@ class ChatMessageModel @WorkerThread constructor( val text = MutableLiveData() - val imagesList = MutableLiveData>() - val timestamp = chatMessage.time val time = TimestampUtils.toString(timestamp) @@ -75,6 +73,10 @@ class ChatMessageModel @WorkerThread constructor( val reactions = MutableLiveData() + val imagesList = MutableLiveData>() + + val firstImage = MutableLiveData() + val dismissLongPressMenuEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -125,6 +127,9 @@ class ChatMessageModel @WorkerThread constructor( when (content.type) { "image", "video" -> { imagesPath.add(path) + if (filesContentCount == 1) { + firstImage.postValue(path) + } displayableContentFound = true } "audio" -> { diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index ab506af7c..e2fe5c416 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -52,6 +52,7 @@ import androidx.lifecycle.lifecycleScope import coil.dispose import coil.load import coil.request.videoFrameMillis +import coil.transform.RoundedCornersTransformation import com.google.android.material.imageview.ShapeableImageView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.coroutineScope @@ -210,9 +211,13 @@ fun AppCompatTextView.setColor(@ColorRes color: Int) { @BindingAdapter("coilBubble") fun ImageView.loadImageForChatBubble(file: String?) { if (!file.isNullOrEmpty()) { + val radius = context.resources.getDimension( + R.dimen.chat_bubble_images_rounded_corner_radius + ) if (FileUtils.isExtensionVideo(file)) { load(file) { videoFrameMillis(0) + transformations(RoundedCornersTransformation(radius)) listener( onError = { _, result -> Log.e( @@ -227,6 +232,7 @@ fun ImageView.loadImageForChatBubble(file: String?) { } } else { load(file) { + transformations(RoundedCornersTransformation(radius)) listener( onError = { _, result -> Log.e( diff --git a/app/src/main/res/layout/chat_bubble_content.xml b/app/src/main/res/layout/chat_bubble_content.xml index e02cf9328..58c5d0f92 100644 --- a/app/src/main/res/layout/chat_bubble_content.xml +++ b/app/src/main/res/layout/chat_bubble_content.xml @@ -1,29 +1,47 @@ - + + - - + + + android:visibility="@{model.text.length() > 0 ? View.VISIBLE : View.GONE}" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/single_image"/> - + \ No newline at end of file diff --git a/app/src/main/res/layout/chat_bubble_content_grid_cell.xml b/app/src/main/res/layout/chat_bubble_content_grid_cell.xml index 00a372bb5..fd0d32846 100644 --- a/app/src/main/res/layout/chat_bubble_content_grid_cell.xml +++ b/app/src/main/res/layout/chat_bubble_content_grid_cell.xml @@ -1,6 +1,5 @@ - + @@ -10,13 +9,11 @@ \ No newline at end of file diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml index da273c91d..b8e06846f 100644 --- a/app/src/main/res/values/dimen.xml +++ b/app/src/main/res/values/dimen.xml @@ -67,6 +67,7 @@ 5dp 30sp 200dp + 5dp 290dp 425dp