diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt index cc268d6c9..23161bcd1 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt @@ -92,7 +92,7 @@ class ActiveCallFragment : GenericCallFragment() { override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { if (findNavController().currentDestination?.id == R.id.newCallFragment) { - // Holds fragment in place while new contact fragment slides over it + // Holds fragment in place while new fragment slides over it return AnimationUtils.loadAnimation(activity, R.anim.hold) } return super.onCreateAnimation(transit, enter, nextAnim) diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt index 1ce016454..502e448c9 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt @@ -92,7 +92,7 @@ class ConversationsListFragment : AbstractTopBarFragment() { findNavController().currentDestination?.id == R.id.startConversationFragment || findNavController().currentDestination?.id == R.id.meetingWaitingRoomFragment ) { - // Holds fragment in place while new contact fragment slides over it + // Holds fragment in place while new fragment slides over it return AnimationUtils.loadAnimation(activity, R.anim.hold) } return super.onCreateAnimation(transit, enter, nextAnim) diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt index a0230b9c0..532d75322 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactsListFragment.kt @@ -26,6 +26,8 @@ import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.animation.Animation +import android.view.animation.AnimationUtils import android.widget.PopupWindow import androidx.annotation.UiThread import androidx.core.content.FileProvider @@ -69,6 +71,15 @@ class ContactsListFragment : AbstractTopBarFragment() { listViewModel.applyCurrentDefaultAccountFilter() } + override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { + if (findNavController().currentDestination?.id == R.id.newContactFragment + ) { + // Holds fragment in place while new fragment slides over it + return AnimationUtils.loadAnimation(activity, R.anim.hold) + } + return super.onCreateAnimation(transit, enter, nextAnim) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt index fe28b093f..03857d793 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt @@ -60,7 +60,7 @@ class NewContactFragment : GenericFragment() { private val backPressedCallback = object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { - showAbortConfirmationDialog() + showAbortConfirmationDialogIfNeededOrGoBack() } } @@ -119,7 +119,7 @@ class NewContactFragment : GenericFragment() { viewModel.findFriendByRefKey("") binding.setBackClickListener { - showAbortConfirmationDialog() + showAbortConfirmationDialogIfNeededOrGoBack() } binding.setPickImageClickListener { @@ -210,7 +210,13 @@ class NewContactFragment : GenericFragment() { pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) } - private fun showAbortConfirmationDialog() { + private fun showAbortConfirmationDialogIfNeededOrGoBack() { + if (!viewModel.isPendingChanges()) { + backPressedCallback.isEnabled = false + findNavController().popBackStack() + return + } + val model = ConfirmationDialogModel() val dialog = DialogUtils.getCancelContactChangesConfirmationDialog( requireActivity(), diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt index b4c39ed73..dcb50ffa4 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt @@ -276,4 +276,20 @@ class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { company.value = "" jobTitle.value = "" } + + @UiThread + fun isPendingChanges(): Boolean { + if (isEdit.value == true) { + // TODO: check if values of each field match friend values + return true + } + + return !picturePath.value.isNullOrEmpty() || + !firstName.value.isNullOrEmpty() || + !lastName.value.isNullOrEmpty() || + !sipAddresses.firstOrNull()?.value?.value.isNullOrEmpty() || + !phoneNumbers.firstOrNull()?.value?.value.isNullOrEmpty() || + !company.value.isNullOrEmpty() || + !jobTitle.value.isNullOrEmpty() + } } diff --git a/app/src/main/java/org/linphone/ui/main/fragment/EmptyFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/EmptyFragment.kt index f61bcbd61..bcb92de98 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/EmptyFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/EmptyFragment.kt @@ -38,7 +38,7 @@ class EmptyFragment : Fragment() { override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? { if (findNavController().currentDestination?.id == R.id.newContactFragment) { - // Holds fragment in place while new contact fragment slides over it + // Holds fragment in place while new fragment slides over it return AnimationUtils.loadAnimation(activity, R.anim.hold) } return super.onCreateAnimation(transit, enter, nextAnim) diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt index 948696c23..f27c6ca22 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt @@ -76,7 +76,7 @@ class HistoryListFragment : AbstractTopBarFragment() { if (findNavController().currentDestination?.id == R.id.startCallFragment || findNavController().currentDestination?.id == R.id.meetingWaitingRoomFragment ) { - // Holds fragment in place while new contact fragment slides over it + // Holds fragment in place while new fragment slides over it return AnimationUtils.loadAnimation(activity, R.anim.hold) } return super.onCreateAnimation(transit, enter, nextAnim) diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt index 17e389258..5cfcce105 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingsListFragment.kt @@ -67,7 +67,7 @@ class MeetingsListFragment : AbstractTopBarFragment() { findNavController().currentDestination?.id == R.id.scheduleMeetingFragment || findNavController().currentDestination?.id == R.id.meetingWaitingRoomFragment ) { - // Holds fragment in place while new contact fragment slides over it + // Holds fragment in place while new fragment slides over it return AnimationUtils.loadAnimation(activity, R.anim.hold) } return super.onCreateAnimation(transit, enter, nextAnim)