Fixed back navigation in some scenarios

This commit is contained in:
Sylvain Berfini 2021-08-02 10:08:13 +02:00
parent 4cb9b62418
commit 8e5a191155
23 changed files with 253 additions and 46 deletions

View file

@ -43,8 +43,7 @@ import org.linphone.activities.main.dialer.fragments.DialerFragment
import org.linphone.activities.main.fragments.TabsFragment
import org.linphone.activities.main.history.fragments.DetailCallLogFragment
import org.linphone.activities.main.history.fragments.MasterCallLogsFragment
import org.linphone.activities.main.settings.fragments.AccountSettingsFragment
import org.linphone.activities.main.settings.fragments.SettingsFragment
import org.linphone.activities.main.settings.fragments.*
import org.linphone.activities.main.sidemenu.fragments.SideMenuFragment
import org.linphone.contact.NativeContact
import org.linphone.core.Address
@ -411,6 +410,14 @@ internal fun DetailChatRoomFragment.navigateToAudioFileViewer(secure: Boolean) {
)
}
internal fun DetailChatRoomFragment.navigateToEmptyChatRoom() {
findNavController().navigate(
R.id.action_global_emptyChatFragment,
null,
popupTo()
)
}
internal fun ChatRoomCreationFragment.navigateToGroupInfo() {
if (findNavController().currentDestination?.id == R.id.chatRoomCreationFragment) {
findNavController().navigate(
@ -426,11 +433,19 @@ internal fun ChatRoomCreationFragment.navigateToChatRoom(args: Bundle) {
findNavController().navigate(
R.id.action_chatRoomCreationFragment_to_detailChatRoomFragment,
args,
getRightToLeftAnimationNavOptions(R.id.emptyFragment, true)
getRightToLeftAnimationNavOptions(R.id.emptyChatFragment, true)
)
}
}
internal fun ChatRoomCreationFragment.navigateToEmptyChatRoom() {
findNavController().navigate(
R.id.action_global_emptyChatFragment,
null,
popupTo()
)
}
internal fun GroupInfoFragment.navigateToChatRoomCreation(args: Bundle?) {
if (findNavController().currentDestination?.id == R.id.groupInfoFragment) {
findNavController().navigate(R.id.action_groupInfoFragment_to_chatRoomCreationFragment,
@ -445,7 +460,7 @@ internal fun GroupInfoFragment.navigateToChatRoom(args: Bundle?) {
findNavController().navigate(
R.id.action_groupInfoFragment_to_detailChatRoomFragment,
args,
getRightToLeftAnimationNavOptions(R.id.emptyFragment, true)
getRightToLeftAnimationNavOptions(R.id.emptyChatFragment, true)
)
}
}
@ -472,7 +487,7 @@ internal fun MasterContactsFragment.navigateToContactEditor(sipUriToAdd: String?
navHostFragment.navController.navigate(
R.id.action_global_contactEditorFragment,
bundle,
popupTo()
popupTo(R.id.emptyContactFragment, true)
)
}
}
@ -499,6 +514,14 @@ internal fun ContactEditorFragment.navigateToContact(contact: NativeContact) {
)
}
internal fun ContactEditorFragment.navigateToEmptyContact() {
findNavController().navigate(
R.id.action_global_emptyContactFragment,
null,
popupTo()
)
}
internal fun DetailContactFragment.navigateToChatRoom(args: Bundle?) {
findMasterNavController().navigate(
R.id.action_global_masterChatRoomsFragment,
@ -525,6 +548,14 @@ internal fun DetailContactFragment.navigateToContactEditor() {
}
}
internal fun DetailContactFragment.navigateToEmptyContact() {
findNavController().navigate(
R.id.action_global_emptyContactFragment,
null,
popupTo()
)
}
/* History related */
internal fun MasterCallLogsFragment.navigateToCallHistory() {
@ -534,7 +565,7 @@ internal fun MasterCallLogsFragment.navigateToCallHistory() {
navHostFragment.navController.navigate(
R.id.action_global_detailCallLogFragment,
null,
popupTo(R.id.emptyFragment, true)
popupTo(R.id.emptyCallHistoryFragment, true)
)
}
}
@ -546,7 +577,7 @@ internal fun MasterCallLogsFragment.clearDisplayedCallHistory() {
navHostFragment.navController.navigate(
R.id.action_global_emptyFragment,
null,
popupTo(R.id.emptyFragment, true)
popupTo(R.id.emptyCallHistoryFragment, true)
)
}
}
@ -575,19 +606,33 @@ internal fun DetailCallLogFragment.navigateToFriend(friendAddress: Address) {
}
internal fun DetailCallLogFragment.navigateToChatRoom(args: Bundle?) {
findMasterNavController().navigate(
R.id.action_global_masterChatRoomsFragment,
args,
getRightBottomToLeftTopAnimationNavOptions()
)
if (findNavController().currentDestination?.id == R.id.detailCallLogFragment) {
findMasterNavController().navigate(
R.id.action_global_masterChatRoomsFragment,
args,
getRightBottomToLeftTopAnimationNavOptions()
)
}
}
internal fun DetailCallLogFragment.navigateToDialer(args: Bundle?) {
findMasterNavController().navigate(
R.id.action_global_dialerFragment,
args,
getRightToLeftAnimationNavOptions()
)
if (findNavController().currentDestination?.id == R.id.detailCallLogFragment) {
findMasterNavController().navigate(
R.id.action_global_dialerFragment,
args,
getRightToLeftAnimationNavOptions()
)
}
}
internal fun DetailCallLogFragment.navigateToEmptyCallHistory() {
if (findNavController().currentDestination?.id == R.id.detailCallLogFragment) {
findNavController().navigate(
R.id.action_global_emptyFragment,
null,
popupTo()
)
}
}
/* Settings related */
@ -721,6 +766,78 @@ internal fun PhoneAccountLinkingFragment.navigateToPhoneAccountValidation(args:
}
}
internal fun AccountSettingsFragment.navigateToEmptySetting() {
findNavController().navigate(
R.id.action_global_emptySettingsFragment,
null,
popupTo()
)
}
internal fun AdvancedSettingsFragment.navigateToEmptySetting() {
findNavController().navigate(
R.id.action_global_emptySettingsFragment,
null,
popupTo()
)
}
internal fun AudioSettingsFragment.navigateToEmptySetting() {
findNavController().navigate(
R.id.action_global_emptySettingsFragment,
null,
popupTo()
)
}
internal fun CallSettingsFragment.navigateToEmptySetting() {
findNavController().navigate(
R.id.action_global_emptySettingsFragment,
null,
popupTo()
)
}
internal fun ChatSettingsFragment.navigateToEmptySetting() {
findNavController().navigate(
R.id.action_global_emptySettingsFragment,
null,
popupTo()
)
}
internal fun ContactsSettingsFragment.navigateToEmptySetting() {
findNavController().navigate(
R.id.action_global_emptySettingsFragment,
null,
popupTo()
)
}
internal fun NetworkSettingsFragment.navigateToEmptySetting() {
findNavController().navigate(
R.id.action_global_emptySettingsFragment,
null,
popupTo()
)
}
internal fun TunnelSettingsFragment.navigateToEmptySetting() {
findNavController().navigate(
R.id.action_global_emptySettingsFragment,
null,
popupTo()
)
}
internal fun VideoSettingsFragment.navigateToEmptySetting() {
findNavController().navigate(
R.id.action_global_emptySettingsFragment,
null,
popupTo()
)
}
/* Side menu related */
internal fun SideMenuFragment.navigateToAccountSettings(identity: String) {

View file

@ -33,6 +33,7 @@ import org.linphone.activities.main.chat.viewmodels.ChatRoomCreationViewModel
import org.linphone.activities.main.fragments.SecureFragment
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToChatRoom
import org.linphone.activities.navigateToEmptyChatRoom
import org.linphone.activities.navigateToGroupInfo
import org.linphone.core.tools.Log
import org.linphone.databinding.ChatRoomCreationFragmentBinding
@ -149,7 +150,11 @@ class ChatRoomCreationFragment : SecureFragment<ChatRoomCreationFragmentBinding>
override fun goBack() {
if (!findNavController().popBackStack()) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptyChatRoom()
}
}
}

