diff --git a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt index 2a350a3b5..f8d92cc31 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt @@ -313,7 +313,7 @@ class ChatMessagesListAdapter( popupView.addToContactsHidden = true totalSize -= itemSize } - if (chatMessage.chatRoom.isReadOnly()) { + if (chatMessage.chatRoom.isReadOnly) { popupView.replyHidden = true totalSize -= itemSize } diff --git a/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageContentData.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageContentData.kt index 8111a4125..4ad57b5a5 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageContentData.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/ChatMessageContentData.kt @@ -402,12 +402,16 @@ class ChatMessageContentData( var earpieceCard: String? = null for (device in coreContext.core.audioDevices) { if (device.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) { - if (device.type == AudioDevice.Type.Speaker) { - speakerCard = device.id - } else if (device.type == AudioDevice.Type.Earpiece) { - earpieceCard = device.id - } else if (device.type == AudioDevice.Type.Headphones || device.type == AudioDevice.Type.Headset) { - headphonesCard = device.id + when (device.type) { + AudioDevice.Type.Speaker -> { + speakerCard = device.id + } + AudioDevice.Type.Earpiece -> { + earpieceCard = device.id + } + AudioDevice.Type.Headphones, AudioDevice.Type.Headset -> { + headphonesCard = device.id + } } } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/data/ImdnParticipantData.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ImdnParticipantData.kt index 2dcfbf0f6..5446b9243 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/data/ImdnParticipantData.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/ImdnParticipantData.kt @@ -27,8 +27,4 @@ class ImdnParticipantData(val imdnState: ParticipantImdnState) : GenericContactD val sipUri: String = imdnState.participant.address.asStringUriOnly() val time: String = TimestampUtils.toString(imdnState.stateChangeTime) - - override fun destroy() { - super.destroy() - } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt index 9e5ea8c16..6b46658ff 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt @@ -73,7 +73,7 @@ class GroupInfoFragment : SecureFragment() { adapter = GroupInfoParticipantsAdapter( viewLifecycleOwner, - chatRoom?.hasCapability(ChatRoomCapabilities.Encrypted.toInt()) ?: viewModel.isEncrypted.value == true + chatRoom?.hasCapability(ChatRoomCapabilities.Encrypted.toInt()) ?: (viewModel.isEncrypted.value == true) ) binding.participants.adapter = adapter diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageSendingViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageSendingViewModel.kt index 2fdb9d280..3c712548c 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageSendingViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessageSendingViewModel.kt @@ -114,7 +114,7 @@ class ChatMessageSendingViewModel(private val chatRoom: ChatRoom) : ViewModel() private val chatRoomListener: ChatRoomListenerStub = object : ChatRoomListenerStub() { override fun onStateChanged(chatRoom: ChatRoom, state: ChatRoom.State) { if (state == ChatRoom.State.Created || state == ChatRoom.State.Terminated) { - isReadOnly.value = chatRoom.isReadOnly() + isReadOnly.value = chatRoom.isReadOnly } } } @@ -457,12 +457,16 @@ class ChatMessageSendingViewModel(private val chatRoom: ChatRoom) : ViewModel() var earpieceCard: String? = null for (device in coreContext.core.audioDevices) { if (device.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) { - if (device.type == AudioDevice.Type.Speaker) { - speakerCard = device.id - } else if (device.type == AudioDevice.Type.Earpiece) { - earpieceCard = device.id - } else if (device.type == AudioDevice.Type.Headphones || device.type == AudioDevice.Type.Headset) { - headphonesCard = device.id + when (device.type) { + AudioDevice.Type.Speaker -> { + speakerCard = device.id + } + AudioDevice.Type.Earpiece -> { + earpieceCard = device.id + } + AudioDevice.Type.Headphones, AudioDevice.Type.Headset -> { + headphonesCard = device.id + } } } } 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 8ce5b21fc..db4c1e51e 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 @@ -63,10 +63,6 @@ class ChatRoomCreationViewModel : ContactsSelectionViewModel() { waitForChatRoomCreation.value = false } - override fun onCleared() { - super.onCleared() - } - fun updateEncryption(encrypted: Boolean) { isEncrypted.value = encrypted } 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 7f65033b3..ac464a44a 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 @@ -97,8 +97,8 @@ class GroupInfoViewModel(val chatRoom: ChatRoom?) : MessageNotifierViewModel() { init { subject.value = chatRoom?.subject - isMeAdmin.value = chatRoom == null || (chatRoom.me?.isAdmin == true && !chatRoom.isReadOnly()) - canLeaveGroup.value = chatRoom != null && !chatRoom.isReadOnly() + isMeAdmin.value = chatRoom == null || (chatRoom.me?.isAdmin == true && !chatRoom.isReadOnly) + canLeaveGroup.value = chatRoom != null && !chatRoom.isReadOnly isEncrypted.value = chatRoom?.hasCapability(ChatRoomCapabilities.Encrypted.toInt()) if (chatRoom != null) updateParticipants() diff --git a/app/src/main/java/org/linphone/activities/main/recordings/data/RecordingData.kt b/app/src/main/java/org/linphone/activities/main/recordings/data/RecordingData.kt index fa3e9ced2..1f6203580 100644 --- a/app/src/main/java/org/linphone/activities/main/recordings/data/RecordingData.kt +++ b/app/src/main/java/org/linphone/activities/main/recordings/data/RecordingData.kt @@ -171,12 +171,16 @@ class RecordingData(val path: String, private val recordingListener: RecordingLi var earpieceCard: String? = null for (device in coreContext.core.audioDevices) { if (device.hasCapability(AudioDevice.Capabilities.CapabilityPlay)) { - if (device.type == AudioDevice.Type.Speaker) { - speakerCard = device.id - } else if (device.type == AudioDevice.Type.Earpiece) { - earpieceCard = device.id - } else if (device.type == AudioDevice.Type.Headphones || device.type == AudioDevice.Type.Headset) { - headphonesCard = device.id + when (device.type) { + AudioDevice.Type.Speaker -> { + speakerCard = device.id + } + AudioDevice.Type.Earpiece -> { + earpieceCard = device.id + } + AudioDevice.Type.Headphones, AudioDevice.Type.Headset -> { + headphonesCard = device.id + } } } } diff --git a/app/src/main/java/org/linphone/activities/main/viewmodels/StatusViewModel.kt b/app/src/main/java/org/linphone/activities/main/viewmodels/StatusViewModel.kt index 27f0afb14..68c11dfcb 100644 --- a/app/src/main/java/org/linphone/activities/main/viewmodels/StatusViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/viewmodels/StatusViewModel.kt @@ -59,7 +59,7 @@ open class StatusViewModel : ViewModel() { if (body.type == "application" && body.subtype == "simple-message-summary" && body.size > 0) { val data = body.utf8Text?.lowercase(Locale.getDefault()) val voiceMail = data?.split("voice-message: ") - if (voiceMail?.size ?: 0 >= 2) { + if ((voiceMail?.size ?: 0) >= 2) { val toParse = voiceMail!![1].split("/", limit = 0) try { val unreadCount: Int = toParse[0].toInt() diff --git a/app/src/main/java/org/linphone/activities/voip/fragments/ConferenceParticipantsFragment.kt b/app/src/main/java/org/linphone/activities/voip/fragments/ConferenceParticipantsFragment.kt index 00353f16d..ecc3fba47 100644 --- a/app/src/main/java/org/linphone/activities/voip/fragments/ConferenceParticipantsFragment.kt +++ b/app/src/main/java/org/linphone/activities/voip/fragments/ConferenceParticipantsFragment.kt @@ -26,6 +26,7 @@ import androidx.navigation.navGraphViewModels import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.activities.GenericFragment +import org.linphone.activities.navigateToAddParticipants import org.linphone.activities.voip.viewmodels.ConferenceViewModel import org.linphone.core.tools.Log import org.linphone.databinding.VoipConferenceParticipantsFragmentBinding @@ -76,7 +77,7 @@ class ConferenceParticipantsFragment : GenericFragment(SearchResultDiffCallback()) { val selectedContact = MutableLiveData>() - private var selectedAddresses = ArrayList
() + private val selection = MutableLiveData>() - private var requireGroupChatCapability: Boolean = false - private var requireLimeCapability: Boolean = false + private val requireGroupChatCapability = MutableLiveData() + private var requireLimeCapability = MutableLiveData() - @SuppressLint("NotifyDataSetChanged") - fun updateSelectedAddresses(selection: ArrayList
) { - selectedAddresses = selection - notifyDataSetChanged() + init { + requireGroupChatCapability.value = false + requireLimeCapability.value = false + } + + fun updateSelectedAddresses(selectedAddresses: List
) { + selection.value = selectedAddresses } - @SuppressLint("NotifyDataSetChanged") fun setLimeCapabilityRequired(enabled: Boolean) { - requireLimeCapability = enabled - notifyDataSetChanged() + requireLimeCapability.value = enabled } fun setGroupChatCapabilityRequired(enabled: Boolean) { - requireGroupChatCapability = enabled + requireGroupChatCapability.value = enabled } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { @@ -84,13 +84,20 @@ class ContactsSelectionAdapter( lifecycleOwner = viewLifecycleOwner - updateSecurity(searchResult, searchResultViewModel, requireLimeCapability) - - val selected = selectedAddresses.find { address -> - val searchAddress = searchResult.address - if (searchAddress != null) address.weakEqual(searchAddress) else false + requireLimeCapability.observe(viewLifecycleOwner) { + updateSecurity(searchResult, searchResultViewModel) + } + requireGroupChatCapability.observe(viewLifecycleOwner) { + updateSecurity(searchResult, searchResultViewModel) + } + + selection.observe(viewLifecycleOwner) { selectedAddresses -> + val selected = selectedAddresses.find { address -> + val searchAddress = searchResult.address + if (searchAddress != null) address.weakEqual(searchAddress) else false + } + searchResultViewModel.isSelected.value = selected != null } - searchResultViewModel.isSelected.value = selected != null setClickListener { selectedContact.value = Event(searchResult) @@ -102,13 +109,14 @@ class ContactsSelectionAdapter( private fun updateSecurity( searchResult: SearchResult, - viewModel: ContactSelectionData, - securityEnabled: Boolean + viewModel: ContactSelectionData ) { + val securityEnabled = requireLimeCapability.value ?: false + val groupCapabilityRequired = requireGroupChatCapability.value ?: false val searchAddress = searchResult.address val isMyself = securityEnabled && searchAddress != null && coreContext.core.defaultAccount?.params?.identityAddress?.weakEqual(searchAddress) ?: false val limeCheck = !securityEnabled || (securityEnabled && searchResult.hasCapability(FriendCapability.LimeX3Dh)) - val groupCheck = !requireGroupChatCapability || (requireGroupChatCapability && searchResult.hasCapability(FriendCapability.GroupChat)) + val groupCheck = !groupCapabilityRequired || (groupCapabilityRequired && searchResult.hasCapability(FriendCapability.GroupChat)) val disabled = if (searchResult.friend != null) !limeCheck || !groupCheck || isMyself else false // Generated entry from search filter viewModel.isDisabled.value = disabled diff --git a/app/src/main/java/org/linphone/contact/ContactsSelectionViewModel.kt b/app/src/main/java/org/linphone/contact/ContactsSelectionViewModel.kt index 9aaf88e8e..d34a6e782 100644 --- a/app/src/main/java/org/linphone/contact/ContactsSelectionViewModel.kt +++ b/app/src/main/java/org/linphone/contact/ContactsSelectionViewModel.kt @@ -97,7 +97,7 @@ open class ContactsSelectionViewModel : MessageNotifierViewModel() { val domain = if (sipContactsSelected.value == true) coreContext.core.defaultAccount?.params?.domain ?: "" else "" searchResultsPending = true fastFetchJob?.cancel() - coreContext.contactsManager.magicSearch.getContactsAsync(filter.value.orEmpty(), domain, MagicSearchSource.All.toInt()) + coreContext.contactsManager.magicSearch.getContactsListAsync(filter.value.orEmpty(), domain, MagicSearchSource.All.toInt(), MagicSearchAggregation.None) val spinnerDelay = corePreferences.delayBeforeShowingContactsSearchSpinner.toLong() fastFetchJob = viewModelScope.launch { diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index 5e2eba3c3..adc5350f4 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -22,7 +22,6 @@ package org.linphone.utils import android.annotation.SuppressLint import android.app.Activity import android.content.Context -import android.graphics.Bitmap import android.text.Editable import android.text.TextWatcher import android.util.Patterns @@ -65,11 +64,6 @@ fun ImageView.setSourceImageResource(resource: Int) { this.setImageResource(resource) } -@BindingAdapter("android:src") -fun ImageView.setSourceImageBitmap(bitmap: Bitmap?) { - if (bitmap != null) this.setImageBitmap(bitmap) -} - @BindingAdapter("android:contentDescription") fun ImageView.setContentDescription(resource: Int) { if (resource == 0) { @@ -116,13 +110,6 @@ fun setRightMargin(view: View, margin: Float) { view.layoutParams = layoutParams } -@BindingAdapter("android:layout_weight") -fun setLayoutWeight(view: View, weight: Float) { - val layoutParams = view.layoutParams as LinearLayout.LayoutParams - layoutParams.weight = weight - view.layoutParams = layoutParams -} - @BindingAdapter("android:layout_alignLeft") fun setLayoutLeftAlign(view: View, oldTargetId: Int, newTargetId: Int) { val layoutParams = view.layoutParams as RelativeLayout.LayoutParams @@ -494,7 +481,7 @@ fun addUsernameEditTextValidation(editText: EditText, enabled: Boolean) { s?.matches(Regex(usernameRegexp)) == false -> editText.error = editText.context.getString(R.string.assistant_error_username_invalid_characters) - s?.length ?: 0 > usernameMaxLength -> { + (s?.length ?: 0) > usernameMaxLength -> { editText.error = editText.context.getString(R.string.assistant_error_username_too_long) } diff --git a/app/src/main/java/org/linphone/utils/PatternClickableSpan.kt b/app/src/main/java/org/linphone/utils/PatternClickableSpan.kt index 3455d18c5..19b1f8735 100644 --- a/app/src/main/java/org/linphone/utils/PatternClickableSpan.kt +++ b/app/src/main/java/org/linphone/utils/PatternClickableSpan.kt @@ -27,7 +27,7 @@ import android.widget.TextView import java.util.regex.Pattern class PatternClickableSpan { - var patterns: ArrayList = ArrayList() + private var patterns: ArrayList = ArrayList() inner class SpannablePatternItem( var pattern: Pattern, diff --git a/build.gradle b/build.gradle index 83d1f7501..565eb3866 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ buildscript { classpath 'com.google.gms:google-services:4.3.10' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21" classpath "org.jlleitschuh.gradle:ktlint-gradle:10.1.0" - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.0' } }