diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt index cfdd675f5..4cf945451 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt @@ -79,66 +79,62 @@ class AccountLoginFragment : AbstractPhoneFragment - (requireActivity() as AssistantActivity).showSnackBar(message) - } + viewLifecycleOwner + ) { + it.consume { message -> + (requireActivity() as AssistantActivity).showSnackBar(message) } - ) + } if (Version.sdkAboveOrEqual(Version.API23_MARSHMALLOW_60)) { checkPermissions() diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/EchoCancellerCalibrationFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/EchoCancellerCalibrationFragment.kt index a48be894b..626e35017 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/EchoCancellerCalibrationFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/EchoCancellerCalibrationFragment.kt @@ -48,13 +48,12 @@ class EchoCancellerCalibrationFragment : GenericFragment - (requireActivity() as AssistantActivity).showSnackBar(message) - } + viewLifecycleOwner + ) { + it.consume { message -> + (requireActivity() as AssistantActivity).showSnackBar(message) } - ) + } } } diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/EmailAccountValidationFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/EmailAccountValidationFragment.kt index dd2f5aeef..e6f4cd409 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/EmailAccountValidationFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/EmailAccountValidationFragment.kt @@ -49,27 +49,25 @@ class EmailAccountValidationFragment : GenericFragment - (requireActivity() as AssistantActivity).showSnackBar(message) - } + viewLifecycleOwner + ) { + it.consume { message -> + (requireActivity() as AssistantActivity).showSnackBar(message) } - ) + } } } diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/GenericAccountLoginFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/GenericAccountLoginFragment.kt index 2b81c1336..9dc119313 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/GenericAccountLoginFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/GenericAccountLoginFragment.kt @@ -54,52 +54,50 @@ class GenericAccountLoginFragment : GenericFragment - (requireActivity() as AssistantActivity).showSnackBar(message) - } + viewLifecycleOwner + ) { + it.consume { message -> + (requireActivity() as AssistantActivity).showSnackBar(message) } - ) + } } } diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountCreationFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountCreationFragment.kt index 749ac6449..cce9f7a9c 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountCreationFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountCreationFragment.kt @@ -62,25 +62,23 @@ class PhoneAccountCreationFragment : } viewModel.goToSmsValidationEvent.observe( - viewLifecycleOwner, - { - it.consume { - val args = Bundle() - args.putBoolean("IsCreation", true) - args.putString("PhoneNumber", viewModel.accountCreator.phoneNumber) - navigateToPhoneAccountValidation(args) - } + viewLifecycleOwner + ) { + it.consume { + val args = Bundle() + args.putBoolean("IsCreation", true) + args.putString("PhoneNumber", viewModel.accountCreator.phoneNumber) + navigateToPhoneAccountValidation(args) } - ) + } viewModel.onErrorEvent.observe( - viewLifecycleOwner, - { - it.consume { message -> - (requireActivity() as AssistantActivity).showSnackBar(message) - } + viewLifecycleOwner + ) { + it.consume { message -> + (requireActivity() as AssistantActivity).showSnackBar(message) } - ) + } if (Version.sdkAboveOrEqual(Version.API23_MARSHMALLOW_60)) { checkPermissions() diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountLinkingFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountLinkingFragment.kt index b1f42a00e..1f7fa1f26 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountLinkingFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountLinkingFragment.kt @@ -73,38 +73,35 @@ class PhoneAccountLinkingFragment : AbstractPhoneFragment - (requireActivity() as AssistantActivity).showSnackBar(message) - } + viewLifecycleOwner + ) { + it.consume { message -> + (requireActivity() as AssistantActivity).showSnackBar(message) } - ) + } if (Version.sdkAboveOrEqual(Version.API23_MARSHMALLOW_60)) { checkPermissions() diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountValidationFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountValidationFragment.kt index 534f38234..4bac03647 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountValidationFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/PhoneAccountValidationFragment.kt @@ -59,37 +59,38 @@ class PhoneAccountValidationFragment : GenericFragment { - coreContext.contactsManager.updateLocalContacts() + viewLifecycleOwner + ) { + it.consume { + when { + viewModel.isLogin.value == true || viewModel.isCreation.value == true -> { + coreContext.contactsManager.updateLocalContacts() - if (coreContext.core.isEchoCancellerCalibrationRequired) { - navigateToEchoCancellerCalibration() - } else { - requireActivity().finish() - } - } - viewModel.isLinking.value == true -> { - val args = Bundle() - args.putString("Identity", "sip:${viewModel.accountCreator.username}@${viewModel.accountCreator.domain}") - navigateToAccountSettings(args) + if (coreContext.core.isEchoCancellerCalibrationRequired) { + navigateToEchoCancellerCalibration() + } else { + requireActivity().finish() } } + viewModel.isLinking.value == true -> { + val args = Bundle() + args.putString( + "Identity", + "sip:${viewModel.accountCreator.username}@${viewModel.accountCreator.domain}" + ) + navigateToAccountSettings(args) + } } } - ) + } viewModel.onErrorEvent.observe( - viewLifecycleOwner, - { - it.consume { message -> - (requireActivity() as AssistantActivity).showSnackBar(message) - } + viewLifecycleOwner + ) { + it.consume { message -> + (requireActivity() as AssistantActivity).showSnackBar(message) } - ) + } val clipboard = requireContext().getSystemService(CLIPBOARD_SERVICE) as ClipboardManager clipboard.addPrimaryClipChangedListener { diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/QrCodeFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/QrCodeFragment.kt index 115ec375e..45daa8761 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/QrCodeFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/QrCodeFragment.kt @@ -56,14 +56,13 @@ class QrCodeFragment : GenericFragment() { binding.viewModel = viewModel viewModel.qrCodeFoundEvent.observe( - viewLifecycleOwner, - { - it.consume { url -> - sharedViewModel.remoteProvisioningUrl.value = url - findNavController().navigateUp() - } + viewLifecycleOwner + ) { + it.consume { url -> + sharedViewModel.remoteProvisioningUrl.value = url + findNavController().navigateUp() } - ) + } viewModel.setBackCamera() if (!PermissionHelper.required(requireContext()).hasCameraPermission()) { diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt index 3dad2ddc6..d80738b57 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/RemoteProvisioningFragment.kt @@ -55,22 +55,21 @@ class RemoteProvisioningFragment : GenericFragment - if (success) { - if (coreContext.core.isEchoCancellerCalibrationRequired) { - navigateToEchoCancellerCalibration() - } else { - requireActivity().finish() - } + viewLifecycleOwner + ) { + it.consume { success -> + if (success) { + if (coreContext.core.isEchoCancellerCalibrationRequired) { + navigateToEchoCancellerCalibration() } else { - val activity = requireActivity() as AssistantActivity - activity.showSnackBar(R.string.assistant_remote_provisioning_failure) + requireActivity().finish() } + } else { + val activity = requireActivity() as AssistantActivity + activity.showSnackBar(R.string.assistant_remote_provisioning_failure) } } - ) + } viewModel.urlToFetch.value = sharedViewModel.remoteProvisioningUrl.value ?: coreContext.core.provisioningUri } diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/WelcomeFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/WelcomeFragment.kt index 8afe92371..aba6fa79f 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/WelcomeFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/WelcomeFragment.kt @@ -73,11 +73,10 @@ class WelcomeFragment : GenericFragment() { } viewModel.termsAndPrivacyAccepted.observe( - viewLifecycleOwner, - { - if (it) corePreferences.readAndAgreeTermsAndPrivacy = true - } - ) + viewLifecycleOwner + ) { + if (it) corePreferences.readAndAgreeTermsAndPrivacy = true + } setUpTermsAndPrivacyLinks() } diff --git a/app/src/main/java/org/linphone/activities/call/CallActivity.kt b/app/src/main/java/org/linphone/activities/call/CallActivity.kt index 09ea2bb8a..2ef7eb13e 100644 --- a/app/src/main/java/org/linphone/activities/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/activities/call/CallActivity.kt @@ -61,40 +61,36 @@ class CallActivity : ProximitySensorActivity() { sharedViewModel = ViewModelProvider(this)[SharedCallViewModel::class.java] sharedViewModel.toggleDrawerEvent.observe( - this, - { - it.consume { - if (binding.statsMenu.isDrawerOpen(Gravity.LEFT)) { - binding.statsMenu.closeDrawer(binding.sideMenuContent, true) - } else { - binding.statsMenu.openDrawer(binding.sideMenuContent, true) - } + this + ) { + it.consume { + if (binding.statsMenu.isDrawerOpen(Gravity.LEFT)) { + binding.statsMenu.closeDrawer(binding.sideMenuContent, true) + } else { + binding.statsMenu.openDrawer(binding.sideMenuContent, true) } } - ) + } sharedViewModel.resetHiddenInterfaceTimerInVideoCallEvent.observe( - this, - { - it.consume { - viewModel.showMomentarily() - } + this + ) { + it.consume { + viewModel.showMomentarily() } - ) + } viewModel.proximitySensorEnabled.observe( - this, - { - enableProximitySensor(it) - } - ) + this + ) { + enableProximitySensor(it) + } viewModel.videoEnabled.observe( - this, - { - updateConstraintSetDependingOnFoldingState() - } - ) + this + ) { + updateConstraintSetDependingOnFoldingState() + } } override fun onLayoutChanges(foldingFeature: FoldingFeature?) { diff --git a/app/src/main/java/org/linphone/activities/call/IncomingCallActivity.kt b/app/src/main/java/org/linphone/activities/call/IncomingCallActivity.kt index 5ddc9b93d..c150de7a0 100644 --- a/app/src/main/java/org/linphone/activities/call/IncomingCallActivity.kt +++ b/app/src/main/java/org/linphone/activities/call/IncomingCallActivity.kt @@ -79,24 +79,22 @@ class IncomingCallActivity : GenericActivity() { binding.viewModel = viewModel viewModel.callEndedEvent.observe( - this, - { - it.consume { - Log.i("[Incoming Call Activity] Call ended, finish activity") - finish() - } + this + ) { + it.consume { + Log.i("[Incoming Call Activity] Call ended, finish activity") + finish() } - ) + } viewModel.earlyMediaVideoEnabled.observe( - this, - { - if (it) { - Log.i("[Incoming Call Activity] Early media video being received, set native window id") - coreContext.core.nativeVideoWindowId = binding.remoteVideoSurface - } + this + ) { + if (it) { + Log.i("[Incoming Call Activity] Early media video being received, set native window id") + coreContext.core.nativeVideoWindowId = binding.remoteVideoSurface } - ) + } val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager val keyguardLocked = keyguardManager.isKeyguardLocked diff --git a/app/src/main/java/org/linphone/activities/call/OutgoingCallActivity.kt b/app/src/main/java/org/linphone/activities/call/OutgoingCallActivity.kt index c5ba36007..5dc2a1676 100644 --- a/app/src/main/java/org/linphone/activities/call/OutgoingCallActivity.kt +++ b/app/src/main/java/org/linphone/activities/call/OutgoingCallActivity.kt @@ -80,64 +80,58 @@ class OutgoingCallActivity : ProximitySensorActivity() { binding.controlsViewModel = controlsViewModel viewModel.callEndedEvent.observe( - this, - { - it.consume { - Log.i("[Outgoing Call Activity] Call ended, finish activity") - finish() - } + this + ) { + it.consume { + Log.i("[Outgoing Call Activity] Call ended, finish activity") + finish() } - ) + } viewModel.callConnectedEvent.observe( - this, - { - it.consume { - Log.i("[Outgoing Call Activity] Call connected, finish activity") - finish() - } + this + ) { + it.consume { + Log.i("[Outgoing Call Activity] Call connected, finish activity") + finish() } - ) + } controlsViewModel.isSpeakerSelected.observe( - this, - { - enableProximitySensor(!it) - } - ) + this + ) { + enableProximitySensor(!it) + } controlsViewModel.askAudioRecordPermissionEvent.observe( - this, - { - it.consume { permission -> - requestPermissions(arrayOf(permission), 0) - } + this + ) { + it.consume { permission -> + requestPermissions(arrayOf(permission), 0) } - ) + } controlsViewModel.askCameraPermissionEvent.observe( - this, - { - it.consume { permission -> - requestPermissions(arrayOf(permission), 0) - } + this + ) { + it.consume { permission -> + requestPermissions(arrayOf(permission), 0) } - ) + } controlsViewModel.toggleNumpadEvent.observe( - this, - { - it.consume { open -> - if (this::numpadAnimator.isInitialized) { - if (open) { - numpadAnimator.start() - } else { - numpadAnimator.reverse() - } + this + ) { + it.consume { open -> + if (this::numpadAnimator.isInitialized) { + if (open) { + numpadAnimator.start() + } else { + numpadAnimator.reverse() } } } - ) + } if (Version.sdkAboveOrEqual(Version.API23_MARSHMALLOW_60)) { checkPermissions() diff --git a/app/src/main/java/org/linphone/activities/call/fragments/ControlsFragment.kt b/app/src/main/java/org/linphone/activities/call/fragments/ControlsFragment.kt index 8c8f89640..3765a4183 100644 --- a/app/src/main/java/org/linphone/activities/call/fragments/ControlsFragment.kt +++ b/app/src/main/java/org/linphone/activities/call/fragments/ControlsFragment.kt @@ -88,140 +88,129 @@ class ControlsFragment : GenericFragment() { binding.conferenceViewModel = conferenceViewModel callsViewModel.currentCallViewModel.observe( - viewLifecycleOwner, - { - if (it != null) { - binding.activeCallTimer.base = - SystemClock.elapsedRealtime() - (1000 * it.call.duration) // Linphone timestamps are in seconds - binding.activeCallTimer.start() - } + viewLifecycleOwner + ) { + if (it != null) { + binding.activeCallTimer.base = + SystemClock.elapsedRealtime() - (1000 * it.call.duration) // Linphone timestamps are in seconds + binding.activeCallTimer.start() } - ) + } callsViewModel.noMoreCallEvent.observe( - viewLifecycleOwner, - { - it.consume { - requireActivity().finish() - } + viewLifecycleOwner + ) { + it.consume { + requireActivity().finish() } - ) + } callsViewModel.askWriteExternalStoragePermissionEvent.observe( - viewLifecycleOwner, - { - it.consume { - if (!PermissionHelper.get().hasWriteExternalStoragePermission()) { - Log.i("[Controls Fragment] Asking for WRITE_EXTERNAL_STORAGE permission") - requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 2) - } + viewLifecycleOwner + ) { + it.consume { + if (!PermissionHelper.get().hasWriteExternalStoragePermission()) { + Log.i("[Controls Fragment] Asking for WRITE_EXTERNAL_STORAGE permission") + requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 2) } } - ) + } callsViewModel.callUpdateEvent.observe( - viewLifecycleOwner, - { - it.consume { call -> - if (call.state == Call.State.StreamsRunning) { - dialog?.dismiss() - } else if (call.state == Call.State.UpdatedByRemote) { - if (coreContext.core.isVideoCaptureEnabled || coreContext.core.isVideoDisplayEnabled) { - if (call.currentParams.isVideoEnabled != call.remoteParams?.isVideoEnabled) { - showCallVideoUpdateDialog(call) - } - } else { - Log.w("[Controls Fragment] Video display & capture are disabled, don't show video dialog") + viewLifecycleOwner + ) { + it.consume { call -> + if (call.state == Call.State.StreamsRunning) { + dialog?.dismiss() + } else if (call.state == Call.State.UpdatedByRemote) { + if (coreContext.core.isVideoCaptureEnabled || coreContext.core.isVideoDisplayEnabled) { + if (call.currentParams.isVideoEnabled != call.remoteParams?.isVideoEnabled) { + showCallVideoUpdateDialog(call) } + } else { + Log.w("[Controls Fragment] Video display & capture are disabled, don't show video dialog") } } } - ) + } controlsViewModel.chatClickedEvent.observe( - viewLifecycleOwner, - { - it.consume { - val intent = Intent() - intent.setClass(requireContext(), MainActivity::class.java) - intent.putExtra("Chat", true) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - startActivity(intent) - } + viewLifecycleOwner + ) { + it.consume { + val intent = Intent() + intent.setClass(requireContext(), MainActivity::class.java) + intent.putExtra("Chat", true) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity(intent) } - ) + } controlsViewModel.addCallClickedEvent.observe( - viewLifecycleOwner, - { - it.consume { - val intent = Intent() - intent.setClass(requireContext(), MainActivity::class.java) - intent.putExtra("Dialer", true) - intent.putExtra("Transfer", false) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - startActivity(intent) - } + viewLifecycleOwner + ) { + it.consume { + val intent = Intent() + intent.setClass(requireContext(), MainActivity::class.java) + intent.putExtra("Dialer", true) + intent.putExtra("Transfer", false) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity(intent) } - ) + } controlsViewModel.transferCallClickedEvent.observe( - viewLifecycleOwner, - { - it.consume { - val intent = Intent() - intent.setClass(requireContext(), MainActivity::class.java) - intent.putExtra("Dialer", true) - intent.putExtra("Transfer", true) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - startActivity(intent) - } + viewLifecycleOwner + ) { + it.consume { + val intent = Intent() + intent.setClass(requireContext(), MainActivity::class.java) + intent.putExtra("Dialer", true) + intent.putExtra("Transfer", true) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity(intent) } - ) + } controlsViewModel.askAudioRecordPermissionEvent.observe( - viewLifecycleOwner, - { - it.consume { permission -> - Log.i("[Controls Fragment] Asking for $permission permission") - requestPermissions(arrayOf(permission), 0) - } + viewLifecycleOwner + ) { + it.consume { permission -> + Log.i("[Controls Fragment] Asking for $permission permission") + requestPermissions(arrayOf(permission), 0) } - ) + } controlsViewModel.askCameraPermissionEvent.observe( - viewLifecycleOwner, - { - it.consume { permission -> - Log.i("[Controls Fragment] Asking for $permission permission") - requestPermissions(arrayOf(permission), 1) - } + viewLifecycleOwner + ) { + it.consume { permission -> + Log.i("[Controls Fragment] Asking for $permission permission") + requestPermissions(arrayOf(permission), 1) } - ) + } controlsViewModel.toggleNumpadEvent.observe( - viewLifecycleOwner, - { - it.consume { open -> - if (this::numpadAnimator.isInitialized) { - if (open) { - numpadAnimator.start() - } else { - numpadAnimator.reverse() - } + viewLifecycleOwner + ) { + it.consume { open -> + if (this::numpadAnimator.isInitialized) { + if (open) { + numpadAnimator.start() + } else { + numpadAnimator.reverse() } } } - ) + } controlsViewModel.somethingClickedEvent.observe( - viewLifecycleOwner, - { - it.consume { - sharedViewModel.resetHiddenInterfaceTimerInVideoCallEvent.value = Event(true) - } + viewLifecycleOwner + ) { + it.consume { + sharedViewModel.resetHiddenInterfaceTimerInVideoCallEvent.value = Event(true) } - ) + } if (Version.sdkAboveOrEqual(Version.API23_MARSHMALLOW_60)) { checkPermissions() diff --git a/app/src/main/java/org/linphone/activities/call/fragments/StatusFragment.kt b/app/src/main/java/org/linphone/activities/call/fragments/StatusFragment.kt index 5c2a4a41a..7837b7482 100644 --- a/app/src/main/java/org/linphone/activities/call/fragments/StatusFragment.kt +++ b/app/src/main/java/org/linphone/activities/call/fragments/StatusFragment.kt @@ -64,15 +64,14 @@ class StatusFragment : GenericFragment() { } viewModel.showZrtpDialogEvent.observe( - viewLifecycleOwner, - { - it.consume { call -> - if (call.state == Call.State.Connected || call.state == Call.State.StreamsRunning) { - showZrtpDialog(call) - } + viewLifecycleOwner + ) { + it.consume { call -> + if (call.state == Call.State.Connected || call.state == Call.State.StreamsRunning) { + showZrtpDialog(call) } } - ) + } } override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/org/linphone/activities/chat_bubble/ChatBubbleActivity.kt b/app/src/main/java/org/linphone/activities/chat_bubble/ChatBubbleActivity.kt index a9405ef01..08d3d8d1e 100644 --- a/app/src/main/java/org/linphone/activities/chat_bubble/ChatBubbleActivity.kt +++ b/app/src/main/java/org/linphone/activities/chat_bubble/ChatBubbleActivity.kt @@ -122,35 +122,36 @@ class ChatBubbleActivity : GenericActivity() { adapter.disableContextMenu() adapter.openContentEvent.observe( - this, - { - it.consume { content -> - if (content.isFileEncrypted) { - Toast.makeText(this, R.string.chat_bubble_cant_open_enrypted_file, Toast.LENGTH_LONG).show() - } else { - FileUtils.openFileInThirdPartyApp(this, content.filePath.orEmpty(), true) - } + this + ) { + it.consume { content -> + if (content.isFileEncrypted) { + Toast.makeText( + this, + R.string.chat_bubble_cant_open_enrypted_file, + Toast.LENGTH_LONG + ).show() + } else { + FileUtils.openFileInThirdPartyApp(this, content.filePath.orEmpty(), true) } } - ) + } val layoutManager = LinearLayoutManager(this) layoutManager.stackFromEnd = true binding.chatMessagesList.layoutManager = layoutManager listViewModel.events.observe( - this, - { events -> - adapter.submitList(events) - } - ) + this + ) { events -> + adapter.submitList(events) + } chatSendingViewModel.textToSend.observe( - this, - { - chatSendingViewModel.onTextToSendChanged(it) - } - ) + this + ) { + chatSendingViewModel.onTextToSendChanged(it) + } binding.setOpenAppClickListener { coreContext.notificationsManager.currentlyDisplayedChatRoomAddress = null diff --git a/app/src/main/java/org/linphone/activities/main/MainActivity.kt b/app/src/main/java/org/linphone/activities/main/MainActivity.kt index a345afba7..b995f5371 100644 --- a/app/src/main/java/org/linphone/activities/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/activities/main/MainActivity.kt @@ -125,26 +125,24 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin binding.callOverlayViewModel = callOverlayViewModel sharedViewModel.toggleDrawerEvent.observe( - this, - { - it.consume { - if (binding.sideMenu.isDrawerOpen(Gravity.LEFT)) { - binding.sideMenu.closeDrawer(binding.sideMenuContent, true) - } else { - binding.sideMenu.openDrawer(binding.sideMenuContent, true) - } + this + ) { + it.consume { + if (binding.sideMenu.isDrawerOpen(Gravity.LEFT)) { + binding.sideMenu.closeDrawer(binding.sideMenuContent, true) + } else { + binding.sideMenu.openDrawer(binding.sideMenuContent, true) } } - ) + } coreContext.callErrorMessageResourceId.observe( - this, - { - it.consume { message -> - showSnackBar(message) - } + this + ) { + it.consume { message -> + showSnackBar(message) } - ) + } if (coreContext.core.accountList.isEmpty()) { if (corePreferences.firstStart) { @@ -251,7 +249,7 @@ class MainActivity : GenericActivity(), SnackBarActivity, NavController.OnDestin tabsFragment.visibility = if (tabsFragmentVisible1 && tabsFragmentVisible2) View.VISIBLE else View.GONE } - fun View.hideKeyboard() { + private fun View.hideKeyboard() { val imm = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(windowToken, 0) } diff --git a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt index 2b08a173c..dffd8aeef 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt @@ -211,11 +211,10 @@ class ChatMessagesListAdapter( // This is for item selection through ListTopBarFragment selectionListViewModel = selectionViewModel selectionViewModel.isEditionEnabled.observe( - viewLifecycleOwner, - { - position = bindingAdapterPosition - } - ) + viewLifecycleOwner + ) { + position = bindingAdapterPosition + } setClickListener { if (selectionViewModel.isEditionEnabled.value == true) { @@ -416,11 +415,10 @@ class ChatMessagesListAdapter( // This is for item selection through ListTopBarFragment selectionListViewModel = selectionViewModel selectionViewModel.isEditionEnabled.observe( - viewLifecycleOwner, - { - position = bindingAdapterPosition - } - ) + viewLifecycleOwner + ) { + position = bindingAdapterPosition + } binding.setClickListener { if (selectionViewModel.isEditionEnabled.value == true) { diff --git a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomsListAdapter.kt b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomsListAdapter.kt index 1d8da9029..18face997 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomsListAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomsListAdapter.kt @@ -73,11 +73,10 @@ class ChatRoomsListAdapter( // This is for item selection through ListTopBarFragment selectionListViewModel = selectionViewModel selectionViewModel.isEditionEnabled.observe( - viewLifecycleOwner, - { - position = bindingAdapterPosition - } - ) + viewLifecycleOwner + ) { + position = bindingAdapterPosition + } forwardPending = isForwardPending diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt index 714f8834d..95b08e3bf 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt @@ -93,62 +93,55 @@ class ChatRoomCreationFragment : SecureFragment } viewModel.contactsList.observe( - viewLifecycleOwner, - { - adapter.submitList(it) - } - ) + viewLifecycleOwner + ) { + adapter.submitList(it) + } viewModel.isEncrypted.observe( - viewLifecycleOwner, - { - adapter.updateSecurity(it) - } - ) + viewLifecycleOwner + ) { + adapter.updateSecurity(it) + } viewModel.sipContactsSelected.observe( - viewLifecycleOwner, - { - viewModel.updateContactsList() - } - ) + viewLifecycleOwner + ) { + viewModel.updateContactsList() + } viewModel.selectedAddresses.observe( - viewLifecycleOwner, - { - adapter.updateSelectedAddresses(it) - } - ) + viewLifecycleOwner + ) { + adapter.updateSelectedAddresses(it) + } viewModel.chatRoomCreatedEvent.observe( - viewLifecycleOwner, - { - it.consume { chatRoom -> - sharedViewModel.selectedChatRoom.value = chatRoom - navigateToChatRoom(AppUtils.createBundleWithSharedTextAndFiles(sharedViewModel)) - } + viewLifecycleOwner + ) { + it.consume { chatRoom -> + sharedViewModel.selectedChatRoom.value = chatRoom + navigateToChatRoom(AppUtils.createBundleWithSharedTextAndFiles(sharedViewModel)) } - ) + } viewModel.filter.observe( - viewLifecycleOwner, - { - viewModel.applyFilter() - } - ) + viewLifecycleOwner + ) { + viewModel.applyFilter() + } adapter.selectedContact.observe( - viewLifecycleOwner, - { - it.consume { searchResult -> - if (createGroup) { - viewModel.toggleSelectionForSearchResult(searchResult) - } else { - viewModel.createOneToOneChat(searchResult) - } + viewLifecycleOwner + ) { + it.consume { searchResult -> + if (createGroup) { + viewModel.toggleSelectionForSearchResult(searchResult) + } else { + viewModel.createOneToOneChat(searchResult) } } - ) + } addParticipantsFromSharedViewModel() @@ -160,13 +153,12 @@ class ChatRoomCreationFragment : SecureFragment } viewModel.onErrorEvent.observe( - viewLifecycleOwner, - { - it.consume { messageResourceId -> - (activity as MainActivity).showSnackBar(messageResourceId) - } + viewLifecycleOwner + ) { + it.consume { messageResourceId -> + (activity as MainActivity).showSnackBar(messageResourceId) } - ) + } if (!PermissionHelper.get().hasReadContactsPermission()) { Log.i("[Chat Room Creation] Asking for READ_CONTACTS permission") diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index 4c4870196..77dfadf5c 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -294,193 +294,191 @@ class DetailChatRoomFragment : MasterFragment - adapter.setUnreadMessageCount(viewModel.chatRoom.unreadMessagesCount, viewModel.isUserScrollingUp.value == true) - adapter.submitList(events) - } - ) + viewLifecycleOwner + ) { events -> + adapter.setUnreadMessageCount( + viewModel.chatRoom.unreadMessagesCount, + viewModel.isUserScrollingUp.value == true + ) + adapter.submitList(events) + } listViewModel.messageUpdatedEvent.observe( - viewLifecycleOwner, - { - it.consume { position -> - adapter.notifyItemChanged(position) - } + viewLifecycleOwner + ) { + it.consume { position -> + adapter.notifyItemChanged(position) } - ) + } listViewModel.requestWriteExternalStoragePermissionEvent.observe( - viewLifecycleOwner, - { - it.consume { - requestPermissions(arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE), 1) - } + viewLifecycleOwner + ) { + it.consume { + requestPermissions(arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE), 1) } - ) + } adapter.deleteMessageEvent.observe( - viewLifecycleOwner, - { - it.consume { chatMessage -> - listViewModel.deleteMessage(chatMessage) - viewModel.updateLastMessageToDisplay() - } + viewLifecycleOwner + ) { + it.consume { chatMessage -> + listViewModel.deleteMessage(chatMessage) + viewModel.updateLastMessageToDisplay() } - ) + } adapter.resendMessageEvent.observe( - viewLifecycleOwner, - { - it.consume { chatMessage -> - listViewModel.resendMessage(chatMessage) - } + viewLifecycleOwner + ) { + it.consume { chatMessage -> + listViewModel.resendMessage(chatMessage) } - ) + } adapter.forwardMessageEvent.observe( - viewLifecycleOwner, - { - it.consume { chatMessage -> - // Remove observer before setting the message to forward - // as we don't want to forward it in this chat room - sharedViewModel.messageToForwardEvent.removeObservers(viewLifecycleOwner) - sharedViewModel.messageToForwardEvent.value = Event(chatMessage) - sharedViewModel.isPendingMessageForward.value = true + viewLifecycleOwner + ) { + it.consume { chatMessage -> + // Remove observer before setting the message to forward + // as we don't want to forward it in this chat room + sharedViewModel.messageToForwardEvent.removeObservers(viewLifecycleOwner) + sharedViewModel.messageToForwardEvent.value = Event(chatMessage) + sharedViewModel.isPendingMessageForward.value = true - if (sharedViewModel.isSlidingPaneSlideable.value == true) { - Log.i("[Chat Room] Forwarding message, going to chat rooms list") - sharedViewModel.closeSlidingPaneEvent.value = Event(true) - } else { - navigateToEmptyChatRoom() - } + if (sharedViewModel.isSlidingPaneSlideable.value == true) { + Log.i("[Chat Room] Forwarding message, going to chat rooms list") + sharedViewModel.closeSlidingPaneEvent.value = Event(true) + } else { + navigateToEmptyChatRoom() } } - ) + } adapter.replyMessageEvent.observe( - viewLifecycleOwner, - { - it.consume { chatMessage -> - chatSendingViewModel.pendingChatMessageToReplyTo.value?.destroy() - chatSendingViewModel.pendingChatMessageToReplyTo.value = ChatMessageData(chatMessage) - chatSendingViewModel.isPendingAnswer.value = true - } + viewLifecycleOwner + ) { + it.consume { chatMessage -> + chatSendingViewModel.pendingChatMessageToReplyTo.value?.destroy() + chatSendingViewModel.pendingChatMessageToReplyTo.value = + ChatMessageData(chatMessage) + chatSendingViewModel.isPendingAnswer.value = true } - ) + } adapter.showImdnForMessageEvent.observe( - viewLifecycleOwner, - { - it.consume { chatMessage -> - val args = Bundle() - args.putString("MessageId", chatMessage.messageId) - navigateToImdn(args) - } + viewLifecycleOwner + ) { + it.consume { chatMessage -> + val args = Bundle() + args.putString("MessageId", chatMessage.messageId) + navigateToImdn(args) } - ) + } adapter.addSipUriToContactEvent.observe( - viewLifecycleOwner, - { - it.consume { sipUri -> - Log.i("[Chat Room] Going to contacts list with SIP URI to add: $sipUri") - sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.masterChatRoomsFragment) - navigateToContacts(sipUri) - } + viewLifecycleOwner + ) { + it.consume { sipUri -> + Log.i("[Chat Room] Going to contacts list with SIP URI to add: $sipUri") + sharedViewModel.updateContactsAnimationsBasedOnDestination.value = + Event(R.id.masterChatRoomsFragment) + navigateToContacts(sipUri) } - ) + } adapter.openContentEvent.observe( - viewLifecycleOwner, - { - it.consume { content -> - val path = content.filePath.orEmpty() + viewLifecycleOwner + ) { + it.consume { content -> + val path = content.filePath.orEmpty() - if (!File(path).exists()) { - (requireActivity() as MainActivity).showSnackBar(R.string.chat_room_file_not_found) - } else { - Log.i("[Chat Message] Opening file: $path") - sharedViewModel.contentToOpen.value = content + if (!File(path).exists()) { + (requireActivity() as MainActivity).showSnackBar(R.string.chat_room_file_not_found) + } else { + Log.i("[Chat Message] Opening file: $path") + sharedViewModel.contentToOpen.value = content - if (corePreferences.useInAppFileViewerForNonEncryptedFiles || content.isFileEncrypted) { - val preventScreenshots = - viewModel.chatRoom.currentParams.isEncryptionEnabled - when { - FileUtils.isExtensionImage(path) -> navigateToImageFileViewer( - preventScreenshots - ) - FileUtils.isExtensionVideo(path) -> navigateToVideoFileViewer( - preventScreenshots - ) - FileUtils.isExtensionAudio(path) -> navigateToAudioFileViewer( - preventScreenshots - ) - FileUtils.isExtensionPdf(path) -> navigateToPdfFileViewer( - preventScreenshots - ) - FileUtils.isPlainTextFile(path) -> navigateToTextFileViewer( - preventScreenshots - ) - else -> { - if (content.isFileEncrypted) { - Log.w("[Chat Message] File is encrypted and can't be opened in one of our viewers...") - showDialogForUserConsentBeforeExportingFileInThirdPartyApp(content) - } else if (!FileUtils.openFileInThirdPartyApp(requireActivity(), path)) { - showDialogToSuggestOpeningFileAsText() - } + if (corePreferences.useInAppFileViewerForNonEncryptedFiles || content.isFileEncrypted) { + val preventScreenshots = + viewModel.chatRoom.currentParams.isEncryptionEnabled + when { + FileUtils.isExtensionImage(path) -> navigateToImageFileViewer( + preventScreenshots + ) + FileUtils.isExtensionVideo(path) -> navigateToVideoFileViewer( + preventScreenshots + ) + FileUtils.isExtensionAudio(path) -> navigateToAudioFileViewer( + preventScreenshots + ) + FileUtils.isExtensionPdf(path) -> navigateToPdfFileViewer( + preventScreenshots + ) + FileUtils.isPlainTextFile(path) -> navigateToTextFileViewer( + preventScreenshots + ) + else -> { + if (content.isFileEncrypted) { + Log.w("[Chat Message] File is encrypted and can't be opened in one of our viewers...") + showDialogForUserConsentBeforeExportingFileInThirdPartyApp( + content + ) + } else if (!FileUtils.openFileInThirdPartyApp( + requireActivity(), + path + ) + ) { + showDialogToSuggestOpeningFileAsText() } } - } else { - if (!FileUtils.openFileInThirdPartyApp(requireActivity(), path)) { - showDialogToSuggestOpeningFileAsText() - } + } + } else { + if (!FileUtils.openFileInThirdPartyApp(requireActivity(), path)) { + showDialogToSuggestOpeningFileAsText() } } } } - ) + } adapter.scrollToChatMessageEvent.observe( - viewLifecycleOwner, - { - it.consume { chatMessage -> - val events = listViewModel.events.value.orEmpty() - val eventLog = events.find { eventLog -> - if (eventLog.eventLog.type == EventLog.Type.ConferenceChatMessage) { - (eventLog.data as ChatMessageData).chatMessage.messageId == chatMessage.messageId - } else false - } - val index = events.indexOf(eventLog) - try { - if (corePreferences.enableAnimations) { - binding.chatMessagesList.smoothScrollToPosition(index) - } else { - binding.chatMessagesList.scrollToPosition(index) - } - } catch (iae: IllegalArgumentException) { - Log.e("[Chat Room] Can't scroll to position $index") + viewLifecycleOwner + ) { + it.consume { chatMessage -> + val events = listViewModel.events.value.orEmpty() + val eventLog = events.find { eventLog -> + if (eventLog.eventLog.type == EventLog.Type.ConferenceChatMessage) { + (eventLog.data as ChatMessageData).chatMessage.messageId == chatMessage.messageId + } else false + } + val index = events.indexOf(eventLog) + try { + if (corePreferences.enableAnimations) { + binding.chatMessagesList.smoothScrollToPosition(index) + } else { + binding.chatMessagesList.scrollToPosition(index) } + } catch (iae: IllegalArgumentException) { + Log.e("[Chat Room] Can't scroll to position $index") } } - ) + } binding.setBackClickListener { goBack() @@ -571,33 +569,31 @@ class DetailChatRoomFragment : MasterFragment - Log.i("[Chat] Found rich content URI: $uri") - lifecycleScope.launch { - withContext(Dispatchers.Main) { - val path = FileUtils.getFilePath(requireContext(), uri) - Log.i("[Chat] Rich content URI: $uri matching path is: $path") - if (path != null) { - chatSendingViewModel.addAttachment(path) - } + viewLifecycleOwner + ) { + it.consume { uri -> + Log.i("[Chat] Found rich content URI: $uri") + lifecycleScope.launch { + withContext(Dispatchers.Main) { + val path = FileUtils.getFilePath(requireContext(), uri) + Log.i("[Chat] Rich content URI: $uri matching path is: $path") + if (path != null) { + chatSendingViewModel.addAttachment(path) } } } } - ) + } sharedViewModel.messageToForwardEvent.observe( - viewLifecycleOwner, - { - it.consume { chatMessage -> - Log.i("[Chat Room] Found message to transfer") - showForwardConfirmationDialog(chatMessage) - sharedViewModel.isPendingMessageForward.value = false - } + viewLifecycleOwner + ) { + it.consume { chatMessage -> + Log.i("[Chat Room] Found message to transfer") + showForwardConfirmationDialog(chatMessage) + sharedViewModel.isPendingMessageForward.value = false } - ) + } binding.stubbedMessageToReplyTo.setOnInflateListener { _, inflated -> Log.i("[Chat Room] Replying to message layout inflated") diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt index dede4bd89..4baa685a3 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt @@ -84,36 +84,32 @@ class GroupInfoFragment : SecureFragment() { binding.participants.addItemDecoration(AppUtils.getDividerDecoration(requireContext(), layoutManager)) viewModel.participants.observe( - viewLifecycleOwner, - { - adapter.submitList(it) - } - ) + viewLifecycleOwner + ) { + adapter.submitList(it) + } viewModel.isMeAdmin.observe( - viewLifecycleOwner, - { isMeAdmin -> - adapter.showAdminControls(isMeAdmin && chatRoom != null) - } - ) + viewLifecycleOwner + ) { isMeAdmin -> + adapter.showAdminControls(isMeAdmin && chatRoom != null) + } viewModel.meAdminChangedEvent.observe( - viewLifecycleOwner, - { - it.consume { isMeAdmin -> - showMeAdminStateChanged(isMeAdmin) - } + viewLifecycleOwner + ) { + it.consume { isMeAdmin -> + showMeAdminStateChanged(isMeAdmin) } - ) + } adapter.participantRemovedEvent.observe( - viewLifecycleOwner, - { - it.consume { participant -> - viewModel.removeParticipant(participant) - } + viewLifecycleOwner + ) { + it.consume { participant -> + viewModel.removeParticipant(participant) } - ) + } addParticipantsFromSharedViewModel() @@ -122,22 +118,20 @@ class GroupInfoFragment : SecureFragment() { } viewModel.createdChatRoomEvent.observe( - viewLifecycleOwner, - { - it.consume { chatRoom -> - goToChatRoom(chatRoom, true) - } + viewLifecycleOwner + ) { + it.consume { chatRoom -> + goToChatRoom(chatRoom, true) } - ) + } viewModel.updatedChatRoomEvent.observe( - viewLifecycleOwner, - { - it.consume { chatRoom -> - goToChatRoom(chatRoom, false) - } + viewLifecycleOwner + ) { + it.consume { chatRoom -> + goToChatRoom(chatRoom, false) } - ) + } binding.setNextClickListener { if (viewModel.chatRoom != null) { @@ -182,13 +176,12 @@ class GroupInfoFragment : SecureFragment() { } viewModel.onErrorEvent.observe( - viewLifecycleOwner, - { - it.consume { messageResourceId -> - (activity as MainActivity).showSnackBar(messageResourceId) - } + viewLifecycleOwner + ) { + it.consume { messageResourceId -> + (activity as MainActivity).showSnackBar(messageResourceId) } - ) + } } private fun addParticipantsFromSharedViewModel() { diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/ImdnFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/ImdnFragment.kt index d07e8ca3b..e50e5d0a1 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/ImdnFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/ImdnFragment.kt @@ -98,11 +98,10 @@ class ImdnFragment : SecureFragment() { binding.participantsList.addItemDecoration(headerItemDecoration) viewModel.participants.observe( - viewLifecycleOwner, - { - adapter.submitList(it) - } - ) + viewLifecycleOwner + ) { + adapter.submitList(it) + } binding.setBackClickListener { goBack() diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt index 175012fc0..eff7aedc1 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/MasterChatRoomsFragment.kt @@ -113,40 +113,38 @@ class MasterChatRoomsFragment : MasterFragment - adapter.submitList(chatRooms) - } - ) + viewLifecycleOwner + ) { chatRooms -> + adapter.submitList(chatRooms) + } listViewModel.contactsUpdatedEvent.observe( - viewLifecycleOwner, - { - it.consume { - adapter.notifyDataSetChanged() - } + viewLifecycleOwner + ) { + it.consume { + adapter.notifyDataSetChanged() } - ) + } adapter.selectedChatRoomEvent.observe( - viewLifecycleOwner, - { - it.consume { chatRoom -> - if ((requireActivity() as GenericActivity).isDestructionPending) { - Log.w("[Chat] Activity is pending destruction, don't start navigating now!") - sharedViewModel.destructionPendingChatRoom = chatRoom - } else { - if (chatRoom.peerAddress.asStringUriOnly() == coreContext.notificationsManager.currentlyDisplayedChatRoomAddress) { - if (!binding.slidingPane.isOpen) { - Log.w("[Chat] Chat room is displayed but sliding pane is closed...") - if (!binding.slidingPane.openPane()) { - Log.e("[Chat] Tried to open pane to workaround already displayed chat room issue, failed!") - } - } else { - Log.w("[Chat] This chat room is already displayed!") + viewLifecycleOwner + ) { + it.consume { chatRoom -> + if ((requireActivity() as GenericActivity).isDestructionPending) { + Log.w("[Chat] Activity is pending destruction, don't start navigating now!") + sharedViewModel.destructionPendingChatRoom = chatRoom + } else { + if (chatRoom.peerAddress.asStringUriOnly() == coreContext.notificationsManager.currentlyDisplayedChatRoomAddress) { + if (!binding.slidingPane.isOpen) { + Log.w("[Chat] Chat room is displayed but sliding pane is closed...") + if (!binding.slidingPane.openPane()) { + Log.e("[Chat] Tried to open pane to workaround already displayed chat room issue, failed!") } } else { - sharedViewModel.selectedChatRoom.value = chatRoom - navigateToChatRoom( - AppUtils.createBundleWithSharedTextAndFiles( - sharedViewModel - ) - ) + Log.w("[Chat] This chat room is already displayed!") } + } else { + sharedViewModel.selectedChatRoom.value = chatRoom + navigateToChatRoom( + AppUtils.createBundleWithSharedTextAndFiles( + sharedViewModel + ) + ) } } } - ) + } binding.setEditClickListener { listSelectionViewModel.isEditionEnabled.value = true @@ -313,56 +308,52 @@ class MasterChatRoomsFragment : MasterFragment - (activity as MainActivity).showSnackBar(messageResourceId) - } + viewLifecycleOwner + ) { + it.consume { messageResourceId -> + (activity as MainActivity).showSnackBar(messageResourceId) } - ) + } } } diff --git a/app/src/main/java/org/linphone/activities/main/contact/adapters/ContactsListAdapter.kt b/app/src/main/java/org/linphone/activities/main/contact/adapters/ContactsListAdapter.kt index 768ca2602..3772c35a4 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/adapters/ContactsListAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/adapters/ContactsListAdapter.kt @@ -71,11 +71,10 @@ class ContactsListAdapter( // This is for item selection through ListTopBarFragment selectionListViewModel = selectionViewModel selectionViewModel.isEditionEnabled.observe( - viewLifecycleOwner, - { - position = bindingAdapterPosition - } - ) + viewLifecycleOwner + ) { + position = bindingAdapterPosition + } setClickListener { if (selectionViewModel.isEditionEnabled.value == true) { diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt index 5c39ad78e..cf7384fae 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/DetailContactFragment.kt @@ -83,47 +83,50 @@ class DetailContactFragment : GenericFragment() { binding.viewModel = viewModel viewModel.sendSmsToEvent.observe( - viewLifecycleOwner, - { - it.consume { number -> - sendSms(number) - } + viewLifecycleOwner + ) { + it.consume { number -> + sendSms(number) } - ) + } viewModel.startCallToEvent.observe( - viewLifecycleOwner, - { - it.consume { address -> - if (coreContext.core.callsNb > 0) { - Log.i("[Contact] Starting dialer with pre-filled URI ${address.asStringUriOnly()}, is transfer? ${sharedViewModel.pendingCallTransfer}") - sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.dialerFragment) - sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(R.id.masterContactsFragment) + viewLifecycleOwner + ) { + it.consume { address -> + if (coreContext.core.callsNb > 0) { + Log.i("[Contact] Starting dialer with pre-filled URI ${address.asStringUriOnly()}, is transfer? ${sharedViewModel.pendingCallTransfer}") + sharedViewModel.updateContactsAnimationsBasedOnDestination.value = + Event(R.id.dialerFragment) + sharedViewModel.updateDialerAnimationsBasedOnDestination.value = + Event(R.id.masterContactsFragment) - val args = Bundle() - args.putString("URI", address.asStringUriOnly()) - args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer) - args.putBoolean("SkipAutoCallStart", true) // If auto start call setting is enabled, ignore it - navigateToDialer(args) - } else { - coreContext.startCall(address) - } + val args = Bundle() + args.putString("URI", address.asStringUriOnly()) + args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer) + args.putBoolean( + "SkipAutoCallStart", + true + ) // If auto start call setting is enabled, ignore it + navigateToDialer(args) + } else { + coreContext.startCall(address) } } - ) + } viewModel.chatRoomCreatedEvent.observe( - viewLifecycleOwner, - { - it.consume { chatRoom -> - sharedViewModel.updateContactsAnimationsBasedOnDestination.value = Event(R.id.masterChatRoomsFragment) - val args = Bundle() - args.putString("LocalSipUri", chatRoom.localAddress.asStringUriOnly()) - args.putString("RemoteSipUri", chatRoom.peerAddress.asStringUriOnly()) - navigateToChatRoom(args) - } + viewLifecycleOwner + ) { + it.consume { chatRoom -> + sharedViewModel.updateContactsAnimationsBasedOnDestination.value = + Event(R.id.masterChatRoomsFragment) + val args = Bundle() + args.putString("LocalSipUri", chatRoom.localAddress.asStringUriOnly()) + args.putString("RemoteSipUri", chatRoom.peerAddress.asStringUriOnly()) + navigateToChatRoom(args) } - ) + } binding.setBackClickListener { goBack() @@ -138,13 +141,12 @@ class DetailContactFragment : GenericFragment() { } viewModel.onErrorEvent.observe( - viewLifecycleOwner, - { - it.consume { messageResourceId -> - (activity as MainActivity).showSnackBar(messageResourceId) - } + viewLifecycleOwner + ) { + it.consume { messageResourceId -> + (activity as MainActivity).showSnackBar(messageResourceId) } - ) + } view.doOnPreDraw { // Notifies fragment is ready to be drawn diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt index 4a1f9494a..bc419400f 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt @@ -85,59 +85,58 @@ class MasterContactsFragment : MasterFragment - val forward = when (id) { - R.id.dialerFragment, R.id.masterChatRoomsFragment -> false - else -> true - } - if (corePreferences.enableAnimations) { - val portraitOrientation = resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE - val axis = if (portraitOrientation) MaterialSharedAxis.X else MaterialSharedAxis.Y - enterTransition = MaterialSharedAxis(axis, forward) - reenterTransition = MaterialSharedAxis(axis, forward) - returnTransition = MaterialSharedAxis(axis, !forward) - exitTransition = MaterialSharedAxis(axis, !forward) - } + viewLifecycleOwner + ) { + it.consume { id -> + val forward = when (id) { + R.id.dialerFragment, R.id.masterChatRoomsFragment -> false + else -> true + } + if (corePreferences.enableAnimations) { + val portraitOrientation = + resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE + val axis = + if (portraitOrientation) MaterialSharedAxis.X else MaterialSharedAxis.Y + enterTransition = MaterialSharedAxis(axis, forward) + reenterTransition = MaterialSharedAxis(axis, forward) + returnTransition = MaterialSharedAxis(axis, !forward) + exitTransition = MaterialSharedAxis(axis, !forward) } } - ) + } sharedViewModel.contactFragmentOpenedEvent.observe( - viewLifecycleOwner, - { - it.consume { - binding.slidingPane.openPane() - } + viewLifecycleOwner + ) { + it.consume { + binding.slidingPane.openPane() } - ) + } sharedViewModel.closeSlidingPaneEvent.observe( - viewLifecycleOwner, - { - it.consume { - if (!binding.slidingPane.closePane()) { - goBack() - } + viewLifecycleOwner + ) { + it.consume { + if (!binding.slidingPane.closePane()) { + goBack() } } - ) + } sharedViewModel.layoutChangedEvent.observe( - viewLifecycleOwner, - { - it.consume { - sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable - if (binding.slidingPane.isSlideable) { - val navHostFragment = childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment - if (navHostFragment.navController.currentDestination?.id == R.id.emptyContactFragment) { - Log.i("[Contacts] Foldable device has been folded, closing side pane with empty fragment") - binding.slidingPane.closePane() - } + viewLifecycleOwner + ) { + it.consume { + sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable + if (binding.slidingPane.isSlideable) { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.contacts_nav_container) as NavHostFragment + if (navHostFragment.navController.currentDestination?.id == R.id.emptyContactFragment) { + Log.i("[Contacts] Foldable device has been folded, closing side pane with empty fragment") + binding.slidingPane.closePane() } } } - ) + } binding.slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED /* End of shared view model & sliding pane related */ @@ -208,38 +207,36 @@ class MasterContactsFragment : MasterFragment - Log.i("[Contacts] Selected item in list changed: $contact") - sharedViewModel.selectedContact.value = contact + viewLifecycleOwner + ) { + it.consume { contact -> + Log.i("[Contacts] Selected item in list changed: $contact") + sharedViewModel.selectedContact.value = contact - if (editOnClick) { - navigateToContactEditor(sipUriToAdd, binding.slidingPane) - editOnClick = false - sipUriToAdd = null - } else { - navigateToContact() - } + if (editOnClick) { + navigateToContactEditor(sipUriToAdd, binding.slidingPane) + editOnClick = false + sipUriToAdd = null + } else { + navigateToContact() } } - ) + } listViewModel.contactsList.observe( - viewLifecycleOwner, - { - val id = contactIdToDisplay - if (id != null) { - val contact = coreContext.contactsManager.findContactById(id) - if (contact != null) { - contactIdToDisplay = null - Log.i("[Contacts] Found matching contact $contact after callback") - adapter.selectedContactEvent.value = Event(contact) - } + viewLifecycleOwner + ) { + val id = contactIdToDisplay + if (id != null) { + val contact = coreContext.contactsManager.findContactById(id) + if (contact != null) { + contactIdToDisplay = null + Log.i("[Contacts] Found matching contact $contact after callback") + adapter.selectedContactEvent.value = Event(contact) } - adapter.submitList(it) } - ) + adapter.submitList(it) + } binding.setAllContactsToggleClickListener { listViewModel.sipContactsSelected.value = false @@ -249,18 +246,16 @@ class MasterContactsFragment : MasterFragment() { useMaterialSharedAxisXForwardAnimation = false sharedViewModel.updateDialerAnimationsBasedOnDestination.observe( - viewLifecycleOwner, - { - it.consume { id -> - val forward = when (id) { - R.id.masterChatRoomsFragment -> false - else -> true - } - if (corePreferences.enableAnimations) { - val portraitOrientation = resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE - val axis = if (portraitOrientation) MaterialSharedAxis.X else MaterialSharedAxis.Y - enterTransition = MaterialSharedAxis(axis, forward) - reenterTransition = MaterialSharedAxis(axis, forward) - returnTransition = MaterialSharedAxis(axis, !forward) - exitTransition = MaterialSharedAxis(axis, !forward) - } + viewLifecycleOwner + ) { + it.consume { id -> + val forward = when (id) { + R.id.masterChatRoomsFragment -> false + else -> true + } + if (corePreferences.enableAnimations) { + val portraitOrientation = + resources.configuration.orientation != Configuration.ORIENTATION_LANDSCAPE + val axis = + if (portraitOrientation) MaterialSharedAxis.X else MaterialSharedAxis.Y + enterTransition = MaterialSharedAxis(axis, forward) + reenterTransition = MaterialSharedAxis(axis, forward) + returnTransition = MaterialSharedAxis(axis, !forward) + exitTransition = MaterialSharedAxis(axis, !forward) } } - ) + } binding.setNewContactClickListener { sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(R.id.masterContactsFragment) @@ -111,43 +112,40 @@ class DialerFragment : SecureFragment() { } viewModel.enteredUri.observe( - viewLifecycleOwner, - { - if (it == corePreferences.debugPopupCode) { - displayDebugPopup() - viewModel.enteredUri.value = "" - } + viewLifecycleOwner + ) { + if (it == corePreferences.debugPopupCode) { + displayDebugPopup() + viewModel.enteredUri.value = "" } - ) + } viewModel.uploadFinishedEvent.observe( - viewLifecycleOwner, - { - it.consume { url -> - // To prevent being trigger when using the Send Logs button in About page - if (uploadLogsInitiatedByUs) { - val clipboard = - requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - val clip = ClipData.newPlainText("Logs url", url) - clipboard.setPrimaryClip(clip) + viewLifecycleOwner + ) { + it.consume { url -> + // To prevent being trigger when using the Send Logs button in About page + if (uploadLogsInitiatedByUs) { + val clipboard = + requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clip = ClipData.newPlainText("Logs url", url) + clipboard.setPrimaryClip(clip) - val activity = requireActivity() as MainActivity - activity.showSnackBar(R.string.logs_url_copied_to_clipboard) + val activity = requireActivity() as MainActivity + activity.showSnackBar(R.string.logs_url_copied_to_clipboard) - AppUtils.shareUploadedLogsUrl(activity, url) - } + AppUtils.shareUploadedLogsUrl(activity, url) } } - ) + } viewModel.updateAvailableEvent.observe( - viewLifecycleOwner, - { - it.consume { url -> - displayNewVersionAvailableDialog(url) - } + viewLifecycleOwner + ) { + it.consume { url -> + displayNewVersionAvailableDialog(url) } - ) + } if (corePreferences.firstStart) { Log.w("[Dialer] First start detected, wait for assistant to be finished to check for update & request permissions") diff --git a/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt b/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt index dd10adf92..f8987756d 100644 --- a/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/files/fragments/TopBarFragment.kt @@ -139,7 +139,7 @@ class TopBarFragment : GenericFragment() { Log.w("[File Viewer] Media store file path is empty, media store export failed?") val filePath = content.plainFilePath.orEmpty() - plainFilePath = if (filePath.isEmpty()) content.filePath.orEmpty() else filePath + plainFilePath = filePath.ifEmpty { content.filePath.orEmpty() } Log.i("[File Viewer] Plain file path is: $plainFilePath") if (plainFilePath.isNotEmpty()) { if (!FileUtils.openFileInThirdPartyApp(requireActivity(), plainFilePath)) { diff --git a/app/src/main/java/org/linphone/activities/main/fragments/MasterFragment.kt b/app/src/main/java/org/linphone/activities/main/fragments/MasterFragment.kt index a6f86e180..c342b2a9a 100644 --- a/app/src/main/java/org/linphone/activities/main/fragments/MasterFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/fragments/MasterFragment.kt @@ -56,56 +56,55 @@ abstract class MasterFragment() { } sharedViewModel.accountRemoved.observe( - viewLifecycleOwner, - { - Log.i("[Status Fragment] An account was removed, update default account state") - val defaultAccount = coreContext.core.defaultAccount - if (defaultAccount != null) { - viewModel.updateDefaultAccountRegistrationStatus(defaultAccount.state) - } + viewLifecycleOwner + ) { + Log.i("[Status Fragment] An account was removed, update default account state") + val defaultAccount = coreContext.core.defaultAccount + if (defaultAccount != null) { + viewModel.updateDefaultAccountRegistrationStatus(defaultAccount.state) } - ) + } binding.setMenuClickListener { sharedViewModel.toggleDrawerEvent.value = Event(true) diff --git a/app/src/main/java/org/linphone/activities/main/history/adapters/CallLogsListAdapter.kt b/app/src/main/java/org/linphone/activities/main/history/adapters/CallLogsListAdapter.kt index 8a7bd550b..ac0194cc1 100644 --- a/app/src/main/java/org/linphone/activities/main/history/adapters/CallLogsListAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/history/adapters/CallLogsListAdapter.kt @@ -73,11 +73,10 @@ class CallLogsListAdapter( // This is for item selection through ListTopBarFragment selectionListViewModel = selectionViewModel selectionViewModel.isEditionEnabled.observe( - viewLifecycleOwner, - { - position = bindingAdapterPosition - } - ) + viewLifecycleOwner + ) { + position = bindingAdapterPosition + } setClickListener { if (selectionViewModel.isEditionEnabled.value == true) { diff --git a/app/src/main/java/org/linphone/activities/main/history/fragments/DetailCallLogFragment.kt b/app/src/main/java/org/linphone/activities/main/history/fragments/DetailCallLogFragment.kt index f4254f96b..825921125 100644 --- a/app/src/main/java/org/linphone/activities/main/history/fragments/DetailCallLogFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/history/fragments/DetailCallLogFragment.kt @@ -99,50 +99,48 @@ class DetailCallLogFragment : GenericFragment() { } viewModel.startCallEvent.observe( - viewLifecycleOwner, - { - it.consume { callLog -> - val address = callLog.remoteAddress - if (coreContext.core.callsNb > 0) { - Log.i("[History] Starting dialer with pre-filled URI ${address.asStringUriOnly()}, is transfer? ${sharedViewModel.pendingCallTransfer}") - sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(R.id.masterCallLogsFragment) + viewLifecycleOwner + ) { + it.consume { callLog -> + val address = callLog.remoteAddress + if (coreContext.core.callsNb > 0) { + Log.i("[History] Starting dialer with pre-filled URI ${address.asStringUriOnly()}, is transfer? ${sharedViewModel.pendingCallTransfer}") + sharedViewModel.updateDialerAnimationsBasedOnDestination.value = + Event(R.id.masterCallLogsFragment) - val args = Bundle() - args.putString("URI", address.asStringUriOnly()) - args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer) - args.putBoolean( - "SkipAutoCallStart", - true - ) // If auto start call setting is enabled, ignore it - navigateToDialer(args) - } else { - val localAddress = callLog.localAddress - coreContext.startCall(address, localAddress = localAddress) - } + val args = Bundle() + args.putString("URI", address.asStringUriOnly()) + args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer) + args.putBoolean( + "SkipAutoCallStart", + true + ) // If auto start call setting is enabled, ignore it + navigateToDialer(args) + } else { + val localAddress = callLog.localAddress + coreContext.startCall(address, localAddress = localAddress) } } - ) + } viewModel.chatRoomCreatedEvent.observe( - viewLifecycleOwner, - { - it.consume { chatRoom -> - val args = Bundle() - args.putString("LocalSipUri", chatRoom.localAddress.asStringUriOnly()) - args.putString("RemoteSipUri", chatRoom.peerAddress.asStringUriOnly()) - navigateToChatRoom(args) - } + viewLifecycleOwner + ) { + it.consume { chatRoom -> + val args = Bundle() + args.putString("LocalSipUri", chatRoom.localAddress.asStringUriOnly()) + args.putString("RemoteSipUri", chatRoom.peerAddress.asStringUriOnly()) + navigateToChatRoom(args) } - ) + } viewModel.onErrorEvent.observe( - viewLifecycleOwner, - { - it.consume { messageResourceId -> - (activity as MainActivity).showSnackBar(messageResourceId) - } + viewLifecycleOwner + ) { + it.consume { messageResourceId -> + (activity as MainActivity).showSnackBar(messageResourceId) } - ) + } } override fun goBack() { diff --git a/app/src/main/java/org/linphone/activities/main/history/fragments/MasterCallLogsFragment.kt b/app/src/main/java/org/linphone/activities/main/history/fragments/MasterCallLogsFragment.kt index c7a56c4c9..cd0c0d757 100644 --- a/app/src/main/java/org/linphone/activities/main/history/fragments/MasterCallLogsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/history/fragments/MasterCallLogsFragment.kt @@ -101,30 +101,29 @@ class MasterCallLogsFragment : MasterFragment - if (listViewModel.missedCallLogsSelected.value == false) { - adapter.submitList(callLogs) - } + viewLifecycleOwner + ) { callLogs -> + if (listViewModel.missedCallLogsSelected.value == false) { + adapter.submitList(callLogs) } - ) + } listViewModel.missedCallLogs.observe( - viewLifecycleOwner, - { callLogs -> - if (listViewModel.missedCallLogsSelected.value == true) { - adapter.submitList(callLogs) - } + viewLifecycleOwner + ) { callLogs -> + if (listViewModel.missedCallLogsSelected.value == true) { + adapter.submitList(callLogs) } - ) + } listViewModel.missedCallLogsSelected.observe( - viewLifecycleOwner, - { - if (it) { - adapter.submitList(listViewModel.missedCallLogs.value) - } else { - adapter.submitList(listViewModel.callLogs.value) - } + viewLifecycleOwner + ) { + if (it) { + adapter.submitList(listViewModel.missedCallLogs.value) + } else { + adapter.submitList(listViewModel.callLogs.value) } - ) + } listViewModel.contactsUpdatedEvent.observe( - viewLifecycleOwner, - { - it.consume { - adapter.notifyDataSetChanged() - } + viewLifecycleOwner + ) { + it.consume { + adapter.notifyDataSetChanged() } - ) + } adapter.selectedCallLogEvent.observe( - viewLifecycleOwner, - { - it.consume { callLog -> - sharedViewModel.selectedCallLogGroup.value = callLog - navigateToCallHistory(binding.slidingPane) - } + viewLifecycleOwner + ) { + it.consume { callLog -> + sharedViewModel.selectedCallLogGroup.value = callLog + navigateToCallHistory(binding.slidingPane) } - ) + } adapter.startCallToEvent.observe( - viewLifecycleOwner, - { - it.consume { callLogGroup -> - val remoteAddress = callLogGroup.lastCallLog.remoteAddress - if (coreContext.core.callsNb > 0) { - Log.i("[History] Starting dialer with pre-filled URI ${remoteAddress.asStringUriOnly()}, is transfer? ${sharedViewModel.pendingCallTransfer}") - sharedViewModel.updateDialerAnimationsBasedOnDestination.value = Event(R.id.masterCallLogsFragment) - val args = Bundle() - args.putString("URI", remoteAddress.asStringUriOnly()) - args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer) - args.putBoolean("SkipAutoCallStart", true) // If auto start call setting is enabled, ignore it - navigateToDialer(args) - } else { - val localAddress = callLogGroup.lastCallLog.localAddress - coreContext.startCall(remoteAddress, localAddress = localAddress) - } + viewLifecycleOwner + ) { + it.consume { callLogGroup -> + val remoteAddress = callLogGroup.lastCallLog.remoteAddress + if (coreContext.core.callsNb > 0) { + Log.i("[History] Starting dialer with pre-filled URI ${remoteAddress.asStringUriOnly()}, is transfer? ${sharedViewModel.pendingCallTransfer}") + sharedViewModel.updateDialerAnimationsBasedOnDestination.value = + Event(R.id.masterCallLogsFragment) + val args = Bundle() + args.putString("URI", remoteAddress.asStringUriOnly()) + args.putBoolean("Transfer", sharedViewModel.pendingCallTransfer) + args.putBoolean( + "SkipAutoCallStart", + true + ) // If auto start call setting is enabled, ignore it + navigateToDialer(args) + } else { + val localAddress = callLogGroup.lastCallLog.localAddress + coreContext.startCall(remoteAddress, localAddress = localAddress) } } - ) + } binding.setAllCallLogsToggleClickListener { listViewModel.missedCallLogsSelected.value = false diff --git a/app/src/main/java/org/linphone/activities/main/history/viewmodels/CallLogViewModel.kt b/app/src/main/java/org/linphone/activities/main/history/viewmodels/CallLogViewModel.kt index 22b734f7a..a5cabce8b 100644 --- a/app/src/main/java/org/linphone/activities/main/history/viewmodels/CallLogViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/history/viewmodels/CallLogViewModel.kt @@ -22,7 +22,6 @@ package org.linphone.activities.main.history.viewmodels import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import java.util.* import kotlin.collections.ArrayList import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences diff --git a/app/src/main/java/org/linphone/activities/main/recordings/fragments/RecordingsFragment.kt b/app/src/main/java/org/linphone/activities/main/recordings/fragments/RecordingsFragment.kt index 582debc2d..625c45d16 100644 --- a/app/src/main/java/org/linphone/activities/main/recordings/fragments/RecordingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/recordings/fragments/RecordingsFragment.kt @@ -69,11 +69,10 @@ class RecordingsFragment : MasterFragment - adapter.submitList(recordings) - } - ) + viewLifecycleOwner + ) { recordings -> + adapter.submitList(recordings) + } binding.setBackClickListener { goBack() } diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/AccountSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/AccountSettingsFragment.kt index df8623f9c..cb18d3a35 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/AccountSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/AccountSettingsFragment.kt @@ -63,32 +63,30 @@ class AccountSettingsFragment : GenericSettingFragment - val clipboard = - requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - val clip = ClipData.newPlainText("Logs url", url) - clipboard.setPrimaryClip(clip) + viewLifecycleOwner + ) { + it.consume { url -> + val clipboard = + requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clip = ClipData.newPlainText("Logs url", url) + clipboard.setPrimaryClip(clip) - val activity = requireActivity() as MainActivity - activity.showSnackBar(R.string.logs_url_copied_to_clipboard) + val activity = requireActivity() as MainActivity + activity.showSnackBar(R.string.logs_url_copied_to_clipboard) - AppUtils.shareUploadedLogsUrl(activity, url) - } + AppUtils.shareUploadedLogsUrl(activity, url) } - ) + } viewModel.uploadErrorEvent.observe( - viewLifecycleOwner, - { - it.consume { - val activity = requireActivity() as MainActivity - activity.showSnackBar(R.string.logs_upload_failure) - } + viewLifecycleOwner + ) { + it.consume { + val activity = requireActivity() as MainActivity + activity.showSnackBar(R.string.logs_upload_failure) } - ) + } viewModel.resetCompleteEvent.observe( - viewLifecycleOwner, - { - it.consume { - val activity = requireActivity() as MainActivity - activity.showSnackBar(R.string.logs_reset_complete) - } + viewLifecycleOwner + ) { + it.consume { + val activity = requireActivity() as MainActivity + activity.showSnackBar(R.string.logs_reset_complete) } - ) + } viewModel.setNightModeEvent.observe( - viewLifecycleOwner, - { - it.consume { value -> - AppCompatDelegate.setDefaultNightMode( - when (value) { - 0 -> AppCompatDelegate.MODE_NIGHT_NO - 1 -> AppCompatDelegate.MODE_NIGHT_YES - else -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM - } - ) - } + viewLifecycleOwner + ) { + it.consume { value -> + AppCompatDelegate.setDefaultNightMode( + when (value) { + 0 -> AppCompatDelegate.MODE_NIGHT_NO + 1 -> AppCompatDelegate.MODE_NIGHT_YES + else -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM + } + ) } - ) + } viewModel.backgroundModeEnabled.value = !DeviceUtils.isAppUserRestricted(requireContext()) viewModel.goToBatterySettingsEvent.observe( - viewLifecycleOwner, - { - it.consume { - try { - val intent = Intent("android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS") - startActivity(intent) - } catch (anfe: ActivityNotFoundException) { - Log.e("[Advanced Settings] ActivityNotFound exception: ", anfe) - } + viewLifecycleOwner + ) { + it.consume { + try { + val intent = Intent("android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS") + startActivity(intent) + } catch (anfe: ActivityNotFoundException) { + Log.e("[Advanced Settings] ActivityNotFound exception: ", anfe) } } - ) + } viewModel.powerManagerSettingsVisibility.value = PowerManagerUtils.getDevicePowerManagerIntent(requireContext()) != null viewModel.goToPowerManagerSettingsEvent.observe( - viewLifecycleOwner, - { - it.consume { - val intent = PowerManagerUtils.getDevicePowerManagerIntent(requireActivity()) - if (intent != null) { - try { - startActivity(intent) - } catch (se: SecurityException) { - Log.e("[Advanced Settings] Security exception: ", se) - } + viewLifecycleOwner + ) { + it.consume { + val intent = PowerManagerUtils.getDevicePowerManagerIntent(requireActivity()) + if (intent != null) { + try { + startActivity(intent) + } catch (se: SecurityException) { + Log.e("[Advanced Settings] Security exception: ", se) } } } - ) + } viewModel.goToAndroidSettingsEvent.observe( - viewLifecycleOwner, - { - it.consume { - val intent = Intent() - intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS - intent.addCategory(Intent.CATEGORY_DEFAULT) - intent.data = Uri.parse("package:${requireContext().packageName}") - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) - ContextCompat.startActivity(requireContext(), intent, null) - } + viewLifecycleOwner + ) { + it.consume { + val intent = Intent() + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + intent.addCategory(Intent.CATEGORY_DEFAULT) + intent.data = Uri.parse("package:${requireContext().packageName}") + intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) + ContextCompat.startActivity(requireContext(), intent, null) } - ) + } } override fun goBack() { diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/AudioSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/AudioSettingsFragment.kt index 1f85d7fdd..2ed0343eb 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/AudioSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/AudioSettingsFragment.kt @@ -54,24 +54,22 @@ class AudioSettingsFragment : GenericSettingFragment binding.setBackClickListener { goBack() } viewModel.systemWideOverlayEnabledEvent.observe( - viewLifecycleOwner, - { - it.consume { - if (!Compatibility.canDrawOverlay(requireContext())) { - val intent = Intent("android.settings.action.MANAGE_OVERLAY_PERMISSION", Uri.parse("package:${requireContext().packageName}")) - startActivityForResult(intent, 0) - } + viewLifecycleOwner + ) { + it.consume { + if (!Compatibility.canDrawOverlay(requireContext())) { + val intent = Intent( + "android.settings.action.MANAGE_OVERLAY_PERMISSION", + Uri.parse("package:${requireContext().packageName}") + ) + startActivityForResult(intent, 0) } } - ) + } viewModel.goToAndroidNotificationSettingsEvent.observe( - viewLifecycleOwner, - { - it.consume { - if (Build.VERSION.SDK_INT >= Version.API26_O_80) { - val i = Intent() - i.action = Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS - i.putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName) - i.putExtra( - Settings.EXTRA_CHANNEL_ID, - getString(R.string.notification_channel_service_id) - ) - i.addCategory(Intent.CATEGORY_DEFAULT) - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) - i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) - startActivity(i) - } + viewLifecycleOwner + ) { + it.consume { + if (Build.VERSION.SDK_INT >= Version.API26_O_80) { + val i = Intent() + i.action = Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS + i.putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName) + i.putExtra( + Settings.EXTRA_CHANNEL_ID, + getString(R.string.notification_channel_service_id) + ) + i.addCategory(Intent.CATEGORY_DEFAULT) + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) + i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) + startActivity(i) } } - ) + } viewModel.enableTelecomManagerEvent.observe( - viewLifecycleOwner, - { - it.consume { - if (!Compatibility.hasTelecomManagerPermissions(requireContext())) { - Compatibility.requestTelecomManagerPermissions(requireActivity(), 1) - } else if (!TelecomHelper.exists()) { - corePreferences.useTelecomManager = true - Log.w("[Telecom Helper] Doesn't exists yet, creating it") - TelecomHelper.create(requireContext()) - updateTelecomManagerAccount() - } + viewLifecycleOwner + ) { + it.consume { + if (!Compatibility.hasTelecomManagerPermissions(requireContext())) { + Compatibility.requestTelecomManagerPermissions(requireActivity(), 1) + } else if (!TelecomHelper.exists()) { + corePreferences.useTelecomManager = true + Log.w("[Telecom Helper] Doesn't exists yet, creating it") + TelecomHelper.create(requireContext()) + updateTelecomManagerAccount() } } - ) + } viewModel.goToAndroidNotificationSettingsEvent.observe( - viewLifecycleOwner, - { - it.consume { - if (Build.VERSION.SDK_INT >= Version.API26_O_80) { - val i = Intent() - i.action = Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS - i.putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName) - i.putExtra( - Settings.EXTRA_CHANNEL_ID, - getString(R.string.notification_channel_service_id) - ) - i.addCategory(Intent.CATEGORY_DEFAULT) - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) - i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) - startActivity(i) - } + viewLifecycleOwner + ) { + it.consume { + if (Build.VERSION.SDK_INT >= Version.API26_O_80) { + val i = Intent() + i.action = Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS + i.putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName) + i.putExtra( + Settings.EXTRA_CHANNEL_ID, + getString(R.string.notification_channel_service_id) + ) + i.addCategory(Intent.CATEGORY_DEFAULT) + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) + i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) + startActivity(i) } } - ) + } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/ChatSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/ChatSettingsFragment.kt index e04d7f2a3..2a89ac47c 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/ChatSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/ChatSettingsFragment.kt @@ -50,39 +50,37 @@ class ChatSettingsFragment : GenericSettingFragment binding.setBackClickListener { goBack() } viewModel.launcherShortcutsEvent.observe( - viewLifecycleOwner, - { - it.consume { newValue -> - if (newValue) { - Compatibility.createShortcutsToChatRooms(requireContext()) - } else { - Compatibility.removeShortcuts(requireContext()) - } + viewLifecycleOwner + ) { + it.consume { newValue -> + if (newValue) { + Compatibility.createShortcutsToChatRooms(requireContext()) + } else { + Compatibility.removeShortcuts(requireContext()) } } - ) + } viewModel.goToAndroidNotificationSettingsEvent.observe( - viewLifecycleOwner, - { - it.consume { - if (Build.VERSION.SDK_INT >= Version.API26_O_80) { - val i = Intent() - i.action = Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS - i.putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName) - i.putExtra( - Settings.EXTRA_CHANNEL_ID, - getString(R.string.notification_channel_chat_id) - ) - i.addCategory(Intent.CATEGORY_DEFAULT) - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) - i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) - startActivity(i) - } + viewLifecycleOwner + ) { + it.consume { + if (Build.VERSION.SDK_INT >= Version.API26_O_80) { + val i = Intent() + i.action = Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS + i.putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName) + i.putExtra( + Settings.EXTRA_CHANNEL_ID, + getString(R.string.notification_channel_chat_id) + ) + i.addCategory(Intent.CATEGORY_DEFAULT) + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) + i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) + startActivity(i) } } - ) + } } override fun goBack() { diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/ContactsSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/ContactsSettingsFragment.kt index acb9a6556..4d89df1a4 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/ContactsSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/ContactsSettingsFragment.kt @@ -51,30 +51,28 @@ class ContactsSettingsFragment : GenericSettingFragment - if (newValue) { - Compatibility.createShortcutsToContacts(requireContext()) - } else { - Compatibility.removeShortcuts(requireContext()) - if (corePreferences.chatRoomShortcuts) { - Compatibility.createShortcutsToChatRooms(requireContext()) - } + viewLifecycleOwner + ) { + it.consume { newValue -> + if (newValue) { + Compatibility.createShortcutsToContacts(requireContext()) + } else { + Compatibility.removeShortcuts(requireContext()) + if (corePreferences.chatRoomShortcuts) { + Compatibility.createShortcutsToChatRooms(requireContext()) } } } - ) + } viewModel.askWriteContactsPermissionForPresenceStorageEvent.observe( - viewLifecycleOwner, - { - it.consume { - Log.i("[Contacts Settings] Asking for WRITE_CONTACTS permission to be able to store presence") - requestPermissions(arrayOf(android.Manifest.permission.WRITE_CONTACTS), 1) - } + viewLifecycleOwner + ) { + it.consume { + Log.i("[Contacts Settings] Asking for WRITE_CONTACTS permission to be able to store presence") + requestPermissions(arrayOf(android.Manifest.permission.WRITE_CONTACTS), 1) } - ) + } if (!PermissionHelper.required(requireContext()).hasReadContactsPermission()) { Log.i("[Contacts Settings] Asking for READ_CONTACTS permission") diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/SettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/SettingsFragment.kt index 800e9af57..6395507b9 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/SettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/SettingsFragment.kt @@ -69,39 +69,37 @@ class SettingsFragment : SecureFragment() { // Account settings loading can take some time, so wait until it is ready before opening the pane sharedViewModel.accountSettingsFragmentOpenedEvent.observe( - viewLifecycleOwner, - { - it.consume { - binding.slidingPane.openPane() - } + viewLifecycleOwner + ) { + it.consume { + binding.slidingPane.openPane() } - ) + } sharedViewModel.closeSlidingPaneEvent.observe( - viewLifecycleOwner, - { - it.consume { - if (!binding.slidingPane.closePane()) { - goBack() - } + viewLifecycleOwner + ) { + it.consume { + if (!binding.slidingPane.closePane()) { + goBack() } } - ) + } sharedViewModel.layoutChangedEvent.observe( - viewLifecycleOwner, - { - it.consume { - sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable - if (binding.slidingPane.isSlideable) { - val navHostFragment = childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment - if (navHostFragment.navController.currentDestination?.id == R.id.emptySettingsFragment) { - Log.i("[Settings] Foldable device has been folded, closing side pane with empty fragment") - binding.slidingPane.closePane() - } + viewLifecycleOwner + ) { + it.consume { + sharedViewModel.isSlidingPaneSlideable.value = binding.slidingPane.isSlideable + if (binding.slidingPane.isSlideable) { + val navHostFragment = + childFragmentManager.findFragmentById(R.id.settings_nav_container) as NavHostFragment + if (navHostFragment.navController.currentDestination?.id == R.id.emptySettingsFragment) { + Log.i("[Settings] Foldable device has been folded, closing side pane with empty fragment") + binding.slidingPane.closePane() } } } - ) + } binding.slidingPane.lockMode = SlidingPaneLayout.LOCK_MODE_LOCKED /* End of shared view model & sliding pane related */ @@ -112,12 +110,11 @@ class SettingsFragment : SecureFragment() { binding.setBackClickListener { goBack() } sharedViewModel.accountRemoved.observe( - viewLifecycleOwner, - { - Log.i("[Settings] Account removed, update accounts list") - viewModel.updateAccountsList() - } - ) + viewLifecycleOwner + ) { + Log.i("[Settings] Account removed, update accounts list") + viewModel.updateAccountsList() + } val identity = arguments?.getString("Identity") if (identity != null) { diff --git a/app/src/main/java/org/linphone/compatibility/TelephonyListener.kt b/app/src/main/java/org/linphone/compatibility/TelephonyListener.kt index b946cc94e..df96c50f6 100644 --- a/app/src/main/java/org/linphone/compatibility/TelephonyListener.kt +++ b/app/src/main/java/org/linphone/compatibility/TelephonyListener.kt @@ -33,7 +33,7 @@ class TelephonyListener(private val telephonyManager: TelephonyManager) : PhoneS private fun runOnUiThreadExecutor(): Executor { val handler = Handler(Looper.getMainLooper()) - return Executor() { + return Executor { handler.post(it) } } diff --git a/app/src/main/res/layout-land/about_fragment.xml b/app/src/main/res/layout-land/about_fragment.xml index ca69f55be..7dd4b881e 100644 --- a/app/src/main/res/layout-land/about_fragment.xml +++ b/app/src/main/res/layout-land/about_fragment.xml @@ -1,6 +1,5 @@ - + diff --git a/app/src/main/res/layout/about_fragment.xml b/app/src/main/res/layout/about_fragment.xml index 871b85cfe..80fa67cb3 100644 --- a/app/src/main/res/layout/about_fragment.xml +++ b/app/src/main/res/layout/about_fragment.xml @@ -1,6 +1,5 @@ - +