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 e8db46ca3..392bc207c 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 @@ -38,13 +38,13 @@ import org.linphone.databinding.ChatListFragmentBinding import org.linphone.ui.GenericActivity import org.linphone.ui.main.chat.adapter.ConversationsListAdapter import org.linphone.ui.main.chat.viewmodel.ConversationsListViewModel -import org.linphone.ui.main.fragment.AbstractTopBarFragment +import org.linphone.ui.main.fragment.AbstractMainFragment import org.linphone.ui.main.history.fragment.HistoryMenuDialogFragment import org.linphone.utils.AppUtils import org.linphone.utils.Event @UiThread -class ConversationsListFragment : AbstractTopBarFragment() { +class ConversationsListFragment : AbstractMainFragment() { companion object { private const val TAG = "[Conversations List Fragment]" } @@ -279,20 +279,17 @@ class ConversationsListFragment : AbstractTopBarFragment() { } } - // TopBarFragment related + // AbstractMainFragment related - setViewModelAndTitle( + listViewModel.title.value = getString(R.string.bottom_navigation_conversations_label) + setViewModel(listViewModel) + initViews( + binding.slidingPaneLayout, binding.topBar.search, - listViewModel, - getString(R.string.bottom_navigation_conversations_label) + binding.bottomNavBar.root, + R.id.conversationsListFragment ) - initBottomNavBar(binding.bottomNavBar.root) - - initSlidingPane(binding.slidingPaneLayout) - - initNavigation(R.id.conversationsListFragment) - // Handle intent params if any val args = arguments diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt index 32daf1f3f..f54286186 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationsListViewModel.kt @@ -33,12 +33,12 @@ import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log import org.linphone.ui.main.chat.model.ConversationModel import org.linphone.ui.main.model.isInSecureMode -import org.linphone.ui.main.viewmodel.AbstractTopBarViewModel +import org.linphone.ui.main.viewmodel.AbstractMainViewModel import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils -class ConversationsListViewModel @UiThread constructor() : AbstractTopBarViewModel() { +class ConversationsListViewModel @UiThread constructor() : AbstractMainViewModel() { companion object { private const val TAG = "[Conversations List ViewModel]" } 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 9acb2eec5..294f4e859 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 @@ -45,11 +45,11 @@ import org.linphone.databinding.ContactsListFilterPopupMenuBinding import org.linphone.databinding.ContactsListFragmentBinding import org.linphone.ui.main.contacts.adapter.ContactsListAdapter import org.linphone.ui.main.contacts.viewmodel.ContactsListViewModel -import org.linphone.ui.main.fragment.AbstractTopBarFragment +import org.linphone.ui.main.fragment.AbstractMainFragment import org.linphone.utils.Event @UiThread -class ContactsListFragment : AbstractTopBarFragment() { +class ContactsListFragment : AbstractMainFragment() { companion object { private const val TAG = "[Contacts List Fragment]" } @@ -181,19 +181,16 @@ class ContactsListFragment : AbstractTopBarFragment() { } } - // TopBarFragment related + // AbstractMainFragment related - setViewModelAndTitle( + listViewModel.title.value = getString(R.string.bottom_navigation_contacts_label) + setViewModel(listViewModel) + initViews( + binding.slidingPaneLayout, binding.topBar.search, - listViewModel, - getString(R.string.bottom_navigation_contacts_label) + binding.bottomNavBar.root, + R.id.contactsListFragment ) - - initBottomNavBar(binding.bottomNavBar.root) - - initSlidingPane(binding.slidingPaneLayout) - - initNavigation(R.id.contactsListFragment) } private fun configureAdapter(adapter: ContactsListAdapter) { 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 067f9b0d9..a60fd2b78 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 @@ -38,11 +38,11 @@ import org.linphone.core.SearchResult import org.linphone.core.tools.Log import org.linphone.ui.main.contacts.model.ContactAvatarModel import org.linphone.ui.main.model.isInSecureMode -import org.linphone.ui.main.viewmodel.AbstractTopBarViewModel +import org.linphone.ui.main.viewmodel.AbstractMainViewModel import org.linphone.utils.Event import org.linphone.utils.FileUtils -class ContactsListViewModel @UiThread constructor() : AbstractTopBarViewModel() { +class ContactsListViewModel @UiThread constructor() : AbstractMainViewModel() { companion object { private const val TAG = "[Contacts List ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/AbstractMainFragment.kt similarity index 92% rename from app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt rename to app/src/main/java/org/linphone/ui/main/fragment/AbstractMainFragment.kt index 91932676d..7436e8e2e 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/AbstractMainFragment.kt @@ -35,77 +35,26 @@ import org.linphone.ui.main.chat.fragment.ConversationsListFragmentDirections import org.linphone.ui.main.contacts.fragment.ContactsListFragmentDirections import org.linphone.ui.main.history.fragment.HistoryListFragmentDirections import org.linphone.ui.main.meetings.fragment.MeetingsListFragmentDirections -import org.linphone.ui.main.viewmodel.AbstractTopBarViewModel +import org.linphone.ui.main.viewmodel.AbstractMainViewModel import org.linphone.utils.SlidingPaneBackPressedCallback import org.linphone.utils.hideKeyboard import org.linphone.utils.setKeyboardInsetListener import org.linphone.utils.showKeyboard @UiThread -abstract class AbstractTopBarFragment : GenericFragment() { +abstract class AbstractMainFragment : GenericFragment() { companion object { - private const val TAG = "[Abstract TobBar Fragment]" + private const val TAG = "[Abstract Main Fragment]" } private var currentFragmentId: Int = 0 + private lateinit var viewModel: AbstractMainViewModel + abstract fun onDefaultAccountChanged() - fun initSlidingPane(slidingPane: SlidingPaneLayout) { - val slidingPaneBackPressedCallback = SlidingPaneBackPressedCallback(slidingPane) - requireActivity().onBackPressedDispatcher.addCallback( - viewLifecycleOwner, - slidingPaneBackPressedCallback - ) - - view?.doOnPreDraw { - slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED - val slideable = slidingPane.isSlideable - sharedViewModel.isSlidingPaneSlideable.value = slideable - slidingPaneBackPressedCallback.isEnabled = slideable && slidingPane.isOpen - Log.d("$TAG Sliding Pane is ${if (slideable) "slideable" else "flat"}") - } - - sharedViewModel.closeSlidingPaneEvent.observe( - viewLifecycleOwner - ) { - it.consume { - if (slidingPane.isSlideable) { - Log.d("$TAG Closing sliding pane") - slidingPane.closePane() - } - } - } - - sharedViewModel.openSlidingPaneEvent.observe( - viewLifecycleOwner - ) { - it.consume { - if (!slidingPane.isOpen) { - Log.d("$TAG Opening sliding pane") - slidingPane.openPane() - } - } - } - } - - fun setViewModelAndTitle( - searchBar: TextInputLayout, - viewModel: AbstractTopBarViewModel, - title: String - ) { - viewModel.title.value = title - - viewModel.focusSearchBarEvent.observe(viewLifecycleOwner) { - it.consume { show -> - if (show) { - // To automatically open keyboard - searchBar.showKeyboard() - } else { - searchBar.hideKeyboard() - } - } - } + fun setViewModel(abstractMainViewModel: AbstractMainViewModel) { + viewModel = abstractMainViewModel viewModel.openDrawerMenuEvent.observe(viewLifecycleOwner) { it.consume { @@ -175,14 +124,77 @@ abstract class AbstractTopBarFragment : GenericFragment() { } } - fun initBottomNavBar(navBar: View) { + fun initViews( + slidingPane: SlidingPaneLayout, + searchBar: TextInputLayout, + navBar: View, + @IdRes fragmentId: Int + ) { + initSlidingPane(slidingPane) + initSearchBar(searchBar) + initBottomNavBar(navBar) + initNavigation(fragmentId) + } + + private fun initSlidingPane(slidingPane: SlidingPaneLayout) { + val slidingPaneBackPressedCallback = SlidingPaneBackPressedCallback(slidingPane) + requireActivity().onBackPressedDispatcher.addCallback( + viewLifecycleOwner, + slidingPaneBackPressedCallback + ) + + view?.doOnPreDraw { + slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED + val slideable = slidingPane.isSlideable + sharedViewModel.isSlidingPaneSlideable.value = slideable + slidingPaneBackPressedCallback.isEnabled = slideable && slidingPane.isOpen + Log.d("$TAG Sliding Pane is ${if (slideable) "slideable" else "flat"}") + } + + sharedViewModel.closeSlidingPaneEvent.observe( + viewLifecycleOwner + ) { + it.consume { + if (slidingPane.isSlideable) { + Log.d("$TAG Closing sliding pane") + slidingPane.closePane() + } + } + } + + sharedViewModel.openSlidingPaneEvent.observe( + viewLifecycleOwner + ) { + it.consume { + if (!slidingPane.isOpen) { + Log.d("$TAG Opening sliding pane") + slidingPane.openPane() + } + } + } + } + + private fun initSearchBar(searchBar: TextInputLayout) { + viewModel.focusSearchBarEvent.observe(viewLifecycleOwner) { + it.consume { show -> + if (show) { + // To automatically open keyboard + searchBar.showKeyboard() + } else { + searchBar.hideKeyboard() + } + } + } + } + + private fun initBottomNavBar(navBar: View) { view?.setKeyboardInsetListener { keyboardVisible -> val portraitOrientation = resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE navBar.visibility = if (!portraitOrientation || !keyboardVisible) View.VISIBLE else View.GONE } } - fun initNavigation(@IdRes fragmentId: Int) { + private fun initNavigation(@IdRes fragmentId: Int) { currentFragmentId = fragmentId sharedViewModel.navigateToContactsEvent.observe(viewLifecycleOwner) { 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 4d84fc53c..062760347 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 @@ -43,7 +43,7 @@ import org.linphone.core.tools.Log import org.linphone.databinding.HistoryListFragmentBinding import org.linphone.databinding.HistoryListPopupMenuBinding import org.linphone.ui.GenericActivity -import org.linphone.ui.main.fragment.AbstractTopBarFragment +import org.linphone.ui.main.fragment.AbstractMainFragment import org.linphone.ui.main.history.adapter.HistoryListAdapter import org.linphone.ui.main.history.model.ConfirmationDialogModel import org.linphone.ui.main.history.viewmodel.HistoryListViewModel @@ -51,7 +51,7 @@ import org.linphone.utils.DialogUtils import org.linphone.utils.Event @UiThread -class HistoryListFragment : AbstractTopBarFragment() { +class HistoryListFragment : AbstractMainFragment() { companion object { private const val TAG = "[History List Fragment]" } @@ -237,19 +237,16 @@ class HistoryListFragment : AbstractTopBarFragment() { } } - // TopBarFragment related + // AbstractMainFragment related - setViewModelAndTitle( + listViewModel.title.value = getString(R.string.bottom_navigation_calls_label) + setViewModel(listViewModel) + initViews( + binding.slidingPaneLayout, binding.topBar.search, - listViewModel, - getString(R.string.bottom_navigation_calls_label) + binding.bottomNavBar.root, + R.id.historyListFragment ) - - initBottomNavBar(binding.bottomNavBar.root) - - initSlidingPane(binding.slidingPaneLayout) - - initNavigation(R.id.historyListFragment) } override fun onPause() { diff --git a/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryListViewModel.kt b/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryListViewModel.kt index fcf90e0d3..afec0f757 100644 --- a/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/history/viewmodel/HistoryListViewModel.kt @@ -29,11 +29,11 @@ import org.linphone.core.Core import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log import org.linphone.ui.main.history.model.CallLogModel -import org.linphone.ui.main.viewmodel.AbstractTopBarViewModel +import org.linphone.ui.main.viewmodel.AbstractMainViewModel import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils -class HistoryListViewModel @UiThread constructor() : AbstractTopBarViewModel() { +class HistoryListViewModel @UiThread constructor() : AbstractMainViewModel() { companion object { private const val TAG = "[History List ViewModel]" } 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 ec7257c40..083b99066 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 @@ -35,7 +35,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.MeetingsListFragmentBinding -import org.linphone.ui.main.fragment.AbstractTopBarFragment +import org.linphone.ui.main.fragment.AbstractMainFragment import org.linphone.ui.main.meetings.adapter.MeetingsListAdapter import org.linphone.ui.main.meetings.viewmodel.MeetingsListViewModel import org.linphone.utils.AppUtils @@ -43,7 +43,7 @@ import org.linphone.utils.Event import org.linphone.utils.RecyclerViewHeaderDecoration @UiThread -class MeetingsListFragment : AbstractTopBarFragment() { +class MeetingsListFragment : AbstractMainFragment() { companion object { private const val TAG = "[Meetings List Fragment]" } @@ -198,19 +198,16 @@ class MeetingsListFragment : AbstractTopBarFragment() { } } - // TopBarFragment related + // AbstractMainFragment related - setViewModelAndTitle( + listViewModel.title.value = getString(R.string.bottom_navigation_meetings_label) + setViewModel(listViewModel) + initViews( + binding.slidingPaneLayout, binding.topBar.search, - listViewModel, - getString(R.string.bottom_navigation_meetings_label) + binding.bottomNavBar.root, + R.id.meetingsListFragment ) - - initBottomNavBar(binding.bottomNavBar.root) - - initSlidingPane(binding.slidingPaneLayout) - - initNavigation(R.id.meetingsListFragment) } override fun onPause() { diff --git a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingsListViewModel.kt index 6216afeb1..46117acea 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/viewmodel/MeetingsListViewModel.kt @@ -29,9 +29,9 @@ import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log import org.linphone.ui.main.meetings.model.MeetingListItemModel import org.linphone.ui.main.meetings.model.MeetingModel -import org.linphone.ui.main.viewmodel.AbstractTopBarViewModel +import org.linphone.ui.main.viewmodel.AbstractMainViewModel -class MeetingsListViewModel @UiThread constructor() : AbstractTopBarViewModel() { +class MeetingsListViewModel @UiThread constructor() : AbstractMainViewModel() { companion object { private const val TAG = "[Meetings List ViewModel]" } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractMainViewModel.kt similarity index 98% rename from app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt rename to app/src/main/java/org/linphone/ui/main/viewmodel/AbstractMainViewModel.kt index 339044da2..202fe9a98 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractMainViewModel.kt @@ -36,9 +36,9 @@ import org.linphone.ui.main.model.AccountModel import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils -open class AbstractTopBarViewModel @UiThread constructor() : ViewModel() { +open class AbstractMainViewModel @UiThread constructor() : ViewModel() { companion object { - private const val TAG = "[Top Bar ViewModel]" + private const val TAG = "[Abstract Main ViewModel]" } val title = MutableLiveData() 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 a98938a21..c36ed3258 100644 --- a/app/src/main/res/layout-land/bottom_nav_bar.xml +++ b/app/src/main/res/layout-land/bottom_nav_bar.xml @@ -8,7 +8,7 @@ + type="org.linphone.ui.main.viewmodel.AbstractMainViewModel" /> + type="org.linphone.ui.main.viewmodel.AbstractMainViewModel" /> + type="org.linphone.ui.main.viewmodel.AbstractMainViewModel" />