diff --git a/app/src/main/java/org/linphone/activities/GenericFragment.kt b/app/src/main/java/org/linphone/activities/GenericFragment.kt index 8cbd2a1d0..bc0f831e9 100644 --- a/app/src/main/java/org/linphone/activities/GenericFragment.kt +++ b/app/src/main/java/org/linphone/activities/GenericFragment.kt @@ -23,35 +23,65 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageView import androidx.activity.OnBackPressedCallback import androidx.core.view.doOnPreDraw import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.fragment.app.Fragment -import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import com.google.android.material.transition.MaterialSharedAxis -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.linphone.LinphoneApplication.Companion.corePreferences +import org.linphone.R +import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.core.tools.Log abstract class GenericFragment : Fragment() { + companion object { + val emptyFragmentsIds = arrayListOf( + R.id.emptyChatFragment, + R.id.emptyContactFragment, + R.id.emptySettingsFragment, + R.id.emptyCallHistoryFragment + ) + } + private var _binding: T? = null protected val binding get() = _binding!! + protected var useMaterialSharedAxisXForwardAnimation = true + protected lateinit var sharedViewModel: SharedMainViewModel + + protected fun isSharedViewModelInitialized(): Boolean { + return ::sharedViewModel.isInitialized + } + protected fun isBindingAvailable(): Boolean { return _binding != null } - protected val onBackPressedCallback = object : OnBackPressedCallback(true) { + private fun getFragmentRealClassName(): String { + return this.javaClass.name + } + + private val onBackPressedCallback = object : OnBackPressedCallback(false) { override fun handleOnBackPressed() { - lifecycleScope.launch { - withContext(Dispatchers.Main) { - goBack() + try { + val navController = findNavController() + Log.d("[Generic Fragment] ${getFragmentRealClassName()} handleOnBackPressed") + if (!navController.popBackStack()) { + Log.d("[Generic Fragment] ${getFragmentRealClassName()} couldn't pop") + if (!navController.navigateUp()) { + Log.d("[Generic Fragment] ${getFragmentRealClassName()} couldn't navigate up") + // Disable this callback & start a new back press event + isEnabled = false + goBack() + } } + } catch (ise: IllegalStateException) { + Log.e("[Generic Fragment] ${getFragmentRealClassName()} Can't go back: $ise") } } } @@ -63,20 +93,19 @@ abstract class GenericFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { + sharedViewModel = requireActivity().run { + ViewModelProvider(this)[SharedMainViewModel::class.java] + } + + sharedViewModel.isSlidingPaneSlideable.observe(viewLifecycleOwner) { + Log.d("[Generic Fragment] ${getFragmentRealClassName()} shared main VM sliding pane has changed") + onBackPressedCallback.isEnabled = backPressedCallBackEnabled() + } + _binding = DataBindingUtil.inflate(inflater, getLayoutId(), container, false) return _binding!!.root } - override fun onResume() { - super.onResume() - requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, onBackPressedCallback) - } - - override fun onPause() { - onBackPressedCallback.remove() - super.onPause() - } - override fun onStart() { super.onStart() @@ -89,25 +118,50 @@ abstract class GenericFragment : Fragment() { postponeEnterTransition() binding.root.doOnPreDraw { startPostponedEnterTransition() } } + + setupBackPressCallback() } override fun onDestroyView() { super.onDestroyView() + + onBackPressedCallback.remove() _binding = null } - protected open fun goBack() { - try { - if (!findNavController().popBackStack()) { - if (!findNavController().navigateUp()) { - onBackPressedCallback.isEnabled = false - requireActivity().onBackPressed() - } - } - } catch (ise: IllegalStateException) { - Log.e("[Generic Fragment] [$this] Can't go back: $ise") + protected fun goBack() { + requireActivity().onBackPressedDispatcher.onBackPressed() + } + + private fun setupBackPressCallback() { + Log.d("[Generic Fragment] ${getFragmentRealClassName()} setupBackPressCallback") + + val backButton = binding.root.findViewById(R.id.back) + if (backButton != null) { + Log.d("[Generic Fragment] ${getFragmentRealClassName()} found back button") + // If popping navigation back stack entry would bring us to an "empty" fragment + // then don't do it if sliding pane layout isn't "flat" + onBackPressedCallback.isEnabled = backPressedCallBackEnabled() + backButton.setOnClickListener { goBack() } + } else { onBackPressedCallback.isEnabled = false - requireActivity().onBackPressed() } + + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, onBackPressedCallback) + } + + private fun backPressedCallBackEnabled(): Boolean { + // This allow to navigate a SlidingPane child nav graph. + // This only concerns fragments for which the nav graph is inside a SlidingPane layout. + // In our case it's all graphs except the main one. + if (findNavController().graph.id == R.id.main_nav_graph_xml) return false + + val isSlidingPaneFlat = sharedViewModel.isSlidingPaneSlideable.value == false + Log.d("[Generic Fragment] ${getFragmentRealClassName()} isSlidingPaneFlat ? $isSlidingPaneFlat") + val isPreviousFragmentEmpty = findNavController().previousBackStackEntry?.destination?.id in emptyFragmentsIds + Log.d("[Generic Fragment] ${getFragmentRealClassName()} isPreviousFragmentEmpty ? $isPreviousFragmentEmpty") + val popBackStack = isSlidingPaneFlat || !isPreviousFragmentEmpty + Log.d("[Generic Fragment] ${getFragmentRealClassName()} popBackStack ? $popBackStack") + return popBackStack } } diff --git a/app/src/main/java/org/linphone/activities/Navigation.kt b/app/src/main/java/org/linphone/activities/Navigation.kt index c87133ddc..d1b42cabc 100644 --- a/app/src/main/java/org/linphone/activities/Navigation.kt +++ b/app/src/main/java/org/linphone/activities/Navigation.kt @@ -43,7 +43,6 @@ import org.linphone.activities.main.contact.fragments.MasterContactsFragment import org.linphone.activities.main.dialer.fragments.DialerFragment import org.linphone.activities.main.fragments.TabsFragment import org.linphone.activities.main.history.fragments.DetailCallLogFragment -import org.linphone.activities.main.history.fragments.DetailConferenceCallLogFragment import org.linphone.activities.main.history.fragments.MasterCallLogsFragment import org.linphone.activities.main.settings.fragments.* import org.linphone.activities.main.sidemenu.fragments.SideMenuFragment @@ -265,16 +264,10 @@ internal fun ScheduledConferencesFragment.navigateToConferenceScheduling() { internal fun MasterChatRoomsFragment.navigateToChatRoom(args: Bundle) { val navHostFragment = childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment - val previousBackStackEntry = navHostFragment.navController.currentBackStackEntry - val popUpToFragmentId = when (previousBackStackEntry?.destination?.id) { - R.id.detailChatRoomFragment -> R.id.detailChatRoomFragment - R.id.chatRoomCreationFragment -> R.id.chatRoomCreationFragment - else -> R.id.emptyChatFragment - } navHostFragment.navController.navigate( R.id.action_global_detailChatRoomFragment, args, - popupTo(popUpToFragmentId, true) + popupTo(R.id.emptyChatFragment, false) ) } @@ -285,16 +278,10 @@ internal fun MasterChatRoomsFragment.navigateToChatRoomCreation( val bundle = bundleOf("createGroup" to createGroupChatRoom) val navHostFragment = childFragmentManager.findFragmentById(R.id.chat_nav_container) as NavHostFragment - val previousBackStackEntry = navHostFragment.navController.currentBackStackEntry - val popUpToFragmentId = when (previousBackStackEntry?.destination?.id) { - R.id.detailChatRoomFragment -> R.id.detailChatRoomFragment - R.id.chatRoomCreationFragment -> R.id.chatRoomCreationFragment - else -> R.id.emptyChatFragment - } navHostFragment.navController.navigate( R.id.action_global_chatRoomCreationFragment, bundle, - popupTo(popUpToFragmentId, true) + popupTo(R.id.emptyChatFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -437,19 +424,11 @@ internal fun ChatRoomCreationFragment.navigateToChatRoom(args: Bundle) { findNavController().navigate( R.id.action_chatRoomCreationFragment_to_detailChatRoomFragment, args, - popupTo(R.id.chatRoomCreationFragment, true) + popupTo(R.id.emptyChatFragment, false) ) } } -internal fun ChatRoomCreationFragment.navigateToEmptyChatRoom() { - findNavController().navigate( - R.id.action_global_emptyChatFragment, - null, - popupTo(R.id.chatRoomCreationFragment, true) - ) -} - internal fun GroupInfoFragment.navigateToChatRoomCreation(args: Bundle?) { if (findNavController().currentDestination?.id == R.id.groupInfoFragment) { findNavController().navigate( @@ -481,16 +460,10 @@ internal fun MasterContactsFragment.navigateToContact() { if (findNavController().currentDestination?.id == R.id.masterContactsFragment) { val navHostFragment = childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment - val previousBackStackEntry = navHostFragment.navController.currentBackStackEntry - val popUpToFragmentId = when (previousBackStackEntry?.destination?.id) { - R.id.detailContactFragment -> R.id.detailContactFragment - R.id.contactEditorFragment -> R.id.contactEditorFragment - else -> R.id.emptyContactFragment - } navHostFragment.navController.navigate( R.id.action_global_detailContactFragment, null, - popupTo(popUpToFragmentId, true) + popupTo(R.id.emptyContactFragment, false) ) } } @@ -506,7 +479,7 @@ internal fun MasterContactsFragment.navigateToContactEditor( navHostFragment.navController.navigate( R.id.action_global_contactEditorFragment, bundle, - popupTo(R.id.emptyContactFragment, true) + popupTo(R.id.emptyContactFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -534,14 +507,6 @@ internal fun ContactEditorFragment.navigateToContact(id: String) { ) } -internal fun ContactEditorFragment.navigateToEmptyContact() { - findNavController().navigate( - R.id.action_global_emptyContactFragment, - null, - popupTo(R.id.emptyContactFragment, true) - ) -} - internal fun DetailContactFragment.navigateToChatRoom(args: Bundle?) { findMasterNavController().navigate( R.id.action_global_masterChatRoomsFragment, @@ -568,14 +533,6 @@ internal fun DetailContactFragment.navigateToContactEditor() { } } -internal fun DetailContactFragment.navigateToEmptyContact() { - findNavController().navigate( - R.id.action_global_emptyContactFragment, - null, - popupTo(R.id.emptyContactFragment, true) - ) -} - /* History related */ internal fun MasterCallLogsFragment.navigateToCallHistory(slidingPane: SlidingPaneLayout) { @@ -585,7 +542,7 @@ internal fun MasterCallLogsFragment.navigateToCallHistory(slidingPane: SlidingPa navHostFragment.navController.navigate( R.id.action_global_detailCallLogFragment, null, - popupTo(R.id.detailCallLogFragment, true) + popupTo(R.id.emptyCallHistoryFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -598,7 +555,7 @@ internal fun MasterCallLogsFragment.navigateToConferenceCallHistory(slidingPane: navHostFragment.navController.navigate( R.id.action_global_detailConferenceCallLogFragment, null, - popupTo(R.id.detailConferenceCallLogFragment, true) + popupTo(R.id.emptyCallHistoryFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -668,26 +625,6 @@ internal fun DetailCallLogFragment.navigateToDialer(args: Bundle?) { } } -internal fun DetailCallLogFragment.navigateToEmptyCallHistory() { - if (findNavController().currentDestination?.id == R.id.detailCallLogFragment) { - findNavController().navigate( - R.id.action_global_emptyFragment, - null, - popupTo(R.id.emptyCallHistoryFragment, true) - ) - } -} - -internal fun DetailConferenceCallLogFragment.navigateToEmptyCallHistory() { - if (findNavController().currentDestination?.id == R.id.detailConferenceCallLogFragment) { - findNavController().navigate( - R.id.action_global_emptyFragment, - null, - popupTo(R.id.emptyCallHistoryFragment, true) - ) - } -} - /* Settings related */ internal fun SettingsFragment.navigateToAccountSettings(identity: String) { @@ -698,7 +635,7 @@ internal fun SettingsFragment.navigateToAccountSettings(identity: String) { navHostFragment.navController.navigate( R.id.action_global_accountSettingsFragment, bundle, - popupTo(R.id.accountSettingsFragment, true) + popupTo(R.id.emptySettingsFragment, false) ) } } @@ -710,7 +647,7 @@ internal fun SettingsFragment.navigateToTunnelSettings(slidingPane: SlidingPaneL navHostFragment.navController.navigate( R.id.action_global_tunnelSettingsFragment, null, - popupTo(R.id.tunnelSettingsFragment, true) + popupTo(R.id.emptySettingsFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -723,7 +660,7 @@ internal fun SettingsFragment.navigateToAudioSettings(slidingPane: SlidingPaneLa navHostFragment.navController.navigate( R.id.action_global_audioSettingsFragment, null, - popupTo(R.id.audioSettingsFragment, true) + popupTo(R.id.emptySettingsFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -736,7 +673,7 @@ internal fun SettingsFragment.navigateToVideoSettings(slidingPane: SlidingPaneLa navHostFragment.navController.navigate( R.id.action_global_videoSettingsFragment, null, - popupTo(R.id.videoSettingsFragment, true) + popupTo(R.id.emptySettingsFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -749,7 +686,7 @@ internal fun SettingsFragment.navigateToCallSettings(slidingPane: SlidingPaneLay navHostFragment.navController.navigate( R.id.action_global_callSettingsFragment, null, - popupTo(R.id.callSettingsFragment, true) + popupTo(R.id.emptySettingsFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -762,7 +699,7 @@ internal fun SettingsFragment.navigateToChatSettings(slidingPane: SlidingPaneLay navHostFragment.navController.navigate( R.id.action_global_chatSettingsFragment, null, - popupTo(R.id.chatSettingsFragment, true) + popupTo(R.id.emptySettingsFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -775,7 +712,7 @@ internal fun SettingsFragment.navigateToNetworkSettings(slidingPane: SlidingPane navHostFragment.navController.navigate( R.id.action_global_networkSettingsFragment, null, - popupTo(R.id.networkSettingsFragment, true) + popupTo(R.id.emptySettingsFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -788,7 +725,7 @@ internal fun SettingsFragment.navigateToContactsSettings(slidingPane: SlidingPan navHostFragment.navController.navigate( R.id.action_global_contactsSettingsFragment, null, - popupTo(R.id.contactsSettingsFragment, true) + popupTo(R.id.emptySettingsFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -801,7 +738,7 @@ internal fun SettingsFragment.navigateToAdvancedSettings(slidingPane: SlidingPan navHostFragment.navController.navigate( R.id.action_global_advancedSettingsFragment, null, - popupTo(R.id.advancedSettingsFragment, true) + popupTo(R.id.emptySettingsFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -814,7 +751,7 @@ internal fun SettingsFragment.navigateToConferencesSettings(slidingPane: Sliding navHostFragment.navController.navigate( R.id.action_global_conferencesSettingsFragment, null, - popupTo(R.id.conferencesSettingsFragment, true) + popupTo(R.id.emptySettingsFragment, false) ) if (!slidingPane.isOpen) slidingPane.openPane() } @@ -859,46 +796,6 @@ internal fun ContactsSettingsFragment.navigateToLdapSettings(configIndex: Int) { } } -internal fun AccountSettingsFragment.navigateToEmptySetting() { - navigateToEmptySetting(findNavController()) -} - -internal fun AdvancedSettingsFragment.navigateToEmptySetting() { - navigateToEmptySetting(findNavController()) -} - -internal fun AudioSettingsFragment.navigateToEmptySetting() { - navigateToEmptySetting(findNavController()) -} - -internal fun CallSettingsFragment.navigateToEmptySetting() { - navigateToEmptySetting(findNavController()) -} - -internal fun ChatSettingsFragment.navigateToEmptySetting() { - navigateToEmptySetting(findNavController()) -} - -internal fun ConferencesSettingsFragment.navigateToEmptySetting() { - navigateToEmptySetting(findNavController()) -} - -internal fun ContactsSettingsFragment.navigateToEmptySetting() { - navigateToEmptySetting(findNavController()) -} - -internal fun NetworkSettingsFragment.navigateToEmptySetting() { - navigateToEmptySetting(findNavController()) -} - -internal fun TunnelSettingsFragment.navigateToEmptySetting() { - navigateToEmptySetting(findNavController()) -} - -internal fun VideoSettingsFragment.navigateToEmptySetting() { - navigateToEmptySetting(findNavController()) -} - /* Side menu related */ internal fun SideMenuFragment.navigateToAccountSettings(identity: String) { diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt index 49285d9e9..ff4a67628 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt @@ -39,7 +39,7 @@ import org.linphone.utils.DialogUtils class AccountLoginFragment : AbstractPhoneFragment() { override lateinit var viewModel: AccountLoginViewModel - private lateinit var sharedViewModel: SharedAssistantViewModel + private lateinit var sharedAssistantViewModel: SharedAssistantViewModel override fun getLayoutId(): Int = R.layout.assistant_account_login_fragment @@ -48,13 +48,13 @@ class AccountLoginFragment : AbstractPhoneFragment() { - private lateinit var sharedViewModel: SharedAssistantViewModel + private lateinit var sharedAssistantViewModel: SharedAssistantViewModel private lateinit var viewModel: EmailAccountCreationViewModel override fun getLayoutId(): Int = R.layout.assistant_email_account_creation_fragment @@ -42,11 +42,11 @@ class EmailAccountCreationFragment : GenericFragment() { - private lateinit var sharedViewModel: SharedAssistantViewModel + private lateinit var sharedAssistantViewModel: SharedAssistantViewModel private lateinit var viewModel: EmailAccountValidationViewModel override fun getLayoutId(): Int = R.layout.assistant_email_account_validation_fragment @@ -41,11 +41,11 @@ class EmailAccountValidationFragment : GenericFragment() { - private lateinit var sharedViewModel: SharedAssistantViewModel + private lateinit var sharedAssistantViewModel: SharedAssistantViewModel private lateinit var viewModel: GenericLoginViewModel override fun getLayoutId(): Int = R.layout.assistant_generic_account_login_fragment @@ -47,11 +47,11 @@ class GenericAccountLoginFragment : GenericFragment() { - private lateinit var sharedViewModel: SharedAssistantViewModel + private lateinit var sharedAssistantViewModel: SharedAssistantViewModel override lateinit var viewModel: PhoneAccountCreationViewModel override fun getLayoutId(): Int = R.layout.assistant_phone_account_creation_fragment @@ -42,13 +42,13 @@ class PhoneAccountCreationFragment : binding.lifecycleOwner = viewLifecycleOwner - sharedViewModel = requireActivity().run { + sharedAssistantViewModel = requireActivity().run { ViewModelProvider(this)[SharedAssistantViewModel::class.java] } viewModel = ViewModelProvider( this, - PhoneAccountCreationViewModelFactory(sharedViewModel.getAccountCreator()) + PhoneAccountCreationViewModelFactory(sharedAssistantViewModel.getAccountCreator()) )[PhoneAccountCreationViewModel::class.java] binding.viewModel = viewModel diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountLinkingFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountLinkingFragment.kt index 7a95a4a35..9ff9259e3 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountLinkingFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountLinkingFragment.kt @@ -32,7 +32,7 @@ import org.linphone.core.tools.Log import org.linphone.databinding.AssistantPhoneAccountLinkingFragmentBinding class PhoneAccountLinkingFragment : AbstractPhoneFragment() { - private lateinit var sharedViewModel: SharedAssistantViewModel + private lateinit var sharedAssistantViewModel: SharedAssistantViewModel override lateinit var viewModel: PhoneAccountLinkingViewModel override fun getLayoutId(): Int = R.layout.assistant_phone_account_linking_fragment @@ -42,11 +42,11 @@ class PhoneAccountLinkingFragment : AbstractPhoneFragment() { - private lateinit var sharedViewModel: SharedAssistantViewModel + private lateinit var sharedAssistantViewModel: SharedAssistantViewModel private lateinit var viewModel: PhoneAccountValidationViewModel override fun getLayoutId(): Int = R.layout.assistant_phone_account_validation_fragment @@ -47,11 +47,11 @@ class PhoneAccountValidationFragment : GenericFragment() { const val CAMERA_PERMISSION_REQUEST_CODE = 0 } - private lateinit var sharedViewModel: SharedAssistantViewModel + private lateinit var sharedAssistantViewModel: SharedAssistantViewModel private lateinit var viewModel: QrCodeViewModel override fun getLayoutId(): Int = R.layout.assistant_qr_code_fragment @@ -48,7 +48,7 @@ class QrCodeFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner - sharedViewModel = requireActivity().run { + sharedAssistantViewModel = requireActivity().run { ViewModelProvider(this)[SharedAssistantViewModel::class.java] } @@ -59,7 +59,7 @@ class QrCodeFragment : GenericFragment() { viewLifecycleOwner ) { it.consume { url -> - sharedViewModel.remoteProvisioningUrl.value = url + sharedAssistantViewModel.remoteProvisioningUrl.value = url findNavController().navigateUp() } } diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt index ecb1dc062..5889ba271 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt @@ -33,7 +33,7 @@ import org.linphone.activities.navigateToQrCode import org.linphone.databinding.AssistantRemoteProvisioningFragmentBinding class RemoteProvisioningFragment : GenericFragment() { - private lateinit var sharedViewModel: SharedAssistantViewModel + private lateinit var sharedAssistantViewModel: SharedAssistantViewModel private lateinit var viewModel: RemoteProvisioningViewModel override fun getLayoutId(): Int = R.layout.assistant_remote_provisioning_fragment @@ -43,7 +43,7 @@ class RemoteProvisioningFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner useMaterialSharedAxisXForwardAnimation = false - - binding.setBackClickListener { - goBack() - } - } - - override fun goBack() { - if (!findNavController().popBackStack()) { - requireActivity().finish() - } } } diff --git a/app/src/main/java/org/linphone/activities/main/about/AboutFragment.kt b/app/src/main/java/org/linphone/activities/main/about/AboutFragment.kt index 89b36a3cf..e81703192 100644 --- a/app/src/main/java/org/linphone/activities/main/about/AboutFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/about/AboutFragment.kt @@ -42,8 +42,6 @@ class AboutFragment : SecureFragment() { viewModel = ViewModelProvider(this)[AboutViewModel::class.java] binding.viewModel = viewModel - binding.setBackClickListener { goBack() } - binding.setPrivacyPolicyClickListener { val browserIntent = Intent( Intent.ACTION_VIEW, diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt index fc00bc174..a979a19c1 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt @@ -23,27 +23,22 @@ import android.content.pm.PackageManager import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.activities.main.MainActivity import org.linphone.activities.main.chat.viewmodels.ChatRoomCreationViewModel import org.linphone.activities.main.fragments.SecureFragment -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.navigateToChatRoom -import org.linphone.activities.navigateToEmptyChatRoom import org.linphone.activities.navigateToGroupInfo import org.linphone.contact.ContactsSelectionAdapter import org.linphone.core.tools.Log import org.linphone.databinding.ChatRoomCreationFragmentBinding import org.linphone.utils.AppUtils -import org.linphone.utils.Event import org.linphone.utils.PermissionHelper class ChatRoomCreationFragment : SecureFragment() { private lateinit var viewModel: ChatRoomCreationViewModel - private lateinit var sharedViewModel: SharedMainViewModel private lateinit var adapter: ContactsSelectionAdapter override fun getLayoutId(): Int = R.layout.chat_room_creation_fragment @@ -53,10 +48,6 @@ class ChatRoomCreationFragment : SecureFragment binding.lifecycleOwner = viewLifecycleOwner - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false val createGroup = arguments?.getBoolean("createGroup") ?: false @@ -79,9 +70,6 @@ class ChatRoomCreationFragment : SecureFragment // Divider between items binding.contactsList.addItemDecoration(AppUtils.getDividerDecoration(requireContext(), layoutManager)) - binding.setBackClickListener { - goBack() - } binding.back.visibility = if (resources.getBoolean(R.bool.isTablet)) View.INVISIBLE else View.VISIBLE binding.setAllContactsToggleClickListener { @@ -182,16 +170,6 @@ class ChatRoomCreationFragment : SecureFragment } } - override fun goBack() { - if (!findNavController().popBackStack()) { - if (sharedViewModel.isSlidingPaneSlideable.value == true) { - sharedViewModel.closeSlidingPaneEvent.value = Event(true) - } else { - navigateToEmptyChatRoom() - } - } - } - private fun addParticipantsFromSharedViewModel() { val participants = sharedViewModel.chatRoomParticipants.value if (participants != null && participants.size > 0) { diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index 747c201e2..e7fac8f02 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -36,7 +36,6 @@ import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -57,7 +56,6 @@ import org.linphone.activities.main.chat.viewmodels.* import org.linphone.activities.main.chat.views.RichEditTextSendListener import org.linphone.activities.main.fragments.MasterFragment import org.linphone.activities.main.viewmodels.DialogViewModel -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.navigateToContacts import org.linphone.activities.navigateToImageFileViewer import org.linphone.activities.navigateToImdn @@ -73,7 +71,6 @@ class DetailChatRoomFragment : MasterFragment() { private lateinit var listViewModel: DevicesListViewModel - private lateinit var sharedViewModel: SharedMainViewModel override fun getLayoutId(): Int = R.layout.chat_room_devices_fragment @@ -42,10 +40,6 @@ class DevicesFragment : SecureFragment() { binding.lifecycleOwner = viewLifecycleOwner - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - val chatRoom = sharedViewModel.selectedChatRoom.value if (chatRoom == null) { Log.e("[Devices] Chat room is null, aborting!") @@ -60,10 +54,6 @@ class DevicesFragment : SecureFragment() { DevicesListViewModelFactory(chatRoom) )[DevicesListViewModel::class.java] binding.viewModel = listViewModel - - binding.setBackClickListener { - goBack() - } } override fun onResume() { diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/EphemeralFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/EphemeralFragment.kt index 42284a767..ba4a3382e 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/EphemeralFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/EphemeralFragment.kt @@ -27,14 +27,12 @@ import org.linphone.R import org.linphone.activities.main.chat.viewmodels.EphemeralViewModel import org.linphone.activities.main.chat.viewmodels.EphemeralViewModelFactory import org.linphone.activities.main.fragments.SecureFragment -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.core.tools.Log import org.linphone.databinding.ChatRoomEphemeralFragmentBinding import org.linphone.utils.Event class EphemeralFragment : SecureFragment() { private lateinit var viewModel: EphemeralViewModel - private lateinit var sharedViewModel: SharedMainViewModel override fun getLayoutId(): Int { return R.layout.chat_room_ephemeral_fragment @@ -46,10 +44,6 @@ class EphemeralFragment : SecureFragment() { isSecure = true binding.lifecycleOwner = viewLifecycleOwner - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - val chatRoom = sharedViewModel.selectedChatRoom.value if (chatRoom == null) { Log.e("[Ephemeral] Chat room is null, aborting!") @@ -63,10 +57,6 @@ class EphemeralFragment : SecureFragment() { )[EphemeralViewModel::class.java] binding.viewModel = viewModel - binding.setBackClickListener { - goBack() - } - binding.setValidClickListener { viewModel.updateChatRoomEphemeralDuration() sharedViewModel.refreshChatRoomInListEvent.value = Event(true) diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt index 6b46658ff..efe216d9d 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt @@ -33,7 +33,6 @@ import org.linphone.activities.main.chat.viewmodels.GroupInfoViewModel import org.linphone.activities.main.chat.viewmodels.GroupInfoViewModelFactory import org.linphone.activities.main.fragments.SecureFragment import org.linphone.activities.main.viewmodels.DialogViewModel -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.navigateToChatRoom import org.linphone.activities.navigateToChatRoomCreation import org.linphone.core.Address @@ -45,7 +44,6 @@ import org.linphone.utils.DialogUtils class GroupInfoFragment : SecureFragment() { private lateinit var viewModel: GroupInfoViewModel - private lateinit var sharedViewModel: SharedMainViewModel private lateinit var adapter: GroupInfoParticipantsAdapter private var meAdminStatusChangedDialog: Dialog? = null @@ -56,10 +54,6 @@ class GroupInfoFragment : SecureFragment() { binding.lifecycleOwner = viewLifecycleOwner - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - val chatRoom: ChatRoom? = sharedViewModel.selectedGroupChatRoom.value isSecure = chatRoom?.currentParams?.isEncryptionEnabled ?: false @@ -113,10 +107,6 @@ class GroupInfoFragment : SecureFragment() { addParticipantsFromSharedViewModel() - binding.setBackClickListener { - goBack() - } - viewModel.createdChatRoomEvent.observe( viewLifecycleOwner ) { diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/ImdnFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/ImdnFragment.kt index 7b422a491..95fd3b8c4 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/ImdnFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/ImdnFragment.kt @@ -29,7 +29,6 @@ import org.linphone.activities.main.chat.adapters.ImdnAdapter import org.linphone.activities.main.chat.viewmodels.ImdnViewModel import org.linphone.activities.main.chat.viewmodels.ImdnViewModelFactory import org.linphone.activities.main.fragments.SecureFragment -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.core.tools.Log import org.linphone.databinding.ChatRoomImdnFragmentBinding import org.linphone.utils.AppUtils @@ -38,7 +37,6 @@ import org.linphone.utils.RecyclerViewHeaderDecoration class ImdnFragment : SecureFragment() { private lateinit var viewModel: ImdnViewModel private lateinit var adapter: ImdnAdapter - private lateinit var sharedViewModel: SharedMainViewModel override fun getLayoutId(): Int { return R.layout.chat_room_imdn_fragment @@ -49,10 +47,6 @@ class ImdnFragment : SecureFragment() { binding.lifecycleOwner = viewLifecycleOwner - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - val chatRoom = sharedViewModel.selectedChatRoom.value if (chatRoom == null) { Log.e("[IMDN] Chat room is null, aborting!") @@ -101,9 +95,5 @@ class ImdnFragment : SecureFragment() { ) { adapter.submitList(it) } - - binding.setBackClickListener { - goBack() - } } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt index a4ad1bbfd..2ec4482d1 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt @@ -24,7 +24,6 @@ import android.content.res.Configuration import android.os.Bundle import android.view.View import androidx.core.content.ContextCompat -import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.NavHostFragment import androidx.recyclerview.widget.ItemTouchHelper @@ -42,7 +41,6 @@ import org.linphone.activities.main.chat.adapters.ChatRoomsListAdapter import org.linphone.activities.main.chat.viewmodels.ChatRoomsListViewModel import org.linphone.activities.main.fragments.MasterFragment import org.linphone.activities.main.viewmodels.DialogViewModel -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.navigateToChatRoom import org.linphone.activities.navigateToChatRoomCreation import org.linphone.core.ChatRoom @@ -54,7 +52,6 @@ import org.linphone.utils.* class MasterChatRoomsFragment : MasterFragment() { override val dialogConfirmationMessageBeforeRemoval = R.plurals.chat_room_delete_dialog private lateinit var listViewModel: ChatRoomsListViewModel - private lateinit var sharedViewModel: SharedMainViewModel private val observer = object : RecyclerView.AdapterDataObserver() { override fun onChanged() { @@ -105,11 +102,18 @@ class MasterChatRoomsFragment : MasterFragment() { private val viewModel: ConferenceSchedulingViewModel by navGraphViewModels(R.id.conference_scheduling_nav_graph) - private lateinit var sharedViewModel: SharedMainViewModel override fun getLayoutId(): Int = R.layout.conference_scheduling_fragment @@ -52,10 +49,6 @@ class ConferenceSchedulingFragment : GenericFragment() { private lateinit var viewModel: ScheduledConferencesViewModel private lateinit var adapter: ScheduledConferencesAdapter - private lateinit var sharedViewModel: SharedMainViewModel override fun getLayoutId(): Int = R.layout.conferences_scheduled_fragment @@ -66,10 +64,6 @@ class ScheduledConferencesFragment : GenericFragment(), SyncAccountPickerFragment.SyncAccountPickedListener { private lateinit var viewModel: ContactEditorViewModel - private lateinit var sharedViewModel: SharedMainViewModel private var temporaryPicturePath: File? = null override fun getLayoutId(): Int = R.layout.contact_editor_fragment @@ -59,10 +54,6 @@ class ContactEditorFragment : GenericFragment(), S binding.lifecycleOwner = viewLifecycleOwner - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - viewModel = ViewModelProvider( this, ContactEditorViewModelFactory(sharedViewModel.selectedContact.value) @@ -71,10 +62,6 @@ class ContactEditorFragment : GenericFragment(), S useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false - binding.setBackClickListener { - goBack() - } - binding.setAvatarClickListener { pickFile() } @@ -109,16 +96,6 @@ class ContactEditorFragment : GenericFragment(), S } } - override fun goBack() { - if (!findNavController().popBackStack()) { - if (sharedViewModel.isSlidingPaneSlideable.value == true) { - sharedViewModel.closeSlidingPaneEvent.value = Event(true) - } else { - navigateToEmptyContact() - } - } - } - override fun onSyncAccountClicked(name: String?, type: String?) { Log.i("[Contact Editor] Using account $name / $type") viewModel.syncAccountName = name diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt index db9d9d059..49d6f8ee9 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt @@ -26,7 +26,6 @@ import android.os.Bundle import android.view.View import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider -import androidx.navigation.fragment.findNavController import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.activities.* @@ -34,7 +33,6 @@ import org.linphone.activities.main.* import org.linphone.activities.main.contact.viewmodels.ContactViewModel import org.linphone.activities.main.contact.viewmodels.ContactViewModelFactory import org.linphone.activities.main.viewmodels.DialogViewModel -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.navigateToChatRoom import org.linphone.activities.navigateToContactEditor import org.linphone.activities.navigateToDialer @@ -45,7 +43,6 @@ import org.linphone.utils.Event class DetailContactFragment : GenericFragment() { private lateinit var viewModel: ContactViewModel - private lateinit var sharedViewModel: SharedMainViewModel override fun getLayoutId(): Int = R.layout.contact_detail_fragment @@ -54,9 +51,6 @@ class DetailContactFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } binding.sharedMainViewModel = sharedViewModel useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false @@ -127,10 +121,6 @@ class DetailContactFragment : GenericFragment() { } } - binding.setBackClickListener { - goBack() - } - binding.setEditClickListener { navigateToContactEditor() } @@ -170,16 +160,6 @@ class DetailContactFragment : GenericFragment() { } } - override fun goBack() { - if (!findNavController().popBackStack()) { - if (sharedViewModel.isSlidingPaneSlideable.value == true) { - sharedViewModel.closeSlidingPaneEvent.value = Event(true) - } else { - navigateToEmptyContact() - } - } - } - private fun confirmContactRemoval() { val dialogViewModel = DialogViewModel(getString(R.string.contact_delete_one_dialog)) val dialog: Dialog = DialogUtils.getDialog(requireContext(), dialogViewModel) diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt index b69fde325..a28328488 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt @@ -25,13 +25,11 @@ import android.content.res.Configuration import android.os.Bundle import android.view.View import androidx.core.content.ContextCompat -import androidx.core.view.doOnPreDraw import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.NavHostFragment 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 @@ -43,7 +41,6 @@ import org.linphone.activities.main.contact.adapters.ContactsListAdapter import org.linphone.activities.main.contact.viewmodels.ContactsListViewModel import org.linphone.activities.main.fragments.MasterFragment import org.linphone.activities.main.viewmodels.DialogViewModel -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.navigateToContact import org.linphone.activities.navigateToContactEditor import org.linphone.core.Factory @@ -55,7 +52,6 @@ import org.linphone.utils.* class MasterContactsFragment : MasterFragment() { override val dialogConfirmationMessageBeforeRemoval = R.plurals.contact_delete_dialog private lateinit var listViewModel: ContactsListViewModel - private lateinit var sharedViewModel: SharedMainViewModel private var sipUriToAdd: String? = null private var editOnClick: Boolean = false @@ -78,11 +74,7 @@ class MasterContactsFragment : MasterFragment() { isSecure = arguments?.getBoolean("Secure") ?: false - binding.setBackClickListener { - goBack() - } - binding.setExportClickListener { shareConfig() } diff --git a/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt b/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt index beb57f1d4..92a02e0bf 100644 --- a/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt @@ -43,7 +43,6 @@ import org.linphone.activities.main.MainActivity import org.linphone.activities.main.dialer.viewmodels.DialerViewModel import org.linphone.activities.main.fragments.SecureFragment import org.linphone.activities.main.viewmodels.DialogViewModel -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.navigateToConferenceScheduling import org.linphone.activities.navigateToConfigFileViewer import org.linphone.activities.navigateToContacts @@ -59,7 +58,6 @@ import org.linphone.utils.PermissionHelper class DialerFragment : SecureFragment() { private lateinit var viewModel: DialerViewModel - private lateinit var sharedViewModel: SharedMainViewModel private var uploadLogsInitiatedByUs = false @@ -73,10 +71,6 @@ class DialerFragment : SecureFragment() { viewModel = ViewModelProvider(this)[DialerViewModel::class.java] binding.viewModel = viewModel - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - useMaterialSharedAxisXForwardAnimation = false sharedViewModel.updateDialerAnimationsBasedOnDestination.observe( viewLifecycleOwner diff --git a/app/src/main/java/org/linphone/activities/main/files/fragments/GenericViewerFragment.kt b/app/src/main/java/org/linphone/activities/main/files/fragments/GenericViewerFragment.kt index 704746bb4..63ef1b4f5 100644 --- a/app/src/main/java/org/linphone/activities/main/files/fragments/GenericViewerFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/files/fragments/GenericViewerFragment.kt @@ -22,23 +22,16 @@ package org.linphone.activities.main.files.fragments import android.os.Bundle import android.view.View import androidx.databinding.ViewDataBinding -import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import org.linphone.R import org.linphone.activities.main.fragments.SecureFragment -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.core.tools.Log abstract class GenericViewerFragment : SecureFragment() { - protected lateinit var sharedViewModel: SharedMainViewModel override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - isSecure = arguments?.getBoolean("Secure") ?: false } @@ -55,8 +48,4 @@ abstract class GenericViewerFragment : SecureFragment() (childFragmentManager.findFragmentById(R.id.top_bar_fragment) as? TopBarFragment) ?.setContent(content) } - - override fun goBack() { - findNavController().popBackStack() - } } diff --git a/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt b/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt index 288a257ff..796d8c806 100644 --- a/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt @@ -48,10 +48,6 @@ class TopBarFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner useMaterialSharedAxisXForwardAnimation = false - binding.setBackClickListener { - goBack() - } - binding.setExportClickListener { val contentToExport = content if (contentToExport != null) { diff --git a/app/src/main/java/org/linphone/activities/main/fragments/ListTopBarFragment.kt b/app/src/main/java/org/linphone/activities/main/fragments/ListTopBarFragment.kt index 4afc8cde8..d18ed62a7 100644 --- a/app/src/main/java/org/linphone/activities/main/fragments/ListTopBarFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/fragments/ListTopBarFragment.kt @@ -57,7 +57,5 @@ class ListTopBarFragment : GenericFragment() { binding.setDeleteClickListener { viewModel.deleteSelectionEvent.value = Event(true) } - - onBackPressedCallback.isEnabled = false } } diff --git a/app/src/main/java/org/linphone/activities/main/fragments/MasterFragment.kt b/app/src/main/java/org/linphone/activities/main/fragments/MasterFragment.kt index c342b2a9a..128bcc4e1 100644 --- a/app/src/main/java/org/linphone/activities/main/fragments/MasterFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/fragments/MasterFragment.kt @@ -22,8 +22,11 @@ package org.linphone.activities.main.fragments import android.app.Dialog import android.os.Bundle import android.view.View +import androidx.activity.OnBackPressedCallback +import androidx.core.view.doOnPreDraw import androidx.databinding.ViewDataBinding import androidx.lifecycle.ViewModelProvider +import androidx.slidingpanelayout.widget.SlidingPaneLayout import org.linphone.R import org.linphone.activities.main.adapters.SelectionListAdapter import org.linphone.activities.main.viewmodels.DialogViewModel @@ -107,6 +110,19 @@ abstract class MasterFragment) + + class SlidingPaneBackPressedCallback(private val slidingPaneLayout: SlidingPaneLayout) : + OnBackPressedCallback + ( + slidingPaneLayout.isSlideable && slidingPaneLayout.isOpen + ), + SlidingPaneLayout.PanelSlideListener { + + init { + Log.d("[Master Fragment] SlidingPane isSlideable = ${slidingPaneLayout.isSlideable}, isOpen = ${slidingPaneLayout.isOpen}") + slidingPaneLayout.addPanelSlideListener(this) + } + + override fun handleOnBackPressed() { + Log.d("[Master Fragment] handleOnBackPressed, closing sliding pane") + slidingPaneLayout.closePane() + } + + override fun onPanelOpened(panel: View) { + Log.d("[Master Fragment] onPanelOpened") + isEnabled = true + } + + override fun onPanelClosed(panel: View) { + Log.d("[Master Fragment] onPanelClosed") + isEnabled = false + } + + override fun onPanelSlide(panel: View, slideOffset: Float) { } + } } diff --git a/app/src/main/java/org/linphone/activities/main/fragments/StatusFragment.kt b/app/src/main/java/org/linphone/activities/main/fragments/StatusFragment.kt index a0ac80f5e..50b357198 100644 --- a/app/src/main/java/org/linphone/activities/main/fragments/StatusFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/fragments/StatusFragment.kt @@ -25,7 +25,6 @@ import androidx.lifecycle.ViewModelProvider import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.activities.GenericFragment -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.main.viewmodels.StatusViewModel import org.linphone.core.tools.Log import org.linphone.databinding.StatusFragmentBinding @@ -33,7 +32,6 @@ import org.linphone.utils.Event class StatusFragment : GenericFragment() { private lateinit var viewModel: StatusViewModel - private lateinit var sharedViewModel: SharedMainViewModel override fun getLayoutId(): Int = R.layout.status_fragment @@ -46,10 +44,6 @@ class StatusFragment : GenericFragment() { viewModel = ViewModelProvider(this)[StatusViewModel::class.java] binding.viewModel = viewModel - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - sharedViewModel.accountRemoved.observe( viewLifecycleOwner ) { @@ -67,7 +61,5 @@ class StatusFragment : GenericFragment() { binding.setRefreshClickListener { viewModel.refreshRegister() } - - onBackPressedCallback.isEnabled = false } } diff --git a/app/src/main/java/org/linphone/activities/main/fragments/TabsFragment.kt b/app/src/main/java/org/linphone/activities/main/fragments/TabsFragment.kt index d56133590..94774681d 100644 --- a/app/src/main/java/org/linphone/activities/main/fragments/TabsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/fragments/TabsFragment.kt @@ -28,7 +28,6 @@ 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 @@ -39,7 +38,6 @@ import org.linphone.utils.Event class TabsFragment : GenericFragment(), NavController.OnDestinationChangedListener { private lateinit var viewModel: TabsViewModel - private lateinit var sharedViewModel: SharedMainViewModel override fun getLayoutId(): Int = R.layout.tabs_fragment @@ -49,10 +47,6 @@ class TabsFragment : GenericFragment(), NavController.OnDes binding.lifecycleOwner = viewLifecycleOwner useMaterialSharedAxisXForwardAnimation = false - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - viewModel = requireActivity().run { ViewModelProvider(this)[TabsViewModel::class.java] } @@ -89,8 +83,6 @@ class TabsFragment : GenericFragment(), NavController.OnDes } navigateToChatRooms() } - - onBackPressedCallback.isEnabled = false } override fun onStart() { diff --git a/app/src/main/java/org/linphone/activities/main/history/fragments/DetailCallLogFragment.kt b/app/src/main/java/org/linphone/activities/main/history/fragments/DetailCallLogFragment.kt index 10c29b9c5..8395b788b 100644 --- a/app/src/main/java/org/linphone/activities/main/history/fragments/DetailCallLogFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/history/fragments/DetailCallLogFragment.kt @@ -21,14 +21,12 @@ package org.linphone.activities.main.history.fragments import android.os.Bundle import android.view.View -import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.activities.* import org.linphone.activities.main.* import org.linphone.activities.main.history.viewmodels.CallLogViewModel -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.navigateToContact import org.linphone.activities.navigateToContacts import org.linphone.core.tools.Log @@ -37,7 +35,6 @@ import org.linphone.utils.Event class DetailCallLogFragment : GenericFragment() { private lateinit var viewModel: CallLogViewModel - private lateinit var sharedViewModel: SharedMainViewModel override fun getLayoutId(): Int = R.layout.history_detail_fragment @@ -46,9 +43,6 @@ class DetailCallLogFragment : GenericFragment() { binding.lifecycleOwner = viewLifecycleOwner - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } binding.sharedMainViewModel = sharedViewModel val callLogGroup = sharedViewModel.selectedCallLogGroup.value @@ -64,10 +58,6 @@ class DetailCallLogFragment : GenericFragment() { useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false - binding.setBackClickListener { - goBack() - } - binding.setNewContactClickListener { val copy = viewModel.callLog.remoteAddress.clone() copy.clean() @@ -141,14 +131,6 @@ class DetailCallLogFragment : GenericFragment() { } } - override fun goBack() { - if (sharedViewModel.isSlidingPaneSlideable.value == true) { - sharedViewModel.closeSlidingPaneEvent.value = Event(true) - } else { - navigateToEmptyCallHistory() - } - } - override fun onResume() { super.onResume() viewModel.enableListener(true) diff --git a/app/src/main/java/org/linphone/activities/main/history/fragments/DetailConferenceCallLogFragment.kt b/app/src/main/java/org/linphone/activities/main/history/fragments/DetailConferenceCallLogFragment.kt index d07e4814c..984a8eac7 100644 --- a/app/src/main/java/org/linphone/activities/main/history/fragments/DetailConferenceCallLogFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/history/fragments/DetailConferenceCallLogFragment.kt @@ -21,20 +21,16 @@ package org.linphone.activities.main.history.fragments import android.os.Bundle import android.view.View -import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import org.linphone.R import org.linphone.activities.* import org.linphone.activities.main.* import org.linphone.activities.main.history.viewmodels.CallLogViewModel -import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.core.tools.Log import org.linphone.databinding.HistoryConfDetailFragmentBinding -import org.linphone.utils.Event class DetailConferenceCallLogFragment : GenericFragment() { private lateinit var viewModel: CallLogViewModel - private lateinit var sharedViewModel: SharedMainViewModel override fun getLayoutId(): Int = R.layout.history_conf_detail_fragment @@ -43,9 +39,6 @@ class DetailConferenceCallLogFragment : GenericFragment() { override val dialogConfirmationMessageBeforeRemoval = R.plurals.history_delete_dialog private lateinit var listViewModel: CallLogsListViewModel - private lateinit var sharedViewModel: SharedMainViewModel private val observer = object : RecyclerView.AdapterDataObserver() { override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { @@ -96,21 +92,8 @@ class MasterCallLogsFragment : MasterFragment diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/AccountSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/AccountSettingsFragment.kt index efd297098..f4fb8208d 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/AccountSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/AccountSettingsFragment.kt @@ -26,7 +26,6 @@ import androidx.lifecycle.ViewModelProvider import org.linphone.R import org.linphone.activities.main.settings.viewmodels.AccountSettingsViewModel import org.linphone.activities.main.settings.viewmodels.AccountSettingsViewModelFactory -import org.linphone.activities.navigateToEmptySetting import org.linphone.activities.navigateToPhoneLinking import org.linphone.core.tools.Log import org.linphone.databinding.SettingsAccountFragmentBinding @@ -59,8 +58,6 @@ class AccountSettingsFragment : GenericSettingFragment() { @@ -52,8 +50,6 @@ class AdvancedSettingsFragment : GenericSettingFragment() { @@ -51,8 +49,6 @@ class AudioSettingsFragment : GenericSettingFragment() { private lateinit var viewModel: CallSettingsViewModel @@ -52,8 +50,6 @@ class CallSettingsFragment : GenericSettingFragment viewModel = ViewModelProvider(this)[CallSettingsViewModel::class.java] binding.viewModel = viewModel - binding.setBackClickListener { goBack() } - viewModel.systemWideOverlayEnabledEvent.observe( viewLifecycleOwner ) { @@ -162,14 +158,6 @@ class CallSettingsFragment : GenericSettingFragment corePreferences.useTelecomManager = enabled } - override fun goBack() { - if (sharedViewModel.isSlidingPaneSlideable.value == true) { - sharedViewModel.closeSlidingPaneEvent.value = Event(true) - } else { - navigateToEmptySetting() - } - } - override fun onRequestPermissionsResult( requestCode: Int, permissions: Array, diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/ChatSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/ChatSettingsFragment.kt index dee6299ab..23c6ef87e 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/ChatSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/ChatSettingsFragment.kt @@ -28,10 +28,8 @@ import androidx.lifecycle.ViewModelProvider import org.linphone.R import org.linphone.activities.main.chat.viewmodels.ChatRoomsListViewModel import org.linphone.activities.main.settings.viewmodels.ChatSettingsViewModel -import org.linphone.activities.navigateToEmptySetting import org.linphone.databinding.SettingsChatFragmentBinding import org.linphone.mediastream.Version -import org.linphone.utils.Event import org.linphone.utils.ShortcutsHelper class ChatSettingsFragment : GenericSettingFragment() { @@ -48,8 +46,6 @@ class ChatSettingsFragment : GenericSettingFragment viewModel = ViewModelProvider(this)[ChatSettingsViewModel::class.java] binding.viewModel = viewModel - binding.setBackClickListener { goBack() } - viewModel.launcherShortcutsEvent.observe( viewLifecycleOwner ) { @@ -90,14 +86,6 @@ class ChatSettingsFragment : GenericSettingFragment } } - override fun goBack() { - if (sharedViewModel.isSlidingPaneSlideable.value == true) { - sharedViewModel.closeSlidingPaneEvent.value = Event(true) - } else { - navigateToEmptySetting() - } - } - private fun reloadChatRooms() { val listViewModel = requireActivity().run { ViewModelProvider(this)[ChatRoomsListViewModel::class.java] diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/ConferencesSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/ConferencesSettingsFragment.kt index 241aa3987..02bac24ab 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/ConferencesSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/ConferencesSettingsFragment.kt @@ -24,9 +24,7 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import org.linphone.R import org.linphone.activities.main.settings.viewmodels.ConferencesSettingsViewModel -import org.linphone.activities.navigateToEmptySetting import org.linphone.databinding.SettingsConferencesFragmentBinding -import org.linphone.utils.Event class ConferencesSettingsFragment : GenericSettingFragment() { private lateinit var viewModel: ConferencesSettingsViewModel @@ -41,15 +39,5 @@ class ConferencesSettingsFragment : GenericSettingFragment : GenericFragment() { - protected lateinit var sharedViewModel: SharedMainViewModel - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/LdapSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/LdapSettingsFragment.kt index c02fbe9ac..aba760799 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/LdapSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/LdapSettingsFragment.kt @@ -62,7 +62,5 @@ class LdapSettingsFragment : GenericSettingFragment goBack() } } - - binding.setBackClickListener { goBack() } } } diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/NetworkSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/NetworkSettingsFragment.kt index 8363f40bb..f990f2ada 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/NetworkSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/NetworkSettingsFragment.kt @@ -24,9 +24,7 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import org.linphone.R import org.linphone.activities.main.settings.viewmodels.NetworkSettingsViewModel -import org.linphone.activities.navigateToEmptySetting import org.linphone.databinding.SettingsNetworkFragmentBinding -import org.linphone.utils.Event class NetworkSettingsFragment : GenericSettingFragment() { private lateinit var viewModel: NetworkSettingsViewModel @@ -41,15 +39,5 @@ class NetworkSettingsFragment : GenericSettingFragment() { - private lateinit var sharedViewModel: SharedMainViewModel private lateinit var viewModel: SettingsViewModel override fun getLayoutId(): Int = R.layout.settings_fragment @@ -61,10 +60,6 @@ class SettingsFragment : SecureFragment() { /* Shared view model & sliding pane related */ - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - view.doOnPreDraw { sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable } // Account settings loading can take some time, so wait until it is ready before opening the pane @@ -76,15 +71,6 @@ class SettingsFragment : SecureFragment() { } } - sharedViewModel.closeSlidingPaneEvent.observe( - viewLifecycleOwner - ) { - it.consume { - if (!binding.slidingPane.closePane()) { - goBack() - } - } - } sharedViewModel.layoutChangedEvent.observe( viewLifecycleOwner ) { @@ -100,6 +86,12 @@ class SettingsFragment : SecureFragment() { } } } + + requireActivity().onBackPressedDispatcher.addCallback( + viewLifecycleOwner, + MasterFragment.SlidingPaneBackPressedCallback(binding.slidingPane) + ) + binding.slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED /* End of shared view model & sliding pane related */ @@ -107,8 +99,6 @@ class SettingsFragment : SecureFragment() { viewModel = ViewModelProvider(this)[SettingsViewModel::class.java] binding.viewModel = viewModel - binding.setBackClickListener { goBack() } - sharedViewModel.accountRemoved.observe( viewLifecycleOwner ) { diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/TunnelSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/TunnelSettingsFragment.kt index a3ff4ef28..947f7bd6f 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/TunnelSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/TunnelSettingsFragment.kt @@ -24,9 +24,7 @@ import android.view.View import androidx.lifecycle.ViewModelProvider import org.linphone.R import org.linphone.activities.main.settings.viewmodels.TunnelSettingsViewModel -import org.linphone.activities.navigateToEmptySetting import org.linphone.databinding.SettingsTunnelFragmentBinding -import org.linphone.utils.Event class TunnelSettingsFragment : GenericSettingFragment() { private lateinit var viewModel: TunnelSettingsViewModel @@ -41,15 +39,5 @@ class TunnelSettingsFragment : GenericSettingFragment() { @@ -51,8 +49,6 @@ class VideoSettingsFragment : GenericSettingFragment() { private lateinit var viewModel: SideMenuViewModel - private lateinit var sharedViewModel: SharedMainViewModel private var temporaryPicturePath: File? = null override fun getLayoutId(): Int = R.layout.side_menu_fragment @@ -62,10 +60,6 @@ class SideMenuFragment : GenericFragment() { viewModel = ViewModelProvider(this)[SideMenuViewModel::class.java] binding.viewModel = viewModel - sharedViewModel = requireActivity().run { - ViewModelProvider(this)[SharedMainViewModel::class.java] - } - sharedViewModel.accountRemoved.observe( viewLifecycleOwner ) { @@ -128,8 +122,6 @@ class SideMenuFragment : GenericFragment() { coreContext.notificationsManager.stopForegroundNotification() coreContext.stop() } - - onBackPressedCallback.isEnabled = false } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt b/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt index 9c2d1634d..a5e5109dc 100644 --- a/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt @@ -31,7 +31,6 @@ class SharedMainViewModel : ViewModel() { val layoutChangedEvent = MutableLiveData>() var isSlidingPaneSlideable = MutableLiveData() - val closeSlidingPaneEvent = MutableLiveData>() /* Call history */ diff --git a/app/src/main/java/org/linphone/activities/voip/fragments/ConferenceAddParticipantsFragment.kt b/app/src/main/java/org/linphone/activities/voip/fragments/ConferenceAddParticipantsFragment.kt index 1b1eeaaf2..d5119e089 100644 --- a/app/src/main/java/org/linphone/activities/voip/fragments/ConferenceAddParticipantsFragment.kt +++ b/app/src/main/java/org/linphone/activities/voip/fragments/ConferenceAddParticipantsFragment.kt @@ -69,10 +69,6 @@ class ConferenceAddParticipantsFragment : GenericFragment() { } } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - onBackPressedCallback.isEnabled = false - } - override fun onDestroy() { if (zrtpDialog != null) { zrtpDialog?.dismiss() diff --git a/app/src/main/res/layout-land/about_fragment.xml b/app/src/main/res/layout-land/about_fragment.xml index 9862830be..3a351bf9f 100644 --- a/app/src/main/res/layout-land/about_fragment.xml +++ b/app/src/main/res/layout-land/about_fragment.xml @@ -3,9 +3,6 @@ - @@ -35,7 +32,6 @@ - @@ -35,7 +32,6 @@ - - @@ -36,7 +33,6 @@ - @@ -61,7 +58,6 @@ - @@ -25,7 +22,6 @@ - @@ -28,7 +25,6 @@ - @@ -40,7 +37,6 @@ - @@ -26,7 +23,6 @@ - @@ -35,7 +32,7 @@ android:orientation="horizontal"> - @@ -29,7 +26,7 @@ android:orientation="horizontal"> - @@ -34,7 +31,7 @@ android:orientation="horizontal"> - @@ -30,7 +27,6 @@ - @@ -35,7 +32,6 @@ - @@ -30,9 +27,8 @@ android:orientation="horizontal"> - @@ -28,7 +25,7 @@ android:orientation="horizontal"> - @@ -20,7 +17,7 @@ android:orientation="horizontal"> - - @@ -45,7 +41,6 @@ android:layout_height="match_parent" android:layout_weight="0.2" android:contentDescription="@string/content_description_go_back" - android:onClick="@{backClickListener}" android:padding="18dp" android:src="@drawable/back" android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}" /> diff --git a/app/src/main/res/layout/history_detail_fragment.xml b/app/src/main/res/layout/history_detail_fragment.xml index c2ef639e7..f22a36f3e 100644 --- a/app/src/main/res/layout/history_detail_fragment.xml +++ b/app/src/main/res/layout/history_detail_fragment.xml @@ -5,9 +5,6 @@ - @@ -35,7 +32,6 @@ - @@ -33,7 +30,6 @@ - @@ -31,7 +28,6 @@ - @@ -31,7 +28,6 @@ - @@ -30,7 +27,6 @@ - @@ -30,7 +27,6 @@ - @@ -30,7 +27,6 @@ - @@ -30,7 +27,6 @@ - @@ -29,7 +26,6 @@ - @@ -35,7 +32,6 @@ - @@ -30,7 +27,6 @@ - @@ -30,7 +27,6 @@ - @@ -30,7 +27,6 @@ - @@ -30,7 +27,6 @@ - @@ -29,7 +26,7 @@ android:orientation="horizontal">