diff --git a/app/src/main/java/org/linphone/activities/Navigation.kt b/app/src/main/java/org/linphone/activities/Navigation.kt index fa05d2006..108c162f5 100644 --- a/app/src/main/java/org/linphone/activities/Navigation.kt +++ b/app/src/main/java/org/linphone/activities/Navigation.kt @@ -28,6 +28,7 @@ import androidx.navigation.NavOptions import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.findNavController +import androidx.slidingpanelayout.widget.SlidingPaneLayout import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.activities.assistant.fragments.* @@ -52,6 +53,19 @@ internal fun Fragment.findMasterNavController(): NavController { return parentFragment?.parentFragment?.findNavController() ?: findNavController() } +fun computeSlidingPaneNavOptions( + slidingPane: SlidingPaneLayout, + popUpTo: Int = -1, + popUpInclusive: Boolean = false, + singleTop: Boolean = true +): NavOptions { + return if (slidingPane.isSlideable) { + popupTo(popUpTo, popUpInclusive, singleTop) + } else { + getRightToLeftAnimationNavOptions(popUpTo, popUpInclusive, singleTop) + } +} + fun getRightToLeftAnimationNavOptions( popUpTo: Int = -1, popUpInclusive: Boolean = false, @@ -267,45 +281,45 @@ internal fun DialerFragment.navigateToConfigFileViewer() { /* Chat related */ -internal fun MasterChatRoomsFragment.navigateToChatRoom(args: Bundle) { +internal fun MasterChatRoomsFragment.navigateToChatRoom( + args: Bundle, + slidingPane: SlidingPaneLayout +) { val navHostFragment = childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment val previousBackStackEntry = navHostFragment.navController.currentBackStackEntry - if (previousBackStackEntry == null || previousBackStackEntry.destination.id == R.id.emptyChatFragment) { - navHostFragment.navController.navigate( - R.id.action_global_detailChatRoomFragment, - args, - popupTo(R.id.emptyChatFragment, true) - ) + val popUpToFragmentId = if (previousBackStackEntry == null || previousBackStackEntry.destination.id == R.id.emptyChatFragment) { + R.id.emptyChatFragment } else { - navHostFragment.navController.navigate( - R.id.action_global_detailChatRoomFragment, - args, - popupTo(R.id.chatRoomCreationFragment, true) - ) + R.id.chatRoomCreationFragment } + navHostFragment.navController.navigate( + R.id.action_global_detailChatRoomFragment, + args, + computeSlidingPaneNavOptions(slidingPane, popUpToFragmentId, true) + ) + if (!slidingPane.isOpen) slidingPane.openPane() } internal fun MasterChatRoomsFragment.navigateToChatRoomCreation( - createGroupChatRoom: Boolean = false + createGroupChatRoom: Boolean = false, + slidingPane: SlidingPaneLayout ) { val bundle = bundleOf("createGroup" to createGroupChatRoom) val navHostFragment = childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment val previousBackStackEntry = navHostFragment.navController.currentBackStackEntry - if (previousBackStackEntry == null || previousBackStackEntry.destination.id == R.id.emptyChatFragment) { - navHostFragment.navController.navigate( - R.id.action_global_chatRoomCreationFragment, - bundle, - popupTo(R.id.emptyChatFragment, true) - ) + val popUpToFragmentId = if (previousBackStackEntry == null || previousBackStackEntry.destination.id == R.id.emptyChatFragment) { + R.id.emptyChatFragment } else { - navHostFragment.navController.navigate( - R.id.action_global_chatRoomCreationFragment, - bundle, - popupTo(R.id.detailChatRoomFragment, true) - ) + R.id.detailChatRoomFragment } + navHostFragment.navController.navigate( + R.id.action_global_chatRoomCreationFragment, + bundle, + computeSlidingPaneNavOptions(slidingPane, popUpToFragmentId, true) + ) + if (!slidingPane.isOpen) slidingPane.openPane() } internal fun MasterChatRoomsFragment.clearDisplayedChatRoom() { @@ -315,7 +329,7 @@ internal fun MasterChatRoomsFragment.clearDisplayedChatRoom() { navHostFragment.navController.navigate( R.id.action_global_emptyChatFragment, null, - popupTo(R.id.emptyChatFragment, true) + getLeftToRightAnimationNavOptions(R.id.emptyChatFragment, true) ) } } @@ -414,7 +428,7 @@ internal fun DetailChatRoomFragment.navigateToEmptyChatRoom() { findNavController().navigate( R.id.action_global_emptyChatFragment, null, - popupTo() + getLeftToRightAnimationNavOptions() ) } @@ -442,7 +456,7 @@ internal fun ChatRoomCreationFragment.navigateToEmptyChatRoom() { findNavController().navigate( R.id.action_global_emptyChatFragment, null, - popupTo() + getLeftToRightAnimationNavOptions() ) } @@ -468,19 +482,23 @@ internal fun GroupInfoFragment.navigateToChatRoom(args: Bundle?) { /* Contacts related */ -internal fun MasterContactsFragment.navigateToContact() { +internal fun MasterContactsFragment.navigateToContact(slidingPane: SlidingPaneLayout) { if (findNavController().currentDestination?.id == R.id.masterContactsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_detailContactFragment, null, - popupTo(R.id.emptyContactFragment, true) + computeSlidingPaneNavOptions(slidingPane, R.id.emptyContactFragment, true) ) + if (!slidingPane.isOpen) slidingPane.openPane() } } -internal fun MasterContactsFragment.navigateToContactEditor(sipUriToAdd: String? = null) { +internal fun MasterContactsFragment.navigateToContactEditor( + sipUriToAdd: String? = null, + slidingPane: SlidingPaneLayout +) { if (findNavController().currentDestination?.id == R.id.masterContactsFragment) { val bundle = if (sipUriToAdd != null) bundleOf("SipUri" to sipUriToAdd) else Bundle() val navHostFragment = @@ -488,8 +506,9 @@ internal fun MasterContactsFragment.navigateToContactEditor(sipUriToAdd: String? navHostFragment.navController.navigate( R.id.action_global_contactEditorFragment, bundle, - popupTo(R.id.emptyContactFragment, true) + computeSlidingPaneNavOptions(slidingPane, R.id.emptyContactFragment, true) ) + if (!slidingPane.isOpen) slidingPane.openPane() } } @@ -500,7 +519,7 @@ internal fun MasterContactsFragment.clearDisplayedContact() { navHostFragment.navController.navigate( R.id.action_global_emptyContactFragment, null, - popupTo(R.id.emptyContactFragment, true) + getLeftToRightAnimationNavOptions(R.id.emptyContactFragment, true) ) } } @@ -511,7 +530,7 @@ internal fun ContactEditorFragment.navigateToContact(contact: NativeContact) { findNavController().navigate( R.id.action_contactEditorFragment_to_detailContactFragment, bundle, - popupTo(R.id.masterContactsFragment, false) + getRightToLeftAnimationNavOptions(R.id.masterContactsFragment, false) ) } @@ -519,7 +538,7 @@ internal fun ContactEditorFragment.navigateToEmptyContact() { findNavController().navigate( R.id.action_global_emptyContactFragment, null, - popupTo() + getLeftToRightAnimationNavOptions() ) } @@ -544,7 +563,7 @@ internal fun DetailContactFragment.navigateToContactEditor() { findNavController().navigate( R.id.action_detailContactFragment_to_contactEditorFragment, null, - popupTo() + getLeftToRightAnimationNavOptions() ) } } @@ -553,21 +572,22 @@ internal fun DetailContactFragment.navigateToEmptyContact() { findNavController().navigate( R.id.action_global_emptyContactFragment, null, - popupTo() + getLeftToRightAnimationNavOptions() ) } /* History related */ -internal fun MasterCallLogsFragment.navigateToCallHistory() { +internal fun MasterCallLogsFragment.navigateToCallHistory(slidingPane: SlidingPaneLayout) { if (findNavController().currentDestination?.id == R.id.masterCallLogsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.history_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_detailCallLogFragment, null, - popupTo(R.id.emptyCallHistoryFragment, true) + computeSlidingPaneNavOptions(slidingPane, R.id.emptyCallHistoryFragment, true) ) + if (!slidingPane.isOpen) slidingPane.openPane() } } @@ -578,7 +598,7 @@ internal fun MasterCallLogsFragment.clearDisplayedCallHistory() { navHostFragment.navController.navigate( R.id.action_global_emptyFragment, null, - popupTo(R.id.emptyCallHistoryFragment, true) + getLeftToRightAnimationNavOptions(R.id.emptyCallHistoryFragment, true) ) } } @@ -631,14 +651,17 @@ internal fun DetailCallLogFragment.navigateToEmptyCallHistory() { findNavController().navigate( R.id.action_global_emptyFragment, null, - popupTo() + getLeftToRightAnimationNavOptions() ) } } /* Settings related */ -internal fun SettingsFragment.navigateToAccountSettings(identity: String) { +internal fun SettingsFragment.navigateToAccountSettings( + identity: String, + slidingPane: SlidingPaneLayout +) { if (findNavController().currentDestination?.id == R.id.settingsFragment) { val bundle = bundleOf("Identity" to identity) val navHostFragment = @@ -646,104 +669,113 @@ internal fun SettingsFragment.navigateToAccountSettings(identity: String) { navHostFragment.navController.navigate( R.id.action_global_accountSettingsFragment, bundle, - popupTo() + computeSlidingPaneNavOptions(slidingPane) ) + if (!slidingPane.isOpen) slidingPane.openPane() } } -internal fun SettingsFragment.navigateToTunnelSettings() { +internal fun SettingsFragment.navigateToTunnelSettings(slidingPane: SlidingPaneLayout) { if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_tunnelSettingsFragment, null, - popupTo() + computeSlidingPaneNavOptions(slidingPane) ) + if (!slidingPane.isOpen) slidingPane.openPane() } } -internal fun SettingsFragment.navigateToAudioSettings() { +internal fun SettingsFragment.navigateToAudioSettings(slidingPane: SlidingPaneLayout) { if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_audioSettingsFragment, null, - popupTo() + computeSlidingPaneNavOptions(slidingPane) ) + if (!slidingPane.isOpen) slidingPane.openPane() } } -internal fun SettingsFragment.navigateToVideoSettings() { +internal fun SettingsFragment.navigateToVideoSettings(slidingPane: SlidingPaneLayout) { if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_videoSettingsFragment, null, - popupTo() + computeSlidingPaneNavOptions(slidingPane) ) + if (!slidingPane.isOpen) slidingPane.openPane() } } -internal fun SettingsFragment.navigateToCallSettings() { +internal fun SettingsFragment.navigateToCallSettings(slidingPane: SlidingPaneLayout) { if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_callSettingsFragment, null, - popupTo() + computeSlidingPaneNavOptions(slidingPane) ) + if (!slidingPane.isOpen) slidingPane.openPane() } } -internal fun SettingsFragment.navigateToChatSettings() { +internal fun SettingsFragment.navigateToChatSettings(slidingPane: SlidingPaneLayout) { if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_chatSettingsFragment, null, - popupTo() + computeSlidingPaneNavOptions(slidingPane) ) + if (!slidingPane.isOpen) slidingPane.openPane() } } -internal fun SettingsFragment.navigateToNetworkSettings() { +internal fun SettingsFragment.navigateToNetworkSettings(slidingPane: SlidingPaneLayout) { if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_networkSettingsFragment, null, - popupTo() + computeSlidingPaneNavOptions(slidingPane) ) + if (!slidingPane.isOpen) slidingPane.openPane() } } -internal fun SettingsFragment.navigateToContactsSettings() { +internal fun SettingsFragment.navigateToContactsSettings(slidingPane: SlidingPaneLayout) { if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_contactsSettingsFragment, null, - popupTo() + computeSlidingPaneNavOptions(slidingPane) ) + if (!slidingPane.isOpen) slidingPane.openPane() } } -internal fun SettingsFragment.navigateToAdvancedSettings() { +internal fun SettingsFragment.navigateToAdvancedSettings(slidingPane: SlidingPaneLayout) { if (findNavController().currentDestination?.id == R.id.settingsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment navHostFragment.navController.navigate( R.id.action_global_advancedSettingsFragment, null, - popupTo() + computeSlidingPaneNavOptions(slidingPane) ) + if (!slidingPane.isOpen) slidingPane.openPane() } } @@ -767,76 +799,48 @@ internal fun PhoneAccountLinkingFragment.navigateToPhoneAccountValidation(args: } } -internal fun AccountSettingsFragment.navigateToEmptySetting() { - findNavController().navigate( +internal fun navigateToEmptySetting(navController: NavController) { + navController.navigate( R.id.action_global_emptySettingsFragment, null, - popupTo() + getLeftToRightAnimationNavOptions() ) } +internal fun AccountSettingsFragment.navigateToEmptySetting() { + navigateToEmptySetting(findNavController()) +} + internal fun AdvancedSettingsFragment.navigateToEmptySetting() { - findNavController().navigate( - R.id.action_global_emptySettingsFragment, - null, - popupTo() - ) + navigateToEmptySetting(findNavController()) } internal fun AudioSettingsFragment.navigateToEmptySetting() { - findNavController().navigate( - R.id.action_global_emptySettingsFragment, - null, - popupTo() - ) + navigateToEmptySetting(findNavController()) } internal fun CallSettingsFragment.navigateToEmptySetting() { - findNavController().navigate( - R.id.action_global_emptySettingsFragment, - null, - popupTo() - ) + navigateToEmptySetting(findNavController()) } internal fun ChatSettingsFragment.navigateToEmptySetting() { - findNavController().navigate( - R.id.action_global_emptySettingsFragment, - null, - popupTo() - ) + navigateToEmptySetting(findNavController()) } internal fun ContactsSettingsFragment.navigateToEmptySetting() { - findNavController().navigate( - R.id.action_global_emptySettingsFragment, - null, - popupTo() - ) + navigateToEmptySetting(findNavController()) } internal fun NetworkSettingsFragment.navigateToEmptySetting() { - findNavController().navigate( - R.id.action_global_emptySettingsFragment, - null, - popupTo() - ) + navigateToEmptySetting(findNavController()) } internal fun TunnelSettingsFragment.navigateToEmptySetting() { - findNavController().navigate( - R.id.action_global_emptySettingsFragment, - null, - popupTo() - ) + navigateToEmptySetting(findNavController()) } internal fun VideoSettingsFragment.navigateToEmptySetting() { - findNavController().navigate( - R.id.action_global_emptySettingsFragment, - null, - popupTo() - ) + navigateToEmptySetting(findNavController()) } /* Side menu related */ 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 5f78b7753..729baeabf 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 @@ -225,9 +225,8 @@ class MasterChatRoomsFragment : MasterFragment sharedViewModel.selectedCallLogGroup.value = callLog - binding.slidingPane.openPane() - navigateToCallHistory() + navigateToCallHistory(binding.slidingPane) } } ) 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 c1ede7d17..132594fa8 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 @@ -103,71 +103,61 @@ class SettingsFragment : SecureFragment() { if (identity != null) { Log.i("[Settings] Found identity parameter in arguments: $identity") arguments?.clear() - binding.slidingPane.openPane() - navigateToAccountSettings(identity) + navigateToAccountSettings(identity, binding.slidingPane) } viewModel.accountsSettingsListener = object : SettingListenerStub() { override fun onAccountClicked(identity: String) { Log.i("[Settings] Navigation to settings for account with identity: $identity") - binding.slidingPane.openPane() - navigateToAccountSettings(identity) + navigateToAccountSettings(identity, binding.slidingPane) } } viewModel.tunnelSettingsListener = object : SettingListenerStub() { override fun onClicked() { - binding.slidingPane.openPane() - navigateToTunnelSettings() + navigateToTunnelSettings(binding.slidingPane) } } viewModel.audioSettingsListener = object : SettingListenerStub() { override fun onClicked() { - binding.slidingPane.openPane() - navigateToAudioSettings() + navigateToAudioSettings(binding.slidingPane) } } viewModel.videoSettingsListener = object : SettingListenerStub() { override fun onClicked() { - binding.slidingPane.openPane() - navigateToVideoSettings() + navigateToVideoSettings(binding.slidingPane) } } viewModel.callSettingsListener = object : SettingListenerStub() { override fun onClicked() { - binding.slidingPane.openPane() - navigateToCallSettings() + navigateToCallSettings(binding.slidingPane) } } viewModel.chatSettingsListener = object : SettingListenerStub() { override fun onClicked() { - binding.slidingPane.openPane() - navigateToChatSettings() + navigateToChatSettings(binding.slidingPane) } } viewModel.networkSettingsListener = object : SettingListenerStub() { override fun onClicked() { - binding.slidingPane.openPane() - navigateToNetworkSettings() + navigateToNetworkSettings(binding.slidingPane) } } viewModel.contactsSettingsListener = object : SettingListenerStub() { override fun onClicked() { - binding.slidingPane.openPane() - navigateToContactsSettings() + navigateToContactsSettings(binding.slidingPane) } } viewModel.advancedSettingsListener = object : SettingListenerStub() { override fun onClicked() { - binding.slidingPane.openPane() - navigateToAdvancedSettings() + navigateToAdvancedSettings(binding.slidingPane) } } } diff --git a/gradle.properties b/gradle.properties index ea41c4435..fd519955b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m +org.gradle.jvmargs=-Xmx4096m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects