diff --git a/app/src/main/java/org/linphone/ui/calls/fragment/CallsFragment.kt b/app/src/main/java/org/linphone/ui/calls/fragment/CallsFragment.kt index c8f4891ee..fb87ad467 100644 --- a/app/src/main/java/org/linphone/ui/calls/fragment/CallsFragment.kt +++ b/app/src/main/java/org/linphone/ui/calls/fragment/CallsFragment.kt @@ -102,4 +102,9 @@ class CallsFragment : GenericFragment() { } } } + + override fun onResume() { + super.onResume() + sharedViewModel.currentlyDisplayedFragment.value = R.id.callsFragment + } } diff --git a/app/src/main/java/org/linphone/ui/calls/fragment/CallsListFragment.kt b/app/src/main/java/org/linphone/ui/calls/fragment/CallsListFragment.kt index b83fb4fc2..3887359ef 100644 --- a/app/src/main/java/org/linphone/ui/calls/fragment/CallsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/calls/fragment/CallsListFragment.kt @@ -33,7 +33,6 @@ import org.linphone.databinding.CallsListFragmentBinding import org.linphone.ui.MainActivity import org.linphone.ui.calls.viewmodel.CallsListViewModel import org.linphone.ui.fragment.GenericFragment -import org.linphone.utils.Event import org.linphone.utils.setKeyboardInsetListener class CallsListFragment : GenericFragment() { @@ -71,14 +70,6 @@ class CallsListFragment : GenericFragment() { listViewModel.bottomNavBarVisible.value = !portraitOrientation || !keyboardVisible } - binding.setOnConversationsClicked { - sharedViewModel.navigateToConversationsEvent.value = Event(true) - } - - binding.setOnContactsClicked { - sharedViewModel.navigateToContactsEvent.value = Event(true) - } - binding.setOnAvatarClickListener { (requireActivity() as MainActivity).toggleDrawerMenu() } diff --git a/app/src/main/java/org/linphone/ui/contacts/fragment/ContactFragment.kt b/app/src/main/java/org/linphone/ui/contacts/fragment/ContactFragment.kt index eba32aaa7..b53b5af59 100644 --- a/app/src/main/java/org/linphone/ui/contacts/fragment/ContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/contacts/fragment/ContactFragment.kt @@ -56,6 +56,10 @@ class ContactFragment : GenericFragment() { return binding.root } + override fun goBack() { + sharedViewModel.closeSlidingPaneEvent.value = Event(true) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -71,7 +75,7 @@ class ContactFragment : GenericFragment() { viewModel.findContactByRefKey(refKey) binding.setBackClickListener { - sharedViewModel.closeSlidingPaneEvent.value = Event(true) + goBack() } sharedViewModel.isSlidingPaneSlideable.observe(viewLifecycleOwner) { slideable -> diff --git a/app/src/main/java/org/linphone/ui/contacts/fragment/ContactsFragment.kt b/app/src/main/java/org/linphone/ui/contacts/fragment/ContactsFragment.kt index 55b273cad..5abc74d78 100644 --- a/app/src/main/java/org/linphone/ui/contacts/fragment/ContactsFragment.kt +++ b/app/src/main/java/org/linphone/ui/contacts/fragment/ContactsFragment.kt @@ -115,4 +115,9 @@ class ContactsFragment : GenericFragment() { } } } + + override fun onResume() { + super.onResume() + sharedViewModel.currentlyDisplayedFragment.value = R.id.contactsFragment + } } diff --git a/app/src/main/java/org/linphone/ui/contacts/fragment/ContactsListFragment.kt b/app/src/main/java/org/linphone/ui/contacts/fragment/ContactsListFragment.kt index 06d61f2fe..238dbd6dd 100644 --- a/app/src/main/java/org/linphone/ui/contacts/fragment/ContactsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/contacts/fragment/ContactsListFragment.kt @@ -130,17 +130,7 @@ class ContactsListFragment : GenericFragment() { } binding.setOnNewContactClicked { - if (findNavController().currentDestination?.id == R.id.contactsListFragment) { - findNavController().navigate(R.id.action_contactsListFragment_to_newContactFragment) - } - } - - binding.setOnConversationsClicked { - sharedViewModel.navigateToConversationsEvent.value = Event(true) - } - - binding.setOnCallsClicked { - sharedViewModel.navigateToCallsEvent.value = Event(true) + findNavController().navigate(R.id.action_global_newContactFragment) } binding.setOnAvatarClickListener { diff --git a/app/src/main/java/org/linphone/ui/contacts/fragment/NewContactFragment.kt b/app/src/main/java/org/linphone/ui/contacts/fragment/NewContactFragment.kt index e7af5af12..64547228d 100644 --- a/app/src/main/java/org/linphone/ui/contacts/fragment/NewContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/contacts/fragment/NewContactFragment.kt @@ -31,14 +31,6 @@ import org.linphone.ui.fragment.GenericFragment class NewContactFragment : GenericFragment() { private lateinit var binding: NewContactFragmentBinding - override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { - /*if (findNavController().currentDestination?.id == R.id.contactFragment) { - // Holds fragment in place while created contact fragment slides over it - return AnimationUtils.loadAnimation(activity, R.anim.hold) - }*/ - return super.onCreateAnimation(transit, enter, nextAnim) - } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -48,19 +40,17 @@ class NewContactFragment : GenericFragment() { return binding.root } + override fun goBack() { + findNavController().popBackStack() + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner - // postponeEnterTransition() - binding.setCancelClickListener { - findNavController().popBackStack() + goBack() } - - /*(view.parent as? ViewGroup)?.doOnPreDraw { - startPostponedEnterTransition() - }*/ } } diff --git a/app/src/main/java/org/linphone/ui/fragment/BottomNavBarFragment.kt b/app/src/main/java/org/linphone/ui/fragment/BottomNavBarFragment.kt new file mode 100644 index 000000000..9194dfe33 --- /dev/null +++ b/app/src/main/java/org/linphone/ui/fragment/BottomNavBarFragment.kt @@ -0,0 +1,84 @@ +/* + * 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.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import org.linphone.R +import org.linphone.databinding.BottomNavBarBinding +import org.linphone.ui.viewmodel.SharedMainViewModel +import org.linphone.utils.Event + +class BottomNavBarFragment : Fragment() { + private lateinit var binding: BottomNavBarBinding + + private lateinit var sharedViewModel: SharedMainViewModel + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = BottomNavBarBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + sharedViewModel = requireActivity().run { + ViewModelProvider(this)[SharedMainViewModel::class.java] + } + + binding.lifecycleOwner = viewLifecycleOwner + + binding.setOnContactsClicked { + if (sharedViewModel.currentlyDisplayedFragment.value != R.id.contactsFragment) { + sharedViewModel.navigateToContactsEvent.value = Event(true) + } + } + + binding.setOnCallsClicked { + if (sharedViewModel.currentlyDisplayedFragment.value != R.id.callsFragment) { + sharedViewModel.navigateToCallsEvent.value = Event(true) + } + } + + binding.setOnConversationsClicked { + if (sharedViewModel.currentlyDisplayedFragment.value != R.id.conversationsFragment) { + sharedViewModel.navigateToConversationsEvent.value = Event(true) + } + } + + binding.setOnMeetingsClicked { + // TODO + } + + sharedViewModel.currentlyDisplayedFragment.observe(viewLifecycleOwner) { + binding.contactsSelected = it == R.id.contactsFragment + binding.callsSelected = it == R.id.callsFragment + binding.conversationsSelected = it == R.id.conversationsFragment + } + } +} diff --git a/app/src/main/java/org/linphone/ui/fragment/GenericFragment.kt b/app/src/main/java/org/linphone/ui/fragment/GenericFragment.kt index 9e7634e4d..66bf5b530 100644 --- a/app/src/main/java/org/linphone/ui/fragment/GenericFragment.kt +++ b/app/src/main/java/org/linphone/ui/fragment/GenericFragment.kt @@ -84,7 +84,7 @@ abstract class GenericFragment : Fragment() { return this.javaClass.name } - protected fun goBack() { + protected open fun goBack() { try { requireActivity().onBackPressedDispatcher.onBackPressed() } catch (ise: IllegalStateException) { diff --git a/app/src/main/java/org/linphone/ui/viewmodel/SharedMainViewModel.kt b/app/src/main/java/org/linphone/ui/viewmodel/SharedMainViewModel.kt index dcfd4a973..f8ba0bbfc 100644 --- a/app/src/main/java/org/linphone/ui/viewmodel/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/viewmodel/SharedMainViewModel.kt @@ -38,6 +38,8 @@ class SharedMainViewModel : ViewModel() { val navigateToContactsEvent = MutableLiveData>() + var currentlyDisplayedFragment = MutableLiveData() + /* Contacts related */ val showContactEvent = MutableLiveData>() diff --git a/app/src/main/res/layout-land/calls_list_fragment.xml b/app/src/main/res/layout-land/calls_list_fragment.xml index 35233b1bb..a6f3e3dbd 100644 --- a/app/src/main/res/layout-land/calls_list_fragment.xml +++ b/app/src/main/res/layout-land/calls_list_fragment.xml @@ -45,18 +45,16 @@ app:layout_constraintStart_toEndOf="@id/bottom_nav_bar" app:layout_constraintTop_toBottomOf="@id/top_bar" /> - + app:layout_constraintBottom_toBottomOf="parent" /> - + app:layout_constraintBottom_toBottomOf="parent" /> - + app:layout_constraintBottom_toBottomOf="parent" /> - + app:layout_constraintBottom_toBottomOf="parent" /> - + \ No newline at end of file diff --git a/app/src/main/res/navigation/main_nav_graph.xml b/app/src/main/res/navigation/main_nav_graph.xml index e38bc63c4..c4a3ec67b 100644 --- a/app/src/main/res/navigation/main_nav_graph.xml +++ b/app/src/main/res/navigation/main_nav_graph.xml @@ -14,8 +14,8 @@ android:id="@+id/action_conversationsFragment_to_newConversationFragment" app:destination="@id/newConversationFragment" app:enterAnim="@anim/slide_in" - app:launchSingleTop="true" - app:popExitAnim="@anim/slide_out" /> + app:popExitAnim="@anim/slide_out" + app:launchSingleTop="true" /> + app:popUpToInclusive="true" + app:launchSingleTop="true" /> @@ -68,7 +68,10 @@ app:destination="@id/conversationsFragment" /> + app:destination="@id/callsFragment" + app:popUpTo="@id/callsFragment" + app:popUpToInclusive="true" + app:launchSingleTop="true"/> + app:destination="@id/contactsFragment" + app:popUpTo="@id/contactsFragment" + app:popUpToInclusive="true" + app:launchSingleTop="true" />