Improve slidingPane opening

This commit is contained in:
Sylvain Berfini 2021-09-06 11:05:24 +02:00
parent b329ae8167
commit a66b638f22
6 changed files with 124 additions and 138 deletions

View file

@ -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 {
R.id.chatRoomCreationFragment
}
navHostFragment.navController.navigate(
R.id.action_global_detailChatRoomFragment,
args,
popupTo(R.id.chatRoomCreationFragment, true)
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 {
R.id.detailChatRoomFragment
}
navHostFragment.navController.navigate(
R.id.action_global_chatRoomCreationFragment,
bundle,
popupTo(R.id.detailChatRoomFragment, true)
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 */

View file

@ -225,9 +225,8 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
Log.w("[Chat] Activity is pending destruction, don't start navigating now!")
sharedViewModel.destructionPendingChatRoom = chatRoom
} else {
binding.slidingPane.openPane()
sharedViewModel.selectedChatRoom.value = chatRoom
navigateToChatRoom(AppUtils.createBundleWithSharedTextAndFiles(sharedViewModel))
navigateToChatRoom(AppUtils.createBundleWithSharedTextAndFiles(sharedViewModel), binding.slidingPane)
}
}
}
@ -253,25 +252,22 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
}
binding.setNewOneToOneChatRoomClickListener {
binding.slidingPane.openPane()
sharedViewModel.chatRoomParticipants.value = arrayListOf()
navigateToChatRoomCreation(false)
navigateToChatRoomCreation(false, binding.slidingPane)
}
binding.setNewGroupChatRoomClickListener {
binding.slidingPane.openPane()
sharedViewModel.selectedGroupChatRoom.value = null
sharedViewModel.chatRoomParticipants.value = arrayListOf()
navigateToChatRoomCreation(true)
navigateToChatRoomCreation(true, binding.slidingPane)
}
val pendingDestructionChatRoom = sharedViewModel.destructionPendingChatRoom
if (pendingDestructionChatRoom != null) {
binding.slidingPane.openPane()
Log.w("[Chat] Found pending chat room from before activity was recreated")
sharedViewModel.destructionPendingChatRoom = null
sharedViewModel.selectedChatRoom.value = pendingDestructionChatRoom
navigateToChatRoom(AppUtils.createBundleWithSharedTextAndFiles(sharedViewModel))
navigateToChatRoom(AppUtils.createBundleWithSharedTextAndFiles(sharedViewModel), binding.slidingPane)
}
val localSipUri = arguments?.getString("LocalSipUri")

View file

@ -197,13 +197,12 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
sharedViewModel.selectedContact.value = contact
listViewModel.filter.value = ""
binding.slidingPane.openPane()
if (editOnClick) {
navigateToContactEditor(sipUriToAdd)
navigateToContactEditor(sipUriToAdd, binding.slidingPane)
editOnClick = false
sipUriToAdd = null
} else {
navigateToContact()
navigateToContact(binding.slidingPane)
}
}
}
@ -249,9 +248,7 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
binding.setNewContactClickListener {
// Remove any previously selected contact
sharedViewModel.selectedContact.value = null
binding.slidingPane.openPane()
navigateToContactEditor(sipUriToAdd)
navigateToContactEditor(sipUriToAdd, binding.slidingPane)
}
val id = arguments?.getString("id")

View file

@ -233,8 +233,7 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
{
it.consume { callLog ->
sharedViewModel.selectedCallLogGroup.value = callLog
binding.slidingPane.openPane()
navigateToCallHistory()
navigateToCallHistory(binding.slidingPane)
}
}
)

View file

@ -103,71 +103,61 @@ class SettingsFragment : SecureFragment<SettingsFragmentBinding>() {
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)
}
}
}

View file

@ -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