diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt index 366234de4..3b9fa4c3a 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt @@ -26,6 +26,8 @@ import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.Address import org.linphone.core.ChatRoom +import org.linphone.core.ChatRoomListenerStub +import org.linphone.core.EventLog import org.linphone.core.Factory import org.linphone.core.Friend import org.linphone.core.tools.Log @@ -51,19 +53,41 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { val subject = MutableLiveData() + val isReadOnly = MutableLiveData() + + val textToSend = MutableLiveData() + val chatRoomFoundEvent = MutableLiveData>() private lateinit var chatRoom: ChatRoom private val avatarsMap = hashMapOf() - init { + private val chatRoomListener = object : ChatRoomListenerStub() { + override fun onChatMessageSending(chatRoom: ChatRoom, eventLog: EventLog) { + val message = eventLog.chatMessage + Log.i("$TAG Chat message [$message] is being sent") + + val list = arrayListOf() + list.addAll(events.value.orEmpty()) + + val avatarModel = getAvatarModelForAddress(message?.localAddress) + list.add(EventLogModel(eventLog, avatarModel)) + + events.postValue(list) + } + + override fun onChatMessageSent(chatRoom: ChatRoom, eventLog: EventLog) { + val message = eventLog.chatMessage + Log.i("$TAG Chat message [$message] has been sent") + } } override fun onCleared() { super.onCleared() coreContext.postOnCoreThread { + chatRoom.removeListener(chatRoomListener) avatarsMap.values.forEach(ContactAvatarModel::destroy) } } @@ -88,6 +112,8 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { ) if (found != null) { chatRoom = found + chatRoom.addListener(chatRoomListener) + configureChatRoom() chatRoomFoundEvent.postValue(Event(true)) } else { @@ -101,6 +127,24 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { } } + @UiThread + fun sendMessage() { + coreContext.postOnCoreThread { core -> + val message = chatRoom.createEmptyMessage() + + val toSend = textToSend.value.orEmpty().trim() + if (toSend.isNotEmpty()) { + message.addUtf8TextContent(toSend) + } + + if (message.contents.isNotEmpty()) { + Log.i("$TAG Sending message") + message.send() + } + textToSend.postValue("") + } + } + @WorkerThread private fun configureChatRoom() { isGroup.postValue( @@ -108,6 +152,14 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { ChatRoom.Capabilities.Conference.toInt() ) ) + + val empty = chatRoom.hasCapability(ChatRoom.Capabilities.Conference.toInt()) && chatRoom.participants.isEmpty() + val readOnly = chatRoom.isReadOnly || empty + isReadOnly.postValue(readOnly) + if (readOnly) { + Log.w("$TAG Chat room with subject [${chatRoom.subject}] is read only!") + } + subject.postValue(chatRoom.subject) val friends = arrayListOf() diff --git a/app/src/main/res/color/icon_color_selector.xml b/app/src/main/res/color/icon_color_selector.xml new file mode 100644 index 000000000..52a1d4d2d --- /dev/null +++ b/app/src/main/res/color/icon_color_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/icon_primary_color_selector.xml b/app/src/main/res/color/icon_primary_color_selector.xml new file mode 100644 index 000000000..2f6a070af --- /dev/null +++ b/app/src/main/res/color/icon_primary_color_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/chat_bubble_outgoing.xml b/app/src/main/res/layout/chat_bubble_outgoing.xml index 3a0ea9338..b14b2a245 100644 --- a/app/src/main/res/layout/chat_bubble_outgoing.xml +++ b/app/src/main/res/layout/chat_bubble_outgoing.xml @@ -5,6 +5,7 @@ + @@ -26,19 +27,87 @@ android:layout_marginTop="@{isGroupedWithPreviousOne ? @dimen/chat_bubble_grouped_top_margin : @dimen/chat_bubble_top_margin, default=@dimen/chat_bubble_top_margin}" android:layout_marginEnd="16dp"> - + + + + + + + + + + + + + app:layout_constraintBottom_toBottomOf="@id/date_time" + app:tint="@color/orange_main_500" /> diff --git a/app/src/main/res/layout/chat_conversation_fragment.xml b/app/src/main/res/layout/chat_conversation_fragment.xml index 065ccba3a..df957da97 100644 --- a/app/src/main/res/layout/chat_conversation_fragment.xml +++ b/app/src/main/res/layout/chat_conversation_fragment.xml @@ -186,6 +186,8 @@ diff --git a/app/src/main/res/layout/chat_conversation_send_area.xml b/app/src/main/res/layout/chat_conversation_send_area.xml index f94c6cd5d..c6e326d34 100644 --- a/app/src/main/res/layout/chat_conversation_send_area.xml +++ b/app/src/main/res/layout/chat_conversation_send_area.xml @@ -7,6 +7,9 @@ + @@ -35,6 +39,7 @@ android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:src="@drawable/paperclip" + app:tint="@color/icon_color_selector" app:layout_constraintTop_toTopOf="@id/message_area_background" app:layout_constraintBottom_toBottomOf="@id/message_area_background" app:layout_constraintStart_toEndOf="@id/emoji_picker" @@ -61,10 +66,12 @@ android:layout_marginBottom="16dp" android:minHeight="48dp" android:background="@color/transparent_color" + android:text="@={viewModel.textToSend}" android:textSize="14sp" android:textColorHint="@color/gray_main2_400" android:maxLines="3" android:hint="@string/conversation_text_field_hint" + android:inputType="text" app:layout_constraintStart_toStartOf="@id/message_area_background" app:layout_constraintEnd_toStartOf="@id/send_barrier" app:layout_constraintBottom_toBottomOf="parent"/> @@ -83,17 +90,20 @@ android:layout_marginEnd="12dp" android:src="@drawable/microphone" android:visibility="gone" + app:tint="@color/icon_color_selector" app:layout_constraintTop_toTopOf="@id/message_area_background" app:layout_constraintBottom_toBottomOf="@id/message_area_background" app:layout_constraintEnd_toEndOf="@id/message_area_background" />