Fixed issues with deep links on tablets

This commit is contained in:
Sylvain Berfini 2020-07-15 14:34:16 +02:00
parent cdfc07c560
commit 002999aa7a
8 changed files with 308 additions and 208 deletions

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
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)
}
}

View file

@ -35,7 +35,6 @@ import androidx.appcompat.view.menu.MenuPopupHelper
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.Navigation
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView 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.adapters.ChatMessagesListAdapter
import org.linphone.activities.main.chat.viewmodels.* import org.linphone.activities.main.chat.viewmodels.*
import org.linphone.activities.main.fragments.MasterFragment 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.DialogViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.core.* import org.linphone.core.*
@ -172,10 +173,8 @@ class DetailChatRoomFragment : MasterFragment() {
// as we don't want to forward it in this chat room // as we don't want to forward it in this chat room
sharedViewModel.messageToForwardEvent.removeObservers(viewLifecycleOwner) sharedViewModel.messageToForwardEvent.removeObservers(viewLifecycleOwner)
sharedViewModel.messageToForwardEvent.value = Event(chatMessage) sharedViewModel.messageToForwardEvent.value = Event(chatMessage)
Log.i("[Chat Room] Forwarding message, going to chat rooms list")
val deepLink = "linphone-android://chat/" navigateToChatRooms()
Log.i("[Chat Room] Forwarding message, starting deep link: $deepLink")
findNavController().navigate(Uri.parse(deepLink))
} }
}) })
@ -183,15 +182,14 @@ class DetailChatRoomFragment : MasterFragment() {
it.consume { chatMessage -> it.consume { chatMessage ->
val args = Bundle() val args = Bundle()
args.putString("MessageId", chatMessage.messageId) 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 { adapter.addSipUriToContactEvent.observe(viewLifecycleOwner, Observer {
it.consume { sipUri -> it.consume { sipUri ->
val deepLink = "linphone-android://contact/new/$sipUri" Log.i("[Chat Room] Going to contacts list with SIP URI to add: $sipUri")
Log.i("[Chat Room] Creating contact, starting deep link: $deepLink") navigateToContacts(sipUri)
findNavController().navigate(Uri.parse(deepLink))
} }
}) })

View file

@ -25,11 +25,8 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.os.bundleOf
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager 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.adapters.ChatRoomsListAdapter
import org.linphone.activities.main.chat.viewmodels.ChatRoomsListViewModel import org.linphone.activities.main.chat.viewmodels.ChatRoomsListViewModel
import org.linphone.activities.main.fragments.MasterFragment 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.DialogViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.core.ChatRoom import org.linphone.core.ChatRoom
@ -145,15 +144,7 @@ class MasterChatRoomsFragment : MasterFragment() {
adapter.selectedChatRoomEvent.observe(viewLifecycleOwner, Observer { adapter.selectedChatRoomEvent.observe(viewLifecycleOwner, Observer {
it.consume { chatRoom -> it.consume { chatRoom ->
sharedViewModel.selectedChatRoom.value = chatRoom sharedViewModel.selectedChatRoom.value = chatRoom
if (!resources.getBoolean(R.bool.isTablet)) { navigateToChatRoom()
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)
}
} }
}) })
@ -162,37 +153,12 @@ class MasterChatRoomsFragment : MasterFragment() {
} }
binding.setNewOneToOneChatRoomClickListener { binding.setNewOneToOneChatRoomClickListener {
val bundle = bundleOf("createGroup" to false) navigateToChatRoomCreation(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)
}
} }
binding.setNewGroupChatRoomClickListener { binding.setNewGroupChatRoomClickListener {
sharedViewModel.selectedGroupChatRoom.value = null sharedViewModel.selectedGroupChatRoom.value = null
navigateToChatRoomCreation(true)
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)
}
} }
val localSipUri = arguments?.getString("LocalSipUri") val localSipUri = arguments?.getString("LocalSipUri")

View file