View file

@ -125,7 +125,7 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
if (chatRoom == null) {
Log.e("[Chat Room] Chat room is null, aborting!")
// (activity as MainActivity).showSnackBar(R.string.error)
findNavController().navigateUp()
goBack()
return
}
@ -476,7 +476,11 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
override fun goBack() {
if (!findNavController().popBackStack()) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptyChatRoom()
}
}
}

View file

@ -101,6 +101,9 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
sharedViewModel.layoutChangedEvent.observe(viewLifecycleOwner, {
it.consume {
sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable
if (binding.slidingPane.isSlideable) {
binding.slidingPane.closePane()
}
}
})
binding.slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED

View file

@ -40,9 +40,11 @@ import org.linphone.activities.main.contact.data.NumberOrAddressEditorData
import org.linphone.activities.main.contact.viewmodels.*
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToContact
import org.linphone.activities.navigateToEmptyContact
import org.linphone.contact.NativeContact
import org.linphone.core.tools.Log
import org.linphone.databinding.ContactEditorFragmentBinding
import org.linphone.utils.Event
import org.linphone.utils.FileUtils
import org.linphone.utils.ImageUtils
import org.linphone.utils.PermissionHelper
@ -107,6 +109,16 @@ class ContactEditorFragment : GenericFragment<ContactEditorFragmentBinding>(), S
}
}
override fun goBack() {
if (!findNavController().popBackStack()) {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptyContact()
}
}
}
override fun onSyncAccountClicked(name: String?, type: String?) {
Log.i("[Contact Editor] Using account $name / $type")
viewModel.syncAccountName = name
@ -126,7 +138,7 @@ class ContactEditorFragment : GenericFragment<ContactEditorFragmentBinding>(), S
} else {
Log.w("[Contact Editor] WRITE_CONTACTS permission denied")
(requireActivity() as MainActivity).showSnackBar(R.string.contact_editor_write_permission_denied)
findNavController().popBackStack()
goBack()
}
}
}
@ -149,7 +161,7 @@ class ContactEditorFragment : GenericFragment<ContactEditorFragmentBinding>(), S
Log.i("[Contact Editor] Displaying contact $savedContact")
navigateToContact(savedContact)
} else {
findNavController().popBackStack()
goBack()
}
}

