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" />