diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index 54b012e71..d83a697fd 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -26,14 +26,11 @@ import android.content.pm.PackageManager import android.os.Bundle import android.os.Parcelable import android.provider.MediaStore -import android.view.MenuInflater -import android.view.MenuItem -import android.view.MotionEvent -import android.view.View -import androidx.appcompat.view.menu.MenuBuilder -import androidx.appcompat.view.menu.MenuPopupHelper +import android.view.* +import android.widget.PopupWindow import androidx.core.content.FileProvider import androidx.core.view.doOnPreDraw +import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController @@ -62,6 +59,7 @@ import org.linphone.compatibility.Compatibility import org.linphone.core.* import org.linphone.core.tools.Log import org.linphone.databinding.ChatRoomDetailFragmentBinding +import org.linphone.databinding.ChatRoomMenuBindingImpl import org.linphone.utils.* import org.linphone.utils.Event @@ -620,53 +618,71 @@ class DetailChatRoomFragment : MasterFragment { - showGroupInfo(chatRoom) - true - } - R.id.chat_room_participants_devices -> { - showParticipantsDevices() - true - } - R.id.chat_room_ephemeral_messages -> { - showEphemeralMessages() - true - } - R.id.chat_room_delete_messages -> { - enterEditionMode() - true - } - else -> false + if (viewModel.ephemeralChatRoom) { + if (chatRoom.currentParams.ephemeralMode == ChatRoomEphemeralMode.AdminManaged && + viewModel.meAdmin.value == false + ) { + popupView.ephemeralHidden = true + totalSize -= itemSize } } - }) + } - popupMenu.show() + // When using WRAP_CONTENT instead of real size, fails to place the + // popup window above if not enough space is available below + val popupWindow = PopupWindow( + popupView.root, + AppUtils.getDimension(R.dimen.chat_room_popup_width).toInt(), + totalSize, + true + ) + // Elevation is for showing a shadow around the popup + popupWindow.elevation = 20f + + popupView.setGroupInfoListener { + showGroupInfo(chatRoom) + popupWindow.dismiss() + } + popupView.setDevicesListener { + showParticipantsDevices() + popupWindow.dismiss() + } + popupView.setEphemeralListener { + showEphemeralMessages() + popupWindow.dismiss() + } + popupView.setEditionModeListener { + enterEditionMode() + popupWindow.dismiss() + } + + popupWindow.showAsDropDown(binding.menu, 0, 0, Gravity.BOTTOM) } private fun scrollToBottom() { diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomCreationViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomCreationViewModel.kt index 9f10ab947..06f2bfd88 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomCreationViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomCreationViewModel.kt @@ -21,6 +21,7 @@ package org.linphone.activities.main.chat.viewmodels import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.activities.main.viewmodels.ErrorReportingViewModel import org.linphone.contact.ContactsUpdatedListenerStub @@ -163,6 +164,11 @@ class ChatRoomCreationViewModel : ErrorReportingViewModel() { if (encrypted) { params.enableEncryption(true) params.backend = ChatRoomBackend.FlexisipChat + params.ephemeralMode = if (corePreferences.useEphemeralPerDeviceMode) + ChatRoomEphemeralMode.DeviceManaged + else + ChatRoomEphemeralMode.AdminManaged + params.ephemeralLifetime = 0 // Make sure ephemeral is disabled by default params.subject = AppUtils.getString(R.string.chat_room_dummy_subject) } diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomViewModel.kt index d6c97d653..6e16530c3 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomViewModel.kt @@ -75,7 +75,11 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf val encryptedChatRoom: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt()) - val basicChatRoom: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt()) + val ephemeralChatRoom: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Ephemeral.toInt()) + + val meAdmin: MutableLiveData by lazy { + MutableLiveData() + } var oneParticipantOneDevice: Boolean = false @@ -174,6 +178,10 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf Log.i("[Chat Room] Ephemeral message deleted, updated last message displayed") lastMessageText.value = formatLastMessage(chatRoom.lastMessageInHistory) } + + override fun onParticipantAdminStatusChanged(chatRoom: ChatRoom, eventLog: EventLog) { + meAdmin.value = chatRoom.me?.isAdmin ?: false + } } init { @@ -187,6 +195,7 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf subject.value = chatRoom.subject updateSecurityIcon() + meAdmin.value = chatRoom.me?.isAdmin ?: false contactLookup() updateParticipants() @@ -206,6 +215,10 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf chatRoom.core.removeListener(coreListener) } + fun hideMenu(): Boolean { + return chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt()) || (oneToOneChatRoom && !encryptedChatRoom) + } + fun contactLookup() { displayName.value = when { chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt()) -> LinphoneUtils.getDisplayName( @@ -304,7 +317,7 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf } private fun updateParticipants() { - peerSipUri.value = if (oneToOneChatRoom && !basicChatRoom) + peerSipUri.value = if (oneToOneChatRoom && !chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt())) chatRoom.participants.firstOrNull()?.address?.asStringUriOnly() ?: chatRoom.peerAddress.asStringUriOnly() else chatRoom.peerAddress.asStringUriOnly() diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/GroupInfoViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/GroupInfoViewModel.kt index 4afa8ace0..f2526a05d 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/GroupInfoViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/GroupInfoViewModel.kt @@ -23,6 +23,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.activities.main.chat.GroupChatRoomMember import org.linphone.activities.main.chat.data.GroupInfoParticipantData @@ -117,6 +118,13 @@ class GroupInfoViewModel(val chatRoom: ChatRoom?) : ErrorReportingViewModel() { val params: ChatRoomParams = coreContext.core.createDefaultChatRoomParams() params.enableEncryption(isEncrypted.value == true) params.enableGroup(true) + if (isEncrypted.value == true) { + params.ephemeralMode = if (corePreferences.useEphemeralPerDeviceMode) + ChatRoomEphemeralMode.DeviceManaged + else + ChatRoomEphemeralMode.AdminManaged + } + params.ephemeralLifetime = 0 // Make sure ephemeral is disabled by default params.subject = subject.value val addresses = arrayOfNulls
(participants.value.orEmpty().size) diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index bbdcb9a11..7a6975ddf 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -417,6 +417,10 @@ class CorePreferences constructor(private val context: Context) { val voiceMessagesFormatMkv: Boolean get() = config.getBool("app", "record_voice_messages_in_mkv_format", true) + // TODO FIXME: Keeping it device based until we have the API to know if all participants support the new mode + val useEphemeralPerDeviceMode: Boolean + get() = config.getBool("app", "ephemeral_chat_messages_settings_per_device", true) + /* Default values related */ val echoCancellerCalibration: Int diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index 4164dcd7d..213c7e4d7 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -627,7 +627,7 @@ class NotificationsManager(private val context: Context) { val notifiableMessage = getNotifiableMessage(message, contact) notifiable.messages.add(notifiableMessage) } else { - for (chatMessage in room.getUnreadHistory()) { + for (chatMessage in room.unreadHistory) { val notifiableMessage = getNotifiableMessage(chatMessage, contact) notifiable.messages.add(notifiableMessage) } diff --git a/app/src/main/res/drawable-xhdpi/menu_ephemeral_messages_default.png b/app/src/main/res/drawable-xhdpi/menu_ephemeral_messages_default.png index 6bdcc38db..bbe180afd 100644 Binary files a/app/src/main/res/drawable-xhdpi/menu_ephemeral_messages_default.png and b/app/src/main/res/drawable-xhdpi/menu_ephemeral_messages_default.png differ diff --git a/app/src/main/res/drawable-xhdpi/menu_group_info_default.png b/app/src/main/res/drawable-xhdpi/menu_group_info_default.png index 7ebc8c576..249d74a56 100644 Binary files a/app/src/main/res/drawable-xhdpi/menu_group_info_default.png and b/app/src/main/res/drawable-xhdpi/menu_group_info_default.png differ diff --git a/app/src/main/res/drawable-xhdpi/menu_security_default.png b/app/src/main/res/drawable-xhdpi/menu_security_default.png index 51ee24fd9..477de590a 100644 Binary files a/app/src/main/res/drawable-xhdpi/menu_security_default.png and b/app/src/main/res/drawable-xhdpi/menu_security_default.png differ diff --git a/app/src/main/res/layout/chat_room_detail_fragment.xml b/app/src/main/res/layout/chat_room_detail_fragment.xml index 100a0e23d..28b602fff 100644 --- a/app/src/main/res/layout/chat_room_detail_fragment.xml +++ b/app/src/main/res/layout/chat_room_detail_fragment.xml @@ -110,7 +110,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/chat_room_menu.xml b/app/src/main/res/menu/chat_room_menu.xml deleted file mode 100644 index a0e509e5e..000000000 --- a/app/src/main/res/menu/chat_room_menu.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - \ 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 3ce9c972f..9344f15d7 100644 --- a/app/src/main/res/values/dimen.xml +++ b/app/src/main/res/values/dimen.xml @@ -26,7 +26,9 @@ 3dp 60dp 250dp + 250dp 50dp + 50dp 6.7dp 30dp 40dp