From 002999aa7a3a68a1d251e9d630065ac7edb42a46 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 15 Jul 2020 14:34:16 +0200 Subject: [PATCH] Fixed issues with deep links on tablets --- .../linphone/activities/main/Navigation.kt | 263 ++++++++++++++++++ .../chat/fragments/DetailChatRoomFragment.kt | 16 +- .../chat/fragments/MasterChatRoomsFragment.kt | 44 +-- .../fragments/ContactEditorFragment.kt | 6 +- .../fragments/MasterContactsFragment.kt | 37 +-- .../fragments/DetailCallLogFragment.kt | 19 +- .../fragments/MasterCallLogsFragment.kt | 12 +- .../settings/fragments/SettingsFragment.kt | 119 +------- 8 files changed, 308 insertions(+), 208 deletions(-) create mode 100644 app/src/main/java/org/linphone/activities/main/Navigation.kt diff --git a/app/src/main/java/org/linphone/activities/main/Navigation.kt b/app/src/main/java/org/linphone/activities/main/Navigation.kt new file mode 100644 index 000000000..430f405af --- /dev/null +++ b/app/src/main/java/org/linphone/activities/main/Navigation.kt @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2010-2020 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.activities.main + +import android.net.Uri +import android.os.Bundle +import androidx.core.os.bundleOf +import androidx.fragment.app.Fragment +import androidx.navigation.NavController +import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.fragment.findNavController +import org.linphone.R +import org.linphone.activities.main.chat.fragments.DetailChatRoomFragment +import org.linphone.activities.main.chat.fragments.MasterChatRoomsFragment +import org.linphone.activities.main.contact.fragments.ContactEditorFragment +import org.linphone.activities.main.contact.fragments.MasterContactsFragment +import org.linphone.activities.main.history.fragments.DetailCallLogFragment +import org.linphone.activities.main.history.fragments.MasterCallLogsFragment +import org.linphone.activities.main.settings.fragments.SettingsFragment +import org.linphone.contact.NativeContact +import org.linphone.core.Address + +internal fun Fragment.findMasterNavController(): NavController { + return if (!resources.getBoolean(R.bool.isTablet)) { + findNavController() + } else { + parentFragment?.parentFragment?.findNavController() ?: findNavController() + } +} + +/* Chat related */ + +internal fun MasterChatRoomsFragment.navigateToChatRoom() { + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.masterChatRoomsFragment) { + findNavController().navigate(R.id.action_masterChatRoomsFragment_to_detailChatRoomFragment) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_detailChatRoomFragment) + } +} + +internal fun MasterChatRoomsFragment.navigateToChatRoomCreation( + createGroupChatRoom: Boolean = false +) { + val bundle = bundleOf("createGroup" to createGroupChatRoom) + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.masterChatRoomsFragment) { + findNavController().navigate( + R.id.action_masterChatRoomsFragment_to_chatRoomCreationFragment, + bundle + ) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_chatRoomCreationFragment, bundle) + } +} + +internal fun DetailChatRoomFragment.navigateToContacts(sipUriToAdd: String) { + val deepLink = "linphone-android://contact/new/$sipUriToAdd" + findMasterNavController().navigate(Uri.parse(deepLink)) +} + +internal fun DetailChatRoomFragment.navigateToChatRooms() { + val deepLink = "linphone-android://chat/" + findMasterNavController().navigate(Uri.parse(deepLink)) +} + +/* Contacts related */ + +internal fun MasterContactsFragment.navigateToContact() { + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.masterContactsFragment) { + findNavController().navigate(R.id.action_masterContactsFragment_to_detailContactFragment) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_detailContactFragment) + } +} + +internal fun MasterContactsFragment.navigateToContactEditor(sipUriToAdd: String? = null) { + val bundle = if (sipUriToAdd != null) bundleOf("SipUri" to sipUriToAdd) else Bundle() + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.masterContactsFragment) { + findNavController().navigate(R.id.action_masterContactsFragment_to_contactEditorFragment, bundle) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_contactEditorFragment, bundle) + } +} + +internal fun ContactEditorFragment.navigateToContact(contact: NativeContact) { + val deepLink = "linphone-android://contact/view/${contact.nativeId}" + findMasterNavController().navigate(Uri.parse(deepLink)) +} + +/* History related */ + +internal fun MasterCallLogsFragment.navigateToCallHistory() { + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.masterCallLogsFragment) { + findNavController().navigate(R.id.action_masterCallLogsFragment_to_detailCallLogFragment) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.history_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_detailCallLogFragment) + } +} + +internal fun DetailCallLogFragment.navigateToContacts(sipUriToAdd: String) { + val deepLink = "linphone-android://contact/new/$sipUriToAdd" + findMasterNavController().navigate(Uri.parse(deepLink)) +} + +internal fun DetailCallLogFragment.navigateToContact(contact: NativeContact) { + val deepLink = "linphone-android://contact/view/${contact.nativeId}" + findMasterNavController().navigate(Uri.parse(deepLink)) +} + +internal fun DetailCallLogFragment.navigateToFriend(friendAddress: Address) { + val deepLink = "linphone-android://contact/new/${friendAddress.asStringUriOnly()}" + findMasterNavController().navigate(Uri.parse(deepLink)) +} + +/* Settings related */ + +internal fun SettingsFragment.navigateToAccountSettings(identity: String) { + val bundle = bundleOf("Identity" to identity) + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { + findNavController().navigate( + R.id.action_settingsFragment_to_accountSettingsFragment, + bundle + ) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_accountSettingsFragment, bundle) + } +} + +internal fun SettingsFragment.navigateToTunnelSettings() { + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { + findNavController().navigate(R.id.action_settingsFragment_to_tunnelSettingsFragment) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_tunnelSettingsFragment) + } +} + +internal fun SettingsFragment.navigateToAudioSettings() { + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { + findNavController().navigate(R.id.action_settingsFragment_to_audioSettingsFragment) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_audioSettingsFragment) + } +} + +internal fun SettingsFragment.navigateToVideoSettings() { + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { + findNavController().navigate(R.id.action_settingsFragment_to_videoSettingsFragment) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_videoSettingsFragment) + } +} + +internal fun SettingsFragment.navigateToCallSettings() { + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { + findNavController().navigate(R.id.action_settingsFragment_to_callSettingsFragment) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_callSettingsFragment) + } +} + +internal fun SettingsFragment.navigateToChatSettings() { + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { + findNavController().navigate(R.id.action_settingsFragment_to_chatSettingsFragment) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_chatSettingsFragment) + } +} + +internal fun SettingsFragment.navigateToNetworkSettings() { + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { + findNavController().navigate(R.id.action_settingsFragment_to_networkSettingsFragment) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_networkSettingsFragment) + } +} + +internal fun SettingsFragment.navigateToContactsSettings() { + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { + findNavController().navigate(R.id.action_settingsFragment_to_contactsSettingsFragment) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_contactsSettingsFragment) + } +} + +internal fun SettingsFragment.navigateToAdvancedSettings() { + if (!resources.getBoolean(R.bool.isTablet)) { + if (findNavController().currentDestination?.id == R.id.settingsFragment) { + findNavController().navigate(R.id.action_settingsFragment_to_advancedSettingsFragment) + } + } else { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment + navHostFragment.navController.navigate(R.id.action_global_advancedSettingsFragment) + } +} diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index 1b9785567..ffb05ff05 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -35,7 +35,6 @@ import androidx.appcompat.view.menu.MenuPopupHelper import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope -import androidx.navigation.Navigation import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -48,6 +47,8 @@ import org.linphone.activities.main.chat.ChatScrollListener import org.linphone.activities.main.chat.adapters.ChatMessagesListAdapter import org.linphone.activities.main.chat.viewmodels.* import org.linphone.activities.main.fragments.MasterFragment +import org.linphone.activities.main.navigateToChatRooms +import org.linphone.activities.main.navigateToContacts import org.linphone.activities.main.viewmodels.DialogViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.core.* @@ -172,10 +173,8 @@ class DetailChatRoomFragment : MasterFragment() { // as we don't want to forward it in this chat room sharedViewModel.messageToForwardEvent.removeObservers(viewLifecycleOwner) sharedViewModel.messageToForwardEvent.value = Event(chatMessage) - - val deepLink = "linphone-android://chat/" - Log.i("[Chat Room] Forwarding message, starting deep link: $deepLink") - findNavController().navigate(Uri.parse(deepLink)) + Log.i("[Chat Room] Forwarding message, going to chat rooms list") + navigateToChatRooms() } }) @@ -183,15 +182,14 @@ class DetailChatRoomFragment : MasterFragment() { it.consume { chatMessage -> val args = Bundle() args.putString("MessageId", chatMessage.messageId) - Navigation.findNavController(binding.root).navigate(R.id.action_detailChatRoomFragment_to_imdnFragment, args) + findNavController().navigate(R.id.action_detailChatRoomFragment_to_imdnFragment, args) } }) adapter.addSipUriToContactEvent.observe(viewLifecycleOwner, Observer { it.consume { sipUri -> - val deepLink = "linphone-android://contact/new/$sipUri" - Log.i("[Chat Room] Creating contact, starting deep link: $deepLink") - findNavController().navigate(Uri.parse(deepLink)) + Log.i("[Chat Room] Going to contacts list with SIP URI to add: $sipUri") + navigateToContacts(sipUri) } }) diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt index b3d73a40e..77b717470 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt @@ -25,11 +25,8 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat -import androidx.core.os.bundleOf import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.NavHostFragment -import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager @@ -40,6 +37,8 @@ import org.linphone.activities.main.MainActivity import org.linphone.activities.main.chat.adapters.ChatRoomsListAdapter import org.linphone.activities.main.chat.viewmodels.ChatRoomsListViewModel import org.linphone.activities.main.fragments.MasterFragment +import org.linphone.activities.main.navigateToChatRoom +import org.linphone.activities.main.navigateToChatRoomCreation import org.linphone.activities.main.viewmodels.DialogViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.core.ChatRoom @@ -145,15 +144,7 @@ class MasterChatRoomsFragment : MasterFragment() { adapter.selectedChatRoomEvent.observe(viewLifecycleOwner, Observer { it.consume { chatRoom -> sharedViewModel.selectedChatRoom.value = chatRoom - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.masterChatRoomsFragment) { - findNavController().navigate(R.id.action_masterChatRoomsFragment_to_detailChatRoomFragment) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_detailChatRoomFragment) - } + navigateToChatRoom() } }) @@ -162,37 +153,12 @@ class MasterChatRoomsFragment : MasterFragment() { } binding.setNewOneToOneChatRoomClickListener { - val bundle = bundleOf("createGroup" to false) - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.masterChatRoomsFragment) { - findNavController().navigate( - R.id.action_masterChatRoomsFragment_to_chatRoomCreationFragment, - bundle - ) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_chatRoomCreationFragment, bundle) - } + navigateToChatRoomCreation(false) } binding.setNewGroupChatRoomClickListener { sharedViewModel.selectedGroupChatRoom.value = null - - val bundle = bundleOf("createGroup" to true) - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.masterChatRoomsFragment) { - findNavController().navigate( - R.id.action_masterChatRoomsFragment_to_chatRoomCreationFragment, - bundle - ) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_chatRoomCreationFragment, bundle) - } + navigateToChatRoomCreation(true) } val localSipUri = arguments?.getString("LocalSipUri") diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/ContactEditorFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/ContactEditorFragment.kt index 4487da829..401562e0b 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/ContactEditorFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/ContactEditorFragment.kt @@ -38,6 +38,7 @@ import kotlinx.coroutines.launch import org.linphone.R import org.linphone.activities.main.MainActivity import org.linphone.activities.main.contact.viewmodels.* +import org.linphone.activities.main.navigateToContact import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.contact.NativeContact import org.linphone.core.tools.Log @@ -87,9 +88,8 @@ class ContactEditorFragment : Fragment() { val savedContact = viewModel.save() if (savedContact is NativeContact) { savedContact.syncValuesFromAndroidContact(requireContext()) - val deepLink = "linphone-android://contact/view/${savedContact.nativeId}" - Log.i("[Contact Editor] Displaying contact, starting deep link: $deepLink") - findNavController().navigate(Uri.parse(deepLink)) + Log.i("[Contact Editor] Displaying contact $savedContact") + navigateToContact(savedContact) } else { findNavController().popBackStack() } diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt index 713388706..622686c24 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt @@ -28,8 +28,6 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.NavHostFragment -import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager @@ -40,6 +38,8 @@ import org.linphone.activities.main.MainActivity import org.linphone.activities.main.contact.adapters.ContactsListAdapter import org.linphone.activities.main.contact.viewmodels.ContactsListViewModel import org.linphone.activities.main.fragments.MasterFragment +import org.linphone.activities.main.navigateToContact +import org.linphone.activities.main.navigateToContactEditor import org.linphone.activities.main.viewmodels.DialogViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.contact.Contact @@ -138,11 +138,11 @@ class MasterContactsFragment : MasterFragment() { listViewModel.filter.value = "" if (editOnClick) { - goToContactEditor() + navigateToContactEditor(sipUriToAdd) editOnClick = false sipUriToAdd = null } else { - goToContactDetails() + navigateToContact() } } }) @@ -169,7 +169,7 @@ class MasterContactsFragment : MasterFragment() { binding.setNewContactClickListener { // Remove any previously selected contact sharedViewModel.selectedContact.value = null - goToContactEditor() + navigateToContactEditor(sipUriToAdd) } val id = arguments?.getString("id") @@ -253,31 +253,4 @@ class MasterContactsFragment : MasterFragment() { } } } - - private fun goToContactDetails() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.masterContactsFragment) { - findNavController().navigate(R.id.action_masterContactsFragment_to_detailContactFragment) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_detailContactFragment) - } - } - - private fun goToContactEditor() { - val args = Bundle() - if (sipUriToAdd != null) args.putString("SipUri", sipUriToAdd) - - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.masterContactsFragment) { - findNavController().navigate(R.id.action_masterContactsFragment_to_contactEditorFragment, args) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_contactEditorFragment, args) - } - } } diff --git a/app/src/main/java/org/linphone/activities/main/history/fragments/DetailCallLogFragment.kt b/app/src/main/java/org/linphone/activities/main/history/fragments/DetailCallLogFragment.kt index 12a2d670a..5348fed8b 100644 --- a/app/src/main/java/org/linphone/activities/main/history/fragments/DetailCallLogFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/history/fragments/DetailCallLogFragment.kt @@ -19,7 +19,6 @@ */ package org.linphone.activities.main.history.fragments -import android.net.Uri import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -33,6 +32,9 @@ import org.linphone.R import org.linphone.activities.main.MainActivity import org.linphone.activities.main.history.viewmodels.CallLogViewModel import org.linphone.activities.main.history.viewmodels.CallLogViewModelFactory +import org.linphone.activities.main.navigateToContact +import org.linphone.activities.main.navigateToContacts +import org.linphone.activities.main.navigateToFriend import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.contact.NativeContact import org.linphone.core.tools.Log @@ -79,23 +81,20 @@ class DetailCallLogFragment : Fragment() { binding.setNewContactClickListener { viewModel.callLog.remoteAddress.clean() - val deepLink = "linphone-android://contact/new/${viewModel.callLog.remoteAddress.asStringUriOnly()}" - Log.i("[History] Creating contact, starting deep link: $deepLink") - findNavController().navigate(Uri.parse(deepLink)) + Log.i("[History] Creating contact with SIP URI: ${viewModel.callLog.remoteAddress.asStringUriOnly()}") + navigateToContacts(viewModel.callLog.remoteAddress.asStringUriOnly()) } binding.setContactClickListener { val contact = viewModel.contact.value as? NativeContact if (contact != null) { - val deepLink = "linphone-android://contact/view/${contact.nativeId}" - Log.i("[History] Displaying contact, starting deep link: $deepLink") - findNavController().navigate(Uri.parse(deepLink)) + Log.i("[History] Displaying contact $contact") + navigateToContact(contact) } else { val address = viewModel.callLog.remoteAddress address.clean() - val deepLink = "linphone-android://contact/view-friend/${address.asStringUriOnly()}" - Log.i("[History] Displaying friend, starting deep link: $deepLink") - findNavController().navigate(Uri.parse(deepLink)) + Log.i("[History] Displaying friend with address ${address.asStringUriOnly()}") + navigateToFriend(address) } } diff --git a/app/src/main/java/org/linphone/activities/main/history/fragments/MasterCallLogsFragment.kt b/app/src/main/java/org/linphone/activities/main/history/fragments/MasterCallLogsFragment.kt index dab221378..9ecf1ffb2 100644 --- a/app/src/main/java/org/linphone/activities/main/history/fragments/MasterCallLogsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/history/fragments/MasterCallLogsFragment.kt @@ -27,7 +27,6 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.ItemTouchHelper @@ -39,6 +38,7 @@ import org.linphone.activities.main.fragments.MasterFragment import org.linphone.activities.main.history.adapters.CallLogsListAdapter import org.linphone.activities.main.history.viewmodels.CallLogsListViewModel import org.linphone.activities.main.history.viewmodels.GroupedCallLogViewModel +import org.linphone.activities.main.navigateToCallHistory import org.linphone.activities.main.viewmodels.DialogViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.main.viewmodels.TabsViewModel @@ -157,15 +157,7 @@ class MasterCallLogsFragment : MasterFragment() { adapter.selectedCallLogEvent.observe(viewLifecycleOwner, Observer { it.consume { callLog -> sharedViewModel.selectedCallLogGroup.value = callLog - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.masterCallLogsFragment) { - findNavController().navigate(R.id.action_masterCallLogsFragment_to_detailCallLogFragment) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.history_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_detailCallLogFragment) - } + navigateToCallHistory() } }) diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/SettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/SettingsFragment.kt index 4388aa9ca..173cfa178 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/SettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/SettingsFragment.kt @@ -26,9 +26,11 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.findNavController -import org.linphone.R +import org.linphone.activities.main.* +import org.linphone.activities.main.navigateToAccountSettings +import org.linphone.activities.main.navigateToAudioSettings +import org.linphone.activities.main.navigateToTunnelSettings import org.linphone.activities.main.settings.SettingListenerStub import org.linphone.activities.main.settings.viewmodels.SettingsViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel @@ -70,155 +72,62 @@ class SettingsFragment : Fragment() { val identity = arguments?.getString("identity") if (identity != null) { - val args = Bundle() - args.putString("Identity", identity) Log.i("[Settings] Found identity parameter in arguments: $identity") - arguments?.clear() - - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate( - R.id.action_settingsFragment_to_accountSettingsFragment, - args - ) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_accountSettingsFragment, args) - } + navigateToAccountSettings(identity) } viewModel.accountsSettingsListener = object : SettingListenerStub() { override fun onAccountClicked(identity: String) { - val args = Bundle() - args.putString("Identity", identity) Log.i("[Settings] Navigation to settings for proxy with identity: $identity") - - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate( - R.id.action_settingsFragment_to_accountSettingsFragment, - args - ) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_accountSettingsFragment, args) - } + navigateToAccountSettings(identity) } } viewModel.tunnelSettingsListener = object : SettingListenerStub() { override fun onClicked() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate(R.id.action_settingsFragment_to_tunnelSettingsFragment) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_tunnelSettingsFragment) - } + navigateToTunnelSettings() } } viewModel.audioSettingsListener = object : SettingListenerStub() { override fun onClicked() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate(R.id.action_settingsFragment_to_audioSettingsFragment) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_audioSettingsFragment) - } + navigateToAudioSettings() } } viewModel.videoSettingsListener = object : SettingListenerStub() { override fun onClicked() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate(R.id.action_settingsFragment_to_videoSettingsFragment) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_videoSettingsFragment) - } + navigateToVideoSettings() } } viewModel.callSettingsListener = object : SettingListenerStub() { override fun onClicked() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate(R.id.action_settingsFragment_to_callSettingsFragment) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_callSettingsFragment) - } + navigateToCallSettings() } } viewModel.chatSettingsListener = object : SettingListenerStub() { override fun onClicked() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate(R.id.action_settingsFragment_to_chatSettingsFragment) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_chatSettingsFragment) - } + navigateToChatSettings() } } viewModel.networkSettingsListener = object : SettingListenerStub() { override fun onClicked() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate(R.id.action_settingsFragment_to_networkSettingsFragment) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_networkSettingsFragment) - } + navigateToNetworkSettings() } } viewModel.contactsSettingsListener = object : SettingListenerStub() { override fun onClicked() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate(R.id.action_settingsFragment_to_contactsSettingsFragment) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_contactsSettingsFragment) - } + navigateToContactsSettings() } } viewModel.advancedSettingsListener = object : SettingListenerStub() { override fun onClicked() { - if (!resources.getBoolean(R.bool.isTablet)) { - if (findNavController().currentDestination?.id == R.id.settingsFragment) { - findNavController().navigate(R.id.action_settingsFragment_to_advancedSettingsFragment) - } - } else { - val navHostFragment = - childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment - navHostFragment.navController.navigate(R.id.action_global_advancedSettingsFragment) - } + navigateToAdvancedSettings() } } }