diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt index 388da963c..04ef77796 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt @@ -85,17 +85,6 @@ class ConversationsListFragment : AbstractTopBarFragment() { "$TAG Default account changed, updating avatar in top bar & re-computing conversations" ) listViewModel.applyFilter() - - val slidingPane = binding.slidingPaneLayout - if (slidingPane.isOpen) { - if (slidingPane.isSlideable) { - Log.i("$TAG Default account changed, closing sliding pane") - slidingPane.close() - } else { - Log.i("$TAG Default account changed, going back to empty fragment") - // TODO: clear displayed conversation - } - } } override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt index 35d99843b..a820f7cf0 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt @@ -102,9 +102,10 @@ class StartConversationFragment : GenericAddressPickerFragment() { } } - sharedViewModel.defaultAccountChangedEvent.observe(viewLifecycleOwner) { - // Do not consume it! - viewModel.updateGroupChatButtonVisibility() + viewModel.defaultAccountChangedEvent.observe(viewLifecycleOwner) { + it.consume { + viewModel.updateGroupChatButtonVisibility() + } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt index 7cd438d7a..cc919ffc1 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt @@ -140,7 +140,6 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() { } showGreenToastEvent.postValue(Event(Pair(message, R.drawable.user_circle))) - // TODO FIXME: list doesn't have the changes... computeParticipantsList() } 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 958a97ac8..532d75322 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 @@ -69,17 +69,6 @@ class ContactsListFragment : AbstractTopBarFragment() { "$TAG Default account changed, updating avatar in top bar & refreshing contacts list" ) listViewModel.applyCurrentDefaultAccountFilter() - - val slidingPane = binding.slidingPaneLayout - if (slidingPane.isOpen) { - if (slidingPane.isSlideable) { - Log.i("$TAG Default account changed, closing sliding pane") - slidingPane.close() - } else { - Log.i("$TAG Default account changed, going back to empty fragment") - // TODO: clear displayed contact - } - } } override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { 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 6fd6f40f3..f2b4446fa 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 @@ -149,6 +149,12 @@ abstract class AbstractTopBarFragment : GenericFragment() { } } + viewModel.defaultAccountChangedEvent.observe(viewLifecycleOwner) { + it.consume { + onDefaultAccountChanged() + } + } + sharedViewModel.currentlyDisplayedFragment.observe(viewLifecycleOwner) { viewModel.contactsSelected.value = it == R.id.contactsListFragment viewModel.callsSelected.value = it == R.id.historyListFragment @@ -161,13 +167,6 @@ abstract class AbstractTopBarFragment : GenericFragment() { viewModel.resetMissedCallsCount() } } - - sharedViewModel.defaultAccountChangedEvent.observe(viewLifecycleOwner) { - it.consume { - Log.i("$TAG Default account changed") - onDefaultAccountChanged() - } - } } fun initBottomNavBar(navBar: View) { 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 b064cfe62..f1a118096 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 @@ -44,7 +44,6 @@ import org.linphone.ui.main.MainActivity import org.linphone.ui.main.settings.fragment.AccountProfileFragmentDirections import org.linphone.ui.main.viewmodel.DrawerMenuViewModel import org.linphone.ui.welcome.WelcomeActivity -import org.linphone.utils.Event @UiThread class DrawerMenuFragment : GenericFragment() { @@ -119,7 +118,6 @@ class DrawerMenuFragment : GenericFragment() { Log.w( "$TAG Default account has changed, now is [$identity], closing side menu in 500ms" ) - sharedViewModel.defaultAccountChangedEvent.value = Event(true) lifecycleScope.launch { withContext(Dispatchers.IO) { diff --git a/app/src/main/java/org/linphone/ui/main/fragment/SlidingPaneChildFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/SlidingPaneChildFragment.kt index 7703f2999..37f7ec97a 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/SlidingPaneChildFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/SlidingPaneChildFragment.kt @@ -23,8 +23,10 @@ import android.os.Bundle import android.view.View import androidx.activity.OnBackPressedCallback import androidx.annotation.UiThread +import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import org.linphone.core.tools.Log +import org.linphone.ui.main.viewmodel.DefaultAccountChangedViewModel @UiThread abstract class SlidingPaneChildFragment : GenericFragment() { @@ -32,6 +34,8 @@ abstract class SlidingPaneChildFragment : GenericFragment() { private const val TAG = "[Sliding Pane Child Fragment]" } + private lateinit var defaultAccountChangedViewModel: DefaultAccountChangedViewModel + private val onBackPressedCallback = object : OnBackPressedCallback(false) { override fun handleOnBackPressed() { Log.d("$TAG ${getFragmentRealClassName()} handleOnBackPressed") @@ -65,6 +69,14 @@ abstract class SlidingPaneChildFragment : GenericFragment() { onBackPressedCallback ) + defaultAccountChangedViewModel = ViewModelProvider(this)[DefaultAccountChangedViewModel::class.java] + defaultAccountChangedViewModel.defaultAccountChangedEvent.observe(viewLifecycleOwner) { + it.consume { + Log.i("$TAG Default account changed, leaving fragment") + goBack() + } + } + sharedViewModel.isSlidingPaneSlideable.observe(viewLifecycleOwner) { slideable -> val enabled = backPressedCallBackEnabled(slideable) onBackPressedCallback.isEnabled = enabled 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 4001c1a8c..f27c6ca22 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 @@ -70,17 +70,6 @@ class HistoryListFragment : AbstractTopBarFragment() { "$TAG Default account changed, updating avatar in top bar & re-computing call logs" ) listViewModel.applyFilter() - - val slidingPane = binding.slidingPaneLayout - if (slidingPane.isOpen) { - if (slidingPane.isSlideable) { - Log.i("$TAG Default account changed, closing sliding pane") - slidingPane.close() - } else { - Log.i("$TAG Default account changed, going back to empty fragment") - // TODO: clear displayed call log - } - } } override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt index d9ad3d4d9..c4db7a9db 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/StartCallFragment.kt @@ -128,16 +128,17 @@ class StartCallFragment : GenericAddressPickerFragment() { } } + viewModel.defaultAccountChangedEvent.observe(viewLifecycleOwner) { + it.consume { + viewModel.updateGroupCallButtonVisibility() + } + } + binding.root.setKeyboardInsetListener { keyboardVisible -> if (keyboardVisible) { viewModel.isNumpadVisible.value = false } } - - sharedViewModel.defaultAccountChangedEvent.observe(viewLifecycleOwner) { - // Do not consume it! - viewModel.updateGroupCallButtonVisibility() - } } @WorkerThread diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt index cb61ecdd7..5cfcce105 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt @@ -60,17 +60,6 @@ class MeetingsListFragment : AbstractTopBarFragment() { "$TAG Default account changed, updating avatar in top bar & re-computing meetings list" ) listViewModel.applyFilter() - - val slidingPane = binding.slidingPaneLayout - if (slidingPane.isOpen) { - if (slidingPane.isSlideable) { - Log.i("$TAG Default account changed, closing sliding pane") - slidingPane.close() - } else { - Log.i("$TAG Default account changed, going back to empty fragment") - // TODO: clear displayed conference - } - } } override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { 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 4529c4792..4b568688d 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 @@ -89,6 +89,10 @@ open class AbstractTopBarViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } + val defaultAccountChangedEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + protected var currentFilter = "" private val coreListener = object : CoreListenerStub() { @@ -132,6 +136,8 @@ open class AbstractTopBarViewModel @UiThread constructor() : ViewModel() { account.postValue(AccountModel(defaultAccount)) } + defaultAccountChangedEvent.postValue(Event(true)) + updateUnreadMessagesCount() updateMissedCallsCount() updateAvailableMenus() diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt index 907377bea..eca7d7889 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/AddressSelectionViewModel.kt @@ -22,7 +22,6 @@ package org.linphone.ui.main.viewmodel import androidx.annotation.UiThread import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import java.text.Collator import java.util.Locale import org.linphone.LinphoneApplication.Companion.coreContext @@ -38,7 +37,7 @@ import org.linphone.ui.main.model.SelectedAddressModel import org.linphone.ui.main.model.isInSecureMode import org.linphone.utils.AppUtils -abstract class AddressSelectionViewModel @UiThread constructor() : ViewModel() { +abstract class AddressSelectionViewModel @UiThread constructor() : DefaultAccountChangedViewModel() { companion object { private const val TAG = "[Address Selection ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/DefaultAccountChangedViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/DefaultAccountChangedViewModel.kt new file mode 100644 index 000000000..ef5dd71e4 --- /dev/null +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/DefaultAccountChangedViewModel.kt @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2010-2023 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.linphone.ui.main.viewmodel + +import androidx.annotation.WorkerThread +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.utils.Event + +open class DefaultAccountChangedViewModel : ViewModel() { + val defaultAccountChangedEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + + private val coreListener = object : CoreListenerStub() { + @WorkerThread + override fun onDefaultAccountChanged(core: Core, account: Account?) { + defaultAccountChangedEvent.postValue(Event(true)) + } + } + + init { + coreContext.postOnCoreThread { core -> + core.addListener(coreListener) + } + } + + override fun onCleared() { + coreContext.postOnCoreThread { core -> + core.removeListener(coreListener) + } + + super.onCleared() + } +} 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 216e21c8c..4f820077f 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 @@ -67,10 +67,6 @@ class SharedMainViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } - val defaultAccountChangedEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - val refreshDrawerMenuAccountsListEvent: MutableLiveData> by lazy { MutableLiveData>() }