From 8bba5ea2b69fd5eaa3de6381f5cf3202d5ba1dcd Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 22 Aug 2023 10:25:51 +0200 Subject: [PATCH] Added thread annotations to constructors + some missing other ones --- .../main/java/org/linphone/LinphoneApplication.kt | 2 ++ .../linphone/contacts/ContactsSelectionAdapter.kt | 3 --- app/src/main/java/org/linphone/core/CoreContext.kt | 2 +- .../ui/assistant/viewmodel/AssistantViewModel.kt | 2 +- .../ui/main/calls/fragment/StartCallFragment.kt | 1 + .../ui/main/calls/model/CallLogHistoryModel.kt | 4 ++-- .../linphone/ui/main/calls/model/CallLogModel.kt | 4 ++-- .../ui/main/calls/model/ConfirmationDialogModel.kt | 2 +- .../ui/main/calls/viewmodel/CallLogViewModel.kt | 2 +- .../ui/main/calls/viewmodel/CallsListViewModel.kt | 2 +- .../ui/main/calls/viewmodel/StartCallViewModel.kt | 3 ++- .../calls/viewmodel/SuggestionsListViewModel.kt | 2 +- .../ui/main/contacts/model/ContactAvatarModel.kt | 3 +-- .../ui/main/contacts/model/ContactDeviceModel.kt | 2 +- .../contacts/model/ContactNumberOrAddressModel.kt | 2 +- .../model/NewOrEditNumberOrAddressModel.kt | 4 ++-- .../model/NumberOrAddressPickerDialogModel.kt | 4 +++- .../viewmodel/ContactNewOrEditViewModel.kt | 2 +- .../ui/main/contacts/viewmodel/ContactViewModel.kt | 2 +- .../contacts/viewmodel/ContactsListViewModel.kt | 2 +- .../viewmodel/ConversationViewModel.kt | 3 +-- .../org/linphone/ui/main/model/AccountModel.kt | 3 +-- .../ui/main/recordings/RecordingsFragment.kt | 2 ++ .../settings/fragment/AccountProfileFragment.kt | 2 ++ .../ui/main/settings/fragment/HelpFragment.kt | 2 ++ .../ui/main/settings/fragment/SettingsFragment.kt | 2 ++ .../settings/viewmodel/AccountProfileViewModel.kt | 2 +- .../ui/main/viewmodel/DrawerMenuViewModel.kt | 2 +- .../ui/main/viewmodel/SharedMainViewModel.kt | 3 ++- .../linphone/ui/main/viewmodel/TopBarViewModel.kt | 2 +- .../voip/model/ZrtpSasConfirmationDialogModel.kt | 2 +- .../linphone/ui/voip/viewmodel/CallsViewModel.kt | 2 +- .../ui/voip/viewmodel/CurrentCallViewModel.kt | 2 +- .../java/org/linphone/utils/ActivityMonitor.kt | 2 ++ .../java/org/linphone/utils/AnimationsUtils.kt | 3 +++ .../main/java/org/linphone/utils/DialogUtils.kt | 5 +++++ app/src/main/java/org/linphone/utils/Event.kt | 9 ++++----- .../main/java/org/linphone/utils/LinphoneUtils.kt | 6 ++++++ .../java/org/linphone/utils/PhoneNumberUtils.kt | 6 ++++++ .../linphone/utils/SlidingPaneBackPressCallback.kt | 2 ++ .../main/java/org/linphone/utils/TimestampUtils.kt | 14 ++++++++++++++ 41 files changed, 86 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/org/linphone/LinphoneApplication.kt b/app/src/main/java/org/linphone/LinphoneApplication.kt index 4bca42e9f..ac992ded0 100644 --- a/app/src/main/java/org/linphone/LinphoneApplication.kt +++ b/app/src/main/java/org/linphone/LinphoneApplication.kt @@ -21,6 +21,7 @@ package org.linphone import android.annotation.SuppressLint import android.app.Application +import androidx.annotation.MainThread import coil.ImageLoader import coil.ImageLoaderFactory import coil.decode.GifDecoder @@ -39,6 +40,7 @@ import org.linphone.core.LogCollectionState import org.linphone.core.LogLevel import org.linphone.mediastream.Version +@MainThread class LinphoneApplication : Application(), ImageLoaderFactory { companion object { @SuppressLint("StaticFieldLeak") diff --git a/app/src/main/java/org/linphone/contacts/ContactsSelectionAdapter.kt b/app/src/main/java/org/linphone/contacts/ContactsSelectionAdapter.kt index a94078e69..a50c1b119 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsSelectionAdapter.kt +++ b/app/src/main/java/org/linphone/contacts/ContactsSelectionAdapter.kt @@ -32,9 +32,6 @@ import org.linphone.databinding.ContactSelectionCellBinding class ContactsSelectionAdapter( private val viewLifecycleOwner: LifecycleOwner ) : ListAdapter(ContactDataDiffCallback()) { - init { - } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val binding: ContactSelectionCellBinding = DataBindingUtil.inflate( LayoutInflater.from(parent.context), diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 173619c41..b69b45660 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -39,7 +39,7 @@ import org.linphone.ui.voip.VoipActivity import org.linphone.utils.ActivityMonitor import org.linphone.utils.LinphoneUtils -class CoreContext(val context: Context) : HandlerThread("Core Thread") { +class CoreContext @UiThread constructor(val context: Context) : HandlerThread("Core Thread") { companion object { const val TAG = "[Core Context]" } diff --git a/app/src/main/java/org/linphone/ui/assistant/viewmodel/AssistantViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AssistantViewModel.kt index 928491c1d..e96daf5cb 100644 --- a/app/src/main/java/org/linphone/ui/assistant/viewmodel/AssistantViewModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AssistantViewModel.kt @@ -35,7 +35,7 @@ import org.linphone.core.RegistrationState import org.linphone.core.tools.Log import org.linphone.utils.Event -class AssistantViewModel : ViewModel() { +class AssistantViewModel @UiThread constructor() : ViewModel() { companion object { const val TAG = "[Assistant ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/calls/fragment/StartCallFragment.kt b/app/src/main/java/org/linphone/ui/main/calls/fragment/StartCallFragment.kt index 6b988f9d6..d34357fc9 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/fragment/StartCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/fragment/StartCallFragment.kt @@ -44,6 +44,7 @@ import org.linphone.ui.main.contacts.viewmodel.ContactsListViewModel import org.linphone.ui.main.fragment.GenericFragment import org.linphone.utils.DialogUtils +@UiThread class StartCallFragment : GenericFragment() { private lateinit var binding: CallStartFragmentBinding diff --git a/app/src/main/java/org/linphone/ui/main/calls/model/CallLogHistoryModel.kt b/app/src/main/java/org/linphone/ui/main/calls/model/CallLogHistoryModel.kt index 3454ee8af..fc1b3faef 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/model/CallLogHistoryModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/model/CallLogHistoryModel.kt @@ -1,6 +1,7 @@ package org.linphone.ui.main.calls.model import androidx.annotation.IntegerRes +import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData import org.linphone.core.Call import org.linphone.core.Call.Dir @@ -8,7 +9,7 @@ import org.linphone.core.CallLog import org.linphone.utils.LinphoneUtils import org.linphone.utils.TimestampUtils -class CallLogHistoryModel(val callLog: CallLog) { +class CallLogHistoryModel @WorkerThread constructor(val callLog: CallLog) { val isOutgoing = MutableLiveData() val isSuccessful = MutableLiveData() @@ -21,7 +22,6 @@ class CallLogHistoryModel(val callLog: CallLog) { val iconResId = MutableLiveData() init { - // Core thread isOutgoing.postValue(callLog.dir == Dir.Outgoing) val startDate = callLog.startDate diff --git a/app/src/main/java/org/linphone/ui/main/calls/model/CallLogModel.kt b/app/src/main/java/org/linphone/ui/main/calls/model/CallLogModel.kt index 908db7ad4..1770ed330 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/model/CallLogModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/model/CallLogModel.kt @@ -2,6 +2,7 @@ package org.linphone.ui.main.calls.model import androidx.annotation.IntegerRes import androidx.annotation.UiThread +import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.Call.Dir @@ -10,7 +11,7 @@ import org.linphone.ui.main.contacts.model.ContactAvatarModel import org.linphone.utils.LinphoneUtils import org.linphone.utils.TimestampUtils -class CallLogModel(private val callLog: CallLog) { +class CallLogModel @WorkerThread constructor(private val callLog: CallLog) { val id = callLog.callId ?: callLog.refKey val address = if (callLog.dir == Dir.Outgoing) callLog.remoteAddress else callLog.fromAddress @@ -31,7 +32,6 @@ class CallLogModel(private val callLog: CallLog) { var friendExists: Boolean = false init { - // Core thread isOutgoing.postValue(callLog.dir == Dir.Outgoing) val timestamp = callLog.startDate diff --git a/app/src/main/java/org/linphone/ui/main/calls/model/ConfirmationDialogModel.kt b/app/src/main/java/org/linphone/ui/main/calls/model/ConfirmationDialogModel.kt index 0d7cf875e..dc7d7363b 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/model/ConfirmationDialogModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/model/ConfirmationDialogModel.kt @@ -23,7 +23,7 @@ import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData import org.linphone.utils.Event -class ConfirmationDialogModel() { +class ConfirmationDialogModel @UiThread constructor() { val dismissEvent = MutableLiveData>() val confirmRemovalEvent = MutableLiveData>() diff --git a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt index aabdb1478..57c25d632 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt @@ -10,7 +10,7 @@ import org.linphone.ui.main.calls.model.CallLogHistoryModel import org.linphone.ui.main.calls.model.CallLogModel import org.linphone.utils.Event -class CallLogViewModel : ViewModel() { +class CallLogViewModel @UiThread constructor() : ViewModel() { val showBackButton = MutableLiveData() val callLogModel = MutableLiveData() diff --git a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallsListViewModel.kt index 00419773f..c07805fbf 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallsListViewModel.kt @@ -30,7 +30,7 @@ import org.linphone.core.CoreListenerStub import org.linphone.ui.main.calls.model.CallLogModel import org.linphone.utils.Event -class CallsListViewModel : ViewModel() { +class CallsListViewModel @UiThread constructor() : ViewModel() { val callLogs = MutableLiveData>() val historyDeletedEvent: MutableLiveData> by lazy { diff --git a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/StartCallViewModel.kt b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/StartCallViewModel.kt index 5464085e2..244c3eca7 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/StartCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/StartCallViewModel.kt @@ -19,10 +19,11 @@ */ package org.linphone.ui.main.calls.viewmodel +import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -class StartCallViewModel : ViewModel() { +class StartCallViewModel @UiThread constructor() : ViewModel() { val searchFilter = MutableLiveData() val emptyContactsList = MutableLiveData() diff --git a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/SuggestionsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/SuggestionsListViewModel.kt index ff469cb2c..5d6c93339 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/SuggestionsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/SuggestionsListViewModel.kt @@ -34,7 +34,7 @@ import org.linphone.core.SearchResult import org.linphone.core.tools.Log import org.linphone.ui.main.contacts.model.ContactAvatarModel -class SuggestionsListViewModel : ViewModel() { +class SuggestionsListViewModel @UiThread constructor() : ViewModel() { companion object { const val TAG = "[Suggestions List ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt index aa10d3a8e..323cb546a 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt @@ -30,7 +30,7 @@ import org.linphone.core.FriendListenerStub import org.linphone.core.tools.Log import org.linphone.utils.LinphoneUtils -class ContactAvatarModel(val friend: Friend) { +class ContactAvatarModel @WorkerThread constructor(val friend: Friend) { companion object { const val TAG = "[Contact Avatar Model]" } @@ -62,7 +62,6 @@ class ContactAvatarModel(val friend: Friend) { } init { - // Core thread friend.addListener(friendListener) name.postValue(friend.name) diff --git a/app/src/main/java/org/linphone/ui/main/contacts/model/ContactDeviceModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/model/ContactDeviceModel.kt index fbb4e2a13..9fd2e3e9d 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/model/ContactDeviceModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/model/ContactDeviceModel.kt @@ -21,7 +21,7 @@ package org.linphone.ui.main.contacts.model import androidx.annotation.UiThread -class ContactDeviceModel( +class ContactDeviceModel @UiThread constructor( val name: String, val trusted: Boolean ) { diff --git a/app/src/main/java/org/linphone/ui/main/contacts/model/ContactNumberOrAddressModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/model/ContactNumberOrAddressModel.kt index 7f86bb304..7d02e0d4c 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/model/ContactNumberOrAddressModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/model/ContactNumberOrAddressModel.kt @@ -23,7 +23,7 @@ import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData import org.linphone.core.Address -class ContactNumberOrAddressModel( +class ContactNumberOrAddressModel @UiThread constructor( val address: Address?, val displayedValue: String, private val listener: ContactNumberOrAddressClickListener, diff --git a/app/src/main/java/org/linphone/ui/main/contacts/model/NewOrEditNumberOrAddressModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/model/NewOrEditNumberOrAddressModel.kt index a995f656a..2361af9cc 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/model/NewOrEditNumberOrAddressModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/model/NewOrEditNumberOrAddressModel.kt @@ -20,9 +20,10 @@ package org.linphone.ui.main.contacts.model import androidx.annotation.UiThread +import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -class NewOrEditNumberOrAddressModel( +class NewOrEditNumberOrAddressModel @WorkerThread constructor( defaultValue: String, val isSip: Boolean, private val onValueNoLongerEmpty: (() -> Unit)? = null, @@ -33,7 +34,6 @@ class NewOrEditNumberOrAddressModel( val showRemoveButton = MutableLiveData() init { - // Core thread value.postValue(defaultValue) showRemoveButton.postValue(defaultValue.isNotEmpty()) } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/model/NumberOrAddressPickerDialogModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/model/NumberOrAddressPickerDialogModel.kt index f0133ee85..acd4f34b3 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/model/NumberOrAddressPickerDialogModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/model/NumberOrAddressPickerDialogModel.kt @@ -23,7 +23,9 @@ import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData import org.linphone.utils.Event -class NumberOrAddressPickerDialogModel(list: List) { +class NumberOrAddressPickerDialogModel @UiThread constructor( + list: List +) { val sipAddressesAndPhoneNumbers = MutableLiveData>() val dismissEvent = MutableLiveData>() diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt index 2cb9b6273..c22eaef66 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt @@ -31,7 +31,7 @@ import org.linphone.ui.main.contacts.model.NewOrEditNumberOrAddressModel import org.linphone.utils.Event import org.linphone.utils.FileUtils -class ContactNewOrEditViewModel() : ViewModel() { +class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { companion object { const val TAG = "[Contact New/Edit View Model]" } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt index d2851cb81..75b309e3b 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt @@ -37,7 +37,7 @@ import org.linphone.ui.main.contacts.model.ContactNumberOrAddressModel import org.linphone.utils.Event import org.linphone.utils.FileUtils -class ContactViewModel : ViewModel() { +class ContactViewModel @UiThread constructor() : ViewModel() { companion object { const val TAG = "[Contact ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt index e13d3d0d3..d341e623e 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactsListViewModel.kt @@ -34,7 +34,7 @@ import org.linphone.core.SearchResult import org.linphone.core.tools.Log import org.linphone.ui.main.contacts.model.ContactAvatarModel -class ContactsListViewModel : ViewModel() { +class ContactsListViewModel @UiThread constructor() : ViewModel() { companion object { const val TAG = "[Contacts List ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/conversations/viewmodel/ConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/conversations/viewmodel/ConversationViewModel.kt index df590b838..c367e7d00 100644 --- a/app/src/main/java/org/linphone/ui/main/conversations/viewmodel/ConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/conversations/viewmodel/ConversationViewModel.kt @@ -34,7 +34,7 @@ import org.linphone.core.tools.Log import org.linphone.ui.main.conversations.data.EventLogData import org.linphone.utils.LinphoneUtils -class ConversationViewModel : ViewModel() { +class ConversationViewModel @WorkerThread constructor(): ViewModel() { private lateinit var chatRoom: ChatRoom val events = MutableLiveData>() @@ -86,7 +86,6 @@ class ConversationViewModel : ViewModel() { } init { - // Core thread coreContext.contactsManager.addListener(contactsListener) } diff --git a/app/src/main/java/org/linphone/ui/main/model/AccountModel.kt b/app/src/main/java/org/linphone/ui/main/model/AccountModel.kt index 31d041ffa..1b67f8745 100644 --- a/app/src/main/java/org/linphone/ui/main/model/AccountModel.kt +++ b/app/src/main/java/org/linphone/ui/main/model/AccountModel.kt @@ -30,7 +30,7 @@ import org.linphone.core.RegistrationState import org.linphone.utils.FileUtils import org.linphone.utils.LinphoneUtils -class AccountModel( +class AccountModel @WorkerThread constructor( private val account: Account, private val onMenuClicked: ((view: View, account: Account) -> Unit)? = null ) { @@ -58,7 +58,6 @@ class AccountModel( } init { - // Core thread account.addListener(accountListener) avatar.postValue(account.getPicturePath()) diff --git a/app/src/main/java/org/linphone/ui/main/recordings/RecordingsFragment.kt b/app/src/main/java/org/linphone/ui/main/recordings/RecordingsFragment.kt index 614f97cc2..05aa22473 100644 --- a/app/src/main/java/org/linphone/ui/main/recordings/RecordingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/recordings/RecordingsFragment.kt @@ -4,9 +4,11 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.annotation.UiThread import org.linphone.databinding.RecordingsFragmentBinding import org.linphone.ui.main.fragment.GenericFragment +@UiThread class RecordingsFragment : GenericFragment() { private lateinit var binding: RecordingsFragmentBinding override fun onCreateView( diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt index c54b5470d..db0771d71 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt @@ -6,6 +6,7 @@ import android.view.View import android.view.ViewGroup import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.UiThread import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -21,6 +22,7 @@ import org.linphone.ui.main.fragment.GenericFragment import org.linphone.ui.main.settings.viewmodel.AccountProfileViewModel import org.linphone.utils.FileUtils +@UiThread class AccountProfileFragment : GenericFragment() { companion object { const val TAG = "[Account Profile Fragment]" diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/HelpFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/HelpFragment.kt index 36c97107d..5a524cf98 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/HelpFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/HelpFragment.kt @@ -4,9 +4,11 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.annotation.UiThread import org.linphone.databinding.HelpFragmentBinding import org.linphone.ui.main.fragment.GenericFragment +@UiThread class HelpFragment : GenericFragment() { private lateinit var binding: HelpFragmentBinding diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt index b647dc2bd..868154064 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt @@ -4,9 +4,11 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.annotation.UiThread import org.linphone.databinding.SettingsFragmentBinding import org.linphone.ui.main.fragment.GenericFragment +@UiThread class SettingsFragment : GenericFragment() { private lateinit var binding: SettingsFragmentBinding diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt index a00bfedf5..9366b2f06 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt @@ -11,7 +11,7 @@ import org.linphone.ui.main.model.getPicturePath import org.linphone.utils.Event import org.linphone.utils.FileUtils -class AccountProfileViewModel : ViewModel() { +class AccountProfileViewModel @UiThread constructor() : ViewModel() { companion object { const val TAG = "[Account Profile ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/DrawerMenuViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/DrawerMenuViewModel.kt index 6bbac067c..0b4e5aad2 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/DrawerMenuViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/DrawerMenuViewModel.kt @@ -30,7 +30,7 @@ import org.linphone.core.tools.Log import org.linphone.ui.main.model.AccountModel import org.linphone.utils.Event -class DrawerMenuViewModel : ViewModel() { +class DrawerMenuViewModel @UiThread constructor() : ViewModel() { companion object { const val TAG = "[Drawer Menu ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt index 79df5acb5..9384dd5df 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/SharedMainViewModel.kt @@ -19,11 +19,12 @@ */ package org.linphone.ui.main.viewmodel +import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.utils.Event -class SharedMainViewModel : ViewModel() { +class SharedMainViewModel @UiThread constructor() : ViewModel() { /* Sliding Pane & navigation related */ val isSlidingPaneSlideable = MutableLiveData() diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/TopBarViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/TopBarViewModel.kt index 58f4a1bcf..e5ee2fe47 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/TopBarViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/TopBarViewModel.kt @@ -28,7 +28,7 @@ import org.linphone.core.tools.Log import org.linphone.ui.main.model.AccountModel import org.linphone.utils.Event -class TopBarViewModel : ViewModel() { +class TopBarViewModel @UiThread constructor() : ViewModel() { companion object { const val TAG = "[Top Bar ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/voip/model/ZrtpSasConfirmationDialogModel.kt b/app/src/main/java/org/linphone/ui/voip/model/ZrtpSasConfirmationDialogModel.kt index 429c180dd..78217c7dd 100644 --- a/app/src/main/java/org/linphone/ui/voip/model/ZrtpSasConfirmationDialogModel.kt +++ b/app/src/main/java/org/linphone/ui/voip/model/ZrtpSasConfirmationDialogModel.kt @@ -26,7 +26,7 @@ import java.util.Random import org.linphone.core.tools.Log import org.linphone.utils.Event -class ZrtpSasConfirmationDialogModel( +class ZrtpSasConfirmationDialogModel @UiThread constructor( private val authTokenToRead: String, private val authTokenToListen: String ) : ViewModel() { diff --git a/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt b/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt index 90b80529c..e6625895d 100644 --- a/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt @@ -30,7 +30,7 @@ import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log import org.linphone.utils.Event -class CallsViewModel : ViewModel() { +class CallsViewModel @UiThread constructor() : ViewModel() { val goToActiveCallEvent = MutableLiveData>() val showIncomingCallEvent = MutableLiveData>() diff --git a/app/src/main/java/org/linphone/ui/voip/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/voip/viewmodel/CurrentCallViewModel.kt index fd41900d1..358621ee1 100644 --- a/app/src/main/java/org/linphone/ui/voip/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/voip/viewmodel/CurrentCallViewModel.kt @@ -36,7 +36,7 @@ import org.linphone.ui.main.contacts.model.ContactAvatarModel import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils -class CurrentCallViewModel() : ViewModel() { +class CurrentCallViewModel @UiThread constructor() : ViewModel() { companion object { const val TAG = "[Current Call ViewModel]" } diff --git a/app/src/main/java/org/linphone/utils/ActivityMonitor.kt b/app/src/main/java/org/linphone/utils/ActivityMonitor.kt index fca1e7329..657acc0ab 100644 --- a/app/src/main/java/org/linphone/utils/ActivityMonitor.kt +++ b/app/src/main/java/org/linphone/utils/ActivityMonitor.kt @@ -22,9 +22,11 @@ package org.linphone.utils import android.app.Activity import android.app.Application.ActivityLifecycleCallbacks import android.os.Bundle +import androidx.annotation.UiThread import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.tools.service.AndroidDispatcher +@UiThread class ActivityMonitor : ActivityLifecycleCallbacks { private val activities = ArrayList() private var mActive = false diff --git a/app/src/main/java/org/linphone/utils/AnimationsUtils.kt b/app/src/main/java/org/linphone/utils/AnimationsUtils.kt index ed56be858..522c3e0d5 100644 --- a/app/src/main/java/org/linphone/utils/AnimationsUtils.kt +++ b/app/src/main/java/org/linphone/utils/AnimationsUtils.kt @@ -22,6 +22,7 @@ package org.linphone.utils import android.view.Gravity import android.view.View import android.view.ViewGroup +import androidx.annotation.UiThread import androidx.lifecycle.LifecycleCoroutineScope import androidx.transition.Slide import androidx.transition.Transition @@ -31,6 +32,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +@UiThread fun View.slideInToastFromTop( root: ViewGroup, visible: Boolean @@ -45,6 +47,7 @@ fun View.slideInToastFromTop( view.visibility = if (visible) View.VISIBLE else View.GONE } +@UiThread fun View.slideInToastFromTopForDuration( root: ViewGroup, lifecycleScope: LifecycleCoroutineScope, diff --git a/app/src/main/java/org/linphone/utils/DialogUtils.kt b/app/src/main/java/org/linphone/utils/DialogUtils.kt index b65dc426b..f4988eb0f 100644 --- a/app/src/main/java/org/linphone/utils/DialogUtils.kt +++ b/app/src/main/java/org/linphone/utils/DialogUtils.kt @@ -26,6 +26,7 @@ import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.Window import android.view.WindowManager +import androidx.annotation.UiThread import androidx.core.content.ContextCompat import androidx.databinding.DataBindingUtil import org.linphone.R @@ -39,6 +40,7 @@ import org.linphone.ui.voip.model.ZrtpSasConfirmationDialogModel class DialogUtils { companion object { + @UiThread fun getNumberOrAddressPickerDialog( context: Context, viewModel: NumberOrAddressPickerDialogModel @@ -68,6 +70,7 @@ class DialogUtils { return dialog } + @UiThread fun getRemoveAllCallLogsConfirmationDialog( context: Context, model: ConfirmationDialogModel @@ -97,6 +100,7 @@ class DialogUtils { return dialog } + @UiThread fun getCancelContactChangesConfirmationDialog( context: Context, model: ConfirmationDialogModel @@ -126,6 +130,7 @@ class DialogUtils { return dialog } + @UiThread fun getZrtpSasConfirmationDialog( context: Context, viewModel: ZrtpSasConfirmationDialogModel diff --git a/app/src/main/java/org/linphone/utils/Event.kt b/app/src/main/java/org/linphone/utils/Event.kt index bdff97f45..a903d24b4 100644 --- a/app/src/main/java/org/linphone/utils/Event.kt +++ b/app/src/main/java/org/linphone/utils/Event.kt @@ -19,19 +19,18 @@ */ package org.linphone.utils +import androidx.annotation.AnyThread +import androidx.annotation.UiThread import java.util.concurrent.atomic.AtomicBoolean /** * This class allows to limit the number of notification for an event. * The first one to consume the event will stop the dispatch. */ -open class Event(private val content: T) { +open class Event @AnyThread constructor(private val content: T) { private val handled = AtomicBoolean(false) - fun consumed(): Boolean { - return handled.get() - } - + @UiThread fun consume(handleContent: (T) -> Unit) { if (!handled.get()) { handled.set(true) diff --git a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt index 9968dcd46..2f335de4d 100644 --- a/app/src/main/java/org/linphone/utils/LinphoneUtils.kt +++ b/app/src/main/java/org/linphone/utils/LinphoneUtils.kt @@ -23,6 +23,7 @@ import android.bluetooth.BluetoothAdapter import android.content.Context import android.os.Build import android.provider.Settings +import androidx.annotation.AnyThread import androidx.annotation.IntegerRes import androidx.annotation.WorkerThread import androidx.emoji2.text.EmojiCompat @@ -38,10 +39,12 @@ import org.linphone.core.tools.Log class LinphoneUtils { companion object { + @AnyThread fun getFirstLetter(displayName: String): String { return getInitials(displayName, 1) } + @AnyThread fun getInitials(displayName: String, limit: Int = 2): String { if (displayName.isEmpty()) return "" @@ -96,6 +99,7 @@ class LinphoneUtils { return address.displayName ?: address.username ?: address.asString() } + @AnyThread fun isCallOutgoing(callState: Call.State): Boolean { return when (callState) { Call.State.OutgoingInit, Call.State.OutgoingProgress, Call.State.OutgoingRinging, Call.State.OutgoingEarlyMedia -> true @@ -103,6 +107,7 @@ class LinphoneUtils { } } + @AnyThread @IntegerRes fun getIconResId(callStatus: Status, callDir: Dir): Int { return when (callStatus) { @@ -146,6 +151,7 @@ class LinphoneUtils { return getChatRoomId(chatRoom.localAddress, chatRoom.peerAddress) } + @AnyThread fun getDeviceName(context: Context): String { var name = Settings.Global.getString( context.contentResolver, diff --git a/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt b/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt index 6623d12a2..ef44a5be8 100644 --- a/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt +++ b/app/src/main/java/org/linphone/utils/PhoneNumberUtils.kt @@ -21,9 +21,11 @@ package org.linphone.utils import android.content.res.Resources import android.provider.ContactsContract +import androidx.annotation.AnyThread class PhoneNumberUtils { companion object { + @AnyThread fun addressBookLabelTypeToVcardParamString(type: Int, default: String?): String { return when (type) { ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT -> "assistant" @@ -51,12 +53,14 @@ class PhoneNumberUtils { } } + @AnyThread fun vcardParamStringToAddressBookLabel(resources: Resources, label: String): String { if (label.isEmpty()) return label val type = labelToType(label) return ContactsContract.CommonDataKinds.Phone.getTypeLabel(resources, type, label).toString() } + @AnyThread private fun labelToType(label: String): Int { return when (label) { "assistant" -> ContactsContract.CommonDataKinds.Phone.TYPE_ASSISTANT @@ -84,10 +88,12 @@ class PhoneNumberUtils { } } + @AnyThread fun arePhoneNumberWeakEqual(number1: String, number2: String): Boolean { return trimPhoneNumber(number1) == trimPhoneNumber(number2) } + @AnyThread private fun trimPhoneNumber(phoneNumber: String): String { return phoneNumber.replace(" ", "") .replace("-", "") diff --git a/app/src/main/java/org/linphone/utils/SlidingPaneBackPressCallback.kt b/app/src/main/java/org/linphone/utils/SlidingPaneBackPressCallback.kt index 49181c37b..b6e969830 100644 --- a/app/src/main/java/org/linphone/utils/SlidingPaneBackPressCallback.kt +++ b/app/src/main/java/org/linphone/utils/SlidingPaneBackPressCallback.kt @@ -21,8 +21,10 @@ package org.linphone.utils import android.view.View import androidx.activity.OnBackPressedCallback +import androidx.annotation.UiThread import androidx.slidingpanelayout.widget.SlidingPaneLayout +@UiThread class SlidingPaneBackPressedCallback(private val slidingPaneLayout: SlidingPaneLayout) : OnBackPressedCallback( slidingPaneLayout.isSlideable && slidingPaneLayout.isOpen diff --git a/app/src/main/java/org/linphone/utils/TimestampUtils.kt b/app/src/main/java/org/linphone/utils/TimestampUtils.kt index 1dd8666c9..22f9068c6 100644 --- a/app/src/main/java/org/linphone/utils/TimestampUtils.kt +++ b/app/src/main/java/org/linphone/utils/TimestampUtils.kt @@ -19,6 +19,7 @@ */ package org.linphone.utils +import androidx.annotation.AnyThread import java.text.DateFormat import java.text.Format import java.text.SimpleDateFormat @@ -27,12 +28,14 @@ import org.linphone.LinphoneApplication.Companion.coreContext class TimestampUtils { companion object { + @AnyThread fun isToday(timestamp: Long, timestampInSecs: Boolean = true): Boolean { val cal = Calendar.getInstance() cal.timeInMillis = if (timestampInSecs) timestamp * 1000 else timestamp return isSameDay(cal, Calendar.getInstance()) } + @AnyThread fun isYesterday(timestamp: Long, timestampInSecs: Boolean = true): Boolean { val yesterday = Calendar.getInstance() yesterday.roll(Calendar.DAY_OF_MONTH, -1) @@ -41,6 +44,7 @@ class TimestampUtils { return isSameDay(cal, yesterday) } + @AnyThread fun isSameDay(timestamp1: Long, timestamp2: Long, timestampInSecs: Boolean = true): Boolean { val cal1 = Calendar.getInstance() cal1.timeInMillis = if (timestampInSecs) timestamp1 * 1000 else timestamp1 @@ -49,6 +53,7 @@ class TimestampUtils { return isSameDay(cal1, cal2) } + @AnyThread fun isSameDay( cal1: Date, cal2: Date @@ -56,6 +61,7 @@ class TimestampUtils { return isSameDay(cal1.time, cal2.time, false) } + @AnyThread fun dateToString(date: Long, timestampInSecs: Boolean = true): String { val dateFormat: Format = android.text.format.DateFormat.getDateFormat( coreContext.context @@ -71,6 +77,7 @@ class TimestampUtils { return dateFormatter.format(calendar.time) } + @AnyThread fun timeToString(hour: Int, minutes: Int): String { val use24hFormat = android.text.format.DateFormat.is24HourFormat( coreContext.context @@ -86,6 +93,7 @@ class TimestampUtils { } } + @AnyThread fun timeToString(time: Long, timestampInSecs: Boolean = true): String { val use24hFormat = android.text.format.DateFormat.is24HourFormat( coreContext.context @@ -100,6 +108,7 @@ class TimestampUtils { } } + @AnyThread fun durationToString(duration: Int): String { val dateFormat = SimpleDateFormat( if (duration >= 3600) "HH:mm:ss" else "mm:ss", @@ -110,6 +119,7 @@ class TimestampUtils { return dateFormat.format(cal.time) } + @AnyThread fun durationToString(hours: Int, minutes: Int): String { val calendar = Calendar.getInstance() calendar.set(Calendar.HOUR_OF_DAY, hours) @@ -124,12 +134,14 @@ class TimestampUtils { return SimpleDateFormat(pattern, Locale.getDefault()).format(calendar.time) } + @AnyThread private fun isSameYear(timestamp: Long, timestampInSecs: Boolean = true): Boolean { val cal = Calendar.getInstance() cal.timeInMillis = if (timestampInSecs) timestamp * 1000 else timestamp return isSameYear(cal, Calendar.getInstance()) } + @AnyThread fun toString( timestamp: Long, onlyDate: Boolean = false, @@ -164,6 +176,7 @@ class TimestampUtils { return dateFormat.format(Date(millis)).capitalize(Locale.getDefault()) } + @AnyThread private fun isSameDay( cal1: Calendar, cal2: Calendar @@ -173,6 +186,7 @@ class TimestampUtils { cal1[Calendar.DAY_OF_YEAR] == cal2[Calendar.DAY_OF_YEAR] } + @AnyThread private fun isSameYear( cal1: Calendar, cal2: Calendar