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 androidx.activity.OnBackPressedCallback
import androidx.activity.addCallback
import androidx.core.view.doOnPreDraw
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.core.tools.Log
abstract class GenericFragment<T : ViewDataBinding> : Fragment() {
private var _binding: T? = null
protected val binding get() = _binding!!
protected var useMaterialSharedAxisXForwardAnimation = true
protected val onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
@ -58,6 +62,20 @@ abstract class GenericFragment<T : ViewDataBinding> : Fragment() {
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() {
super.onDestroyView()
_binding = null

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -22,7 +22,6 @@ package org.linphone.activities.assistant.fragments
import android.os.Bundle
import android.view.View
import androidx.navigation.fragment.findNavController
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.databinding.AssistantTopBarFragmentBinding
@ -33,7 +32,8 @@ class TopBarFragment : GenericFragment<AssistantTopBarFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this
binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
binding.setBackClickListener {
goBack()
@ -43,12 +43,6 @@ class TopBarFragment : GenericFragment<AssistantTopBarFragmentBinding>() {
override fun goBack() {
if (!findNavController().popBackStack()) {
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?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this
binding.lifecycleOwner = viewLifecycleOwner
viewModel = ViewModelProvider(this).get(WelcomeViewModel::class.java)
binding.viewModel = viewModel

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -20,6 +20,7 @@
package org.linphone.activities.main.chat.fragments
import android.app.Dialog
import android.content.res.Configuration
import android.os.Bundle
import android.view.View
import androidx.core.content.ContextCompat
@ -30,7 +31,9 @@ import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.slidingpanelayout.widget.SlidingPaneLayout
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
import org.linphone.activities.GenericActivity
import org.linphone.activities.clearDisplayedChatRoom
@ -75,11 +78,25 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
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?) {
super.onViewCreated(view, savedInstanceState)
isSecure = true
binding.lifecycleOwner = this
binding.lifecycleOwner = viewLifecycleOwner
listViewModel = ViewModelProvider(this).get(ChatRoomsListViewModel::class.java)
binding.viewModel = listViewModel
@ -90,7 +107,7 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
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
sharedViewModel.chatRoomFragmentOpenedEvent.observe(
@ -116,7 +133,7 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
viewLifecycleOwner,
{
it.consume {
sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable
sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable
if (binding.slidingPane.isSlideable) {
val navHostFragment = childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment
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?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this
binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
@ -70,6 +70,8 @@ class ContactEditorFragment : GenericFragment<ContactEditorFragmentBinding>(), S
)[ContactEditorViewModel::class.java]
binding.viewModel = viewModel
useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false
binding.setBackClickListener {
goBack()
}
@ -110,7 +112,7 @@ class ContactEditorFragment : GenericFragment<ContactEditorFragmentBinding>(), S
override fun goBack() {
if (!findNavController().popBackStack()) {
if (sharedViewModel.canSlidingPaneBeClosed.value == true) {
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptyContact()

View file

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

View file

@ -21,6 +21,7 @@ package org.linphone.activities.main.contact.fragments
import android.app.Dialog
import android.content.pm.PackageManager
import android.content.res.Configuration
import android.os.Bundle
import android.view.View
import androidx.core.content.ContextCompat
@ -31,7 +32,9 @@ import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.slidingpanelayout.widget.SlidingPaneLayout
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
import org.linphone.activities.clearDisplayedContact
import org.linphone.activities.main.MainActivity
@ -67,7 +70,7 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this
binding.lifecycleOwner = viewLifecycleOwner
listViewModel = ViewModelProvider(this).get(ContactsListViewModel::class.java)
binding.viewModel = listViewModel
@ -78,7 +81,28 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
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(
viewLifecycleOwner,
@ -94,7 +118,7 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
viewLifecycleOwner,
{
it.consume {
sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable
sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable
if (binding.slidingPane.isSlideable) {
val navHostFragment = childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment
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?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this
binding.lifecycleOwner = viewLifecycleOwner
viewModel = ViewModelProvider(this)[ConfigFileViewModel::class.java]
binding.viewModel = viewModel

View file

@ -24,11 +24,13 @@ import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.net.Uri
import android.os.Bundle
import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.BuildConfig
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
@ -44,6 +46,7 @@ import org.linphone.core.tools.Log
import org.linphone.databinding.DialerFragmentBinding
import org.linphone.utils.AppUtils
import org.linphone.utils.DialogUtils
import org.linphone.utils.Event
class DialerFragment : SecureFragment<DialerFragmentBinding>() {
private lateinit var viewModel: DialerViewModel
@ -56,7 +59,7 @@ class DialerFragment : SecureFragment<DialerFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this
binding.lifecycleOwner = viewLifecycleOwner
viewModel = ViewModelProvider(this).get(DialerViewModel::class.java)
binding.viewModel = viewModel
@ -65,7 +68,30 @@ class DialerFragment : SecureFragment<DialerFragmentBinding>() {
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 {
sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(R.id.masterContactsFragment)
sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.dialerFragment)
navigateToContacts(viewModel.enteredUri.value)
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -24,6 +24,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.R
class EmptyFragment : Fragment() {
@ -32,6 +33,8 @@ class EmptyFragment : Fragment() {
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, 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?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this
binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
viewModel = ViewModelProvider(parentFragment ?: this)[ListTopBarViewModel::class.java]
binding.viewModel = viewModel

View file

@ -22,10 +22,8 @@ package org.linphone.activities.main.fragments
import android.app.Dialog
import android.os.Bundle
import android.view.View
import androidx.core.view.doOnPreDraw
import androidx.databinding.ViewDataBinding
import androidx.lifecycle.ViewModelProvider
import org.linphone.LinphoneApplication
import org.linphone.R
import org.linphone.activities.main.adapters.SelectionListAdapter
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
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
if (LinphoneApplication.corePreferences.enableAnimations) {
postponeEnterTransition()
view.doOnPreDraw { startPostponedEnterTransition() }
}
super.onViewCreated(view, savedInstanceState)
// List selection

View file

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

View file

@ -28,22 +28,30 @@ import androidx.navigation.fragment.findNavController
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.main.viewmodels.TabsViewModel
import org.linphone.activities.navigateToCallHistory
import org.linphone.activities.navigateToChatRooms
import org.linphone.activities.navigateToContacts
import org.linphone.activities.navigateToDialer
import org.linphone.databinding.TabsFragmentBinding
import org.linphone.utils.Event
class TabsFragment : GenericFragment<TabsFragmentBinding>(), NavController.OnDestinationChangedListener {
private lateinit var viewModel: TabsViewModel
private lateinit var sharedViewModel: SharedMainViewModel
override fun getLayoutId(): Int = R.layout.tabs_fragment
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this
binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
sharedViewModel = requireActivity().run {
ViewModelProvider(this).get(SharedMainViewModel::class.java)
}
viewModel = requireActivity().run {
ViewModelProvider(this).get(TabsViewModel::class.java)
@ -51,18 +59,34 @@ class TabsFragment : GenericFragment<TabsFragmentBinding>(), NavController.OnDes
binding.viewModel = viewModel
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()
}
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()
}
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()
}
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()
}
}

View file

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

View file

@ -20,6 +20,7 @@
package org.linphone.activities.main.history.fragments
import android.app.Dialog
import android.content.res.Configuration
import android.os.Bundle
import android.view.View
import androidx.core.content.ContextCompat
@ -30,7 +31,9 @@ import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.slidingpanelayout.widget.SlidingPaneLayout
import com.google.android.material.transition.MaterialSharedAxis
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
import org.linphone.activities.clearDisplayedCallHistory
import org.linphone.activities.main.fragments.MasterFragment
@ -67,10 +70,24 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
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?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = this
binding.lifecycleOwner = viewLifecycleOwner
listViewModel = ViewModelProvider(this).get(CallLogsListViewModel::class.java)
binding.viewModel = listViewModel
@ -81,7 +98,7 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
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(
viewLifecycleOwner,
@ -97,7 +114,7 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
viewLifecycleOwner,
{
it.consume {
sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable
sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable
if (binding.slidingPane.isSlideable) {
val navHostFragment = childFragmentManager.findFragmentById(R.id.history_nav_container) as NavHostFragment
if (navHostFragment.navController.currentDestination?.id == R.id.emptyCallHistoryFragment) {
@ -245,6 +262,7 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
val remoteAddress = callLogGroup.lastCallLog.remoteAddress
if (coreContext.core.callsNb > 0) {
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()
args.putString("URI", remoteAddress.asStringUriOnly())
args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -25,6 +25,8 @@ import androidx.core.view.doOnPreDraw
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.NavHostFragment
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.activities.*
import org.linphone.activities.main.fragments.SecureFragment
@ -47,7 +49,15 @@ class SettingsFragment : SecureFragment<SettingsFragmentBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
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 */
@ -55,7 +65,7 @@ class SettingsFragment : SecureFragment<SettingsFragmentBinding>() {
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(
viewLifecycleOwner,
@ -71,7 +81,7 @@ class SettingsFragment : SecureFragment<SettingsFragmentBinding>() {
viewLifecycleOwner,
{
it.consume {
sharedViewModel.canSlidingPaneBeClosed.value = binding.slidingPane.isSlideable
sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable
if (binding.slidingPane.isSlideable) {
val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment
if (navHostFragment.navController.currentDestination?.id == R.id.emptySettingsFragment) {

View file

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

View file

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

View file

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

View file

@ -30,7 +30,7 @@ class SharedMainViewModel : ViewModel() {
val toggleDrawerEvent = MutableLiveData<Event<Boolean>>()
val layoutChangedEvent = MutableLiveData<Event<Boolean>>()
var canSlidingPaneBeClosed = MutableLiveData<Boolean>()
var isSlidingPaneSlideable = MutableLiveData<Boolean>()
val closeSlidingPaneEvent = MutableLiveData<Event<Boolean>>()
/* Call history */
@ -70,6 +70,11 @@ class SharedMainViewModel : ViewModel() {
val selectedContact = MutableLiveData<Contact>()
// For correct animations directions
val updateContactsAnimationsBasedOnDestination: MutableLiveData<Event<Int>> by lazy {
MutableLiveData<Event<Int>>()
}
/* Accounts */
val accountRemoved = MutableLiveData<Boolean>()
@ -81,4 +86,9 @@ class SharedMainViewModel : ViewModel() {
/* Dialer */
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.coroutineScope
import kotlinx.coroutines.withContext
import org.linphone.LinphoneApplication
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.core.tools.Log
@ -465,9 +464,6 @@ class FileUtils {
try {
activity.startActivity(intent)
if (LinphoneApplication.corePreferences.enableAnimations) {
activity.overridePendingTransition(R.anim.enter_right, R.anim.exit_left)
}
return true
} catch (anfe: ActivityNotFoundException) {
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:contentDescription="@string/content_description_go_back"
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_height="match_parent"
android:layout_weight="0.2"

View file

@ -36,7 +36,7 @@
<ImageView
android:id="@+id/back"
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:layout_width="0dp"
android:layout_height="match_parent"
@ -86,7 +86,7 @@
<org.linphone.contact.BigContactAvatarView
android:id="@+id/avatar"
android:layout_width="100dp"
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center"
tools:layout="@layout/contact_avatar_big"

View file

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

View file

@ -36,7 +36,7 @@
<ImageView
android:id="@+id/back"
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:layout_width="0dp"
android:layout_height="match_parent"
@ -85,7 +85,7 @@
<org.linphone.contact.BigContactAvatarView
android:id="@+id/avatar"
android:layout_width="100dp"
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center"
bind:layout="@layout/contact_avatar_big"

View file

@ -32,7 +32,7 @@
<ImageView
android:id="@+id/back"
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:layout_width="0dp"
android:layout_height="match_parent"
@ -56,7 +56,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" />
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView
android:id="@+id/back"
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:layout_width="0dp"
android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" />
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView
android:id="@+id/back"
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:layout_width="0dp"
android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" />
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView
android:id="@+id/back"
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:layout_width="0dp"
android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" />
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView
android:id="@+id/back"
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:layout_width="0dp"
android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" />
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout>

View file

@ -30,7 +30,7 @@
<ImageView
android:id="@+id/back"
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:layout_width="0dp"
android:layout_height="match_parent"
@ -54,7 +54,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" />
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView
android:id="@+id/back"
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:layout_width="0dp"
android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" />
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView
android:id="@+id/back"
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:layout_width="0dp"
android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" />
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout>

View file

@ -31,7 +31,7 @@
<ImageView
android:id="@+id/back"
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:layout_width="0dp"
android:layout_height="match_parent"
@ -55,7 +55,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:visibility="@{sharedMainViewModel.canSlidingPaneBeClosed ? View.INVISIBLE : View.GONE}" />
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.INVISIBLE : View.GONE}" />
</LinearLayout>