Reworked how back button is handled

This commit is contained in:
Sylvain Berfini 2022-06-28 17:00:46 +02:00
parent 009c6b3333
commit 4f26895cb4
90 changed files with 209 additions and 791 deletions

View file

@ -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<T : ViewDataBinding> : 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<T : ViewDataBinding> : 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<T : ViewDataBinding> : 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<ImageView>(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
}
}

View file

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

View file

@ -39,7 +39,7 @@ import org.linphone.utils.DialogUtils
class AccountLoginFragment : AbstractPhoneFragment<AssistantAccountLoginFragmentBinding>() {
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<AssistantAccountLoginFragment
binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
sharedAssistantViewModel = requireActivity().run {
ViewModelProvider(this)[SharedAssistantViewModel::class.java]
}
viewModel = ViewModelProvider(
this,
AccountLoginViewModelFactory(sharedViewModel.getAccountCreator())
AccountLoginViewModelFactory(sharedAssistantViewModel.getAccountCreator())
)[AccountLoginViewModel::class.java]
binding.viewModel = viewModel

View file

@ -32,7 +32,7 @@ import org.linphone.activities.navigateToEmailAccountValidation
import org.linphone.databinding.AssistantEmailAccountCreationFragmentBinding
class EmailAccountCreationFragment : GenericFragment<AssistantEmailAccountCreationFragmentBinding>() {
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<AssistantEmailAccountCreati
binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
sharedAssistantViewModel = requireActivity().run {
ViewModelProvider(this)[SharedAssistantViewModel::class.java]
}
viewModel = ViewModelProvider(this, EmailAccountCreationViewModelFactory(sharedViewModel.getAccountCreator()))[EmailAccountCreationViewModel::class.java]
viewModel = ViewModelProvider(this, EmailAccountCreationViewModelFactory(sharedAssistantViewModel.getAccountCreator()))[EmailAccountCreationViewModel::class.java]
binding.viewModel = viewModel
viewModel.goToEmailValidationEvent.observe(

View file

@ -31,7 +31,7 @@ import org.linphone.activities.navigateToAccountLinking
import org.linphone.databinding.AssistantEmailAccountValidationFragmentBinding
class EmailAccountValidationFragment : GenericFragment<AssistantEmailAccountValidationFragmentBinding>() {
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<AssistantEmailAccountVali
binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
sharedAssistantViewModel = requireActivity().run {
ViewModelProvider(this)[SharedAssistantViewModel::class.java]
}
viewModel = ViewModelProvider(this, EmailAccountValidationViewModelFactory(sharedViewModel.getAccountCreator()))[EmailAccountValidationViewModel::class.java]
viewModel = ViewModelProvider(this, EmailAccountValidationViewModelFactory(sharedAssistantViewModel.getAccountCreator()))[EmailAccountValidationViewModel::class.java]
binding.viewModel = viewModel
viewModel.leaveAssistantEvent.observe(

View file

@ -37,7 +37,7 @@ import org.linphone.databinding.AssistantGenericAccountLoginFragmentBinding
import org.linphone.utils.DialogUtils
class GenericAccountLoginFragment : GenericFragment<AssistantGenericAccountLoginFragmentBinding>() {
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<AssistantGenericAccountLogin
binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
sharedAssistantViewModel = requireActivity().run {
ViewModelProvider(this)[SharedAssistantViewModel::class.java]
}
viewModel = ViewModelProvider(this, GenericLoginViewModelFactory(sharedViewModel.getAccountCreator(true)))[GenericLoginViewModel::class.java]
viewModel = ViewModelProvider(this, GenericLoginViewModelFactory(sharedAssistantViewModel.getAccountCreator(true)))[GenericLoginViewModel::class.java]
binding.viewModel = viewModel
viewModel.leaveAssistantEvent.observe(

View file

@ -32,7 +32,7 @@ import org.linphone.databinding.AssistantPhoneAccountCreationFragmentBinding
class PhoneAccountCreationFragment :
AbstractPhoneFragment<AssistantPhoneAccountCreationFragmentBinding>() {
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

View file

@ -32,7 +32,7 @@ import org.linphone.core.tools.Log
import org.linphone.databinding.AssistantPhoneAccountLinkingFragmentBinding
class PhoneAccountLinkingFragment : AbstractPhoneFragment<AssistantPhoneAccountLinkingFragmentBinding>() {
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<AssistantPhoneAccountL
binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
sharedAssistantViewModel = requireActivity().run {
ViewModelProvider(this)[SharedAssistantViewModel::class.java]
}
val accountCreator = sharedViewModel.getAccountCreator()
val accountCreator = sharedAssistantViewModel.getAccountCreator()
viewModel = ViewModelProvider(this, PhoneAccountLinkingViewModelFactory(accountCreator))[PhoneAccountLinkingViewModel::class.java]
binding.viewModel = viewModel

View file

@ -37,7 +37,7 @@ import org.linphone.activities.navigateToEchoCancellerCalibration
import org.linphone.databinding.AssistantPhoneAccountValidationFragmentBinding
class PhoneAccountValidationFragment : GenericFragment<AssistantPhoneAccountValidationFragmentBinding>() {
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<AssistantPhoneAccountVali
binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
sharedAssistantViewModel = requireActivity().run {
ViewModelProvider(this)[SharedAssistantViewModel::class.java]
}
viewModel = ViewModelProvider(this, PhoneAccountValidationViewModelFactory(sharedViewModel.getAccountCreator()))[PhoneAccountValidationViewModel::class.java]
viewModel = ViewModelProvider(this, PhoneAccountValidationViewModelFactory(sharedAssistantViewModel.getAccountCreator()))[PhoneAccountValidationViewModel::class.java]
binding.viewModel = viewModel
viewModel.phoneNumber.value = arguments?.getString("PhoneNumber")

View file

@ -38,7 +38,7 @@ class QrCodeFragment : GenericFragment<AssistantQrCodeFragmentBinding>() {
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<AssistantQrCodeFragmentBinding>() {
binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
sharedAssistantViewModel = requireActivity().run {
ViewModelProvider(this)[SharedAssistantViewModel::class.java]
}
@ -59,7 +59,7 @@ class QrCodeFragment : GenericFragment<AssistantQrCodeFragmentBinding>() {
viewLifecycleOwner
) {
it.consume { url ->
sharedViewModel.remoteProvisioningUrl.value = url
sharedAssistantViewModel.remoteProvisioningUrl.value = url
findNavController().navigateUp()
}
}

View file

@ -33,7 +33,7 @@ import org.linphone.activities.navigateToQrCode
import org.linphone.databinding.AssistantRemoteProvisioningFragmentBinding
class RemoteProvisioningFragment : GenericFragment<AssistantRemoteProvisioningFragmentBinding>() {
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<AssistantRemoteProvisioningFr
binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
sharedAssistantViewModel = requireActivity().run {
ViewModelProvider(this)[SharedAssistantViewModel::class.java]
}
@ -71,13 +71,14 @@ class RemoteProvisioningFragment : GenericFragment<AssistantRemoteProvisioningFr
}
}
viewModel.urlToFetch.value = sharedViewModel.remoteProvisioningUrl.value ?: coreContext.core.provisioningUri
viewModel.urlToFetch.value = sharedAssistantViewModel.remoteProvisioningUrl.value ?: coreContext.core.provisioningUri
}
override fun onDestroy() {
super.onDestroy()
if (this::sharedViewModel.isInitialized) {
sharedViewModel.remoteProvisioningUrl.value = null
if (::sharedAssistantViewModel.isInitialized) {
sharedAssistantViewModel.remoteProvisioningUrl.value = null
}
}
}

View file

@ -21,7 +21,6 @@ package org.linphone.activities.assistant.fragments
import android.os.Bundle
import android.view.View
import androidx.navigation.fragment.findNavController
import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.databinding.AssistantTopBarFragmentBinding
@ -34,15 +33,5 @@ class TopBarFragment : GenericFragment<AssistantTopBarFragmentBinding>() {
binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
binding.setBackClickListener {
goBack()
}
}
override fun goBack() {
if (!findNavController().popBackStack()) {
requireActivity().finish()
}
}
}

View file

@ -42,8 +42,6 @@ class AboutFragment : SecureFragment<AboutFragmentBinding>() {
viewModel = ViewModelProvider(this)[AboutViewModel::class.java]
binding.viewModel = viewModel
binding.setBackClickListener { goBack() }
binding.setPrivacyPolicyClickListener {
val browserIntent = Intent(
Intent.ACTION_VIEW,

View file

@ -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<ChatRoomCreationFragmentBinding>() {
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<ChatRoomCreationFragmentBinding>
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<ChatRoomCreationFragmentBinding>
// 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<ChatRoomCreationFragmentBinding>
}
}
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) {

View file

@ -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<ChatRoomDetailFragmentBinding, Cha
private lateinit var viewModel: ChatRoomViewModel
private lateinit var chatSendingViewModel: ChatMessageSendingViewModel
private lateinit var listViewModel: ChatMessagesListViewModel
private lateinit var sharedViewModel: SharedMainViewModel
private val observer = object : RecyclerView.AdapterDataObserver() {
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
@ -111,7 +108,7 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
}
override fun onSaveInstanceState(outState: Bundle) {
if (::sharedViewModel.isInitialized) {
if (isSharedViewModelInitialized()) {
val chatRoom = sharedViewModel.selectedChatRoom.value
if (chatRoom != null) {
outState.putString("LocalSipUri", chatRoom.localAddress.asStringUriOnly())
@ -129,9 +126,6 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
ViewModelProvider(this)[SharedMainViewModel::class.java]
}
binding.sharedMainViewModel = sharedViewModel
useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false
@ -383,7 +377,7 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
Log.i("[Chat Room] Forwarding message, going to chat rooms list")
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
goBack()
} else {
navigateToEmptyChatRoom()
}
@ -548,10 +542,6 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
}
}
binding.setBackClickListener {
goBack()
}
binding.setTitleClickListener {
binding.sipUri.visibility = if (!viewModel.oneToOneChatRoom ||
binding.sipUri.visibility == View.VISIBLE
@ -747,6 +737,7 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
}
override fun onPause() {
// Conversation isn't visible anymore, any new message received in it will trigger a notification
coreContext.notificationsManager.currentlyDisplayedChatRoomAddress = null
super.onPause()
@ -767,22 +758,6 @@ class DetailChatRoomFragment : MasterFragment<ChatRoomDetailFragmentBinding, Cha
}
}
override fun goBack() {
coreContext.notificationsManager.currentlyDisplayedChatRoomAddress = null
if (!findNavController().popBackStack()) {
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
if (_adapter != null) {
try {
adapter.unregisterAdapterDataObserver(observer)
} catch (ise: IllegalStateException) {}
}
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptyChatRoom()
}
}
}
private fun enterEditionMode() {
listSelectionViewModel.isEditionEnabled.value = true
}

View file

@ -27,13 +27,11 @@ import org.linphone.R
import org.linphone.activities.main.chat.viewmodels.DevicesListViewModel
import org.linphone.activities.main.chat.viewmodels.DevicesListViewModelFactory
import org.linphone.activities.main.fragments.SecureFragment
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.core.tools.Log
import org.linphone.databinding.ChatRoomDevicesFragmentBinding
class DevicesFragment : SecureFragment<ChatRoomDevicesFragmentBinding>() {
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<ChatRoomDevicesFragmentBinding>() {
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<ChatRoomDevicesFragmentBinding>() {
DevicesListViewModelFactory(chatRoom)
)[DevicesListViewModel::class.java]
binding.viewModel = listViewModel
binding.setBackClickListener {
goBack()
}
}
override fun onResume() {

View file

@ -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<ChatRoomEphemeralFragmentBinding>() {
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<ChatRoomEphemeralFragmentBinding>() {
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<ChatRoomEphemeralFragmentBinding>() {
)[EphemeralViewModel::class.java]
binding.viewModel = viewModel
binding.setBackClickListener {
goBack()
}
binding.setValidClickListener {
viewModel.updateChatRoomEphemeralDuration()
sharedViewModel.refreshChatRoomInListEvent.value = Event(true)

View file

@ -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<ChatRoomGroupInfoFragmentBinding>() {
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<ChatRoomGroupInfoFragmentBinding>() {
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<ChatRoomGroupInfoFragmentBinding>() {
addParticipantsFromSharedViewModel()
binding.setBackClickListener {
goBack()
}
viewModel.createdChatRoomEvent.observe(
viewLifecycleOwner
) {

View file

@ -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<ChatRoomImdnFragmentBinding>() {
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<ChatRoomImdnFragmentBinding>() {
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<ChatRoomImdnFragmentBinding>() {
) {
adapter.submitList(it)
}
binding.setBackClickListener {
goBack()
}
}
}

View file

@ -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<ChatRoomMasterFragmentBinding, ChatRoomsListAdapter>() {
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<ChatRoomMasterFragmentBinding, Ch
/* Shared view model & sliding pane related */
sharedViewModel = requireActivity().run {
ViewModelProvider(this)[SharedMainViewModel::class.java]
}
setUpSlidingPane(binding.slidingPane)
view.doOnPreDraw { sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable }
binding.slidingPane.addPanelSlideListener(object : SlidingPaneLayout.PanelSlideListener {
override fun onPanelSlide(panel: View, slideOffset: Float) { }
override fun onPanelOpened(panel: View) { }
override fun onPanelClosed(panel: View) {
// Conversation isn't visible anymore, any new message received in it will trigger a notification
coreContext.notificationsManager.currentlyDisplayedChatRoomAddress = null
}
})
// Chat room loading can take some time, so wait until it is ready before opening the pane
sharedViewModel.chatRoomFragmentOpenedEvent.observe(
@ -120,17 +124,6 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
}
}
sharedViewModel.closeSlidingPaneEvent.observe(
viewLifecycleOwner
) {
it.consume {
(requireActivity() as MainActivity).hideKeyboard()
if (!binding.slidingPane.closePane()) {
goBack()
}
}
}
sharedViewModel.layoutChangedEvent.observe(
viewLifecycleOwner
) {
@ -158,8 +151,6 @@ class MasterChatRoomsFragment : MasterFragment<ChatRoomMasterFragmentBinding, Ch
}
}
binding.slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED
/* End of shared view model & sliding pane related */
_adapter = ChatRoomsListAdapter(listSelectionViewModel, viewLifecycleOwner)

View file

@ -22,7 +22,6 @@ package org.linphone.activities.main.conference.fragments
import android.os.Bundle
import android.text.format.DateFormat.is24HourFormat
import android.view.View
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.navGraphViewModels
import com.google.android.material.datepicker.CalendarConstraints
import com.google.android.material.datepicker.DateValidatorPointForward
@ -33,7 +32,6 @@ import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.activities.GenericFragment
import org.linphone.activities.main.conference.viewmodels.ConferenceSchedulingViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToParticipantsList
import org.linphone.core.Factory
import org.linphone.core.tools.Log
@ -41,7 +39,6 @@ import org.linphone.databinding.ConferenceSchedulingFragmentBinding
class ConferenceSchedulingFragment : GenericFragment<ConferenceSchedulingFragmentBinding>() {
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<ConferenceSchedulingFragmen
binding.viewModel = viewModel
sharedViewModel = requireActivity().run {
ViewModelProvider(this)[SharedMainViewModel::class.java]
}
sharedViewModel.conferenceInfoToEdit.observe(
viewLifecycleOwner
) {
@ -75,10 +68,6 @@ class ConferenceSchedulingFragment : GenericFragment<ConferenceSchedulingFragmen
}
}
binding.setBackClickListener {
goBack()
}
binding.setNextClickListener {
navigateToParticipantsList()
}

View file

@ -58,10 +58,6 @@ class ConferenceSchedulingParticipantsListFragment : GenericFragment<ConferenceS
// Divider between items
binding.contactsList.addItemDecoration(AppUtils.getDividerDecoration(requireContext(), layoutManager))
binding.setBackClickListener {
goBack()
}
binding.setNextClickListener {
navigateToSummary()
}

View file

@ -42,10 +42,6 @@ class ConferenceSchedulingSummaryFragment : GenericFragment<ConferenceScheduling
binding.viewModel = viewModel
binding.setBackClickListener {
goBack()
}
binding.setCreateConferenceClickListener {
viewModel.createConference()
}

View file

@ -33,7 +33,6 @@ import org.linphone.activities.main.MainActivity
import org.linphone.activities.main.conference.adapters.ScheduledConferencesAdapter
import org.linphone.activities.main.conference.viewmodels.ScheduledConferencesViewModel
import org.linphone.activities.main.viewmodels.DialogViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToConferenceScheduling
import org.linphone.activities.navigateToConferenceWaitingRoom
import org.linphone.databinding.ConferencesScheduledFragmentBinding
@ -45,7 +44,6 @@ import org.linphone.utils.RecyclerViewHeaderDecoration
class ScheduledConferencesFragment : GenericFragment<ConferencesScheduledFragmentBinding>() {
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<ConferencesScheduledFragmen
)
binding.conferenceInfoList.adapter = adapter
sharedViewModel = requireActivity().run {
ViewModelProvider(this)[SharedMainViewModel::class.java]
}
val layoutManager = LinearLayoutManager(activity)
binding.conferenceInfoList.layoutManager = layoutManager
@ -142,10 +136,6 @@ class ScheduledConferencesFragment : GenericFragment<ConferencesScheduledFragmen
}
}
binding.setBackClickListener {
goBack()
}
binding.setNewConferenceClickListener {
navigateToConferenceScheduling()
}

View file

@ -29,7 +29,6 @@ import android.view.View
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import java.io.File
import kotlinx.coroutines.launch
import org.linphone.LinphoneApplication.Companion.corePreferences
@ -38,18 +37,14 @@ import org.linphone.activities.GenericFragment
import org.linphone.activities.main.MainActivity
import org.linphone.activities.main.contact.data.NumberOrAddressEditorData
import org.linphone.activities.main.contact.viewmodels.*
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToContact
import org.linphone.activities.navigateToEmptyContact
import org.linphone.core.tools.Log
import org.linphone.databinding.ContactEditorFragmentBinding
import org.linphone.utils.Event
import org.linphone.utils.FileUtils
import org.linphone.utils.PermissionHelper
class ContactEditorFragment : GenericFragment<ContactEditorFragmentBinding>(), 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<ContactEditorFragmentBinding>(), 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<ContactEditorFragmentBinding>(), S
useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false
binding.setBackClickListener {
goBack()
}
binding.setAvatarClickListener {
pickFile()
}
@ -109,16 +96,6 @@ class ContactEditorFragment : GenericFragment<ContactEditorFragmentBinding>(), 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

View file

@ -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<ContactDetailFragmentBinding>() {
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<ContactDetailFragmentBinding>() {
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<ContactDetailFragmentBinding>() {
}
}
binding.setBackClickListener {
goBack()
}
binding.setEditClickListener {
navigateToContactEditor()
}
@ -170,16 +160,6 @@ class DetailContactFragment : GenericFragment<ContactDetailFragmentBinding>() {
}
}
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)

View file

@ -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<ContactMasterFragmentBinding, ContactsListAdapter>() {
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<ContactMasterFragmentBinding, Cont
/* Shared view model & sliding pane related */
sharedViewModel = requireActivity().run {
ViewModelProvider(this)[SharedMainViewModel::class.java]
}
view.doOnPreDraw { sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable }
setUpSlidingPane(binding.slidingPane)
useMaterialSharedAxisXForwardAnimation = false
sharedViewModel.updateContactsAnimationsBasedOnDestination.observe(
@ -114,15 +106,6 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
}
}
sharedViewModel.closeSlidingPaneEvent.observe(
viewLifecycleOwner
) {
it.consume {
if (!binding.slidingPane.closePane()) {
goBack()
}
}
}
sharedViewModel.layoutChangedEvent.observe(
viewLifecycleOwner
) {
@ -138,7 +121,7 @@ class MasterContactsFragment : MasterFragment<ContactMasterFragmentBinding, Cont
}
}
}
binding.slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED
/* End of shared view model & sliding pane related */
_adapter = ContactsListAdapter(listSelectionViewModel, viewLifecycleOwner)

View file

@ -45,10 +45,6 @@ class ConfigViewerFragment : SecureFragment<FileConfigViewerFragmentBinding>() {
isSecure = arguments?.getBoolean("Secure") ?: false
binding.setBackClickListener {
goBack()
}
binding.setExportClickListener {
shareConfig()
}

View file

@ -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<DialerFragmentBinding>() {
private lateinit var viewModel: DialerViewModel
private lateinit var sharedViewModel: SharedMainViewModel
private var uploadLogsInitiatedByUs = false
@ -73,10 +71,6 @@ class DialerFragment : SecureFragment<DialerFragmentBinding>() {
viewModel = ViewModelProvider(this)[DialerViewModel::class.java]
binding.viewModel = viewModel
sharedViewModel = requireActivity().run {
ViewModelProvider(this)[SharedMainViewModel::class.java]
}
useMaterialSharedAxisXForwardAnimation = false
sharedViewModel.updateDialerAnimationsBasedOnDestination.observe(
viewLifecycleOwner

View file

@ -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<T : ViewDataBinding> : SecureFragment<T>() {
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<T : ViewDataBinding> : SecureFragment<T>()
(childFragmentManager.findFragmentById(R.id.top_bar_fragment) as? TopBarFragment)
?.setContent(content)
}
override fun goBack() {
findNavController().popBackStack()
}
}

View file

@ -48,10 +48,6 @@ class TopBarFragment : GenericFragment<FileViewerTopBarFragmentBinding>() {
binding.lifecycleOwner = viewLifecycleOwner
useMaterialSharedAxisXForwardAnimation = false
binding.setBackClickListener {
goBack()
}
binding.setExportClickListener {
val contentToExport = content
if (contentToExport != null) {

View file

@ -57,7 +57,5 @@ class ListTopBarFragment : GenericFragment<ListEditTopBarFragmentBinding>() {
binding.setDeleteClickListener {
viewModel.deleteSelectionEvent.value = Event(true)
}
onBackPressedCallback.isEnabled = false
}
}

View file

@ -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<T : ViewDataBinding, U : SelectionListAdapter<*, *
}
}
fun setUpSlidingPane(slidingPane: SlidingPaneLayout) {
binding.root.doOnPreDraw {
sharedViewModel.isSlidingPaneSlideable.value = slidingPane.isSlideable
requireActivity().onBackPressedDispatcher.addCallback(
viewLifecycleOwner,
SlidingPaneBackPressedCallback(slidingPane)
)
}
slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED
}
private fun delete() {
val list = listSelectionViewModel.selectedItems.value ?: arrayListOf()
deleteItems(list)
@ -117,4 +133,34 @@ abstract class MasterFragment<T : ViewDataBinding, U : SelectionListAdapter<*, *
}
abstract fun deleteItems(indexesOfItemToDelete: ArrayList<Int>)
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) { }
}
}

View file

@ -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<StatusFragmentBinding>() {
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<StatusFragmentBinding>() {
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<StatusFragmentBinding>() {
binding.setRefreshClickListener {
viewModel.refreshRegister()
}
onBackPressedCallback.isEnabled = false
}
}

View file

@ -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<TabsFragmentBinding>(), 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<TabsFragmentBinding>(), 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<TabsFragmentBinding>(), NavController.OnDes
}
navigateToChatRooms()
}
onBackPressedCallback.isEnabled = false
}
override fun onStart() {

View file

@ -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<HistoryDetailFragmentBinding>() {
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<HistoryDetailFragmentBinding>() {
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<HistoryDetailFragmentBinding>() {
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<HistoryDetailFragmentBinding>() {
}
}
override fun goBack() {
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptyCallHistory()
}
}
override fun onResume() {
super.onResume()
viewModel.enableListener(true)

View file

@ -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<HistoryConfDetailFragmentBinding>() {
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<HistoryConfDetailFragmen
binding.lifecycleOwner = viewLifecycleOwner
sharedViewModel = requireActivity().run {
ViewModelProvider(this)[SharedMainViewModel::class.java]
}
binding.sharedMainViewModel = sharedViewModel
val callLogGroup = sharedViewModel.selectedCallLogGroup.value
@ -61,10 +54,6 @@ class DetailConferenceCallLogFragment : GenericFragment<HistoryConfDetailFragmen
useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false
binding.setBackClickListener {
goBack()
}
viewModel.onMessageToNotifyEvent.observe(
viewLifecycleOwner
) {
@ -73,12 +62,4 @@ class DetailConferenceCallLogFragment : GenericFragment<HistoryConfDetailFragmen
}
}
}
override fun goBack() {
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptyCallHistory()
}
}
}

View file

@ -24,13 +24,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
@ -42,7 +40,6 @@ import org.linphone.activities.main.history.adapters.CallLogsListAdapter
import org.linphone.activities.main.history.data.GroupedCallLogData
import org.linphone.activities.main.history.viewmodels.CallLogsListViewModel
import org.linphone.activities.main.viewmodels.DialogViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.main.viewmodels.TabsViewModel
import org.linphone.activities.navigateToCallHistory
import org.linphone.activities.navigateToConferenceCallHistory
@ -54,7 +51,6 @@ import org.linphone.utils.*
class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, CallLogsListAdapter>() {
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<HistoryMasterFragmentBinding, Call
/* Shared view model & sliding pane related */
sharedViewModel = requireActivity().run {
ViewModelProvider(this)[SharedMainViewModel::class.java]
}
setUpSlidingPane(binding.slidingPane)
view.doOnPreDraw { sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable }
sharedViewModel.closeSlidingPaneEvent.observe(
viewLifecycleOwner
) {
it.consume {
if (!binding.slidingPane.closePane()) {
goBack()
}
}
}
sharedViewModel.layoutChangedEvent.observe(
viewLifecycleOwner
) {
@ -126,7 +109,7 @@ class MasterCallLogsFragment : MasterFragment<HistoryMasterFragmentBinding, Call
}
}
}
binding.slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED
/* End of shared view model & sliding pane related */
_adapter = CallLogsListAdapter(listSelectionViewModel, viewLifecycleOwner)

View file

@ -97,8 +97,6 @@ class RecordingsFragment : MasterFragment<RecordingsFragmentBinding, RecordingsL
}
}
binding.setBackClickListener { goBack() }
binding.setEditClickListener { listSelectionViewModel.isEditionEnabled.value = true }
binding.setVideoTouchListener { v, event ->

View file

@ -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<SettingsAccountFragmentBi
}
binding.viewModel = viewModel
binding.setBackClickListener { goBack() }
viewModel.linkPhoneNumberEvent.observe(
viewLifecycleOwner
) {
@ -100,12 +97,4 @@ class AccountSettingsFragment : GenericSettingFragment<SettingsAccountFragmentBi
sharedViewModel.accountSettingsFragmentOpenedEvent.value = Event(true)
}
}
override fun goBack() {
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -30,12 +30,10 @@ import androidx.lifecycle.ViewModelProvider
import org.linphone.R
import org.linphone.activities.main.MainActivity
import org.linphone.activities.main.settings.viewmodels.AdvancedSettingsViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.core.tools.Log
import org.linphone.core.tools.compatibility.DeviceUtils
import org.linphone.databinding.SettingsAdvancedFragmentBinding
import org.linphone.utils.AppUtils
import org.linphone.utils.Event
import org.linphone.utils.PowerManagerUtils
class AdvancedSettingsFragment : GenericSettingFragment<SettingsAdvancedFragmentBinding>() {
@ -52,8 +50,6 @@ class AdvancedSettingsFragment : GenericSettingFragment<SettingsAdvancedFragment
viewModel = ViewModelProvider(this)[AdvancedSettingsViewModel::class.java]
binding.viewModel = viewModel
binding.setBackClickListener { goBack() }
viewModel.uploadFinishedEvent.observe(
viewLifecycleOwner
) {
@ -146,12 +142,4 @@ class AdvancedSettingsFragment : GenericSettingFragment<SettingsAdvancedFragment
}
}
}
override fun goBack() {
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -31,10 +31,8 @@ import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.activities.main.settings.SettingListenerStub
import org.linphone.activities.main.settings.viewmodels.AudioSettingsViewModel
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 : GenericSettingFragment<SettingsAudioFragmentBinding>() {
@ -51,8 +49,6 @@ class AudioSettingsFragment : GenericSettingFragment<SettingsAudioFragmentBindin
viewModel = ViewModelProvider(this)[AudioSettingsViewModel::class.java]
binding.viewModel = viewModel
binding.setBackClickListener { goBack() }
viewModel.askAudioRecordPermissionForEchoCancellerCalibrationEvent.observe(
viewLifecycleOwner
) {
@ -117,12 +113,4 @@ class AudioSettingsFragment : GenericSettingFragment<SettingsAudioFragmentBindin
}
viewModel.audioCodecs.value = list
}
override fun goBack() {
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -30,13 +30,11 @@ import androidx.lifecycle.ViewModelProvider
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
import org.linphone.activities.main.settings.viewmodels.CallSettingsViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.compatibility.Compatibility
import org.linphone.core.tools.Log
import org.linphone.databinding.SettingsCallFragmentBinding
import org.linphone.mediastream.Version
import org.linphone.telecom.TelecomHelper
import org.linphone.utils.Event
class CallSettingsFragment : GenericSettingFragment<SettingsCallFragmentBinding>() {
private lateinit var viewModel: CallSettingsViewModel
@ -52,8 +50,6 @@ class CallSettingsFragment : GenericSettingFragment<SettingsCallFragmentBinding>
viewModel = ViewModelProvider(this)[CallSettingsViewModel::class.java]
binding.viewModel = viewModel
binding.setBackClickListener { goBack() }
viewModel.systemWideOverlayEnabledEvent.observe(
viewLifecycleOwner
) {
@ -162,14 +158,6 @@ class CallSettingsFragment : GenericSettingFragment<SettingsCallFragmentBinding>
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<out String>,

View file

@ -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<SettingsChatFragmentBinding>() {
@ -48,8 +46,6 @@ class ChatSettingsFragment : GenericSettingFragment<SettingsChatFragmentBinding>
viewModel = ViewModelProvider(this)[ChatSettingsViewModel::class.java]
binding.viewModel = viewModel
binding.setBackClickListener { goBack() }
viewModel.launcherShortcutsEvent.observe(
viewLifecycleOwner
) {
@ -90,14 +86,6 @@ class ChatSettingsFragment : GenericSettingFragment<SettingsChatFragmentBinding>
}
}
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]

View file

@ -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<SettingsConferencesFragmentBinding>() {
private lateinit var viewModel: ConferencesSettingsViewModel
@ -41,15 +39,5 @@ class ConferencesSettingsFragment : GenericSettingFragment<SettingsConferencesFr
viewModel = ViewModelProvider(this)[ConferencesSettingsViewModel::class.java]
binding.viewModel = viewModel
binding.setBackClickListener { goBack() }
}
override fun goBack() {
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -28,11 +28,9 @@ import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
import org.linphone.activities.main.settings.SettingListenerStub
import org.linphone.activities.main.settings.viewmodels.ContactsSettingsViewModel
import org.linphone.activities.navigateToEmptySetting
import org.linphone.activities.navigateToLdapSettings
import org.linphone.core.tools.Log
import org.linphone.databinding.SettingsContactsFragmentBinding
import org.linphone.utils.Event
import org.linphone.utils.PermissionHelper
import org.linphone.utils.ShortcutsHelper
@ -50,8 +48,6 @@ class ContactsSettingsFragment : GenericSettingFragment<SettingsContactsFragment
viewModel = ViewModelProvider(this)[ContactsSettingsViewModel::class.java]
binding.viewModel = viewModel
binding.setBackClickListener { goBack() }
viewModel.launcherShortcutsEvent.observe(
viewLifecycleOwner
) {
@ -126,14 +122,6 @@ class ContactsSettingsFragment : GenericSettingFragment<SettingsContactsFragment
}
}
override fun goBack() {
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
override fun onResume() {
super.onResume()
viewModel.updateLdapConfigurationsList()

View file

@ -22,18 +22,10 @@ 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)[SharedMainViewModel::class.java]
}
useMaterialSharedAxisXForwardAnimation = sharedViewModel.isSlidingPaneSlideable.value == false
super.onViewCreated(view, savedInstanceState)

View file

@ -62,7 +62,5 @@ class LdapSettingsFragment : GenericSettingFragment<SettingsLdapFragmentBinding>
goBack()
}
}
binding.setBackClickListener { goBack() }
}
}

View file

@ -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<SettingsNetworkFragmentBinding>() {
private lateinit var viewModel: NetworkSettingsViewModel
@ -41,15 +39,5 @@ class NetworkSettingsFragment : GenericSettingFragment<SettingsNetworkFragmentBi
viewModel = ViewModelProvider(this)[NetworkSettingsViewModel::class.java]
binding.viewModel = viewModel
binding.setBackClickListener { goBack() }
}
override fun goBack() {
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -29,10 +29,10 @@ 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.MasterFragment
import org.linphone.activities.main.fragments.SecureFragment
import org.linphone.activities.main.settings.SettingListenerStub
import org.linphone.activities.main.settings.viewmodels.SettingsViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToAccountSettings
import org.linphone.activities.navigateToAudioSettings
import org.linphone.activities.navigateToTunnelSettings
@ -41,7 +41,6 @@ import org.linphone.core.tools.Log
import org.linphone.databinding.SettingsFragmentBinding
class SettingsFragment : SecureFragment<SettingsFragmentBinding>() {
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<SettingsFragmentBinding>() {
/* 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<SettingsFragmentBinding>() {
}
}
sharedViewModel.closeSlidingPaneEvent.observe(
viewLifecycleOwner
) {
it.consume {
if (!binding.slidingPane.closePane()) {
goBack()
}
}
}
sharedViewModel.layoutChangedEvent.observe(
viewLifecycleOwner
) {
@ -100,6 +86,12 @@ class SettingsFragment : SecureFragment<SettingsFragmentBinding>() {
}
}
}
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<SettingsFragmentBinding>() {
viewModel = ViewModelProvider(this)[SettingsViewModel::class.java]
binding.viewModel = viewModel
binding.setBackClickListener { goBack() }
sharedViewModel.accountRemoved.observe(
viewLifecycleOwner
) {

View file

@ -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<SettingsTunnelFragmentBinding>() {
private lateinit var viewModel: TunnelSettingsViewModel
@ -41,15 +39,5 @@ class TunnelSettingsFragment : GenericSettingFragment<SettingsTunnelFragmentBind
viewModel = ViewModelProvider(this)[TunnelSettingsViewModel::class.java]
binding.viewModel = viewModel
binding.setBackClickListener { goBack() }
}
override fun goBack() {
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -31,10 +31,8 @@ import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.activities.main.settings.SettingListenerStub
import org.linphone.activities.main.settings.viewmodels.VideoSettingsViewModel
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 : GenericSettingFragment<SettingsVideoFragmentBinding>() {
@ -51,8 +49,6 @@ class VideoSettingsFragment : GenericSettingFragment<SettingsVideoFragmentBindin
viewModel = ViewModelProvider(this)[VideoSettingsViewModel::class.java]
binding.viewModel = viewModel
binding.setBackClickListener { goBack() }
initVideoCodecsList()
if (!PermissionHelper.required(requireContext()).hasCameraPermission()) {
@ -103,12 +99,4 @@ class VideoSettingsFragment : GenericSettingFragment<SettingsVideoFragmentBindin
}
viewModel.videoCodecs.value = list
}
override fun goBack() {
if (sharedViewModel.isSlidingPaneSlideable.value == true) {
sharedViewModel.closeSlidingPaneEvent.value = Event(true)
} else {
navigateToEmptySetting()
}
}
}

View file

@ -36,7 +36,6 @@ import org.linphone.activities.*
import org.linphone.activities.assistant.AssistantActivity
import org.linphone.activities.main.settings.SettingListenerStub
import org.linphone.activities.main.sidemenu.viewmodels.SideMenuViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.activities.navigateToAbout
import org.linphone.activities.navigateToAccountSettings
import org.linphone.activities.navigateToRecordings
@ -49,7 +48,6 @@ import org.linphone.utils.PermissionHelper
class SideMenuFragment : GenericFragment<SideMenuFragmentBinding>() {
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<SideMenuFragmentBinding>() {
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<SideMenuFragmentBinding>() {
coreContext.notificationsManager.stopForegroundNotification()
coreContext.stop()
}
onBackPressedCallback.isEnabled = false
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

View file

@ -31,7 +31,6 @@ class SharedMainViewModel : ViewModel() {
val layoutChangedEvent = MutableLiveData<Event<Boolean>>()
var isSlidingPaneSlideable = MutableLiveData<Boolean>()
val closeSlidingPaneEvent = MutableLiveData<Event<Boolean>>()
/* Call history */

View file

@ -69,10 +69,6 @@ class ConferenceAddParticipantsFragment : GenericFragment<VoipConferenceParticip
// Divider between items
binding.contactsList.addItemDecoration(AppUtils.getDividerDecoration(requireContext(), layoutManager))
binding.setBackClickListener {
goBack()
}
binding.setApplyClickListener {
viewModel.applyChanges()
goBack()

View file

@ -75,11 +75,6 @@ class StatusFragment : GenericFragment<VoipStatusFragmentBinding>() {
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
onBackPressedCallback.isEnabled = false
}
override fun onDestroy() {
if (zrtpDialog != null) {
zrtpDialog?.dismiss()

View file

@ -3,9 +3,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="privacyPolicyClickListener"
type="android.view.View.OnClickListener"/>
@ -35,7 +32,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -3,9 +3,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="privacyPolicyClickListener"
type="android.view.View.OnClickListener"/>
@ -35,7 +32,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -3,9 +3,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
</data>
<LinearLayout
@ -18,7 +15,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="allContactsToggleClickListener"
type="android.view.View.OnClickListener"/>
@ -36,7 +33,6 @@
<ImageView
android:id="@+id/back"
android:contentDescription="@string/content_description_go_back"
android:onClick="@{backClickListener}"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="left"

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="titleClickListener"
type="android.view.View.OnClickListener"/>
@ -61,7 +58,6 @@
<ImageView
android:id="@+id/back"
android:contentDescription="@string/content_description_go_back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -4,9 +4,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.chat.viewmodels.DevicesListViewModel" />
@ -25,7 +22,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -4,9 +4,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="validClickListener"
type="android.view.View.OnClickListener"/>
@ -28,7 +25,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -4,9 +4,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="nextClickListener"
type="android.view.View.OnClickListener"/>
@ -40,7 +37,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -4,9 +4,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.chat.viewmodels.ImdnViewModel" />
@ -26,7 +23,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -4,9 +4,6 @@
<data>
<import type="android.view.View" />
<variable
name="backClickListener"
type="android.view.View.OnClickListener" />
<variable
name="nextClickListener"
type="android.view.View.OnClickListener" />
@ -35,7 +32,7 @@
android:orientation="horizontal">
<ImageView
android:onClick="@{backClickListener}"
android:id="@+id/back"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -4,9 +4,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="nextClickListener"
type="android.view.View.OnClickListener"/>
@ -29,7 +26,7 @@
android:orientation="horizontal">
<ImageView
android:onClick="@{backClickListener}"
android:id="@+id/back"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View" />
<variable
name="backClickListener"
type="android.view.View.OnClickListener" />
<variable
name="createConferenceClickListener"
type="android.view.View.OnClickListener" />
@ -34,7 +31,7 @@
android:orientation="horizontal">
<ImageView
android:onClick="@{backClickListener}"
android:id="@+id/back"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -3,9 +3,6 @@
<data>
<import type="android.view.View" />
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="newConferenceClickListener"
type="android.view.View.OnClickListener"/>
@ -30,7 +27,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View" />
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="deleteClickListener"
type="android.view.View.OnClickListener"/>
@ -35,7 +32,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -4,9 +4,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="avatarClickListener"
type="android.view.View.OnClickListener"/>
@ -30,9 +27,8 @@
android:orientation="horizontal">
<ImageView
android:id="@+id/cancel"
android:id="@+id/back"
android:contentDescription="@string/content_description_discard_changes"
android:onClick="@{backClickListener}"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2"

View file

@ -3,9 +3,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="exportClickListener"
type="android.view.View.OnClickListener"/>
@ -28,7 +25,7 @@
android:orientation="horizontal">
<ImageView
android:onClick="@{backClickListener}"
android:id="@+id/back"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -3,9 +3,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="exportClickListener"
type="android.view.View.OnClickListener"/>
@ -20,7 +17,7 @@
android:orientation="horizontal">
<ImageView
android:onClick="@{backClickListener}"
android:id="@+id/back"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -6,10 +6,6 @@
<import type="android.view.View" />
<variable
name="backClickListener"
type="android.view.View.OnClickListener" />
<variable
name="newContactClickListener"
type="android.view.View.OnClickListener" />
@ -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}" />

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="newContactClickListener"
type="android.view.View.OnClickListener"/>
@ -35,7 +32,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -4,9 +4,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="editClickListener"
type="android.view.View.OnClickListener"/>
@ -33,7 +30,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -6,9 +6,6 @@
<data>
<import type="android.view.View"/>
<import type="android.text.InputType"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.settings.viewmodels.AccountSettingsViewModel"/>
@ -31,7 +28,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -6,9 +6,6 @@
<data>
<import type="android.view.View"/>
<import type="android.text.InputType"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.settings.viewmodels.AdvancedSettingsViewModel"/>
@ -31,7 +28,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View"/>
<import type="android.text.InputType"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.settings.viewmodels.AudioSettingsViewModel"/>
@ -30,7 +27,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View"/>
<import type="android.text.InputType"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.settings.viewmodels.CallSettingsViewModel"/>
@ -30,7 +27,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View"/>
<import type="android.text.InputType"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.settings.viewmodels.ChatSettingsViewModel"/>
@ -30,7 +27,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View"/>
<import type="android.text.InputType"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.settings.viewmodels.ConferencesSettingsViewModel"/>
@ -30,7 +27,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -4,9 +4,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.settings.viewmodels.ContactsSettingsViewModel"/>
@ -29,7 +26,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -6,9 +6,6 @@
<data>
<import type="android.view.View"/>
<import type="android.text.InputType"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.settings.viewmodels.SettingsViewModel" />
@ -35,7 +32,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View"/>
<import type="android.text.InputType"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.settings.viewmodels.LdapSettingsViewModel"/>
@ -30,7 +27,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View"/>
<import type="android.text.InputType"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.settings.viewmodels.NetworkSettingsViewModel"/>
@ -30,7 +27,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View"/>
<import type="android.text.InputType"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.settings.viewmodels.TunnelSettingsViewModel"/>
@ -30,7 +27,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -5,9 +5,6 @@
<data>
<import type="android.view.View"/>
<import type="android.text.InputType"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="viewModel"
type="org.linphone.activities.main.settings.viewmodels.VideoSettingsViewModel"/>
@ -30,7 +27,6 @@
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:visibility="@{sharedMainViewModel.isSlidingPaneSlideable ? View.VISIBLE : View.GONE}"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"

View file

@ -4,9 +4,6 @@
<data>
<import type="android.view.View"/>
<variable
name="backClickListener"
type="android.view.View.OnClickListener"/>
<variable
name="applyClickListener"
type="android.view.View.OnClickListener"/>
@ -29,7 +26,7 @@
android:orientation="horizontal">
<ImageView
android:onClick="@{backClickListener}"
android:id="@+id/back"
android:contentDescription="@string/content_description_go_back"
android:layout_width="0dp"
android:layout_height="match_parent"

View file

@ -2,6 +2,7 @@
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_nav_graph_xml"
app:startDestination="@id/dialerFragment">
<fragment