From ed23268672e215271431d02e6654a6c2febac251 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 20 Nov 2023 10:20:26 +0100 Subject: [PATCH] Updated meeting icon + using newly added callbacks in SDK for default account --- .../ui/call/viewmodel/CurrentCallViewModel.kt | 2 +- .../contacts/fragment/ContactsListFragment.kt | 1 - .../main/fragment/AbstractTopBarFragment.kt | 1 - .../ui/main/fragment/DrawerMenuFragment.kt | 5 -- .../history/fragment/HistoryListFragment.kt | 1 - .../linphone/ui/main/model/AccountModel.kt | 24 ++++---- .../main/viewmodel/AbstractTopBarViewModel.kt | 15 +++++ .../ui/main/viewmodel/DrawerMenuViewModel.kt | 55 +++++++++++++------ .../org/linphone/utils/DataBindingUtils.kt | 4 +- ...nset_users_three.xml => inset_meeting.xml} | 2 +- app/src/main/res/drawable/meeting.xml | 14 +++++ .../main/res/layout-land/bottom_nav_bar.xml | 2 +- app/src/main/res/layout/bottom_nav_bar.xml | 2 +- .../call_active_conference_fragment.xml | 2 +- .../main/res/layout/call_ended_fragment.xml | 2 +- .../chat_bubble_meeting_invite_content.xml | 2 +- .../main/res/layout/chat_info_fragment.xml | 4 +- app/src/main/res/layout/meeting_fragment.xml | 2 +- app/src/main/res/layout/meeting_list_cell.xml | 2 +- .../res/layout/meeting_schedule_fragment.xml | 6 +- .../main/res/layout/start_call_fragment.xml | 2 +- .../main/res/layout/start_chat_fragment.xml | 2 +- 22 files changed, 98 insertions(+), 54 deletions(-) rename app/src/main/res/drawable/{inset_users_three.xml => inset_meeting.xml} (71%) create mode 100644 app/src/main/res/drawable/meeting.xml diff --git a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt index cf022c0cb..acad23a5d 100644 --- a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt @@ -709,7 +709,7 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { val avatarModel = contact.value if (avatarModel != null) { avatarModel.trust.postValue(securityLevel) - contact.postValue(avatarModel) + contact.postValue(avatarModel!!) } else { Log.e("$TAG No avatar model found!") } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt index 4e1452c40..3e8080a85 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt @@ -63,7 +63,6 @@ class ContactsListFragment : AbstractTopBarFragment() { Log.i( "$TAG Default account changed, updating avatar in top bar & refreshing contacts list" ) - listViewModel.update() listViewModel.applyCurrentDefaultAccountFilter() } diff --git a/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt index a207f2cee..5eeaa8a36 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt @@ -162,7 +162,6 @@ abstract class AbstractTopBarFragment : GenericFragment() { sharedViewModel.defaultAccountChangedEvent.observe(viewLifecycleOwner) { it.consume { Log.i("$TAG Default account changed") - viewModel.update() onDefaultAccountChanged() } } diff --git a/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt index 6371478c3..b064cfe62 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt @@ -170,9 +170,4 @@ class DrawerMenuFragment : GenericFragment() { popupWindow.elevation = 20f popupWindow.showAsDropDown(view, 0, 0, Gravity.BOTTOM) } - - override fun onResume() { - super.onResume() - viewModel.updateAccountsList() - } } diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt index ffe52bbd2..34701b577 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt @@ -66,7 +66,6 @@ class HistoryListFragment : AbstractTopBarFragment() { Log.i( "$TAG Default account changed, updating avatar in top bar & re-computing call logs" ) - listViewModel.update() listViewModel.applyFilter() } 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 27cfbe309..472484fd9 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 @@ -39,8 +39,7 @@ import org.linphone.utils.LinphoneUtils class AccountModel @WorkerThread constructor( val account: Account, - private val onMenuClicked: ((view: View, account: Account) -> Unit)? = null, - private val onSetAsDefault: ((account: Account) -> Unit)? = null + private val onMenuClicked: ((view: View, account: Account) -> Unit)? = null ) : AbstractAvatarModel() { companion object { private const val TAG = "[Account Model]" @@ -109,22 +108,23 @@ class AccountModel @WorkerThread constructor( @UiThread fun setAsDefault() { coreContext.postOnCoreThread { core -> - core.defaultAccount = account + if (core.defaultAccount != account) { + core.defaultAccount = account - for (friendList in core.friendsLists) { - if (friendList.isSubscriptionsEnabled) { - Log.i( - "$TAG Default account has changed, refreshing friend list [${friendList.displayName}] subscriptions" - ) - // friendList.updateSubscriptions() won't trigger a refresh unless a friend has changed - friendList.isSubscriptionsEnabled = false - friendList.isSubscriptionsEnabled = true + for (friendList in core.friendsLists) { + if (friendList.isSubscriptionsEnabled) { + Log.i( + "$TAG Default account has changed, refreshing friend list [${friendList.displayName}] subscriptions" + ) + // friendList.updateSubscriptions() won't trigger a refresh unless a friend has changed + friendList.isSubscriptionsEnabled = false + friendList.isSubscriptionsEnabled = true + } } } } isDefault.value = true - onSetAsDefault?.invoke(account) } @UiThread diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt index 7d7ae12d6..9e86b644b 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt @@ -25,6 +25,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences +import org.linphone.core.Account import org.linphone.core.Call import org.linphone.core.ChatMessage import org.linphone.core.ChatRoom @@ -116,6 +117,20 @@ open class AbstractTopBarViewModel @UiThread constructor() : ViewModel() { override fun onChatRoomRead(core: Core, chatRoom: ChatRoom) { updateUnreadMessagesCount() } + + @WorkerThread + override fun onDefaultAccountChanged(core: Core, defaultAccount: Account) { + Log.i( + "$TAG Default account has changed [${defaultAccount.params.identityAddress?.asStringUriOnly()}]" + ) + + account.value?.destroy() + account.postValue(AccountModel(defaultAccount)) + + updateUnreadMessagesCount() + updateMissedCallsCount() + updateAvailableMenus() + } } init { 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 e4e6394d1..493691b35 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 @@ -26,6 +26,8 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.Account +import org.linphone.core.Core +import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log import org.linphone.ui.main.model.AccountModel import org.linphone.utils.Event @@ -53,9 +55,43 @@ class DrawerMenuViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } + private val coreListener = object : CoreListenerStub() { + @WorkerThread + override fun onDefaultAccountChanged(core: Core, account: Account) { + Log.i( + "$TAG Account [${account.params.identityAddress?.asStringUriOnly()}] has been set as default" + ) + for (model in accounts.value.orEmpty()) { + if (model.account != account) { + model.isDefault.postValue(false) + } + } + defaultAccountChangedEvent.postValue( + Event(account.params.identityAddress?.asStringUriOnly() ?: "") + ) + } + + @WorkerThread + override fun onNewAccountAdded(core: Core, account: Account) { + Log.i( + "$TAG Account [${account.params.identityAddress?.asStringUriOnly()}] has been added to the Core" + ) + computeAccountsList() + } + } + + init { + coreContext.postOnCoreThread { core -> + core.addListener(coreListener) + + computeAccountsList() + } + } + @UiThread override fun onCleared() { - coreContext.postOnCoreThread { + coreContext.postOnCoreThread { core -> + core.removeListener(coreListener) accounts.value.orEmpty().forEach(AccountModel::destroy) } @@ -85,23 +121,10 @@ class DrawerMenuViewModel @UiThread constructor() : ViewModel() { val list = arrayListOf() for (account in coreContext.core.accountList) { - val model = AccountModel(account, { view, account -> + val model = AccountModel(account) { view, account -> // onClicked showAccountPopupMenuEvent.postValue(Event(Pair(view, account))) - }, { account -> - // onSetAsDefault - Log.i( - "$TAG Account [${account.params.identityAddress?.asStringUriOnly()}] has been set as default by user" - ) - for (model in accounts.value.orEmpty()) { - if (model.account != account) { - model.isDefault.value = false - } - } - defaultAccountChangedEvent.postValue( - Event(account.params.identityAddress?.asStringUriOnly() ?: "") - ) - }) + } list.add(model) } accounts.postValue(list) diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index b56e651c9..60bfb3c8d 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -357,7 +357,7 @@ private fun loadContactPictureWithCoil( val context = imageView.context if (model != null) { if (model.forceConferenceIcon.value == true) { - imageView.load(R.drawable.inset_users_three) + imageView.load(R.drawable.inset_meeting) return } @@ -425,7 +425,7 @@ private fun getErrorImageLoader( val initials = model.initials.value.orEmpty() return if (initials.isEmpty() || initials == "+" || model.skipInitials.value == true) { if (model.defaultToConferenceIcon.value == true) { - R.drawable.inset_users_three + R.drawable.inset_meeting } else { R.drawable.inset_user_circle } diff --git a/app/src/main/res/drawable/inset_users_three.xml b/app/src/main/res/drawable/inset_meeting.xml similarity index 71% rename from app/src/main/res/drawable/inset_users_three.xml rename to app/src/main/res/drawable/inset_meeting.xml index 274eb8524..e25a01e75 100644 --- a/app/src/main/res/drawable/inset_users_three.xml +++ b/app/src/main/res/drawable/inset_meeting.xml @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/app/src/main/res/drawable/meeting.xml b/app/src/main/res/drawable/meeting.xml new file mode 100644 index 000000000..5fb894992 --- /dev/null +++ b/app/src/main/res/drawable/meeting.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout-land/bottom_nav_bar.xml b/app/src/main/res/layout-land/bottom_nav_bar.xml index 91fbaf139..62f9407c5 100644 --- a/app/src/main/res/layout-land/bottom_nav_bar.xml +++ b/app/src/main/res/layout-land/bottom_nav_bar.xml @@ -101,7 +101,7 @@ android:onClick="@{() -> viewModel.navigateToMeetings()}" android:layout_width="0dp" android:layout_height="wrap_content" - android:drawableTop="@drawable/users_three" + android:drawableTop="@drawable/meeting" android:drawablePadding="10dp" android:drawableTint="@{viewModel.meetingsSelected ? @color/orange_main_500 : @color/gray_main2_600, default=@color/gray_main2_600}" android:text="@string/bottom_navigation_meetings_label" diff --git a/app/src/main/res/layout/bottom_nav_bar.xml b/app/src/main/res/layout/bottom_nav_bar.xml index d4d776f47..1e5d2b05e 100644 --- a/app/src/main/res/layout/bottom_nav_bar.xml +++ b/app/src/main/res/layout/bottom_nav_bar.xml @@ -120,7 +120,7 @@ android:layout_marginStart="18dp" android:paddingTop="16dp" android:paddingBottom="16dp" - android:drawableTop="@drawable/users_three" + android:drawableTop="@drawable/meeting" android:drawablePadding="10dp" android:drawableTint="@{viewModel.meetingsSelected ? @color/orange_main_500 : @color/gray_main2_600, default=@color/gray_main2_600}" android:text="@string/bottom_navigation_meetings_label" diff --git a/app/src/main/res/layout/call_active_conference_fragment.xml b/app/src/main/res/layout/call_active_conference_fragment.xml index 2f29e79a9..37469a0b5 100644 --- a/app/src/main/res/layout/call_active_conference_fragment.xml +++ b/app/src/main/res/layout/call_active_conference_fragment.xml @@ -123,7 +123,7 @@ android:layout_height="@dimen/icon_size" android:layout_marginStart="10dp" android:adjustViewBounds="true" - android:src="@drawable/users_three" + android:src="@drawable/meeting" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/conference_subject" app:layout_constraintBottom_toBottomOf="@id/conference_subject" diff --git a/app/src/main/res/layout/call_ended_fragment.xml b/app/src/main/res/layout/call_ended_fragment.xml index 4e07509c6..0da659466 100644 --- a/app/src/main/res/layout/call_ended_fragment.xml +++ b/app/src/main/res/layout/call_ended_fragment.xml @@ -57,7 +57,7 @@ android:layout_height="@dimen/icon_size" android:layout_marginStart="10dp" android:adjustViewBounds="true" - android:src="@drawable/users_three" + android:src="@drawable/meeting" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/conference_subject" app:layout_constraintBottom_toBottomOf="@id/conference_subject" diff --git a/app/src/main/res/layout/chat_bubble_meeting_invite_content.xml b/app/src/main/res/layout/chat_bubble_meeting_invite_content.xml index 9f1ed9002..cc71b8e8d 100644 --- a/app/src/main/res/layout/chat_bubble_meeting_invite_content.xml +++ b/app/src/main/res/layout/chat_bubble_meeting_invite_content.xml @@ -87,7 +87,7 @@ android:textColor="@color/gray_main2_600" android:maxLines="1" android:ellipsize="end" - android:drawableStart="@drawable/users_three" + android:drawableStart="@drawable/meeting" android:drawablePadding="8dp" app:drawableTint="@color/gray_main2_600" app:layout_constraintStart_toEndOf="@id/day_background" diff --git a/app/src/main/res/layout/chat_info_fragment.xml b/app/src/main/res/layout/chat_info_fragment.xml index 843dfb963..95e239165 100644 --- a/app/src/main/res/layout/chat_info_fragment.xml +++ b/app/src/main/res/layout/chat_info_fragment.xml @@ -77,7 +77,7 @@ android:layout_width="@dimen/avatar_big_size" android:layout_height="@dimen/avatar_big_size" android:layout_marginTop="8dp" - android:src="@drawable/inset_users_three" + android:src="@drawable/inset_meeting" coilBigAvatar="@{viewModel.avatarModel}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -218,7 +218,7 @@ android:layout_marginTop="40dp" android:background="@drawable/circle_light_blue_button_background" android:padding="16dp" - android:src="@drawable/users_three" + android:src="@drawable/meeting" app:tint="@color/gray_main2_500" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/call" diff --git a/app/src/main/res/layout/meeting_fragment.xml b/app/src/main/res/layout/meeting_fragment.xml index 292480884..eb86d308f 100644 --- a/app/src/main/res/layout/meeting_fragment.xml +++ b/app/src/main/res/layout/meeting_fragment.xml @@ -105,7 +105,7 @@ android:textColor="@color/gray_main2_600" android:maxLines="2" android:ellipsize="end" - android:drawableStart="@{viewModel.isBroadcast ? @drawable/slideshow : @drawable/users_three, default=@drawable/users_three}" + android:drawableStart="@{viewModel.isBroadcast ? @drawable/slideshow : @drawable/meeting, default=@drawable/meeting}" android:drawablePadding="8dp" android:drawableTint="@color/gray_main2_600" android:background="@color/transparent_color" diff --git a/app/src/main/res/layout/meeting_list_cell.xml b/app/src/main/res/layout/meeting_list_cell.xml index 0df44fde0..7c71e8649 100644 --- a/app/src/main/res/layout/meeting_list_cell.xml +++ b/app/src/main/res/layout/meeting_list_cell.xml @@ -112,7 +112,7 @@ android:textColor="@color/gray_main2_600" android:maxLines="1" android:ellipsize="end" - android:drawableStart="@{model.isBroadcast ? @drawable/slideshow : @drawable/users_three, default=@drawable/users_three}" + android:drawableStart="@{model.isBroadcast ? @drawable/slideshow : @drawable/meeting, default=@drawable/meeting}" android:drawablePadding="8dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/meeting_schedule_fragment.xml b/app/src/main/res/layout/meeting_schedule_fragment.xml index 1af49e443..fb960f8fa 100644 --- a/app/src/main/res/layout/meeting_schedule_fragment.xml +++ b/app/src/main/res/layout/meeting_schedule_fragment.xml @@ -101,7 +101,7 @@ android:textColor="@color/primary_button_label_color" android:textSize="16sp" android:gravity="center" - android:drawableStart="@drawable/users_three" + android:drawableStart="@drawable/meeting" android:drawableTint="@color/primary_button_label_color" android:drawablePadding="5dp" android:background="@drawable/primary_button_background" @@ -153,7 +153,7 @@ android:textColor="@color/secondary_button_label_color" android:textSize="16sp" android:gravity="center" - android:drawableStart="@drawable/users_three" + android:drawableStart="@drawable/meeting" android:drawableTint="@color/secondary_button_label_color" android:drawablePadding="5dp" android:background="@drawable/secondary_button_background" @@ -241,7 +241,7 @@ android:textSize="20sp" android:textColor="@color/gray_main2_600" android:inputType="text|textCapSentences" - android:drawableStart="@{viewModel.isBroadcastSelected ? @drawable/slideshow : @drawable/users_three, default=@drawable/users_three}" + android:drawableStart="@{viewModel.isBroadcastSelected ? @drawable/slideshow : @drawable/meeting, default=@drawable/meeting}" android:drawablePadding="8dp" android:drawableTint="@color/gray_main2_600" android:background="@color/transparent_color" diff --git a/app/src/main/res/layout/start_call_fragment.xml b/app/src/main/res/layout/start_call_fragment.xml index eb18c485e..21e0df0cb 100644 --- a/app/src/main/res/layout/start_call_fragment.xml +++ b/app/src/main/res/layout/start_call_fragment.xml @@ -138,7 +138,7 @@ android:layout_marginTop="28dp" android:background="@drawable/shape_orange_round" android:padding="10dp" - android:src="@drawable/users_three" + android:src="@drawable/meeting" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/search_bar" app:tint="@color/white" /> diff --git a/app/src/main/res/layout/start_chat_fragment.xml b/app/src/main/res/layout/start_chat_fragment.xml index d097f9887..95dc4fecd 100644 --- a/app/src/main/res/layout/start_chat_fragment.xml +++ b/app/src/main/res/layout/start_chat_fragment.xml @@ -219,7 +219,7 @@ android:layout_marginTop="28dp" android:background="@drawable/shape_orange_round" android:padding="10dp" - android:src="@drawable/users_three" + android:src="@drawable/meeting" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/search_bar" app:tint="@color/white" />