@ -38,6 +38,7 @@ import kotlinx.coroutines.launch
import org.linphone.R import org.linphone.R
import org.linphone.activities.main.MainActivity import org.linphone.activities.main.MainActivity
import org.linphone.activities.main.contact.viewmodels.* import org.linphone.activities.main.contact.viewmodels.*
import org.linphone.activities.main.navigateToContact
import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.contact.NativeContact import org.linphone.contact.NativeContact
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
@ -87,9 +88,8 @@ class ContactEditorFragment : Fragment() {
val savedContact = viewModel.save() val savedContact = viewModel.save()
if (savedContact is NativeContact) { if (savedContact is NativeContact) {
savedContact.syncValuesFromAndroidContact(requireContext()) savedContact.syncValuesFromAndroidContact(requireContext())
val deepLink = "linphone-android://contact/view/${savedContact.nativeId}" Log.i("[Contact Editor] Displaying contact $savedContact")
Log.i("[Contact Editor] Displaying contact, starting deep link: $deepLink") navigateToContact(savedContact)
findNavController().navigate(Uri.parse(deepLink))
} else { } else {
findNavController().popBackStack() findNavController().popBackStack()
} }

View file

@ -28,8 +28,6 @@ import android.view.ViewGroup
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager 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.adapters.ContactsListAdapter
import org.linphone.activities.main.contact.viewmodels.ContactsListViewModel import org.linphone.activities.main.contact.viewmodels.ContactsListViewModel
import org.linphone.activities.main.fragments.MasterFragment 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.DialogViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.contact.Contact import org.linphone.contact.Contact
@ -138,11 +138,11 @@ class MasterContactsFragment : MasterFragment() {
listViewModel.filter.value = "" listViewModel.filter.value = ""
if (editOnClick) { if (editOnClick) {
goToContactEditor() navigateToContactEditor(sipUriToAdd)
editOnClick = false editOnClick = false
sipUriToAdd = null sipUriToAdd = null
} else { } else {
goToContactDetails() navigateToContact()
} }
} }
}) })
@ -169,7 +169,7 @@ class MasterContactsFragment : MasterFragment() {
binding.setNewContactClickListener { binding.setNewContactClickListener {
// Remove any previously selected contact // Remove any previously selected contact
sharedViewModel.selectedContact.value = null sharedViewModel.selectedContact.value = null
goToContactEditor() navigateToContactEditor(sipUriToAdd)
} }
val id = arguments?.getString("id") 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)
}
}
} }

View file

