Using MaterialSharedAxis animations to properly handle directions when navigation back and forth betwen fragments + fixed multiple 'main' fragments in backstack + use viewLifecycleOwner instead of 'this' for binding lifecycle owner in fragments

This commit is contained in:
Sylvain Berfini 2021-09-07 11:39:08 +02:00
parent 3a8b892ee1
commit fd6eb30d48
83 changed files with 435 additions and 533 deletions

View file

@ -25,15 +25,19 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.core.view.doOnPreDraw
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
abstract class GenericFragment<T : ViewDataBinding> : Fragment() { abstract class GenericFragment<T : ViewDataBinding> : Fragment() {
private var _binding: T? = null private var _binding: T? = null
protected val binding get() = _binding!! protected val binding get() = _binding!!
protected var useMaterialSharedAxisXForwardAnimation = true
protected val onBackPressedCallback = object : OnBackPressedCallback(true) { protected val onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() { override fun handleOnBackPressed() {
@ -58,6 +62,20 @@ abstract class GenericFragment<T : ViewDataBinding> : Fragment() {
requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback) requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
} }
override fun onStart() {
super.onStart()
if (useMaterialSharedAxisXForwardAnimation && corePreferences.enableAnimations) {
enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
exitTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
postponeEnterTransition()
binding.root.doOnPreDraw { startPostponedEnterTransition() }
}
}
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
_binding = null _binding = null

View file

@ -29,7 +29,6 @@ import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.slidingpanelayout.widget.SlidingPaneLayout import androidx.slidingpanelayout.widget.SlidingPaneLayout
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R import org.linphone.R
import org.linphone.activities.assistant.fragments.* import org.linphone.activities.assistant.fragments.*
import org.linphone.activities.main.MainActivity import org.linphone.activities.main.MainActivity
@ -53,111 +52,6 @@ internal fun Fragment.findMasterNavController(): NavController {
return parentFragment?.parentFragment?.findNavController() ?: findNavController() 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,
singleTop: Boolean = true
): NavOptions {
val builder = NavOptions.Builder()
builder.setPopUpTo(popUpTo, popUpInclusive).setLaunchSingleTop(singleTop)
if (!corePreferences.enableAnimations) return builder.build()
return builder
.setEnterAnim(R.anim.enter_right)
.setExitAnim(R.anim.exit_left)
.setPopEnterAnim(R.anim.enter_left)
.setPopExitAnim(R.anim.exit_right)
.build()
}
fun getLeftToRightAnimationNavOptions(
popUpTo: Int = -1,
popUpInclusive: Boolean = false,
singleTop: Boolean = true
): NavOptions {
val builder = NavOptions.Builder()
builder.setPopUpTo(popUpTo, popUpInclusive).setLaunchSingleTop(singleTop)
if (!corePreferences.enableAnimations) return builder.build()
return builder
.setEnterAnim(R.anim.enter_left)
.setExitAnim(R.anim.exit_right)
.setPopEnterAnim(R.anim.enter_right)
.setPopExitAnim(R.anim.exit_left)
.build()
}
fun getRightBottomToLeftTopAnimationNavOptions(
popUpTo: Int = -1,
popUpInclusive: Boolean = false,
singleTop: Boolean = true
): NavOptions {
val builder = NavOptions.Builder()
builder.setPopUpTo(popUpTo, popUpInclusive).setLaunchSingleTop(singleTop)
if (!corePreferences.enableAnimations) return builder.build()
return builder
.setEnterAnim(R.anim.enter_right_or_bottom)
.setExitAnim(R.anim.exit_left_or_top)
.setPopEnterAnim(R.anim.enter_left_or_top)
.setPopExitAnim(R.anim.exit_right_or_bottom)
.build()
}
fun getLeftTopToRightBottomAnimationNavOptions(
popUpTo: Int = -1,
popUpInclusive: Boolean = false,
singleTop: Boolean = true
): NavOptions {
val builder = NavOptions.Builder()
builder.setPopUpTo(popUpTo, popUpInclusive).setLaunchSingleTop(singleTop)
if (!corePreferences.enableAnimations) return builder.build()
return builder
.setEnterAnim(R.anim.enter_left_or_top)
.setExitAnim(R.anim.exit_right_or_bottom)
.setPopEnterAnim(R.anim.enter_right_or_bottom)
.setPopExitAnim(R.anim.exit_left_or_top)
.build()
}
fun getRightBottomToLeftTopNoPopAnimationNavOptions(
popUpTo: Int = -1,
popUpInclusive: Boolean = false,
singleTop: Boolean = true
): NavOptions {
val builder = NavOptions.Builder()
builder.setPopUpTo(popUpTo, popUpInclusive).setLaunchSingleTop(singleTop)
if (!corePreferences.enableAnimations) return builder.build()
return builder
.setEnterAnim(R.anim.enter_right_or_bottom)
.setExitAnim(R.anim.exit_left_or_top)
.build()
}
fun getLeftTopToRightBottomNoPopAnimationNavOptions(
popUpTo: Int = -1,
popUpInclusive: Boolean = false,
singleTop: Boolean = true
): NavOptions {
val builder = NavOptions.Builder()
builder.setPopUpTo(popUpTo, popUpInclusive).setLaunchSingleTop(singleTop)
if (!corePreferences.enableAnimations) return builder.build()
return builder
.setEnterAnim(R.anim.enter_left_or_top)
.setExitAnim(R.anim.exit_right_or_bottom)
.build()
}
fun popupTo( fun popupTo(
popUpTo: Int = -1, popUpTo: Int = -1,
popUpInclusive: Boolean = false, popUpInclusive: Boolean = false,
@ -174,90 +68,62 @@ internal fun MainActivity.navigateToDialer(args: Bundle?) {
findNavController(R.id.nav_host_fragment).navigate( findNavController(R.id.nav_host_fragment).navigate(
R.id.action_global_dialerFragment, R.id.action_global_dialerFragment,
args, args,
getRightToLeftAnimationNavOptions(R.id.dialerFragment, true) popupTo(R.id.dialerFragment, true)
) )
} }
/* Tabs fragment related */ /* Tabs fragment related */
internal fun TabsFragment.navigateToCallHistory() { internal fun TabsFragment.navigateToCallHistory() {
when (findNavController().currentDestination?.id) { val action = when (findNavController().currentDestination?.id) {
R.id.masterContactsFragment -> findNavController().navigate( R.id.masterContactsFragment -> R.id.action_masterContactsFragment_to_masterCallLogsFragment
R.id.action_masterContactsFragment_to_masterCallLogsFragment, R.id.dialerFragment -> R.id.action_dialerFragment_to_masterCallLogsFragment
null, else -> R.id.action_masterChatRoomsFragment_to_masterCallLogsFragment
getLeftTopToRightBottomAnimationNavOptions()
)
R.id.dialerFragment -> findNavController().navigate(
R.id.action_dialerFragment_to_masterCallLogsFragment,
null,
getLeftTopToRightBottomAnimationNavOptions()
)
R.id.masterChatRoomsFragment -> findNavController().navigate(
R.id.action_masterChatRoomsFragment_to_masterCallLogsFragment,
null,
getLeftTopToRightBottomAnimationNavOptions()
)
} }
findNavController().navigate(
action,
null,
popupTo(R.id.masterCallLogsFragment, true)
)
} }
internal fun TabsFragment.navigateToContacts() { internal fun TabsFragment.navigateToContacts() {
when (findNavController().currentDestination?.id) { val action = when (findNavController().currentDestination?.id) {
R.id.masterCallLogsFragment -> findNavController().navigate( R.id.masterCallLogsFragment -> R.id.action_masterCallLogsFragment_to_masterContactsFragment
R.id.action_masterCallLogsFragment_to_masterContactsFragment, R.id.dialerFragment -> R.id.action_dialerFragment_to_masterContactsFragment
null, else -> R.id.action_masterChatRoomsFragment_to_masterContactsFragment
getRightBottomToLeftTopAnimationNavOptions()
)
R.id.dialerFragment -> findNavController().navigate(
R.id.action_dialerFragment_to_masterContactsFragment,
null,
getLeftTopToRightBottomAnimationNavOptions()
)
R.id.masterChatRoomsFragment -> findNavController().navigate(
R.id.action_masterChatRoomsFragment_to_masterContactsFragment,
null,
getLeftTopToRightBottomAnimationNavOptions()
)
} }
findNavController().navigate(
action,
null,
popupTo(R.id.masterContactsFragment, true)
)
} }
internal fun TabsFragment.navigateToDialer() { internal fun TabsFragment.navigateToDialer() {
when (findNavController().currentDestination?.id) { val action = when (findNavController().currentDestination?.id) {
R.id.masterCallLogsFragment -> findNavController().navigate( R.id.masterCallLogsFragment -> R.id.action_masterCallLogsFragment_to_dialerFragment
R.id.action_masterCallLogsFragment_to_dialerFragment, R.id.masterContactsFragment -> R.id.action_masterContactsFragment_to_dialerFragment
null, else -> R.id.action_masterChatRoomsFragment_to_dialerFragment
getRightBottomToLeftTopAnimationNavOptions()
)
R.id.masterContactsFragment -> findNavController().navigate(
R.id.action_masterContactsFragment_to_dialerFragment,
null,
getRightBottomToLeftTopAnimationNavOptions()
)
R.id.masterChatRoomsFragment -> findNavController().navigate(
R.id.action_masterChatRoomsFragment_to_dialerFragment,
null,
getLeftTopToRightBottomAnimationNavOptions()
)
} }
findNavController().navigate(
action,
null,
popupTo(R.id.dialerFragment, true)
)
} }
internal fun TabsFragment.navigateToChatRooms() { internal fun TabsFragment.navigateToChatRooms() {
when (findNavController().currentDestination?.id) { val action = when (findNavController().currentDestination?.id) {
R.id.masterCallLogsFragment -> findNavController().navigate( R.id.masterCallLogsFragment -> R.id.action_masterCallLogsFragment_to_masterChatRoomsFragment
R.id.action_masterCallLogsFragment_to_masterChatRoomsFragment, R.id.masterContactsFragment -> R.id.action_masterContactsFragment_to_masterChatRoomsFragment
null, else -> R.id.action_dialerFragment_to_masterChatRoomsFragment
getRightBottomToLeftTopAnimationNavOptions()
)
R.id.masterContactsFragment -> findNavController().navigate(
R.id.action_masterContactsFragment_to_masterChatRoomsFragment,
null,
getRightBottomToLeftTopAnimationNavOptions()
)
R.id.dialerFragment -> findNavController().navigate(
R.id.action_dialerFragment_to_masterChatRoomsFragment,
null,
getRightBottomToLeftTopAnimationNavOptions()
)
} }
findNavController().navigate(
action,
null,
popupTo(R.id.masterChatRoomsFragment, true)
)
} }
/* Dialer related */ /* Dialer related */
@ -266,7 +132,7 @@ internal fun DialerFragment.navigateToContacts(uriToAdd: String?) {
val deepLink = "linphone-android://contact/new/$uriToAdd" val deepLink = "linphone-android://contact/new/$uriToAdd"
findNavController().navigate( findNavController().navigate(
Uri.parse(deepLink), Uri.parse(deepLink),
getLeftTopToRightBottomNoPopAnimationNavOptions(R.id.masterContactsFragment, true) popupTo(R.id.masterContactsFragment, true)
) )
} }
@ -275,7 +141,7 @@ internal fun DialerFragment.navigateToConfigFileViewer() {
findMasterNavController().navigate( findMasterNavController().navigate(
R.id.action_global_configViewerFragment, R.id.action_global_configViewerFragment,
bundle, bundle,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
@ -296,7 +162,7 @@ internal fun MasterChatRoomsFragment.navigateToChatRoom(
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_detailChatRoomFragment, R.id.action_global_detailChatRoomFragment,
args, args,
computeSlidingPaneNavOptions(slidingPane, popUpToFragmentId, true) popupTo(popUpToFragmentId, true)
) )
} }
@ -316,7 +182,7 @@ internal fun MasterChatRoomsFragment.navigateToChatRoomCreation(
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_chatRoomCreationFragment, R.id.action_global_chatRoomCreationFragment,
bundle, bundle,
computeSlidingPaneNavOptions(slidingPane, popUpToFragmentId, true) popupTo(popUpToFragmentId, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -328,14 +194,14 @@ internal fun MasterChatRoomsFragment.clearDisplayedChatRoom() {
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_emptyChatFragment, R.id.action_global_emptyChatFragment,
null, null,
getLeftToRightAnimationNavOptions(R.id.emptyChatFragment, true) popupTo(R.id.emptyChatFragment, true)
) )
} }
} }
internal fun DetailChatRoomFragment.navigateToContacts(sipUriToAdd: String) { internal fun DetailChatRoomFragment.navigateToContacts(sipUriToAdd: String) {
val deepLink = "linphone-android://contact/new/$sipUriToAdd" val deepLink = "linphone-android://contact/new/$sipUriToAdd"
findMasterNavController().navigate(Uri.parse(deepLink), getLeftToRightAnimationNavOptions()) findMasterNavController().navigate(Uri.parse(deepLink))
} }
internal fun DetailChatRoomFragment.navigateToImdn(args: Bundle?) { internal fun DetailChatRoomFragment.navigateToImdn(args: Bundle?) {
@ -343,7 +209,7 @@ internal fun DetailChatRoomFragment.navigateToImdn(args: Bundle?) {
findNavController().navigate( findNavController().navigate(
R.id.action_detailChatRoomFragment_to_imdnFragment, R.id.action_detailChatRoomFragment_to_imdnFragment,
args, args,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -353,7 +219,7 @@ internal fun DetailChatRoomFragment.navigateToDevices() {
findNavController().navigate( findNavController().navigate(
R.id.action_detailChatRoomFragment_to_devicesFragment, R.id.action_detailChatRoomFragment_to_devicesFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -363,7 +229,7 @@ internal fun DetailChatRoomFragment.navigateToGroupInfo() {
findNavController().navigate( findNavController().navigate(
R.id.action_detailChatRoomFragment_to_groupInfoFragment, R.id.action_detailChatRoomFragment_to_groupInfoFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo(R.id.groupInfoFragment, true)
) )
} }
} }
@ -373,7 +239,7 @@ internal fun DetailChatRoomFragment.navigateToEphemeralInfo() {
findNavController().navigate( findNavController().navigate(
R.id.action_detailChatRoomFragment_to_ephemeralFragment, R.id.action_detailChatRoomFragment_to_ephemeralFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -383,7 +249,7 @@ internal fun DetailChatRoomFragment.navigateToTextFileViewer(secure: Boolean) {
findMasterNavController().navigate( findMasterNavController().navigate(
R.id.action_global_textViewerFragment, R.id.action_global_textViewerFragment,
bundle, bundle,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
@ -392,7 +258,7 @@ internal fun DetailChatRoomFragment.navigateToPdfFileViewer(secure: Boolean) {
findMasterNavController().navigate( findMasterNavController().navigate(
R.id.action_global_pdfViewerFragment, R.id.action_global_pdfViewerFragment,
bundle, bundle,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
@ -401,7 +267,7 @@ internal fun DetailChatRoomFragment.navigateToImageFileViewer(secure: Boolean) {
findMasterNavController().navigate( findMasterNavController().navigate(
R.id.action_global_imageViewerFragment, R.id.action_global_imageViewerFragment,
bundle, bundle,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
@ -410,7 +276,7 @@ internal fun DetailChatRoomFragment.navigateToVideoFileViewer(secure: Boolean) {
findMasterNavController().navigate( findMasterNavController().navigate(
R.id.action_global_videoViewerFragment, R.id.action_global_videoViewerFragment,
bundle, bundle,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
@ -419,7 +285,7 @@ internal fun DetailChatRoomFragment.navigateToAudioFileViewer(secure: Boolean) {
findMasterNavController().navigate( findMasterNavController().navigate(
R.id.action_global_audioViewerFragment, R.id.action_global_audioViewerFragment,
bundle, bundle,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
@ -427,7 +293,7 @@ internal fun DetailChatRoomFragment.navigateToEmptyChatRoom() {
findNavController().navigate( findNavController().navigate(
R.id.action_global_emptyChatFragment, R.id.action_global_emptyChatFragment,
null, null,
getLeftToRightAnimationNavOptions() popupTo(R.id.emptyChatFragment, true)
) )
} }
@ -436,7 +302,7 @@ internal fun ChatRoomCreationFragment.navigateToGroupInfo() {
findNavController().navigate( findNavController().navigate(
R.id.action_chatRoomCreationFragment_to_groupInfoFragment, R.id.action_chatRoomCreationFragment_to_groupInfoFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo(R.id.groupInfoFragment, true)
) )
} }
} }
@ -446,7 +312,7 @@ internal fun ChatRoomCreationFragment.navigateToChatRoom(args: Bundle) {
findNavController().navigate( findNavController().navigate(
R.id.action_chatRoomCreationFragment_to_detailChatRoomFragment, R.id.action_chatRoomCreationFragment_to_detailChatRoomFragment,
args, args,
getRightToLeftAnimationNavOptions(R.id.emptyChatFragment, true) popupTo(R.id.emptyChatFragment, true)
) )
} }
} }
@ -455,7 +321,7 @@ internal fun ChatRoomCreationFragment.navigateToEmptyChatRoom() {
findNavController().navigate( findNavController().navigate(
R.id.action_global_emptyChatFragment, R.id.action_global_emptyChatFragment,
null, null,
getLeftToRightAnimationNavOptions() popupTo(R.id.emptyChatFragment, true)
) )
} }
@ -464,7 +330,7 @@ internal fun GroupInfoFragment.navigateToChatRoomCreation(args: Bundle?) {
findNavController().navigate( findNavController().navigate(
R.id.action_groupInfoFragment_to_chatRoomCreationFragment, R.id.action_groupInfoFragment_to_chatRoomCreationFragment,
args, args,
getLeftToRightAnimationNavOptions(R.id.chatRoomCreationFragment, true) popupTo(R.id.chatRoomCreationFragment, true)
) )
} }
} }
@ -474,7 +340,7 @@ internal fun GroupInfoFragment.navigateToChatRoom(args: Bundle?) {
findNavController().navigate( findNavController().navigate(
R.id.action_groupInfoFragment_to_detailChatRoomFragment, R.id.action_groupInfoFragment_to_detailChatRoomFragment,
args, args,
getRightToLeftAnimationNavOptions(R.id.emptyChatFragment, true) popupTo(R.id.emptyChatFragment, true)
) )
} }
} }
@ -488,7 +354,7 @@ internal fun MasterContactsFragment.navigateToContact(slidingPane: SlidingPaneLa
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_detailContactFragment, R.id.action_global_detailContactFragment,
null, null,
computeSlidingPaneNavOptions(slidingPane, R.id.emptyContactFragment, true) popupTo(R.id.emptyContactFragment, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -505,7 +371,7 @@ internal fun MasterContactsFragment.navigateToContactEditor(
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_contactEditorFragment, R.id.action_global_contactEditorFragment,
bundle, bundle,
computeSlidingPaneNavOptions(slidingPane, R.id.emptyContactFragment, true) popupTo(R.id.emptyContactFragment, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -518,7 +384,7 @@ internal fun MasterContactsFragment.clearDisplayedContact() {
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_emptyContactFragment, R.id.action_global_emptyContactFragment,
null, null,
getLeftToRightAnimationNavOptions(R.id.emptyContactFragment, true) popupTo(R.id.emptyContactFragment, true)
) )
} }
} }
@ -529,7 +395,7 @@ internal fun ContactEditorFragment.navigateToContact(contact: NativeContact) {
findNavController().navigate( findNavController().navigate(
R.id.action_contactEditorFragment_to_detailContactFragment, R.id.action_contactEditorFragment_to_detailContactFragment,
bundle, bundle,
getRightToLeftAnimationNavOptions(R.id.masterContactsFragment, false) popupTo(R.id.masterContactsFragment, false)
) )
} }
@ -537,7 +403,7 @@ internal fun ContactEditorFragment.navigateToEmptyContact() {
findNavController().navigate( findNavController().navigate(
R.id.action_global_emptyContactFragment, R.id.action_global_emptyContactFragment,
null, null,
getLeftToRightAnimationNavOptions() popupTo(R.id.emptyContactFragment, true)
) )
} }
@ -545,7 +411,7 @@ internal fun DetailContactFragment.navigateToChatRoom(args: Bundle?) {
findMasterNavController().navigate( findMasterNavController().navigate(
R.id.action_global_masterChatRoomsFragment, R.id.action_global_masterChatRoomsFragment,
args, args,
getRightBottomToLeftTopAnimationNavOptions() popupTo(R.id.masterChatRoomsFragment, true)
) )
} }
@ -553,7 +419,7 @@ internal fun DetailContactFragment.navigateToDialer(args: Bundle?) {
findMasterNavController().navigate( findMasterNavController().navigate(
R.id.action_global_dialerFragment, R.id.action_global_dialerFragment,
args, args,
getRightToLeftAnimationNavOptions() popupTo(R.id.dialerFragment, true)
) )
} }
@ -562,7 +428,7 @@ internal fun DetailContactFragment.navigateToContactEditor() {
findNavController().navigate( findNavController().navigate(
R.id.action_detailContactFragment_to_contactEditorFragment, R.id.action_detailContactFragment_to_contactEditorFragment,
null, null,
getLeftToRightAnimationNavOptions() popupTo(R.id.contactEditorFragment, true)
) )
} }
} }
@ -571,7 +437,7 @@ internal fun DetailContactFragment.navigateToEmptyContact() {
findNavController().navigate( findNavController().navigate(
R.id.action_global_emptyContactFragment, R.id.action_global_emptyContactFragment,
null, null,
getLeftToRightAnimationNavOptions() popupTo(R.id.emptyContactFragment, true)
) )
} }
@ -584,7 +450,7 @@ internal fun MasterCallLogsFragment.navigateToCallHistory(slidingPane: SlidingPa
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_detailCallLogFragment, R.id.action_global_detailCallLogFragment,
null, null,
computeSlidingPaneNavOptions(slidingPane, R.id.emptyCallHistoryFragment, true) popupTo(R.id.emptyCallHistoryFragment, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -597,7 +463,7 @@ internal fun MasterCallLogsFragment.clearDisplayedCallHistory() {
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_emptyFragment, R.id.action_global_emptyFragment,
null, null,
getLeftToRightAnimationNavOptions(R.id.emptyCallHistoryFragment, true) popupTo(R.id.emptyCallHistoryFragment, true)
) )
} }
} }
@ -606,23 +472,23 @@ internal fun MasterCallLogsFragment.navigateToDialer(args: Bundle?) {
findNavController().navigate( findNavController().navigate(
R.id.action_global_dialerFragment, R.id.action_global_dialerFragment,
args, args,
getRightToLeftAnimationNavOptions() popupTo(R.id.dialerFragment, true)
) )
} }
internal fun DetailCallLogFragment.navigateToContacts(sipUriToAdd: String) { internal fun DetailCallLogFragment.navigateToContacts(sipUriToAdd: String) {
val deepLink = "linphone-android://contact/new/$sipUriToAdd" val deepLink = "linphone-android://contact/new/$sipUriToAdd"
findMasterNavController().navigate(Uri.parse(deepLink), getRightToLeftAnimationNavOptions()) findMasterNavController().navigate(Uri.parse(deepLink))
} }
internal fun DetailCallLogFragment.navigateToContact(contact: NativeContact) { internal fun DetailCallLogFragment.navigateToContact(contact: NativeContact) {
val deepLink = "linphone-android://contact/view/${contact.nativeId}" val deepLink = "linphone-android://contact/view/${contact.nativeId}"
findMasterNavController().navigate(Uri.parse(deepLink), getRightBottomToLeftTopAnimationNavOptions()) findMasterNavController().navigate(Uri.parse(deepLink))
} }
internal fun DetailCallLogFragment.navigateToFriend(friendAddress: Address) { internal fun DetailCallLogFragment.navigateToFriend(friendAddress: Address) {
val deepLink = "linphone-android://contact/new/${friendAddress.asStringUriOnly()}" val deepLink = "linphone-android://contact/new/${friendAddress.asStringUriOnly()}"
findMasterNavController().navigate(Uri.parse(deepLink), getRightToLeftAnimationNavOptions()) findMasterNavController().navigate(Uri.parse(deepLink))
} }
internal fun DetailCallLogFragment.navigateToChatRoom(args: Bundle?) { internal fun DetailCallLogFragment.navigateToChatRoom(args: Bundle?) {
@ -630,7 +496,7 @@ internal fun DetailCallLogFragment.navigateToChatRoom(args: Bundle?) {
findMasterNavController().navigate( findMasterNavController().navigate(
R.id.action_global_masterChatRoomsFragment, R.id.action_global_masterChatRoomsFragment,
args, args,
getRightBottomToLeftTopAnimationNavOptions() popupTo(R.id.masterChatRoomsFragment, true)
) )
} }
} }
@ -640,7 +506,7 @@ internal fun DetailCallLogFragment.navigateToDialer(args: Bundle?) {
findMasterNavController().navigate( findMasterNavController().navigate(
R.id.action_global_dialerFragment, R.id.action_global_dialerFragment,
args, args,
getRightToLeftAnimationNavOptions() popupTo(R.id.dialerFragment, true)
) )
} }
} }
@ -650,7 +516,7 @@ internal fun DetailCallLogFragment.navigateToEmptyCallHistory() {
findNavController().navigate( findNavController().navigate(
R.id.action_global_emptyFragment, R.id.action_global_emptyFragment,
null, null,
getLeftToRightAnimationNavOptions() popupTo(R.id.emptyCallHistoryFragment, true)
) )
} }
} }
@ -668,7 +534,7 @@ internal fun SettingsFragment.navigateToAccountSettings(
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_accountSettingsFragment, R.id.action_global_accountSettingsFragment,
bundle, bundle,
computeSlidingPaneNavOptions(slidingPane) popupTo(R.id.accountSettingsFragment, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -681,7 +547,7 @@ internal fun SettingsFragment.navigateToTunnelSettings(slidingPane: SlidingPaneL
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_tunnelSettingsFragment, R.id.action_global_tunnelSettingsFragment,
null, null,
computeSlidingPaneNavOptions(slidingPane) popupTo(R.id.tunnelSettingsFragment, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -694,7 +560,7 @@ internal fun SettingsFragment.navigateToAudioSettings(slidingPane: SlidingPaneLa
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_audioSettingsFragment, R.id.action_global_audioSettingsFragment,
null, null,
computeSlidingPaneNavOptions(slidingPane) popupTo(R.id.audioSettingsFragment, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -707,7 +573,7 @@ internal fun SettingsFragment.navigateToVideoSettings(slidingPane: SlidingPaneLa
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_videoSettingsFragment, R.id.action_global_videoSettingsFragment,
null, null,
computeSlidingPaneNavOptions(slidingPane) popupTo(R.id.videoSettingsFragment, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -720,7 +586,7 @@ internal fun SettingsFragment.navigateToCallSettings(slidingPane: SlidingPaneLay
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_callSettingsFragment, R.id.action_global_callSettingsFragment,
null, null,
computeSlidingPaneNavOptions(slidingPane) popupTo(R.id.callSettingsFragment, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -733,7 +599,7 @@ internal fun SettingsFragment.navigateToChatSettings(slidingPane: SlidingPaneLay
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_chatSettingsFragment, R.id.action_global_chatSettingsFragment,
null, null,
computeSlidingPaneNavOptions(slidingPane) popupTo(R.id.chatSettingsFragment, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -746,7 +612,7 @@ internal fun SettingsFragment.navigateToNetworkSettings(slidingPane: SlidingPane
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_networkSettingsFragment, R.id.action_global_networkSettingsFragment,
null, null,
computeSlidingPaneNavOptions(slidingPane) popupTo(R.id.networkSettingsFragment, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -759,7 +625,7 @@ internal fun SettingsFragment.navigateToContactsSettings(slidingPane: SlidingPan
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_contactsSettingsFragment, R.id.action_global_contactsSettingsFragment,
null, null,
computeSlidingPaneNavOptions(slidingPane) popupTo(R.id.contactsSettingsFragment, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -772,7 +638,7 @@ internal fun SettingsFragment.navigateToAdvancedSettings(slidingPane: SlidingPan
navHostFragment.navController.navigate( navHostFragment.navController.navigate(
R.id.action_global_advancedSettingsFragment, R.id.action_global_advancedSettingsFragment,
null, null,
computeSlidingPaneNavOptions(slidingPane) popupTo(R.id.advancedSettingsFragment, true)
) )
if (!slidingPane.isOpen) slidingPane.openPane() if (!slidingPane.isOpen) slidingPane.openPane()
} }
@ -802,7 +668,7 @@ internal fun navigateToEmptySetting(navController: NavController) {
navController.navigate( navController.navigate(
R.id.action_global_emptySettingsFragment, R.id.action_global_emptySettingsFragment,
null, null,
getLeftToRightAnimationNavOptions() popupTo(R.id.emptySettingsFragment, true)
) )
} }
@ -846,14 +712,14 @@ internal fun VideoSettingsFragment.navigateToEmptySetting() {
internal fun SideMenuFragment.navigateToAccountSettings(identity: String) { internal fun SideMenuFragment.navigateToAccountSettings(identity: String) {
val deepLink = "linphone-android://settings/$identity" val deepLink = "linphone-android://settings/$identity"
findNavController().navigate(Uri.parse(deepLink), getRightToLeftAnimationNavOptions()) findNavController().navigate(Uri.parse(deepLink))
} }
internal fun SideMenuFragment.navigateToSettings() { internal fun SideMenuFragment.navigateToSettings() {
findNavController().navigate( findNavController().navigate(
R.id.action_global_settingsFragment, R.id.action_global_settingsFragment,
null, null,
getRightToLeftAnimationNavOptions(R.id.settingsFragment) popupTo(R.id.settingsFragment, true)
) )
} }
@ -861,7 +727,7 @@ internal fun SideMenuFragment.navigateToAbout() {
findNavController().navigate( findNavController().navigate(
R.id.action_global_aboutFragment, R.id.action_global_aboutFragment,
null, null,
getRightToLeftAnimationNavOptions(R.id.aboutFragment) popupTo(R.id.aboutFragment, true)
) )
} }
@ -869,7 +735,7 @@ internal fun SideMenuFragment.navigateToRecordings() {
findNavController().navigate( findNavController().navigate(
R.id.action_global_recordingsFragment, R.id.action_global_recordingsFragment,
null, null,
getRightToLeftAnimationNavOptions(R.id.recordingsFragment) popupTo(R.id.recordingsFragment, true)
) )
} }
@ -880,7 +746,7 @@ internal fun WelcomeFragment.navigateToEmailAccountCreation() {
findNavController().navigate( findNavController().navigate(
R.id.action_welcomeFragment_to_emailAccountCreationFragment, R.id.action_welcomeFragment_to_emailAccountCreationFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -890,7 +756,7 @@ internal fun WelcomeFragment.navigateToPhoneAccountCreation() {
findNavController().navigate( findNavController().navigate(
R.id.action_welcomeFragment_to_phoneAccountCreationFragment, R.id.action_welcomeFragment_to_phoneAccountCreationFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -900,7 +766,7 @@ internal fun WelcomeFragment.navigateToAccountLogin() {
findNavController().navigate( findNavController().navigate(
R.id.action_welcomeFragment_to_accountLoginFragment, R.id.action_welcomeFragment_to_accountLoginFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -910,7 +776,7 @@ internal fun WelcomeFragment.navigateToGenericLogin() {
findNavController().navigate( findNavController().navigate(
R.id.action_welcomeFragment_to_genericAccountLoginFragment, R.id.action_welcomeFragment_to_genericAccountLoginFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -920,7 +786,7 @@ internal fun WelcomeFragment.navigateToRemoteProvisioning() {
findNavController().navigate( findNavController().navigate(
R.id.action_welcomeFragment_to_remoteProvisioningFragment, R.id.action_welcomeFragment_to_remoteProvisioningFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -930,7 +796,7 @@ internal fun AccountLoginFragment.navigateToEchoCancellerCalibration() {
findNavController().navigate( findNavController().navigate(
R.id.action_accountLoginFragment_to_echoCancellerCalibrationFragment, R.id.action_accountLoginFragment_to_echoCancellerCalibrationFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -940,7 +806,7 @@ internal fun AccountLoginFragment.navigateToPhoneAccountValidation(args: Bundle?
findNavController().navigate( findNavController().navigate(
R.id.action_accountLoginFragment_to_phoneAccountValidationFragment, R.id.action_accountLoginFragment_to_phoneAccountValidationFragment,
args, args,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -950,7 +816,7 @@ internal fun GenericAccountLoginFragment.navigateToEchoCancellerCalibration() {
findNavController().navigate( findNavController().navigate(
R.id.action_genericAccountLoginFragment_to_echoCancellerCalibrationFragment, R.id.action_genericAccountLoginFragment_to_echoCancellerCalibrationFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -960,7 +826,7 @@ internal fun RemoteProvisioningFragment.navigateToQrCode() {
findNavController().navigate( findNavController().navigate(
R.id.action_remoteProvisioningFragment_to_qrCodeFragment, R.id.action_remoteProvisioningFragment_to_qrCodeFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -970,7 +836,7 @@ internal fun RemoteProvisioningFragment.navigateToEchoCancellerCalibration() {
findNavController().navigate( findNavController().navigate(
R.id.action_remoteProvisioningFragment_to_echoCancellerCalibrationFragment, R.id.action_remoteProvisioningFragment_to_echoCancellerCalibrationFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -980,7 +846,7 @@ internal fun EmailAccountCreationFragment.navigateToEmailAccountValidation() {
findNavController().navigate( findNavController().navigate(
R.id.action_emailAccountCreationFragment_to_emailAccountValidationFragment, R.id.action_emailAccountCreationFragment_to_emailAccountValidationFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -990,7 +856,7 @@ internal fun EmailAccountValidationFragment.navigateToAccountLinking(args: Bundl
findNavController().navigate( findNavController().navigate(
R.id.action_emailAccountValidationFragment_to_phoneAccountLinkingFragment, R.id.action_emailAccountValidationFragment_to_phoneAccountLinkingFragment,
args, args,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -1000,7 +866,7 @@ internal fun PhoneAccountCreationFragment.navigateToPhoneAccountValidation(args:
findNavController().navigate( findNavController().navigate(
R.id.action_phoneAccountCreationFragment_to_phoneAccountValidationFragment, R.id.action_phoneAccountCreationFragment_to_phoneAccountValidationFragment,
args, args,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -1010,7 +876,7 @@ internal fun PhoneAccountValidationFragment.navigateToAccountSettings(args: Bund
findNavController().navigate( findNavController().navigate(
R.id.action_phoneAccountValidationFragment_to_accountSettingsFragment, R.id.action_phoneAccountValidationFragment_to_accountSettingsFragment,
args, args,
getLeftToRightAnimationNavOptions(R.id.accountSettingsFragment, true) popupTo(R.id.accountSettingsFragment, true)
) )
} }
} }
@ -1020,7 +886,7 @@ internal fun PhoneAccountValidationFragment.navigateToEchoCancellerCalibration()
findNavController().navigate( findNavController().navigate(
R.id.action_phoneAccountValidationFragment_to_echoCancellerCalibrationFragment, R.id.action_phoneAccountValidationFragment_to_echoCancellerCalibrationFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }
@ -1030,7 +896,7 @@ internal fun PhoneAccountLinkingFragment.navigateToEchoCancellerCalibration() {
findNavController().navigate( findNavController().navigate(
R.id.action_phoneAccountLinkingFragment_to_echoCancellerCalibrationFragment, R.id.action_phoneAccountLinkingFragment_to_echoCancellerCalibrationFragment,
null, null,
getRightToLeftAnimationNavOptions() popupTo()
) )
} }
} }

View file

@ -46,7 +46,7 @@ class AccountLoginFragment : AbstractPhoneFragment<AssistantAccountLoginFragment
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedAssistantViewModel::class.java) ViewModelProvider(this).get(SharedAssistantViewModel::class.java)

View file

@ -38,7 +38,7 @@ class EchoCancellerCalibrationFragment : GenericFragment<AssistantEchoCancellerC
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
viewModel = ViewModelProvider(this).get(EchoCancellerCalibrationViewModel::class.java) viewModel = ViewModelProvider(this).get(EchoCancellerCalibrationViewModel::class.java)
binding.viewModel = viewModel binding.viewModel = viewModel

View file

@ -40,7 +40,7 @@ class EmailAccountCreationFragment : GenericFragment<AssistantEmailAccountCreati
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedAssistantViewModel::class.java) ViewModelProvider(this).get(SharedAssistantViewModel::class.java)

View file

@ -39,7 +39,7 @@ class EmailAccountValidationFragment : GenericFragment<AssistantEmailAccountVali
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedAssistantViewModel::class.java) ViewModelProvider(this).get(SharedAssistantViewModel::class.java)

View file

@ -44,7 +44,7 @@ class GenericAccountLoginFragment : GenericFragment<AssistantGenericAccountLogin
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedAssistantViewModel::class.java) ViewModelProvider(this).get(SharedAssistantViewModel::class.java)

View file

@ -39,7 +39,7 @@ class PhoneAccountCreationFragment : AbstractPhoneFragment<AssistantPhoneAccount
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedAssistantViewModel::class.java) ViewModelProvider(this).get(SharedAssistantViewModel::class.java)

View file

@ -40,7 +40,7 @@ class PhoneAccountLinkingFragment : AbstractPhoneFragment<AssistantPhoneAccountL
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedAssistantViewModel::class.java) ViewModelProvider(this).get(SharedAssistantViewModel::class.java)

View file

@ -44,7 +44,7 @@ class PhoneAccountValidationFragment : GenericFragment<AssistantPhoneAccountVali
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedAssistantViewModel::class.java) ViewModelProvider(this).get(SharedAssistantViewModel::class.java)

View file

@ -42,7 +42,7 @@ class QrCodeFragment : GenericFragment<AssistantQrCodeFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedAssistantViewModel::class.java) ViewModelProvider(this).get(SharedAssistantViewModel::class.java)

View file

@ -41,7 +41,7 @@ class RemoteProvisioningFragment : GenericFragment<AssistantRemoteProvisioningFr
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedAssistantViewModel::class.java) ViewModelProvider(this).get(SharedAssistantViewModel::class.java)

View file

@ -22,7 +22,6 @@ package org.linphone.activities.assistant.fragments
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericFragment import org.linphone.activities.GenericFragment
import org.linphone.databinding.AssistantTopBarFragmentBinding import org.linphone.databinding.AssistantTopBarFragmentBinding
@ -33,7 +32,8 @@ class TopBarFragment : GenericFragment<AssistantTopBarFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
binding.setBackClickListener { binding.setBackClickListener {
goBack() goBack()
@ -43,12 +43,6 @@ class TopBarFragment : GenericFragment<AssistantTopBarFragmentBinding>() {
override fun goBack() { override fun goBack() {
if (!findNavController().popBackStack()) { if (!findNavController().popBackStack()) {
requireActivity().finish() requireActivity().finish()
if (corePreferences.enableAnimations) {
requireActivity().overridePendingTransition(
R.anim.enter_left,
R.anim.exit_right
)
}
} }
} }
} }

View file

@ -47,7 +47,7 @@ class WelcomeFragment : GenericFragment<AssistantWelcomeFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
viewModel = ViewModelProvider(this).get(WelcomeViewModel::class.java) viewModel = ViewModelProvider(this).get(WelcomeViewModel::class.java)
binding.viewModel = viewModel binding.viewModel = viewModel

View file

@ -65,7 +65,8 @@ class ControlsFragment : GenericFragment<CallControlsFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedCallViewModel::class.java) ViewModelProvider(this).get(SharedCallViewModel::class.java)

View file

@ -35,7 +35,8 @@ class StatisticsFragment : GenericFragment<CallStatisticsFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
viewModel = ViewModelProvider(this).get(StatisticsListViewModel::class.java) viewModel = ViewModelProvider(this).get(StatisticsListViewModel::class.java)
binding.viewModel = viewModel binding.viewModel = viewModel

View file

@ -45,7 +45,8 @@ class StatusFragment : GenericFragment<CallStatusFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
viewModel = ViewModelProvider(this).get(StatusViewModel::class.java) viewModel = ViewModelProvider(this).get(StatusViewModel::class.java)
binding.viewModel = viewModel binding.viewModel = viewModel

View file

@ -36,7 +36,7 @@ class AboutFragment : SecureFragment<AboutFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
viewModel = ViewModelProvider(this).get(AboutViewModel::class.java) viewModel = ViewModelProvider(this).get(AboutViewModel::class.java)
binding.viewModel = viewModel binding.viewModel = viewModel

View file

@ -51,12 +51,14 @@ class ChatRoomCreationFragment : SecureFragment<ChatRoomCreationFragmentBinding>
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)
} }
useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false
val createGroup = arguments?.getBoolean("createGroup") ?: false val createGroup = arguments?.getBoolean("createGroup") ?: false
viewModel = ViewModelProvider(this).get(ChatRoomCreationViewModel::class.java) viewModel = ViewModelProvider(this).get(ChatRoomCreationViewModel::class.java)
@ -174,7 +176,7 @@ class ChatRoomCreationFragment : SecureFragment<ChatRoomCreationFragmentBinding>
override fun goBack() { override fun goBack() {
if (!findNavController().popBackStack()) { if (!findNavController().popBackStack()) {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptyChatRoom() navigateToEmptyChatRoom()

View file

@ -94,13 +94,15 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)
} }
binding.sharedMainViewModel = sharedViewModel binding.sharedMainViewModel = sharedViewModel
useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false
view.doOnPreDraw { view.doOnPreDraw {
// Notifies fragment is ready to be drawn // Notifies fragment is ready to be drawn
sharedViewModel.chatRoomFragmentOpenedEvent.value = Event(true) sharedViewModel.chatRoomFragmentOpenedEvent.value = Event(true)
@ -264,7 +266,7 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
sharedViewModel.messageToForwardEvent.value = Event(chatMessage) sharedViewModel.messageToForwardEvent.value = Event(chatMessage)
sharedViewModel.isPendingMessageForward.value = true sharedViewModel.isPendingMessageForward.value = true
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
Log.i("[Chat Room] Forwarding message, going to chat rooms list") Log.i("[Chat Room] Forwarding message, going to chat rooms list")
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} }
@ -299,6 +301,7 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
{ {
it.consume { sipUri -> it.consume { sipUri ->
Log.i("[Chat Room] Going to contacts list with SIP URI to add: $sipUri") Log.i("[Chat Room] Going to contacts list with SIP URI to add: $sipUri")
sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.masterChatRoomsFragment)
navigateToContacts(sipUri) navigateToContacts(sipUri)
} }
} }
@ -527,7 +530,7 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
override fun goBack() { override fun goBack() {
if (!findNavController().popBackStack()) { if (!findNavController().popBackStack()) {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptyChatRoom() navigateToEmptyChatRoom()

View file

@ -40,7 +40,7 @@ class DevicesFragment : SecureFragment<ChatRoomDevicesFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)

View file

@ -43,7 +43,7 @@ class EphemeralFragment : SecureFragment<ChatRoomEphemeralFragmentBinding>() {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
isSecure = true isSecure = true
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)

View file

@ -54,7 +54,7 @@ class GroupInfoFragment : SecureFragment<ChatRoomGroupInfoFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)

View file

@ -47,7 +47,7 @@ class ImdnFragment : SecureFragment<ChatRoomImdnFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)

View file

@ -20,6 +20,7 @@
package org.linphone.activities.main.chat.fragments package org.linphone.activities.main.chat.fragments
import android.app.Dialog import android.app.Dialog
import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@ -30,7 +31,9 @@ import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.slidingpanelayout.widget.SlidingPaneLayout import androidx.slidingpanelayout.widget.SlidingPaneLayout
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericActivity import org.linphone.activities.GenericActivity
import org.linphone.activities.clearDisplayedChatRoom import org.linphone.activities.clearDisplayedChatRoom
@ -75,11 +78,25 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
super.onDestroyView() super.onDestroyView()
} }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
useMaterialSharedAxisXForwardAnimation = false
if (corePreferences.enableAnimations) {
val portraitOrientation = resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE
val axis = if (portraitOrientation) MaterialSharedAxis.X else MaterialSharedAxis.Y
enterTransition = MaterialSharedAxis(axis, true)
reenterTransition = MaterialSharedAxis(axis, true)
returnTransition = MaterialSharedAxis(axis, false)
exitTransition = MaterialSharedAxis(axis, false)
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
isSecure = true isSecure = true
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
listViewModel = ViewModelProvider(this).get(ChatRoomsListViewModel::class.java) listViewModel = ViewModelProvider(this).get(ChatRoomsListViewModel::class.java)
binding.viewModel = listViewModel binding.viewModel = listViewModel
@ -90,7 +107,7 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)
} }
view.doOnPreDraw { sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable } view.doOnPreDraw { sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable }
// Chat room loading can take some time, so wait until it is ready before opening the pane // Chat room loading can take some time, so wait until it is ready before opening the pane
sharedViewModel.chatRoomFragmentOpenedEvent.observe( sharedViewModel.chatRoomFragmentOpenedEvent.observe(
@ -116,7 +133,7 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
viewLifecycleOwner, viewLifecycleOwner,
{ {
it.consume { it.consume {
sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable
if (binding.slidingPane.isSlideable) { if (binding.slidingPane.isSlideable) {
val navHostFragment = childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment val navHostFragment = childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment
if (navHostFragment.navController.currentDestination?.id == R.id.emptyChatFragment) { if (navHostFragment.navController.currentDestination?.id == R.id.emptyChatFragment) {

View file

@ -58,7 +58,7 @@ class ContactEditorFragment : GenericFragment<ContactEditorFragmentBinding>(), S
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)
@ -70,6 +70,8 @@ class ContactEditorFragment : GenericFragment<ContactEditorFragmentBinding>(), S
)[ContactEditorViewModel::class.java] )[ContactEditorViewModel::class.java]
binding.viewModel = viewModel binding.viewModel = viewModel
useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false
binding.setBackClickListener { binding.setBackClickListener {
goBack() goBack()
} }
@ -110,7 +112,7 @@ class ContactEditorFragment : GenericFragment<ContactEditorFragmentBinding>(), S
override fun goBack() { override fun goBack() {
if (!findNavController().popBackStack()) { if (!findNavController().popBackStack()) {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptyContact() navigateToEmptyContact()

View file

@ -50,13 +50,15 @@ class DetailContactFragment : GenericFragment<ContactDetailFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)
} }
binding.sharedMainViewModel = sharedViewModel binding.sharedMainViewModel = sharedViewModel
useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false
val id = arguments?.getString("id") val id = arguments?.getString("id")
arguments?.clear() arguments?.clear()
if (id != null) { if (id != null) {
@ -93,6 +95,9 @@ class DetailContactFragment : GenericFragment<ContactDetailFragmentBinding>() {
it.consume { address -> it.consume { address ->
if (coreContext.core.callsNb > 0) { if (coreContext.core.callsNb > 0) {
Log.i("[Contact] Starting dialer with pre-filled URI ${address.asStringUriOnly()}, is transfer? ${sharedViewModel.pendingCallTransfer}") Log.i("[Contact] Starting dialer with pre-filled URI ${address.asStringUriOnly()}, is transfer? ${sharedViewModel.pendingCallTransfer}")
sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.dialerFragment)
sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(R.id.masterContactsFragment)
val args = Bundle() val args = Bundle()
args.putString("URI", address.asStringUriOnly()) args.putString("URI", address.asStringUriOnly())
args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer) args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer)
@ -109,6 +114,7 @@ class DetailContactFragment : GenericFragment<ContactDetailFragmentBinding>() {
viewLifecycleOwner, viewLifecycleOwner,
{ {
it.consume { chatRoom -> it.consume { chatRoom ->
sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.masterChatRoomsFragment)
val args = Bundle() val args = Bundle()
args.putString("LocalSipUri", chatRoom.localAddress.asStringUriOnly()) args.putString("LocalSipUri", chatRoom.localAddress.asStringUriOnly())
args.putString("RemoteSipUri", chatRoom.peerAddress.asStringUriOnly()) args.putString("RemoteSipUri", chatRoom.peerAddress.asStringUriOnly())
@ -140,7 +146,7 @@ class DetailContactFragment : GenericFragment<ContactDetailFragmentBinding>() {
} }
override fun goBack() { override fun goBack() {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptyContact() navigateToEmptyContact()

View file

@ -21,6 +21,7 @@ package org.linphone.activities.main.contact.fragments
import android.app.Dialog import android.app.Dialog
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@ -31,7 +32,9 @@ import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.slidingpanelayout.widget.SlidingPaneLayout import androidx.slidingpanelayout.widget.SlidingPaneLayout
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R import org.linphone.R
import org.linphone.activities.clearDisplayedContact import org.linphone.activities.clearDisplayedContact
import org.linphone.activities.main.MainActivity import org.linphone.activities.main.MainActivity
@ -67,7 +70,7 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
listViewModel = ViewModelProvider(this).get(ContactsListViewModel::class.java) listViewModel = ViewModelProvider(this).get(ContactsListViewModel::class.java)
binding.viewModel = listViewModel binding.viewModel = listViewModel
@ -78,7 +81,28 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)
} }
view.doOnPreDraw { sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable } view.doOnPreDraw { sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable }
useMaterialSharedAxisXForwardAnimation = false
sharedViewModel.updateContactsAnimationsBasedOnDestination.observe(
viewLifecycleOwner,
{
it.consume { id ->
val forward = when (id) {
R.id.dialerFragment, R.id.masterChatRoomsFragment -> false
else -> true
}
if (corePreferences.enableAnimations) {
val portraitOrientation = resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE
val axis = if (portraitOrientation) MaterialSharedAxis.X else MaterialSharedAxis.Y
enterTransition = MaterialSharedAxis(axis, forward)
reenterTransition = MaterialSharedAxis(axis, forward)
returnTransition = MaterialSharedAxis(axis, !forward)
exitTransition = MaterialSharedAxis(axis, !forward)
}
}
}
)
sharedViewModel.closeSlidingPaneEvent.observe( sharedViewModel.closeSlidingPaneEvent.observe(
viewLifecycleOwner, viewLifecycleOwner,
@ -94,7 +118,7 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
viewLifecycleOwner, viewLifecycleOwner,
{ {
it.consume { it.consume {
sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable
if (binding.slidingPane.isSlideable) { if (binding.slidingPane.isSlideable) {
val navHostFragment = childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment val navHostFragment = childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment
if (navHostFragment.navController.currentDestination?.id == R.id.emptyContactFragment) { if (navHostFragment.navController.currentDestination?.id == R.id.emptyContactFragment) {

View file

@ -38,7 +38,7 @@ class ConfigViewerFragment : SecureFragment<FileConfigViewerFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
viewModel = ViewModelProvider(this)[ConfigFileViewModel::class.java] viewModel = ViewModelProvider(this)[ConfigFileViewModel::class.java]
binding.viewModel = viewModel binding.viewModel = viewModel

View file

@ -24,11 +24,13 @@ import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.res.Configuration
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.BuildConfig import org.linphone.BuildConfig
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.LinphoneApplication.Companion.corePreferences
@ -44,6 +46,7 @@ import org.linphone.core.tools.Log
import org.linphone.databinding.DialerFragmentBinding import org.linphone.databinding.DialerFragmentBinding
import org.linphone.utils.AppUtils import org.linphone.utils.AppUtils
import org.linphone.utils.DialogUtils import org.linphone.utils.DialogUtils
import org.linphone.utils.Event
class DialerFragment : SecureFragment<DialerFragmentBinding>() { class DialerFragment : SecureFragment<DialerFragmentBinding>() {
private lateinit var viewModel: DialerViewModel private lateinit var viewModel: DialerViewModel
@ -56,7 +59,7 @@ class DialerFragment : SecureFragment<DialerFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
viewModel = ViewModelProvider(this).get(DialerViewModel::class.java) viewModel = ViewModelProvider(this).get(DialerViewModel::class.java)
binding.viewModel = viewModel binding.viewModel = viewModel
@ -65,7 +68,30 @@ class DialerFragment : SecureFragment<DialerFragmentBinding>() {
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)
} }
useMaterialSharedAxisXForwardAnimation = false
sharedViewModel.updateDialerAnimationsBasedOnDestination.observe(
viewLifecycleOwner,
{
it.consume { id ->
val forward = when (id) {
R.id.masterChatRoomsFragment -> false
else -> true
}
if (corePreferences.enableAnimations) {
val portraitOrientation = resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE
val axis = if (portraitOrientation) MaterialSharedAxis.X else MaterialSharedAxis.Y
enterTransition = MaterialSharedAxis(axis, forward)
reenterTransition = MaterialSharedAxis(axis, forward)
returnTransition = MaterialSharedAxis(axis, !forward)
exitTransition = MaterialSharedAxis(axis, !forward)
}
}
}
)
binding.setNewContactClickListener { binding.setNewContactClickListener {
sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(R.id.masterContactsFragment)
sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.dialerFragment)
navigateToContacts(viewModel.enteredUri.value) navigateToContacts(viewModel.enteredUri.value)
} }

View file

@ -43,7 +43,7 @@ class AudioViewerFragment : GenericViewerFragment<FileAudioViewerFragmentBinding
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
val content = sharedViewModel.contentToOpen.value val content = sharedViewModel.contentToOpen.value
if (content == null) { if (content == null) {

View file

@ -39,7 +39,7 @@ class ImageViewerFragment : GenericViewerFragment<FileImageViewerFragmentBinding
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
val content = sharedViewModel.contentToOpen.value val content = sharedViewModel.contentToOpen.value
if (content == null) { if (content == null) {

View file

@ -39,7 +39,7 @@ class PdfViewerFragment : GenericViewerFragment<FilePdfViewerFragmentBinding>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
val content = sharedViewModel.contentToOpen.value val content = sharedViewModel.contentToOpen.value
if (content == null) { if (content == null) {

View file

@ -37,7 +37,7 @@ class TextViewerFragment : GenericViewerFragment<FileTextViewerFragmentBinding>(
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
val content = sharedViewModel.contentToOpen.value val content = sharedViewModel.contentToOpen.value
if (content == null) { if (content == null) {

View file

@ -38,7 +38,8 @@ class TopBarFragment : GenericFragment<FileViewerTopBarFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
binding.setBackClickListener { binding.setBackClickListener {
goBack() goBack()

View file

@ -41,7 +41,7 @@ class VideoViewerFragment : GenericViewerFragment<FileVideoViewerFragmentBinding
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
val content = sharedViewModel.contentToOpen.value val content = sharedViewModel.contentToOpen.value
if (content == null) { if (content == null) {

View file

@ -24,6 +24,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.R import org.linphone.R
class EmptyFragment : Fragment() { class EmptyFragment : Fragment() {
@ -32,6 +33,8 @@ class EmptyFragment : Fragment() {
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
return inflater.inflate(R.layout.empty_fragment, container, false) return inflater.inflate(R.layout.empty_fragment, container, false)
} }
} }

View file

@ -36,7 +36,8 @@ class ListTopBarFragment : GenericFragment<ListEditTopBarFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
viewModel = ViewModelProvider(parentFragment ?: this)[ListTopBarViewModel::class.java] viewModel = ViewModelProvider(parentFragment ?: this)[ListTopBarViewModel::class.java]
binding.viewModel = viewModel binding.viewModel = viewModel

View file

@ -22,10 +22,8 @@ package org.linphone.activities.main.fragments
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.core.view.doOnPreDraw
import androidx.databinding.ViewDataBinding import androidx.databinding.ViewDataBinding
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import org.linphone.LinphoneApplication
import org.linphone.R import org.linphone.R
import org.linphone.activities.main.adapters.SelectionListAdapter import org.linphone.activities.main.adapters.SelectionListAdapter
import org.linphone.activities.main.viewmodels.DialogViewModel import org.linphone.activities.main.viewmodels.DialogViewModel
@ -52,11 +50,6 @@ abstract class MasterFragment<T : ViewDataBinding, U : SelectionListAdapter<*, *
protected open val dialogConfirmationMessageBeforeRemoval: Int = R.plurals.dialog_default_delete protected open val dialogConfirmationMessageBeforeRemoval: Int = R.plurals.dialog_default_delete
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
if (LinphoneApplication.corePreferences.enableAnimations) {
postponeEnterTransition()
view.doOnPreDraw { startPostponedEnterTransition() }
}
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
// List selection // List selection

View file

@ -40,7 +40,8 @@ class StatusFragment : GenericFragment<StatusFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
viewModel = ViewModelProvider(this).get(StatusViewModel::class.java) viewModel = ViewModelProvider(this).get(StatusViewModel::class.java)
binding.viewModel = viewModel binding.viewModel = viewModel

View file

@ -28,22 +28,30 @@ import androidx.navigation.fragment.findNavController
import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericFragment import org.linphone.activities.GenericFragment
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.main.viewmodels.TabsViewModel import org.linphone.activities.main.viewmodels.TabsViewModel
import org.linphone.activities.navigateToCallHistory import org.linphone.activities.navigateToCallHistory
import org.linphone.activities.navigateToChatRooms import org.linphone.activities.navigateToChatRooms
import org.linphone.activities.navigateToContacts import org.linphone.activities.navigateToContacts
import org.linphone.activities.navigateToDialer import org.linphone.activities.navigateToDialer
import org.linphone.databinding.TabsFragmentBinding import org.linphone.databinding.TabsFragmentBinding
import org.linphone.utils.Event
class TabsFragment : GenericFragment<TabsFragmentBinding>(), NavController.OnDestinationChangedListener { class TabsFragment : GenericFragment<TabsFragmentBinding>(), NavController.OnDestinationChangedListener {
private lateinit var viewModel: TabsViewModel private lateinit var viewModel: TabsViewModel
private lateinit var sharedViewModel: SharedMainViewModel
override fun getLayoutId(): Int = R.layout.tabs_fragment override fun getLayoutId(): Int = R.layout.tabs_fragment
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
}
viewModel = requireActivity().run { viewModel = requireActivity().run {
ViewModelProvider(this).get(TabsViewModel::class.java) ViewModelProvider(this).get(TabsViewModel::class.java)
@ -51,18 +59,34 @@ class TabsFragment : GenericFragment<TabsFragmentBinding>(), NavController.OnDes
binding.viewModel = viewModel binding.viewModel = viewModel
binding.setHistoryClickListener { binding.setHistoryClickListener {
when (findNavController().currentDestination?.id) {
R.id.masterContactsFragment -> sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.masterCallLogsFragment)
R.id.dialerFragment -> sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(R.id.masterCallLogsFragment)
}
navigateToCallHistory() navigateToCallHistory()
} }
binding.setContactsClickListener { binding.setContactsClickListener {
when (findNavController().currentDestination?.id) {
R.id.dialerFragment -> sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(R.id.masterContactsFragment)
}
sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(findNavController().currentDestination?.id ?: -1)
navigateToContacts() navigateToContacts()
} }
binding.setDialerClickListener { binding.setDialerClickListener {
when (findNavController().currentDestination?.id) {
R.id.masterContactsFragment -> sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.dialerFragment)
}
sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(findNavController().currentDestination?.id ?: -1)
navigateToDialer() navigateToDialer()
} }
binding.setChatClickListener { binding.setChatClickListener {
when (findNavController().currentDestination?.id) {
R.id.masterContactsFragment -> sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.masterChatRoomsFragment)
R.id.dialerFragment -> sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(R.id.masterChatRoomsFragment)
}
navigateToChatRooms() navigateToChatRooms()
} }
} }

View file

@ -47,7 +47,7 @@ class DetailCallLogFragment : GenericFragment<HistoryDetailFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run { sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)
@ -68,6 +68,8 @@ class DetailCallLogFragment : GenericFragment<HistoryDetailFragmentBinding>() {
)[CallLogViewModel::class.java] )[CallLogViewModel::class.java]
binding.viewModel = viewModel binding.viewModel = viewModel
useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false
viewModel.relatedCallLogs.value = callLogGroup.callLogs viewModel.relatedCallLogs.value = callLogGroup.callLogs
binding.setBackClickListener { binding.setBackClickListener {
@ -78,10 +80,12 @@ class DetailCallLogFragment : GenericFragment<HistoryDetailFragmentBinding>() {
val copy = viewModel.callLog.remoteAddress.clone() val copy = viewModel.callLog.remoteAddress.clone()
copy.clean() copy.clean()
Log.i("[History] Creating contact with SIP URI: ${copy.asStringUriOnly()}") Log.i("[History] Creating contact with SIP URI: ${copy.asStringUriOnly()}")
sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.masterCallLogsFragment)
navigateToContacts(copy.asStringUriOnly()) navigateToContacts(copy.asStringUriOnly())
} }
binding.setContactClickListener { binding.setContactClickListener {
sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.masterCallLogsFragment)
val contact = viewModel.contact.value as? NativeContact val contact = viewModel.contact.value as? NativeContact
if (contact != null) { if (contact != null) {
Log.i("[History] Displaying contact $contact") Log.i("[History] Displaying contact $contact")
@ -101,6 +105,8 @@ class DetailCallLogFragment : GenericFragment<HistoryDetailFragmentBinding>() {
val address = callLog.remoteAddress val address = callLog.remoteAddress
if (coreContext.core.callsNb > 0) { if (coreContext.core.callsNb > 0) {
Log.i("[History] Starting dialer with pre-filled URI ${address.asStringUriOnly()}, is transfer? ${sharedViewModel.pendingCallTransfer}") Log.i("[History] Starting dialer with pre-filled URI ${address.asStringUriOnly()}, is transfer? ${sharedViewModel.pendingCallTransfer}")
sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(R.id.masterCallLogsFragment)
val args = Bundle() val args = Bundle()
args.putString("URI", address.asStringUriOnly()) args.putString("URI", address.asStringUriOnly())
args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer) args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer)
@ -140,7 +146,7 @@ class DetailCallLogFragment : GenericFragment<HistoryDetailFragmentBinding>() {
} }
override fun goBack() { override fun goBack() {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptyCallHistory() navigateToEmptyCallHistory()

View file

@ -20,6 +20,7 @@
package org.linphone.activities.main.history.fragments package org.linphone.activities.main.history.fragments
import android.app.Dialog import android.app.Dialog
import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@ -30,7 +31,9 @@ import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.slidingpanelayout.widget.SlidingPaneLayout import androidx.slidingpanelayout.widget.SlidingPaneLayout
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R import org.linphone.R
import org.linphone.activities.clearDisplayedCallHistory import org.linphone.activities.clearDisplayedCallHistory
import org.linphone.activities.main.fragments.MasterFragment import org.linphone.activities.main.fragments.MasterFragment
@ -67,10 +70,24 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
super.onDestroyView() super.onDestroyView()
} }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
useMaterialSharedAxisXForwardAnimation = false
if (corePreferences.enableAnimations) {
val portraitOrientation = resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE
val axis = if (portraitOrientation) MaterialSharedAxis.X else MaterialSharedAxis.Y
enterTransition = MaterialSharedAxis(axis, false)
reenterTransition = MaterialSharedAxis(axis, false)
returnTransition = MaterialSharedAxis(axis, true)
exitTransition = MaterialSharedAxis(axis, true)
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
listViewModel = ViewModelProvider(this).get(CallLogsListViewModel::class.java) listViewModel = ViewModelProvider(this).get(CallLogsListViewModel::class.java)
binding.viewModel = listViewModel binding.viewModel = listViewModel
@ -81,7 +98,7 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)
} }
view.doOnPreDraw { sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable } view.doOnPreDraw { sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable }
sharedViewModel.closeSlidingPaneEvent.observe( sharedViewModel.closeSlidingPaneEvent.observe(
viewLifecycleOwner, viewLifecycleOwner,
@ -97,7 +114,7 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
viewLifecycleOwner, viewLifecycleOwner,
{ {
it.consume { it.consume {
sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable
if (binding.slidingPane.isSlideable) { if (binding.slidingPane.isSlideable) {
val navHostFragment = childFragmentManager.findFragmentById(R.id.history_nav_container) as NavHostFragment val navHostFragment = childFragmentManager.findFragmentById(R.id.history_nav_container) as NavHostFragment
if (navHostFragment.navController.currentDestination?.id == R.id.emptyCallHistoryFragment) { if (navHostFragment.navController.currentDestination?.id == R.id.emptyCallHistoryFragment) {
@ -245,6 +262,7 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
val remoteAddress = callLogGroup.lastCallLog.remoteAddress val remoteAddress = callLogGroup.lastCallLog.remoteAddress
if (coreContext.core.callsNb > 0) { if (coreContext.core.callsNb > 0) {
Log.i("[History] Starting dialer with pre-filled URI ${remoteAddress.asStringUriOnly()}, is transfer? ${sharedViewModel.pendingCallTransfer}") Log.i("[History] Starting dialer with pre-filled URI ${remoteAddress.asStringUriOnly()}, is transfer? ${sharedViewModel.pendingCallTransfer}")
sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(R.id.masterCallLogsFragment)
val args = Bundle() val args = Bundle()
args.putString("URI", remoteAddress.asStringUriOnly()) args.putString("URI", remoteAddress.asStringUriOnly())
args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer) args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer)

View file

@ -49,7 +49,7 @@ class RecordingsFragment : MasterFragment<RecordingsFragmentBinding, RecordingsL
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
viewModel = ViewModelProvider(this).get(RecordingsViewModel::class.java) viewModel = ViewModelProvider(this).get(RecordingsViewModel::class.java)
binding.viewModel = viewModel binding.viewModel = viewModel

View file

@ -23,18 +23,15 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.viewmodels.AccountSettingsViewModel import org.linphone.activities.main.settings.viewmodels.AccountSettingsViewModel
import org.linphone.activities.main.settings.viewmodels.AccountSettingsViewModelFactory import org.linphone.activities.main.settings.viewmodels.AccountSettingsViewModelFactory
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting import org.linphone.activities.navigateToEmptySetting
import org.linphone.activities.navigateToPhoneLinking import org.linphone.activities.navigateToPhoneLinking
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.databinding.SettingsAccountFragmentBinding import org.linphone.databinding.SettingsAccountFragmentBinding
import org.linphone.utils.Event import org.linphone.utils.Event
class AccountSettingsFragment : GenericFragment<SettingsAccountFragmentBinding>() { class AccountSettingsFragment : GenericSettingFragment<SettingsAccountFragmentBinding>() {
private lateinit var sharedViewModel: SharedMainViewModel
private lateinit var viewModel: AccountSettingsViewModel private lateinit var viewModel: AccountSettingsViewModel
override fun getLayoutId(): Int = R.layout.settings_account_fragment override fun getLayoutId(): Int = R.layout.settings_account_fragment
@ -42,11 +39,7 @@ class AccountSettingsFragment : GenericFragment<SettingsAccountFragmentBinding>(
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
}
binding.sharedMainViewModel = sharedViewModel binding.sharedMainViewModel = sharedViewModel
val identity = arguments?.getString("Identity") val identity = arguments?.getString("Identity")
@ -100,7 +93,7 @@ class AccountSettingsFragment : GenericFragment<SettingsAccountFragmentBinding>(
} }
override fun goBack() { override fun goBack() {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptySetting() navigateToEmptySetting()

View file

@ -28,10 +28,8 @@ import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.MainActivity import org.linphone.activities.main.MainActivity
import org.linphone.activities.main.settings.viewmodels.AdvancedSettingsViewModel import org.linphone.activities.main.settings.viewmodels.AdvancedSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting import org.linphone.activities.navigateToEmptySetting
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.core.tools.compatibility.DeviceUtils import org.linphone.core.tools.compatibility.DeviceUtils
@ -40,8 +38,7 @@ import org.linphone.utils.AppUtils
import org.linphone.utils.Event import org.linphone.utils.Event
import org.linphone.utils.PowerManagerUtils import org.linphone.utils.PowerManagerUtils
class AdvancedSettingsFragment : GenericFragment<SettingsAdvancedFragmentBinding>() { class AdvancedSettingsFragment : GenericSettingFragment<SettingsAdvancedFragmentBinding>() {
private lateinit var sharedViewModel: SharedMainViewModel
private lateinit var viewModel: AdvancedSettingsViewModel private lateinit var viewModel: AdvancedSettingsViewModel
override fun getLayoutId(): Int = R.layout.settings_advanced_fragment override fun getLayoutId(): Int = R.layout.settings_advanced_fragment
@ -49,11 +46,7 @@ class AdvancedSettingsFragment : GenericFragment<SettingsAdvancedFragmentBinding
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
}
binding.sharedMainViewModel = sharedViewModel binding.sharedMainViewModel = sharedViewModel
viewModel = ViewModelProvider(this).get(AdvancedSettingsViewModel::class.java) viewModel = ViewModelProvider(this).get(AdvancedSettingsViewModel::class.java)
@ -162,7 +155,7 @@ class AdvancedSettingsFragment : GenericFragment<SettingsAdvancedFragmentBinding
} }
override fun goBack() { override fun goBack() {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptySetting() navigateToEmptySetting()

View file

@ -29,18 +29,15 @@ import androidx.lifecycle.ViewModelProvider
import org.linphone.BR import org.linphone.BR
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.SettingListenerStub import org.linphone.activities.main.settings.SettingListenerStub
import org.linphone.activities.main.settings.viewmodels.AudioSettingsViewModel import org.linphone.activities.main.settings.viewmodels.AudioSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting import org.linphone.activities.navigateToEmptySetting
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.databinding.SettingsAudioFragmentBinding import org.linphone.databinding.SettingsAudioFragmentBinding
import org.linphone.utils.Event import org.linphone.utils.Event
import org.linphone.utils.PermissionHelper import org.linphone.utils.PermissionHelper
class AudioSettingsFragment : GenericFragment<SettingsAudioFragmentBinding>() { class AudioSettingsFragment : GenericSettingFragment<SettingsAudioFragmentBinding>() {
private lateinit var sharedViewModel: SharedMainViewModel
private lateinit var viewModel: AudioSettingsViewModel private lateinit var viewModel: AudioSettingsViewModel
override fun getLayoutId(): Int = R.layout.settings_audio_fragment override fun getLayoutId(): Int = R.layout.settings_audio_fragment
@ -48,11 +45,7 @@ class AudioSettingsFragment : GenericFragment<SettingsAudioFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
}
binding.sharedMainViewModel = sharedViewModel binding.sharedMainViewModel = sharedViewModel
viewModel = ViewModelProvider(this).get(AudioSettingsViewModel::class.java) viewModel = ViewModelProvider(this).get(AudioSettingsViewModel::class.java)
@ -121,14 +114,14 @@ class AudioSettingsFragment : GenericFragment<SettingsAudioFragmentBinding>() {
} }
} }
) )
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
list.add(binding) list.add(binding)
} }
viewModel.audioCodecs.value = list viewModel.audioCodecs.value = list
} }
override fun goBack() { override fun goBack() {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptySetting() navigateToEmptySetting()

View file

@ -27,17 +27,14 @@ import android.provider.Settings
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.viewmodels.CallSettingsViewModel import org.linphone.activities.main.settings.viewmodels.CallSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting import org.linphone.activities.navigateToEmptySetting
import org.linphone.compatibility.Compatibility import org.linphone.compatibility.Compatibility
import org.linphone.databinding.SettingsCallFragmentBinding import org.linphone.databinding.SettingsCallFragmentBinding
import org.linphone.mediastream.Version import org.linphone.mediastream.Version
import org.linphone.utils.Event import org.linphone.utils.Event
class CallSettingsFragment : GenericFragment<SettingsCallFragmentBinding>() { class CallSettingsFragment : GenericSettingFragment<SettingsCallFragmentBinding>() {
private lateinit var sharedViewModel: SharedMainViewModel
private lateinit var viewModel: CallSettingsViewModel private lateinit var viewModel: CallSettingsViewModel
override fun getLayoutId(): Int = R.layout.settings_call_fragment override fun getLayoutId(): Int = R.layout.settings_call_fragment
@ -45,11 +42,7 @@ class CallSettingsFragment : GenericFragment<SettingsCallFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
}
binding.sharedMainViewModel = sharedViewModel binding.sharedMainViewModel = sharedViewModel
viewModel = ViewModelProvider(this).get(CallSettingsViewModel::class.java) viewModel = ViewModelProvider(this).get(CallSettingsViewModel::class.java)
@ -101,7 +94,7 @@ class CallSettingsFragment : GenericFragment<SettingsCallFragmentBinding>() {
} }
override fun goBack() { override fun goBack() {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptySetting() navigateToEmptySetting()

View file

@ -26,17 +26,14 @@ import android.provider.Settings
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.viewmodels.ChatSettingsViewModel import org.linphone.activities.main.settings.viewmodels.ChatSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting import org.linphone.activities.navigateToEmptySetting
import org.linphone.compatibility.Compatibility import org.linphone.compatibility.Compatibility
import org.linphone.databinding.SettingsChatFragmentBinding import org.linphone.databinding.SettingsChatFragmentBinding
import org.linphone.mediastream.Version import org.linphone.mediastream.Version
import org.linphone.utils.Event import org.linphone.utils.Event
class ChatSettingsFragment : GenericFragment<SettingsChatFragmentBinding>() { class ChatSettingsFragment : GenericSettingFragment<SettingsChatFragmentBinding>() {
private lateinit var sharedViewModel: SharedMainViewModel
private lateinit var viewModel: ChatSettingsViewModel private lateinit var viewModel: ChatSettingsViewModel
override fun getLayoutId(): Int = R.layout.settings_chat_fragment override fun getLayoutId(): Int = R.layout.settings_chat_fragment
@ -44,11 +41,7 @@ class ChatSettingsFragment : GenericFragment<SettingsChatFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
}
binding.sharedMainViewModel = sharedViewModel binding.sharedMainViewModel = sharedViewModel
viewModel = ViewModelProvider(this).get(ChatSettingsViewModel::class.java) viewModel = ViewModelProvider(this).get(ChatSettingsViewModel::class.java)
@ -93,7 +86,7 @@ class ChatSettingsFragment : GenericFragment<SettingsChatFragmentBinding>() {
} }
override fun goBack() { override fun goBack() {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptySetting() navigateToEmptySetting()

View file

@ -26,9 +26,7 @@ import androidx.lifecycle.ViewModelProvider
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.viewmodels.ContactsSettingsViewModel import org.linphone.activities.main.settings.viewmodels.ContactsSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting import org.linphone.activities.navigateToEmptySetting
import org.linphone.compatibility.Compatibility import org.linphone.compatibility.Compatibility
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
@ -36,8 +34,7 @@ import org.linphone.databinding.SettingsContactsFragmentBinding
import org.linphone.utils.Event import org.linphone.utils.Event
import org.linphone.utils.PermissionHelper import org.linphone.utils.PermissionHelper
class ContactsSettingsFragment : GenericFragment<SettingsContactsFragmentBinding>() { class ContactsSettingsFragment : GenericSettingFragment<SettingsContactsFragmentBinding>() {
private lateinit var sharedViewModel: SharedMainViewModel
private lateinit var viewModel: ContactsSettingsViewModel private lateinit var viewModel: ContactsSettingsViewModel
override fun getLayoutId(): Int = R.layout.settings_contacts_fragment override fun getLayoutId(): Int = R.layout.settings_contacts_fragment
@ -45,11 +42,7 @@ class ContactsSettingsFragment : GenericFragment<SettingsContactsFragmentBinding
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
}
binding.sharedMainViewModel = sharedViewModel binding.sharedMainViewModel = sharedViewModel
viewModel = ViewModelProvider(this).get(ContactsSettingsViewModel::class.java) viewModel = ViewModelProvider(this).get(ContactsSettingsViewModel::class.java)
@ -120,7 +113,7 @@ class ContactsSettingsFragment : GenericFragment<SettingsContactsFragmentBinding
} }
override fun goBack() { override fun goBack() {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptySetting() navigateToEmptySetting()

View file

@ -0,0 +1,41 @@
/*
* Copyright (c) 2010-2021 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.settings.fragments
import android.os.Bundle
import android.view.View
import androidx.databinding.ViewDataBinding
import androidx.lifecycle.ViewModelProvider
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.viewmodels.SharedMainViewModel
abstract class GenericSettingFragment<T : ViewDataBinding> : GenericFragment<T>() {
protected lateinit var sharedViewModel: SharedMainViewModel
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
}
useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false
super.onViewCreated(view, savedInstanceState)
}
}

View file

@ -23,15 +23,12 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.viewmodels.NetworkSettingsViewModel import org.linphone.activities.main.settings.viewmodels.NetworkSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting import org.linphone.activities.navigateToEmptySetting
import org.linphone.databinding.SettingsNetworkFragmentBinding import org.linphone.databinding.SettingsNetworkFragmentBinding
import org.linphone.utils.Event import org.linphone.utils.Event
class NetworkSettingsFragment : GenericFragment<SettingsNetworkFragmentBinding>() { class NetworkSettingsFragment : GenericSettingFragment<SettingsNetworkFragmentBinding>() {
private lateinit var sharedViewModel: SharedMainViewModel
private lateinit var viewModel: NetworkSettingsViewModel private lateinit var viewModel: NetworkSettingsViewModel
override fun getLayoutId(): Int = R.layout.settings_network_fragment override fun getLayoutId(): Int = R.layout.settings_network_fragment
@ -39,11 +36,7 @@ class NetworkSettingsFragment : GenericFragment<SettingsNetworkFragmentBinding>(
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
}
binding.sharedMainViewModel = sharedViewModel binding.sharedMainViewModel = sharedViewModel
viewModel = ViewModelProvider(this).get(NetworkSettingsViewModel::class.java) viewModel = ViewModelProvider(this).get(NetworkSettingsViewModel::class.java)
@ -53,7 +46,7 @@ class NetworkSettingsFragment : GenericFragment<SettingsNetworkFragmentBinding>(
} }
override fun goBack() { override fun goBack() {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptySetting() navigateToEmptySetting()

View file

@ -25,6 +25,8 @@ import androidx.core.view.doOnPreDraw
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import androidx.slidingpanelayout.widget.SlidingPaneLayout import androidx.slidingpanelayout.widget.SlidingPaneLayout
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R import org.linphone.R
import org.linphone.activities.* import org.linphone.activities.*
import org.linphone.activities.main.fragments.SecureFragment import org.linphone.activities.main.fragments.SecureFragment
@ -47,7 +49,15 @@ class SettingsFragment : SecureFragment<SettingsFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
if (corePreferences.enableAnimations) {
enterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true)
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Z, true)
returnTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
exitTransition = MaterialSharedAxis(MaterialSharedAxis.Z, false)
}
/* Shared view model & sliding pane related */ /* Shared view model & sliding pane related */
@ -55,7 +65,7 @@ class SettingsFragment : SecureFragment<SettingsFragmentBinding>() {
ViewModelProvider(this).get(SharedMainViewModel::class.java) ViewModelProvider(this).get(SharedMainViewModel::class.java)
} }
view.doOnPreDraw { sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable } view.doOnPreDraw { sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable }
sharedViewModel.closeSlidingPaneEvent.observe( sharedViewModel.closeSlidingPaneEvent.observe(
viewLifecycleOwner, viewLifecycleOwner,
@ -71,7 +81,7 @@ class SettingsFragment : SecureFragment<SettingsFragmentBinding>() {
viewLifecycleOwner, viewLifecycleOwner,
{ {
it.consume { it.consume {
sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable
if (binding.slidingPane.isSlideable) { if (binding.slidingPane.isSlideable) {
val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment
if (navHostFragment.navController.currentDestination?.id == R.id.emptySettingsFragment) { if (navHostFragment.navController.currentDestination?.id == R.id.emptySettingsFragment) {

View file

@ -23,15 +23,12 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.viewmodels.TunnelSettingsViewModel import org.linphone.activities.main.settings.viewmodels.TunnelSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting import org.linphone.activities.navigateToEmptySetting
import org.linphone.databinding.SettingsTunnelFragmentBinding import org.linphone.databinding.SettingsTunnelFragmentBinding
import org.linphone.utils.Event import org.linphone.utils.Event
class TunnelSettingsFragment : GenericFragment<SettingsTunnelFragmentBinding>() { class TunnelSettingsFragment : GenericSettingFragment<SettingsTunnelFragmentBinding>() {
private lateinit var sharedViewModel: SharedMainViewModel
private lateinit var viewModel: TunnelSettingsViewModel private lateinit var viewModel: TunnelSettingsViewModel
override fun getLayoutId(): Int = R.layout.settings_tunnel_fragment override fun getLayoutId(): Int = R.layout.settings_tunnel_fragment
@ -39,11 +36,7 @@ class TunnelSettingsFragment : GenericFragment<SettingsTunnelFragmentBinding>()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
}
binding.sharedMainViewModel = sharedViewModel binding.sharedMainViewModel = sharedViewModel
viewModel = ViewModelProvider(this).get(TunnelSettingsViewModel::class.java) viewModel = ViewModelProvider(this).get(TunnelSettingsViewModel::class.java)
@ -53,7 +46,7 @@ class TunnelSettingsFragment : GenericFragment<SettingsTunnelFragmentBinding>()
} }
override fun goBack() { override fun goBack() {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptySetting() navigateToEmptySetting()

View file

@ -29,18 +29,15 @@ import androidx.lifecycle.ViewModelProvider
import org.linphone.BR import org.linphone.BR
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.settings.SettingListenerStub import org.linphone.activities.main.settings.SettingListenerStub
import org.linphone.activities.main.settings.viewmodels.VideoSettingsViewModel import org.linphone.activities.main.settings.viewmodels.VideoSettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToEmptySetting import org.linphone.activities.navigateToEmptySetting
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.databinding.SettingsVideoFragmentBinding import org.linphone.databinding.SettingsVideoFragmentBinding
import org.linphone.utils.Event import org.linphone.utils.Event
import org.linphone.utils.PermissionHelper import org.linphone.utils.PermissionHelper
class VideoSettingsFragment : GenericFragment<SettingsVideoFragmentBinding>() { class VideoSettingsFragment : GenericSettingFragment<SettingsVideoFragmentBinding>() {
private lateinit var sharedViewModel: SharedMainViewModel
private lateinit var viewModel: VideoSettingsViewModel private lateinit var viewModel: VideoSettingsViewModel
override fun getLayoutId(): Int = R.layout.settings_video_fragment override fun getLayoutId(): Int = R.layout.settings_video_fragment
@ -48,11 +45,7 @@ class VideoSettingsFragment : GenericFragment<SettingsVideoFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
}
binding.sharedMainViewModel = sharedViewModel binding.sharedMainViewModel = sharedViewModel
viewModel = ViewModelProvider(this).get(VideoSettingsViewModel::class.java) viewModel = ViewModelProvider(this).get(VideoSettingsViewModel::class.java)
@ -105,14 +98,14 @@ class VideoSettingsFragment : GenericFragment<SettingsVideoFragmentBinding>() {
} }
} }
) )
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
list.add(binding) list.add(binding)
} }
viewModel.videoCodecs.value = list viewModel.videoCodecs.value = list
} }
override fun goBack() { override fun goBack() {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) { if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true) sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else { } else {
navigateToEmptySetting() navigateToEmptySetting()

View file

@ -31,7 +31,6 @@ import androidx.lifecycle.lifecycleScope
import java.io.File import java.io.File
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R import org.linphone.R
import org.linphone.activities.GenericFragment import org.linphone.activities.GenericFragment
import org.linphone.activities.assistant.AssistantActivity import org.linphone.activities.assistant.AssistantActivity
@ -58,7 +57,7 @@ class SideMenuFragment : GenericFragment<SideMenuFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this binding.lifecycleOwner = viewLifecycleOwner
viewModel = ViewModelProvider(this).get(SideMenuViewModel::class.java) viewModel = ViewModelProvider(this).get(SideMenuViewModel::class.java)
binding.viewModel = viewModel binding.viewModel = viewModel
@ -93,10 +92,6 @@ class SideMenuFragment : GenericFragment<SideMenuFragmentBinding>() {
binding.setAssistantClickListener { binding.setAssistantClickListener {
sharedViewModel.toggleDrawerEvent.value = Event(true) sharedViewModel.toggleDrawerEvent.value = Event(true)
startActivity(Intent(context, AssistantActivity::class.java)) startActivity(Intent(context, AssistantActivity::class.java))
if (corePreferences.enableAnimations) {
requireActivity().overridePendingTransition(R.anim.enter_right, R.anim.exit_left)
}
} }
binding.setSettingsClickListener { binding.setSettingsClickListener {

View file

@ -30,7 +30,7 @@ class SharedMainViewModel : ViewModel() {
val toggleDrawerEvent = MutableLiveData<Event<Boolean>>() val toggleDrawerEvent = MutableLiveData<Event<Boolean>>()
val layoutChangedEvent = MutableLiveData<Event<Boolean>>() val layoutChangedEvent = MutableLiveData<Event<Boolean>>()
var canSlidingPaneBeClosed = MutableLiveData<Boolean>() var isSlidingPaneSlideable = MutableLiveData<Boolean>()
val closeSlidingPaneEvent = MutableLiveData<Event<Boolean>>() val closeSlidingPaneEvent = MutableLiveData<Event<Boolean>>()
/* Call history */ /* Call history */
@ -70,6 +70,11 @@ class SharedMainViewModel : ViewModel() {
val selectedContact = MutableLiveData<Contact>() val selectedContact = MutableLiveData<Contact>()
// For correct animations directions
val updateContactsAnimationsBasedOnDestination: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
/* Accounts */ /* Accounts */
val accountRemoved = MutableLiveData<Boolean>() val accountRemoved = MutableLiveData<Boolean>()
@ -81,4 +86,9 @@ class SharedMainViewModel : ViewModel() {
/* Dialer */ /* Dialer */
var dialerUri: String = "" var dialerUri: String = ""
// For correct animations directions
val updateDialerAnimationsBasedOnDestination: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
} }

View file

@ -36,7 +36,6 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.linphone.LinphoneApplication
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R import org.linphone.R
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
@ -465,9 +464,6 @@ class FileUtils {
try { try {
activity.startActivity(intent) activity.startActivity(intent)
if (LinphoneApplication.corePreferences.enableAnimations) {
activity.overridePendingTransition(R.anim.enter_right, R.anim.exit_left)
}
return true return true
} catch (anfe: ActivityNotFoundException) { } catch (anfe: ActivityNotFoundException) {
Log.e("[File Viewer] Can't open file in third party app: $anfe") Log.e("[File Viewer] Can't open file in third party app: $anfe")

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="0%" android:toXDelta="0%"
android:fromYDelta="-100%p" android:toYDelta="0%"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="0%" android:toXDelta="0%"
android:fromYDelta="100%p" android:toYDelta="0%"
android:duration="@android:integer/config_mediumAnimTime" />
</set>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="0%" android:toXDelta="0%"
android:fromYDelta="0%" android:toYDelta="-100%p"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="0%" android:toXDelta="0%"
android:fromYDelta="0%" android:toYDelta="100%p"
android:duration="@android:integer/config_mediumAnimTime" />
</set>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="-100%p" android:toXDelta="0%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="-100%p" android:toXDelta="0%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="100%p" android:toXDelta="0%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="@android:integer/config_mediumAnimTime" />
</set>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="100%p" android:toXDelta="0%"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="@android:integer/config_mediumAnimTime" />
</set>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="0%" android:toXDelta="-100%p"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="0%" android:toXDelta="-100%p"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="0%" android:toXDelta="100%p"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="@android:integer/config_mediumAnimTime" />
</set>

View file

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
android:fromXDelta="0%" android:toXDelta="100%p"
android:fromYDelta="0%" android:toYDelta="0%"
android:duration="@android:integer/config_mediumAnimTime" />
</set>

View file

@ -53,7 +53,7 @@
android:id="@+id/back" android:id="@+id/back"
android:contentDescription="@string/content_description_go_back" android:contentDescription="@string/content_description_go_back"
android:onClick="@{backClickListener}" android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.VISIBLE : View.GONE}" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.2" android:layout_weight="0.2"

View file

@ -36,7 +36,7 @@
<ImageView <ImageView
android:id="@+id/back" android:id="@+id/back"
android:onClick="@{backClickListener}" android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.VISIBLE : View.GONE}" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back" android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -86,7 +86,7 @@
<org.linphone.contact.BigContactAvatarView <org.linphone.contact.BigContactAvatarView
android:id="@+id/avatar" android:id="@+id/avatar"
android:layout_width="100dp" android:layout_width="match_parent"
android:layout_height="100dp" android:layout_height="100dp"
android:gravity="center" android:gravity="center"
tools:layout="@layout/contact_avatar_big" tools:layout="@layout/contact_avatar_big"

View file

@ -75,13 +75,13 @@
android:layout_marginRight="10dp"> android:layout_marginRight="10dp">
<FrameLayout <FrameLayout
android:layout_width="100dp" android:layout_width="match_parent"
android:layout_height="100dp"> android:layout_height="100dp">
<org.linphone.contact.BigContactAvatarView <org.linphone.contact.BigContactAvatarView
android:id="@+id/avatar" android:id="@+id/avatar"
android:onClick="@{avatarClickListener}" android:onClick="@{avatarClickListener}"
android:layout_width="100dp" android:layout_width="match_parent"
android:layout_height="100dp" android:layout_height="100dp"
android:gravity="center" android:gravity="center"
tools:layout="@layout/contact_avatar_big" tools:layout="@layout/contact_avatar_big"
@ -90,6 +90,7 @@
<ImageView <ImageView
android:layout_width="100dp" android:layout_width="100dp"
android:layout_height="100dp" android:layout_height="100dp"
android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:contentDescription="@string/content_description_change_contact_picture" android:contentDescription="@string/content_description_change_contact_picture"
glideAvatar="@{viewModel.tempPicturePath}"/> glideAvatar="@{viewModel.tempPicturePath}"/>

View file

@ -36,7 +36,7 @@
<ImageView <ImageView
android:id="@+id/back" android:id="@+id/back"
android:onClick="@{backClickListener}" android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.VISIBLE : View.GONE}" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back" android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -85,7 +85,7 @@
<org.linphone.contact.BigContactAvatarView <org.linphone.contact.BigContactAvatarView
android:id="@+id/avatar" android:id="@+id/avatar"
android:layout_width="100dp" android:layout_width="match_parent"
android:layout_height="100dp" android:layout_height="100dp"
android:gravity="center" android:gravity="center"
bind:layout="@layout/contact_avatar_big" bind:layout="@layout/contact_avatar_big"

View file

@ -32,7 +32,7 @@
<ImageView <ImageView
android:id="@+id/back" android:id="@+id/back"
android:onClick="@{backClickListener}" android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.VISIBLE : View.GONE}" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back" android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -56,7 +56,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.2" android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout> </LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView <ImageView
android:id="@+id/back" android:id="@+id/back"
android:onClick="@{backClickListener}" android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.VISIBLE : View.GONE}" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back" android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.2" android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout> </LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView <ImageView
android:id="@+id/back" android:id="@+id/back"
android:onClick="@{backClickListener}" android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.VISIBLE : View.GONE}" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back" android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.2" android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout> </LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView <ImageView
android:id="@+id/back" android:id="@+id/back"
android:onClick="@{backClickListener}" android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.VISIBLE : View.GONE}" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back" android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.2" android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout> </LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView <ImageView
android:id="@+id/back" android:id="@+id/back"
android:onClick="@{backClickListener}" android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.VISIBLE : View.GONE}" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back" android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.2" android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout> </LinearLayout>

View file

@ -30,7 +30,7 @@
<ImageView <ImageView
android:id="@+id/back" android:id="@+id/back"
android:onClick="@{backClickListener}" android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.VISIBLE : View.GONE}" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back" android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -54,7 +54,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.2" android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout> </LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView <ImageView
android:id="@+id/back" android:id="@+id/back"
android:onClick="@{backClickListener}" android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.VISIBLE : View.GONE}" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back" android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.2" android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout> </LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView <ImageView
android:id="@+id/back" android:id="@+id/back"
android:onClick="@{backClickListener}" android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.VISIBLE : View.GONE}" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back" android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.2" android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout> </LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView <ImageView
android:id="@+id/back" android:id="@+id/back"
android:onClick="@{backClickListener}" android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.VISIBLE : View.GONE}" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back" android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0.2" android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" /> android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout> </LinearLayout>