View file

@ -25,10 +25,9 @@ import android.net.Uri
import android.os.Bundle
import android.view.View
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.*
import org.linphone.activities.main.*
import org.linphone.activities.main.contact.viewmodels.ContactViewModel
import org.linphone.activities.main.contact.viewmodels.ContactViewModelFactory
@ -69,7 +68,7 @@ class DetailContactFragment : GenericFragment<ContactDetailFragmentBinding>() {
if (contact == null) {
Log.e("[Contact] Contact is null, aborting!")
// (activity as MainActivity).showSnackBar(R.string.error)
findNavController().navigateUp()
goBack()
return
}
@ -129,7 +128,11 @@ class DetailContactFragment : GenericFragment<ContactDetailFragmentBinding>() {
}
override fun goBack() {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptyContact()
}
}
private fun confirmContactRemoval() {
@ -143,7 +146,7 @@ class DetailContactFragment : GenericFragment<ContactDetailFragmentBinding>() {
dialogViewModel.showDeleteButton({
viewModel.deleteContact()
dialog.dismiss()
findNavController().navigateUp()
goBack()
}, getString(R.string.dialog_delete))
dialog.show()

View file

@ -89,6 +89,9 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
sharedViewModel.layoutChangedEvent.observe(viewLifecycleOwner, {
it.consume {
sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable
if (binding.slidingPane.isSlideable) {
binding.slidingPane.closePane()
}
}
})
binding.slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED

View file

@ -131,6 +131,10 @@ class DetailCallLogFragment : GenericFragment<HistoryDetailFragmentBinding>() {
}
override fun goBack() {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptyCallHistory()
}
}
}

View file

@ -92,6 +92,9 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
sharedViewModel.layoutChangedEvent.observe(viewLifecycleOwner, {
it.consume {
sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable
if (binding.slidingPane.isSlideable) {
binding.slidingPane.closePane()
}
}
})
binding.slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED

View file