@ -19,7 +19,6 @@
*/ */
package org.linphone.activities.main.history.fragments package org.linphone.activities.main.history.fragments
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -33,6 +32,9 @@ import org.linphone.R
import org.linphone.activities.main.MainActivity import org.linphone.activities.main.MainActivity
import org.linphone.activities.main.history.viewmodels.CallLogViewModel import org.linphone.activities.main.history.viewmodels.CallLogViewModel
import org.linphone.activities.main.history.viewmodels.CallLogViewModelFactory 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.activities.main.viewmodels.SharedMainViewModel
import org.linphone.contact.NativeContact import org.linphone.contact.NativeContact
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
@ -79,23 +81,20 @@ class DetailCallLogFragment : Fragment() {
binding.setNewContactClickListener { binding.setNewContactClickListener {
viewModel.callLog.remoteAddress.clean() viewModel.callLog.remoteAddress.clean()
val deepLink = "linphone-android://contact/new/${viewModel.callLog.remoteAddress.asStringUriOnly()}" Log.i("[History] Creating contact with SIP URI: ${viewModel.callLog.remoteAddress.asStringUriOnly()}")
Log.i("[History] Creating contact, starting deep link: $deepLink") navigateToContacts(viewModel.callLog.remoteAddress.asStringUriOnly())
findNavController().navigate(Uri.parse(deepLink))
} }
binding.setContactClickListener { binding.setContactClickListener {
val contact = viewModel.contact.value as? NativeContact val contact = viewModel.contact.value as? NativeContact
if (contact != null) { if (contact != null) {
val deepLink = "linphone-android://contact/view/${contact.nativeId}" Log.i("[History] Displaying contact $contact")
Log.i("[History] Displaying contact, starting deep link: $deepLink") navigateToContact(contact)
findNavController().navigate(Uri.parse(deepLink))
} else { } else {
val address = viewModel.callLog.remoteAddress val address = viewModel.callLog.remoteAddress
address.clean() address.clean()
val deepLink = "linphone-android://contact/view-friend/${address.asStringUriOnly()}" Log.i("[History] Displaying friend with address ${address.asStringUriOnly()}")
Log.i("[History] Displaying friend, starting deep link: $deepLink") navigateToFriend(address)
findNavController().navigate(Uri.parse(deepLink))
} }
} }

View file

@ -27,7 +27,6 @@ import android.view.ViewGroup
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.ItemTouchHelper 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.adapters.CallLogsListAdapter
import org.linphone.activities.main.history.viewmodels.CallLogsListViewModel import org.linphone.activities.main.history.viewmodels.CallLogsListViewModel
import org.linphone.activities.main.history.viewmodels.GroupedCallLogViewModel 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.DialogViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.main.viewmodels.TabsViewModel import org.linphone.activities.main.viewmodels.TabsViewModel
@ -157,15 +157,7 @@ class MasterCallLogsFragment : MasterFragment() {
adapter.selectedCallLogEvent.observe(viewLifecycleOwner, Observer { adapter.selectedCallLogEvent.observe(viewLifecycleOwner, Observer {
it.consume { callLog -> it.consume { callLog ->
sharedViewModel.selectedCallLogGroup.value = callLog sharedViewModel.selectedCallLogGroup.value = callLog
if (!resources.getBoolean(R.bool.isTablet)) { navigateToCallHistory()
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)
}
} }
}) })

View file

@ -26,9 +26,11 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController 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.SettingListenerStub
import org.linphone.activities.main.settings.viewmodels.SettingsViewModel import org.linphone.activities.main.settings.viewmodels.SettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel
@ -70,155 +72,62 @@ class SettingsFragment : Fragment() {
val identity = arguments?.getString("identity") val identity = arguments?.getString("identity")
if (identity != null) { if (identity != null) {
val args = Bundle()
args.putString("Identity", identity)
Log.i("[Settings] Found identity parameter in arguments: $identity") Log.i("[Settings] Found identity parameter in arguments: $identity")
arguments?.clear() navigateToAccountSettings(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)
}
} }
viewModel.accountsSettingsListener = object : SettingListenerStub() { viewModel.accountsSettingsListener = object : SettingListenerStub() {
override fun onAccountClicked(identity: String) { override fun onAccountClicked(identity: String) {
val args = Bundle()
args.putString("Identity", identity)
Log.i("[Settings] Navigation to settings for proxy with identity: $identity") Log.i("[Settings] Navigation to settings for proxy with identity: $identity")
navigateToAccountSettings(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)
}
} }
} }
viewModel.tunnelSettingsListener = object : SettingListenerStub() { viewModel.tunnelSettingsListener = object : SettingListenerStub() {
override fun onClicked() { override fun onClicked() {
if (!resources.getBoolean(R.bool.isTablet)) { navigateToTunnelSettings()
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)
}
} }
} }
viewModel.audioSettingsListener = object : SettingListenerStub() { viewModel.audioSettingsListener = object : SettingListenerStub() {
override fun onClicked() { override fun onClicked() {
if (!resources.getBoolean(R.bool.isTablet)) { navigateToAudioSettings()
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)
}
} }
} }
viewModel.videoSettingsListener = object : SettingListenerStub() { viewModel.videoSettingsListener = object : SettingListenerStub() {
override fun onClicked() { override fun onClicked() {
if (!resources.getBoolean(R.bool.isTablet)) { navigateToVideoSettings()
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)
}
} }
} }
viewModel.callSettingsListener = object : SettingListenerStub() { viewModel.callSettingsListener = object : SettingListenerStub() {
override fun onClicked() { override fun onClicked() {
if (!resources.getBoolean(R.bool.isTablet)) { navigateToCallSettings()
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)
}
} }
} }
viewModel.chatSettingsListener = object : SettingListenerStub() { viewModel.chatSettingsListener = object : SettingListenerStub() {
override fun onClicked() { override fun onClicked() {
if (!resources.getBoolean(R.bool.isTablet)) { navigateToChatSettings()
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)
}
} }
} }
viewModel.networkSettingsListener = object : SettingListenerStub() { viewModel.networkSettingsListener = object : SettingListenerStub() {
override fun onClicked() { override fun onClicked() {
if (!resources.getBoolean(R.bool.isTablet)) { navigateToNetworkSettings()
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)
}
} }
} }
viewModel.contactsSettingsListener = object : SettingListenerStub() { viewModel.contactsSettingsListener = object : SettingListenerStub() {
override fun onClicked() { override fun onClicked() {
if (!resources.getBoolean(R.bool.isTablet)) { navigateToContactsSettings()
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)
}
} }
} }
viewModel.advancedSettingsListener = object : SettingListenerStub() { viewModel.advancedSettingsListener = object : SettingListenerStub() {
override fun onClicked() { override fun onClicked() {
if (!resources.getBoolean(R.bool.isTablet)) { navigateToAdvancedSettings()
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)
}
} }
} }
} }