Added a setting to force secure chat rooms

This commit is contained in:
Sylvain Berfini 2022-09-20 16:46:55 +02:00
parent 05718aa749
commit 02304cdd18
11 changed files with 38 additions and 15 deletions

View file

@ -36,6 +36,7 @@ import org.linphone.contact.ContactsSelectionAdapter
import org.linphone.core.tools.Log
import org.linphone.databinding.ChatRoomCreationFragmentBinding
import org.linphone.utils.AppUtils
import org.linphone.utils.LinphoneUtils
import org.linphone.utils.PermissionHelper
class ChatRoomCreationFragment : SecureFragment<ChatRoomCreationFragmentBinding>() {
@ -174,6 +175,12 @@ class ChatRoomCreationFragment : SecureFragment<ChatRoomCreationFragmentBinding>
}
}
override fun onResume() {
super.onResume()
viewModel.secureChatAvailable.value = LinphoneUtils.isEndToEndEncryptedChatAvailable()
}
private fun addParticipantsFromSharedViewModel() {
val participants = sharedViewModel.chatRoomParticipants.value
if (participants != null && participants.size > 0) {

View file

@ -24,6 +24,7 @@ import android.os.Bundle
import android.view.View
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
import org.linphone.activities.main.MainActivity
import org.linphone.activities.main.chat.GroupChatRoomMember
@ -132,7 +133,7 @@ class GroupInfoFragment : SecureFragment<ChatRoomGroupInfoFragmentBinding>() {
}
binding.setParticipantsClickListener {
sharedViewModel.createEncryptedChatRoom = viewModel.isEncrypted.value == true
sharedViewModel.createEncryptedChatRoom = corePreferences.forceEndToEndEncryptedChat || viewModel.isEncrypted.value == true
val list = arrayListOf<Address>()
for (participant in viewModel.participants.value.orEmpty()) {

View file

@ -41,7 +41,9 @@ class ChatRoomCreationViewModel : ContactsSelectionViewModel() {
val waitForChatRoomCreation = MutableLiveData<Boolean>()
val secureChatAvailable: Boolean = LinphoneUtils.isEndToEndEncryptedChatAvailable()
val secureChatAvailable = MutableLiveData<Boolean>()
val secureChatMandatory: Boolean = corePreferences.forceEndToEndEncryptedChat
private val listener = object : ChatRoomListenerStub() {
override fun onStateChanged(room: ChatRoom, state: ChatRoom.State) {
@ -59,11 +61,16 @@ class ChatRoomCreationViewModel : ContactsSelectionViewModel() {
init {
createGroupChat.value = false
isEncrypted.value = false
isEncrypted.value = secureChatMandatory
waitForChatRoomCreation.value = false
secureChatAvailable.value = LinphoneUtils.isEndToEndEncryptedChatAvailable()
}
fun updateEncryption(encrypted: Boolean) {
if (!encrypted && secureChatMandatory) {
Log.w("[Chat Room Creation] Something tries to force plain text chat room even if secureChatMandatory is enabled!")
return
}
isEncrypted.value = encrypted
}
@ -80,7 +87,7 @@ class ChatRoomCreationViewModel : ContactsSelectionViewModel() {
return
}
val encrypted = isEncrypted.value == true
val encrypted = secureChatMandatory || isEncrypted.value == true
val params: ChatRoomParams = coreContext.core.createDefaultChatRoomParams()
params.backend = ChatRoomBackend.Basic
params.isGroupEnabled = false

View file

@ -99,7 +99,7 @@ class GroupInfoViewModel(val chatRoom: ChatRoom?) : MessageNotifierViewModel() {
subject.value = chatRoom?.subject
isMeAdmin.value = chatRoom == null || (chatRoom.me?.isAdmin == true && !chatRoom.isReadOnly)
canLeaveGroup.value = chatRoom != null && !chatRoom.isReadOnly
isEncrypted.value = chatRoom?.hasCapability(ChatRoomCapabilities.Encrypted.toInt())
isEncrypted.value = corePreferences.forceEndToEndEncryptedChat || chatRoom?.hasCapability(ChatRoomCapabilities.Encrypted.toInt()) == true
if (chatRoom != null) updateParticipants()
@ -117,9 +117,9 @@ class GroupInfoViewModel(val chatRoom: ChatRoom?) : MessageNotifierViewModel() {
fun createChatRoom() {
waitForChatRoomCreation.value = true
val params: ChatRoomParams = coreContext.core.createDefaultChatRoomParams()
params.isEncryptionEnabled = isEncrypted.value == true
params.isEncryptionEnabled = corePreferences.forceEndToEndEncryptedChat || isEncrypted.value == true
params.isGroupEnabled = true
if (isEncrypted.value == true) {
if (params.isEncryptionEnabled) {
params.ephemeralMode = if (corePreferences.useEphemeralPerDeviceMode)
ChatRoomEphemeralMode.DeviceManaged
else

View file

@ -35,6 +35,8 @@ class ContactNumberOrAddressData(
val chatAllowed = !corePreferences.disableChat
val hidePlainChat = corePreferences.forceEndToEndEncryptedChat
fun startCall() {
address ?: return
listener.onCall(address)

View file

@ -99,6 +99,8 @@ class CallLogViewModel(val callLog: CallLog, private val isRelated: Boolean = fa
val chatAllowed = !corePreferences.disableChat
val hidePlainChat = corePreferences.forceEndToEndEncryptedChat
val secureChatAllowed = LinphoneUtils.isEndToEndEncryptedChatAvailable() && (contact.value?.getPresenceModelForUriOrTel(peerSipUri)?.hasCapability(FriendCapability.LimeX3Dh) ?: false)
val relatedCallLogs = MutableLiveData<ArrayList<CallLogViewModel>>()

View file

@ -22,6 +22,7 @@ package org.linphone.activities.main.viewmodels
import android.net.Uri
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.activities.main.history.data.GroupedCallLogData
import org.linphone.core.*
import org.linphone.utils.Event
@ -59,7 +60,7 @@ class SharedMainViewModel : ViewModel() {
val contentToOpen = MutableLiveData<Content>()
var createEncryptedChatRoom: Boolean = false
var createEncryptedChatRoom: Boolean = corePreferences.forceEndToEndEncryptedChat
val chatRoomParticipants = MutableLiveData<ArrayList<Address>>()

View file

@ -455,6 +455,9 @@ class CorePreferences constructor(private val context: Context) {
val disableChat: Boolean
get() = config.getBool("app", "disable_chat_feature", false)
val forceEndToEndEncryptedChat: Boolean
get() = config.getBool("app", "force_lime_chat_rooms", false)
// This will prevent UI from showing up, except for the launcher & the foreground service notification
val preventInterfaceFromShowingUp: Boolean
get() = config.getBool("app", "keep_app_invisible", false)

View file

@ -42,7 +42,7 @@
android:src="@drawable/back" />
<LinearLayout
android:visibility="@{viewModel.secureChatAvailable ? View.VISIBLE : View.INVISIBLE}"
android:visibility="@{viewModel.secureChatAvailable &amp;&amp; !viewModel.secureChatMandatory ? View.VISIBLE : View.INVISIBLE}"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"

View file

@ -102,7 +102,7 @@
<ImageView
android:onClick="@{() -> data.startChat(false)}"
android:enabled="@{data.address != null}"
android:visibility="@{data.chatAllowed ? View.VISIBLE : View.GONE}"
android:visibility="@{data.chatAllowed &amp;&amp; !data.hidePlainChat ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_start_chat"
android:layout_width="60dp"
android:layout_height="60dp"

View file

@ -122,14 +122,14 @@
android:src="@drawable/call_start_default" />
<ImageView
android:onClick="@{() -> viewModel.startChat(false)}"
android:visibility="@{viewModel.chatAllowed ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_start_chat"
android:layout_width="60dp"
android:layout_width="56dp"
android:layout_height="60dp"
android:layout_margin="10dp"
android:background="@drawable/round_orange_button_background"
android:src="@drawable/chat_start_default" />
android:contentDescription="@string/content_description_start_chat"
android:onClick="@{() -> viewModel.startChat(false)}"
android:src="@drawable/chat_start_default"
android:visibility="@{viewModel.chatAllowed &amp;&amp; !viewModel.hidePlainChat ? View.VISIBLE : View.GONE}" />
<RelativeLayout
android:onClick="@{() -> viewModel.startChat(true)}"