@ -27,6 +27,7 @@ import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.viewmodels.AccountSettingsViewModel
import org.linphone.activities.main.settings.viewmodels.AccountSettingsViewModelFactory
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.activities.navigateToPhoneLinking
import org.linphone.core.tools.Log
import org.linphone.databinding.SettingsAccountFragmentBinding
@ -92,6 +93,10 @@ class AccountSettingsFragment : GenericFragment<SettingsAccountFragmentBinding>(
}
override fun goBack() {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -32,6 +32,7 @@ import org.linphone.activities.GenericFragment
import org.linphone.activities.main.MainActivity
import org.linphone.activities.main.settings.viewmodels.AdvancedSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.core.tools.Log
import org.linphone.core.tools.compatibility.DeviceUtils
import org.linphone.databinding.SettingsAdvancedFragmentBinding
@ -134,6 +135,10 @@ class AdvancedSettingsFragment : GenericFragment<SettingsAdvancedFragmentBinding
}
override fun goBack() {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -33,6 +33,7 @@ import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.SettingListenerStub
import org.linphone.activities.main.settings.viewmodels.AudioSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.core.tools.Log
import org.linphone.databinding.SettingsAudioFragmentBinding
import org.linphone.utils.Event
@ -118,6 +119,10 @@ class AudioSettingsFragment : GenericFragment<SettingsAudioFragmentBinding>() {
}
override fun goBack() {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -30,6 +30,7 @@ import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.viewmodels.CallSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.compatibility.Compatibility
import org.linphone.databinding.SettingsCallFragmentBinding
import org.linphone.mediastream.Version
@ -92,6 +93,10 @@ class CallSettingsFragment : GenericFragment<SettingsCallFragmentBinding>() {
}
override fun goBack() {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -29,6 +29,7 @@ import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.viewmodels.ChatSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.compatibility.Compatibility
import org.linphone.databinding.SettingsChatFragmentBinding
import org.linphone.mediastream.Version
@ -84,6 +85,10 @@ class ChatSettingsFragment : GenericFragment<SettingsChatFragmentBinding>() {
}
override fun goBack() {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -29,6 +29,7 @@ import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.viewmodels.ContactsSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.compatibility.Compatibility
import org.linphone.core.tools.Log
import org.linphone.databinding.SettingsContactsFragmentBinding
@ -113,6 +114,10 @@ class ContactsSettingsFragment : GenericFragment<SettingsContactsFragmentBinding
}
override fun goBack() {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -26,6 +26,7 @@ import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.viewmodels.NetworkSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.databinding.SettingsNetworkFragmentBinding
import org.linphone.utils.Event
@ -52,6 +53,10 @@ class NetworkSettingsFragment : GenericFragment<SettingsNetworkFragmentBinding>(
}
override fun goBack() {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -66,6 +66,9 @@ class SettingsFragment : SecureFragment<SettingsFragmentBinding>() {
sharedViewModel.layoutChangedEvent.observe(viewLifecycleOwner, {
it.consume {
sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable
if (binding.slidingPane.isSlideable) {
binding.slidingPane.closePane()
}
}
})
binding.slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED

View file

@ -26,6 +26,7 @@ import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.viewmodels.TunnelSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.databinding.SettingsTunnelFragmentBinding
import org.linphone.utils.Event
@ -52,6 +53,10 @@ class TunnelSettingsFragment : GenericFragment<SettingsTunnelFragmentBinding>()
}
override fun goBack() {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -33,6 +33,7 @@ import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.SettingListenerStub
import org.linphone.activities.main.settings.viewmodels.VideoSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.core.tools.Log
import org.linphone.databinding.SettingsVideoFragmentBinding
import org.linphone.utils.Event
@ -108,6 +109,10 @@ class VideoSettingsFragment : GenericFragment<SettingsVideoFragmentBinding>() {
}
override fun goBack() {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -9,7 +9,7 @@
android:id="@+id/emptyChatFragment"
android:name="org.linphone.activities.main.fragments.EmptyFragment"
tools:layout="@layout/empty_fragment"
android:label="EmptyFragment" />
android:label="EmptyChatFragment" />
<action android:id="@+id/action_global_emptyChatFragment"
app:destination="@id/emptyChatFragment" />

View file

@ -9,7 +9,7 @@
android:id="@+id/emptyContactFragment"
android:name="org.linphone.activities.main.fragments.EmptyFragment"
tools:layout="@layout/empty_fragment"
android:label="EmptyFragment" />
android:label="EmptyContactFragment" />
<action android:id="@+id/action_global_emptyContactFragment"
app:destination="@id/emptyContactFragment" />

View file

@ -3,16 +3,16 @@
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/history_nav_graph.xml"
app:startDestination="@id/emptyFragment">
app:startDestination="@id/emptyCallHistoryFragment">
<fragment
android:id="@+id/emptyFragment"
android:id="@+id/emptyCallHistoryFragment"
android:name="org.linphone.activities.main.fragments.EmptyFragment"
tools:layout="@layout/empty_fragment"
android:label="EmptyFragment" />
android:label="EmptyCallHistoryFragment" />
<action android:id="@+id/action_global_emptyFragment"
app:destination="@id/emptyFragment" />
app:destination="@id/emptyCallHistoryFragment" />
<fragment
android:id="@+id/detailCallLogFragment"

View file

@ -3,12 +3,17 @@
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/settings_nav_graph.xml"
app:startDestination="@id/emptyFragment">
app:startDestination="@id/emptySettingsFragment">
<fragment
android:id="@+id/emptyFragment"
android:id="@+id/emptySettingsFragment"
android:name="org.linphone.activities.main.fragments.EmptyFragment"
tools:layout="@layout/empty_fragment"
android:label="EmptyFragment"/>
android:label="EmptySettingsFragment" />
<action android:id="@+id/action_global_emptySettingsFragment"
app:destination="@id/emptySettingsFragment" />
<fragment
android:id="@+id/accountSettingsFragment"
android:name="org.linphone.activities.main.settings.fragments.AccountSettingsFragment"