Refactored code a bit to make it simplier

This commit is contained in:
Sylvain Berfini 2024-04-24 10:00:26 +02:00
parent fbb59cbc2a
commit 1578e76700
13 changed files with 121 additions and 121 deletions

View file

@ -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

View file

@ -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]"
}

View file

@ -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) {

View file

@ -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]"
}

View file

@ -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) {

View file

@ -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() {

View file

@ -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]"
}

View file

@ -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() {

View file

@ -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]"
}

View file

@ -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<String>()

View file

@ -8,7 +8,7 @@
<import type="android.graphics.Typeface" />
<variable
name="viewModel"
type="org.linphone.ui.main.viewmodel.AbstractTopBarViewModel" />
type="org.linphone.ui.main.viewmodel.AbstractMainViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout

View file

@ -8,7 +8,7 @@
<import type="android.graphics.Typeface" />
<variable
name="viewModel"
type="org.linphone.ui.main.viewmodel.AbstractTopBarViewModel" />
type="org.linphone.ui.main.viewmodel.AbstractMainViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout

View file

@ -7,7 +7,7 @@
<import type="android.view.View" />
<variable
name="viewModel"
type="org.linphone.ui.main.viewmodel.AbstractTopBarViewModel" />
type="org.linphone.ui.main.viewmodel.AbstractMainViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout