diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c9178e398..516993228 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -98,6 +98,8 @@ + + @@ -113,6 +115,21 @@ android:launchMode="singleTask" android:resizeableActivity="true" /> + + + + + + + + + + + if (core.accountList.isEmpty()) { Log.i("$TAG No account configured, disabling back gesture") @@ -73,26 +71,6 @@ class AssistantActivity : GenericActivity() { } } - fun showGreenToast(message: String, @DrawableRes icon: Int) { - val greenToast = ToastUtils.getGreenToast(this, binding.toastsArea, message, icon) - binding.toastsArea.addView(greenToast.root) - - greenToast.root.slideInToastFromTopForDuration( - binding.toastsArea as ViewGroup, - lifecycleScope - ) - } - - fun showRedToast(message: String, @DrawableRes icon: Int) { - val redToast = ToastUtils.getRedToast(this, binding.toastsArea, message, icon) - binding.toastsArea.addView(redToast.root) - - redToast.root.slideInToastFromTopForDuration( - binding.toastsArea as ViewGroup, - lifecycleScope - ) - } - private fun areAllPermissionsGranted(): Boolean { for (permission in Compatibility.getAllRequiredPermissionsArray()) { if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { diff --git a/app/src/main/java/org/linphone/ui/assistant/SingleSignOnActivity.kt b/app/src/main/java/org/linphone/ui/assistant/SingleSignOnActivity.kt new file mode 100644 index 000000000..e77f6ef3b --- /dev/null +++ b/app/src/main/java/org/linphone/ui/assistant/SingleSignOnActivity.kt @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2010-2023 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.linphone.ui.assistant + +import android.os.Bundle +import androidx.annotation.UiThread +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import org.linphone.R +import org.linphone.core.tools.Log +import org.linphone.databinding.AssistantSingleSignOnActivityBinding +import org.linphone.ui.GenericActivity +import org.linphone.ui.assistant.viewmodel.SingleSignOnViewModel + +@UiThread +class SingleSignOnActivity : GenericActivity() { + companion object { + private const val TAG = "[Single Sign On Activity]" + } + + private lateinit var binding: AssistantSingleSignOnActivityBinding + + private lateinit var viewModel: SingleSignOnViewModel + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + viewModel = run { + ViewModelProvider(this)[SingleSignOnViewModel::class.java] + } + + binding = DataBindingUtil.setContentView(this, R.layout.assistant_single_sign_on_activity) + binding.lifecycleOwner = this + + setUpToastsArea(binding.toastsArea) + + if (intent != null) { + Log.i( + "$TAG Handling intent action [${intent.action}], type [${intent.type}] and data [${intent.data}]" + ) + val uri = intent.data?.toString() ?: "" + if (uri.startsWith("linphone-sso:")) { + val ssoUrl = uri.replace("linphone-sso:", "https:") + Log.i("$TAG Setting SSO URL [$ssoUrl]") + viewModel.singleSignOnUrl.value = ssoUrl + } + } + } +} diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/LandingFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/LandingFragment.kt index 6179f3ebd..ce0af01f3 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/LandingFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/LandingFragment.kt @@ -37,7 +37,7 @@ import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantLandingFragmentBinding -import org.linphone.ui.assistant.AssistantActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.assistant.model.AcceptConditionsAndPolicyDialogModel import org.linphone.ui.assistant.viewmodel.LandingViewModel import org.linphone.utils.DialogUtils @@ -132,14 +132,14 @@ class LandingFragment : Fragment() { viewModel.accountLoginErrorEvent.observe(viewLifecycleOwner) { it.consume { message -> - (requireActivity() as AssistantActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( message, R.drawable.warning_circle ) } } - viewModel.redirectToDigestAuthEvent.observe(viewLifecycleOwner) { + /*viewModel.redirectToDigestAuthEvent.observe(viewLifecycleOwner) { it.consume { address -> goToLoginFragment(address) } @@ -149,10 +149,10 @@ class LandingFragment : Fragment() { it.consume { address -> goToSingleSignOnFragment(address) } - } + }*/ } - private fun goToLoginFragment(identity: String) { + /*private fun goToLoginFragment(identity: String) { Log.i( "$TAG Going to Linphone credentials based authentication fragment for SIP account [$identity]" ) @@ -162,9 +162,9 @@ class LandingFragment : Fragment() { private fun goToSingleSignOnFragment(identity: String) { Log.i("$TAG Going to Single Sign On fragment for SIP account [$identity]") - val action = LandingFragmentDirections.actionLandingFragmentToSingleSignOnFragment(identity) + val action = LandingFragmentDirections.actionLandingFragmentToSingleSignOnFragment() findNavController().navigate(action) - } + }*/ private fun goToRegisterFragment() { val action = LandingFragmentDirections.actionLandingFragmentToRegisterFragment() diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/LoginFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/LoginFragment.kt index fcc49e127..793a2a08e 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/LoginFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/LoginFragment.kt @@ -37,7 +37,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantLoginFragmentBinding -import org.linphone.ui.assistant.AssistantActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.assistant.viewmodel.AccountLoginViewModel import org.linphone.utils.PhoneNumberUtils @@ -106,7 +106,7 @@ class LoginFragment : Fragment() { viewModel.accountLoginErrorEvent.observe(viewLifecycleOwner) { it.consume { message -> - (requireActivity() as AssistantActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( message, R.drawable.warning_circle ) diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/QrCodeScannerFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/QrCodeScannerFragment.kt index 278517653..070e8fd08 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/QrCodeScannerFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/QrCodeScannerFragment.kt @@ -35,7 +35,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantQrCodeScannerFragmentBinding -import org.linphone.ui.assistant.AssistantActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.assistant.viewmodel.QrCodeViewModel @UiThread @@ -84,7 +84,7 @@ class QrCodeScannerFragment : Fragment() { viewModel.qrCodeFoundEvent.observe(viewLifecycleOwner) { it.consume { isValid -> if (!isValid) { - (requireActivity() as AssistantActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( getString(R.string.toast_assistant_qr_code_invalid), R.drawable.warning_circle ) diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/RegisterFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/RegisterFragment.kt index c89ec51cf..6c350d44f 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/RegisterFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/RegisterFragment.kt @@ -41,7 +41,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantRegisterFragmentBinding -import org.linphone.ui.assistant.AssistantActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.assistant.model.ConfirmPhoneNumberDialogModel import org.linphone.ui.assistant.viewmodel.AccountCreationViewModel import org.linphone.utils.DialogUtils @@ -130,7 +130,7 @@ class RegisterFragment : Fragment() { viewModel.pushNotificationsAvailable.observe(viewLifecycleOwner) { available -> if (!available) { val text = getString(R.string.assistant_account_register_unavailable_no_push_toast) - (requireActivity() as AssistantActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( text, R.drawable.warning_circle ) @@ -160,7 +160,7 @@ class RegisterFragment : Fragment() { viewModel.errorHappenedEvent.observe(viewLifecycleOwner) { it.consume { error -> - (requireActivity() as AssistantActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( error, R.drawable.warning_circle ) diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/SingleSignOnFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/SingleSignOnFragment.kt index c3e6d3fde..cde2f5ebe 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/SingleSignOnFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/SingleSignOnFragment.kt @@ -28,13 +28,12 @@ import androidx.annotation.UiThread import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController -import androidx.navigation.fragment.navArgs import net.openid.appauth.AuthorizationException import net.openid.appauth.AuthorizationResponse import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantSingleSignOnFragmentBinding -import org.linphone.ui.assistant.AssistantActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.assistant.viewmodel.SingleSignOnViewModel @UiThread @@ -49,8 +48,6 @@ class SingleSignOnFragment : Fragment() { private lateinit var viewModel: SingleSignOnViewModel - private val args: SingleSignOnFragmentArgs by navArgs() - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -65,12 +62,15 @@ class SingleSignOnFragment : Fragment() { binding.lifecycleOwner = viewLifecycleOwner - viewModel = ViewModelProvider(this)[SingleSignOnViewModel::class.java] + viewModel = requireActivity().run { + ViewModelProvider(this)[SingleSignOnViewModel::class.java] + } binding.viewModel = viewModel - val identity = args.sipIdentity - Log.i("$TAG SIP Identity found in arguments is [$identity]") - viewModel.preFilledUser = identity + viewModel.singleSignOnUrl.observe(viewLifecycleOwner) { url -> + Log.i("$TAG SSO URL found [$url], setting it up") + viewModel.setUp() + } viewModel.singleSignOnProcessCompletedEvent.observe(viewLifecycleOwner) { it.consume { @@ -88,15 +88,17 @@ class SingleSignOnFragment : Fragment() { viewModel.onErrorEvent.observe(viewLifecycleOwner) { it.consume { errorMessage -> - (requireActivity() as AssistantActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( errorMessage, R.drawable.warning_circle ) - findNavController().popBackStack() + try { + findNavController().popBackStack() + } catch (ise: IllegalStateException) { + // Excepted in SingleSignOnActivity as no NavController is set + } } } - - viewModel.setUp() } @Deprecated("Deprecated in Java") diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountLoginFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountLoginFragment.kt index 56b82c0fa..87585bf2d 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountLoginFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountLoginFragment.kt @@ -36,7 +36,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantThirdPartySipAccountLoginFragmentBinding -import org.linphone.ui.assistant.AssistantActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.assistant.viewmodel.ThirdPartySipAccountLoginViewModel import org.linphone.utils.PhoneNumberUtils @@ -111,7 +111,7 @@ class ThirdPartySipAccountLoginFragment : Fragment() { viewModel.accountLoginErrorEvent.observe(viewLifecycleOwner) { it.consume { message -> - (requireActivity() as AssistantActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( message, R.drawable.warning_circle ) diff --git a/app/src/main/java/org/linphone/ui/assistant/viewmodel/LandingViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/LandingViewModel.kt index 5c523b918..63cdb6b42 100644 --- a/app/src/main/java/org/linphone/ui/assistant/viewmodel/LandingViewModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/viewmodel/LandingViewModel.kt @@ -23,7 +23,6 @@ import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences -import org.linphone.utils.Event class LandingViewModel @UiThread constructor() : AccountLoginViewModel() { companion object { @@ -38,13 +37,13 @@ class LandingViewModel @UiThread constructor() : AccountLoginViewModel() { val hideThirdPartyAccount = MutableLiveData() - val redirectToDigestAuthEvent: MutableLiveData> by lazy { + /*val redirectToDigestAuthEvent: MutableLiveData> by lazy { MutableLiveData>() } val redirectToSingleSignOnEvent: MutableLiveData> by lazy { MutableLiveData>() - } + }*/ var conditionsAndPrivacyPolicyAccepted = false diff --git a/app/src/main/java/org/linphone/ui/assistant/viewmodel/SingleSignOnViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/SingleSignOnViewModel.kt index ac587e1de..043aabe89 100644 --- a/app/src/main/java/org/linphone/ui/assistant/viewmodel/SingleSignOnViewModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/viewmodel/SingleSignOnViewModel.kt @@ -44,13 +44,14 @@ class SingleSignOnViewModel : ViewModel() { companion object { private const val TAG = "[Single Sign On ViewModel]" - private const val WELL_KNOWN = "https://sso.onhexagone.com/realms/ONHEXAGONE/.well-known/openid-configuration" private const val CLIENT_ID = "linphone" private const val REDIRECT_URI = "org.linphone:/openidcallback" } val singleSignOnProcessCompletedEvent = MutableLiveData>() + val singleSignOnUrl = MutableLiveData() + val startAuthIntentEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -59,7 +60,7 @@ class SingleSignOnViewModel : ViewModel() { MutableLiveData>() } - var preFilledUser: String = "" + private var preFilledUser: String = "" private lateinit var authState: AuthState private lateinit var authService: AuthorizationService @@ -93,7 +94,7 @@ class SingleSignOnViewModel : ViewModel() { private fun singleSignOn() { Log.i("$TAG Fetch from issuer") AuthorizationServiceConfiguration.fetchFromUrl( - Uri.parse(WELL_KNOWN), + Uri.parse(singleSignOnUrl.value), AuthorizationServiceConfiguration.RetrieveConfigurationCallback { serviceConfiguration, ex -> if (ex != null) { Log.e("$TAG Failed to fetch configuration") diff --git a/app/src/main/java/org/linphone/ui/call/CallActivity.kt b/app/src/main/java/org/linphone/ui/call/CallActivity.kt index 905c24977..bab46038e 100644 --- a/app/src/main/java/org/linphone/ui/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/ui/call/CallActivity.kt @@ -23,14 +23,11 @@ import android.Manifest import android.content.Intent import android.content.pm.PackageManager import android.os.Bundle -import android.view.ViewGroup import androidx.activity.result.contract.ActivityResultContracts -import androidx.annotation.DrawableRes import androidx.annotation.UiThread import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat -import androidx.core.view.children import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -58,9 +55,6 @@ import org.linphone.ui.call.model.AudioDeviceModel import org.linphone.ui.call.viewmodel.CallsViewModel import org.linphone.ui.call.viewmodel.CurrentCallViewModel import org.linphone.ui.call.viewmodel.SharedCallViewModel -import org.linphone.utils.ToastUtils -import org.linphone.utils.slideInToastFromTop -import org.linphone.utils.slideInToastFromTopForDuration @UiThread class CallActivity : GenericActivity() { @@ -106,6 +100,8 @@ class CallActivity : GenericActivity() { binding = DataBindingUtil.setContentView(this, R.layout.call_activity) binding.lifecycleOwner = this + setUpToastsArea(binding.toastsArea) + lifecycleScope.launch(Dispatchers.Main) { WindowInfoTracker .getOrCreate(this@CallActivity) @@ -327,78 +323,6 @@ class CallActivity : GenericActivity() { } } - fun showBlueToast(message: String, @DrawableRes icon: Int, doNotTint: Boolean = false) { - val blueToast = ToastUtils.getBlueToast(this, binding.toastsArea, message, icon, doNotTint) - binding.toastsArea.addView(blueToast.root) - - blueToast.root.slideInToastFromTopForDuration( - binding.toastsArea as ViewGroup, - lifecycleScope - ) - } - - fun showRedToast( - message: String, - @DrawableRes icon: Int, - duration: Long = 4000, - doNotTint: Boolean = false - ) { - val redToast = ToastUtils.getRedToast(this, binding.toastsArea, message, icon, doNotTint) - binding.toastsArea.addView(redToast.root) - - redToast.root.slideInToastFromTopForDuration( - binding.toastsArea as ViewGroup, - lifecycleScope, - duration - ) - } - - fun showPersistentRedToast( - message: String, - @DrawableRes icon: Int, - tag: String, - doNotTint: Boolean = false - ) { - val redToast = ToastUtils.getRedToast(this, binding.toastsArea, message, icon, doNotTint) - redToast.root.tag = tag - binding.toastsArea.addView(redToast.root) - - redToast.root.slideInToastFromTop( - binding.toastsArea as ViewGroup, - true - ) - } - - fun removePersistentRedToast(tag: String) { - for (child in binding.toastsArea.children) { - if (child.tag == tag) { - binding.toastsArea.removeView(child) - } - } - } - - fun showGreenToast( - message: String, - @DrawableRes icon: Int, - duration: Long = 4000, - doNotTint: Boolean = false - ) { - val greenToast = ToastUtils.getGreenToast( - this, - binding.toastsArea, - message, - icon, - doNotTint - ) - binding.toastsArea.addView(greenToast.root) - - greenToast.root.slideInToastFromTopForDuration( - binding.toastsArea as ViewGroup, - lifecycleScope, - duration - ) - } - private fun navigateToActiveCall(notInConference: Boolean) { val navController = findNavController(R.id.call_nav_container) val action = when (navController.currentDestination?.id) { diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt index 52bbd913b..3056d5af0 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt @@ -40,6 +40,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.CallActiveFragmentBinding +import org.linphone.ui.GenericActivity import org.linphone.ui.call.CallActivity import org.linphone.ui.call.model.ZrtpSasConfirmationDialogModel import org.linphone.ui.call.viewmodel.CallsViewModel @@ -242,7 +243,7 @@ class ActiveCallFragment : GenericCallFragment() { dialog.dismiss() if (verified) { - (requireActivity() as CallActivity).showBlueToast( + (requireActivity() as GenericActivity).showBlueToast( getString(R.string.toast_call_can_be_trusted), R.drawable.trusted, doNotTint = true @@ -312,7 +313,7 @@ class ActiveCallFragment : GenericCallFragment() { if (isRemoteRecording) { Log.i("$TAG Showing [$displayName] is recording toast") val message = getString(R.string.call_remote_is_recording, displayName) - (requireActivity() as CallActivity).showPersistentRedToast( + (requireActivity() as GenericActivity).showPersistentRedToast( message, R.drawable.record_fill, toastTag @@ -349,7 +350,7 @@ class ActiveCallFragment : GenericCallFragment() { callViewModel.chatRoomCreationErrorEvent.observe(viewLifecycleOwner) { it.consume { error -> - (requireActivity() as CallActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( error, R.drawable.warning_circle ) diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ConversationFragment.kt index 2453cc3c5..449ec870c 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ConversationFragment.kt @@ -57,7 +57,7 @@ import org.linphone.core.ChatMessage import org.linphone.core.tools.Log import org.linphone.databinding.ChatBubbleLongPressMenuBinding import org.linphone.databinding.ChatConversationFragmentBinding -import org.linphone.ui.call.CallActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.chat.ConversationScrollListener import org.linphone.ui.main.chat.adapter.ConversationEventAdapter import org.linphone.ui.main.chat.adapter.MessageBottomSheetAdapter @@ -264,7 +264,7 @@ class ConversationFragment : GenericCallFragment() { Log.e("$TAG Failed to find conversation, going back") findNavController().popBackStack() val message = getString(R.string.toast_cant_find_conversation_to_display) - (requireActivity() as CallActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( message, R.drawable.warning_circle ) @@ -364,7 +364,7 @@ class ConversationFragment : GenericCallFragment() { it.consume { pair -> val message = pair.first val icon = pair.second - (requireActivity() as CallActivity).showRedToast(message, icon) + (requireActivity() as GenericActivity).showRedToast(message, icon) } } @@ -402,7 +402,7 @@ class ConversationFragment : GenericCallFragment() { it.consume { pair -> val message = pair.first val icon = pair.second - (requireActivity() as CallActivity).showRedToast(message, icon) + (requireActivity() as GenericActivity).showRedToast(message, icon) } } @@ -410,7 +410,7 @@ class ConversationFragment : GenericCallFragment() { it.consume { val message = getString(R.string.conversation_message_deleted_toast) val icon = R.drawable.trash_simple - (requireActivity() as CallActivity).showGreenToast(message, icon) + (requireActivity() as GenericActivity).showGreenToast(message, icon) } } binding.sendArea.messageToSend.setControlEnterListener(object : diff --git a/app/src/main/java/org/linphone/ui/main/MainActivity.kt b/app/src/main/java/org/linphone/ui/main/MainActivity.kt index 1819de03c..1c61501a6 100644 --- a/app/src/main/java/org/linphone/ui/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/ui/main/MainActivity.kt @@ -29,12 +29,9 @@ import android.net.Uri import android.os.Bundle import android.os.Parcelable import android.view.Gravity -import android.view.ViewGroup -import androidx.annotation.DrawableRes import androidx.annotation.MainThread import androidx.annotation.UiThread import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import androidx.core.view.children import androidx.core.view.doOnAttach import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider @@ -43,11 +40,9 @@ import androidx.navigation.NavController import androidx.navigation.NavOptions import androidx.navigation.findNavController import kotlinx.coroutines.Deferred -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R @@ -65,9 +60,6 @@ import org.linphone.utils.DialogUtils import org.linphone.utils.Event import org.linphone.utils.FileUtils import org.linphone.utils.LinphoneUtils -import org.linphone.utils.ToastUtils -import org.linphone.utils.slideInToastFromTop -import org.linphone.utils.slideInToastFromTopForDuration @UiThread class MainActivity : GenericActivity() { @@ -98,6 +90,8 @@ class MainActivity : GenericActivity() { binding = DataBindingUtil.setContentView(this, R.layout.main_activity) binding.lifecycleOwner = this + setUpToastsArea(binding.toastsArea) + while (!coreContext.isReady()) { Thread.sleep(50) } @@ -293,102 +287,6 @@ class MainActivity : GenericActivity() { return findNavController(R.id.main_nav_host_fragment) } - fun showGreenToast(message: String, @DrawableRes icon: Int) { - lifecycleScope.launch { - withContext(Dispatchers.Main) { - val greenToast = ToastUtils.getGreenToast( - this@MainActivity, - binding.toastsArea, - message, - icon - ) - binding.toastsArea.addView(greenToast.root) - - greenToast.root.slideInToastFromTopForDuration( - binding.toastsArea as ViewGroup, - lifecycleScope - ) - } - } - } - - fun showBlueToast(message: String, @DrawableRes icon: Int) { - lifecycleScope.launch { - withContext(Dispatchers.Main) { - val blueToast = ToastUtils.getBlueToast( - this@MainActivity, - binding.toastsArea, - message, - icon - ) - binding.toastsArea.addView(blueToast.root) - - blueToast.root.slideInToastFromTopForDuration( - binding.toastsArea as ViewGroup, - lifecycleScope - ) - } - } - } - - fun showRedToast(message: String, @DrawableRes icon: Int) { - lifecycleScope.launch { - withContext(Dispatchers.Main) { - val redToast = ToastUtils.getRedToast( - this@MainActivity, - binding.toastsArea, - message, - icon - ) - binding.toastsArea.addView(redToast.root) - - redToast.root.slideInToastFromTopForDuration( - binding.toastsArea as ViewGroup, - lifecycleScope - ) - } - } - } - - private fun showPersistentRedToast( - message: String, - @DrawableRes icon: Int, - tag: String, - doNotTint: Boolean = false - ) { - lifecycleScope.launch { - withContext(Dispatchers.Main) { - val redToast = - ToastUtils.getRedToast( - this@MainActivity, - binding.toastsArea, - message, - icon, - doNotTint - ) - redToast.root.tag = tag - binding.toastsArea.addView(redToast.root) - - redToast.root.slideInToastFromTop( - binding.toastsArea as ViewGroup, - true - ) - } - } - } - - private fun removePersistentRedToast(tag: String) { - lifecycleScope.launch { - withContext(Dispatchers.Main) { - for (child in binding.toastsArea.children) { - if (child.tag == tag) { - binding.toastsArea.removeView(child) - } - } - } - } - } - @MainThread private fun handleIntent(intent: Intent, isNewIntent: Boolean) { Log.i( @@ -627,9 +525,15 @@ class MainActivity : GenericActivity() { Log.i("$TAG Found URI [$uri] as data for intent [${intent.action}]") val sipUriToCall = if (uri.startsWith("tel:")) { uri.substring("tel:".length) + } else if (uri.startsWith("sip-linphone:")) { + uri.replace("sip-linphone:", "sip:") } else { - uri - }.replace("%40", "@") // Unescape @ character if needed + if (uri.startsWith("sips-linphone:")) { + uri.replace("sips-linphone:", "sips:") + } else { + uri + }.replace("%40", "@") // Unescape @ character if needed + } coreContext.postOnCoreThread { val address = coreContext.core.interpretUrl( diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationDocumentsListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationDocumentsListFragment.kt index 5203b42db..0c868677f 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationDocumentsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationDocumentsListFragment.kt @@ -35,7 +35,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.ChatDocumentsFragmentBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.chat.adapter.ConversationsFilesAdapter import org.linphone.ui.main.chat.viewmodel.ConversationDocumentsListViewModel import org.linphone.ui.main.fragment.SlidingPaneChildFragment @@ -157,7 +157,7 @@ class ConversationDocumentsListFragment : SlidingPaneChildFragment() { R.string.toast_no_app_registered_to_handle_content_type_error ) val icon = R.drawable.file - (requireActivity() as MainActivity).showRedToast(message, icon) + (requireActivity() as GenericActivity).showRedToast(message, icon) } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt index e25c62269..3111c927d 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt @@ -74,6 +74,7 @@ import org.linphone.core.tools.Log import org.linphone.databinding.ChatBubbleLongPressMenuBinding import org.linphone.databinding.ChatConversationFragmentBinding import org.linphone.databinding.ChatConversationPopupMenuBinding +import org.linphone.ui.GenericActivity import org.linphone.ui.main.MainActivity import org.linphone.ui.main.chat.ConversationScrollListener import org.linphone.ui.main.chat.adapter.ConversationEventAdapter @@ -403,7 +404,7 @@ class ConversationFragment : SlidingPaneChildFragment() { Log.e("$TAG Failed to find conversation, going back") goBack() val message = getString(R.string.toast_cant_find_conversation_to_display) - (requireActivity() as MainActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( message, R.drawable.warning_circle ) @@ -575,7 +576,7 @@ class ConversationFragment : SlidingPaneChildFragment() { it.consume { pair -> val message = pair.first val icon = pair.second - (requireActivity() as MainActivity).showRedToast(message, icon) + (requireActivity() as GenericActivity).showRedToast(message, icon) } } @@ -645,7 +646,7 @@ class ConversationFragment : SlidingPaneChildFragment() { it.consume { pair -> val message = pair.first val icon = pair.second - (requireActivity() as MainActivity).showRedToast(message, icon) + (requireActivity() as GenericActivity).showRedToast(message, icon) } } @@ -653,7 +654,7 @@ class ConversationFragment : SlidingPaneChildFragment() { it.consume { val message = getString(R.string.conversation_message_deleted_toast) val icon = R.drawable.trash_simple - (requireActivity() as MainActivity).showGreenToast(message, icon) + (requireActivity() as GenericActivity).showGreenToast(message, icon) sharedViewModel.forceRefreshConversations.value = Event(true) } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt index 261007eae..d1913ea2b 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationInfoFragment.kt @@ -36,7 +36,7 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.ChatInfoFragmentBinding import org.linphone.databinding.ChatParticipantAdminPopupMenuBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.chat.adapter.ConversationParticipantsAdapter import org.linphone.ui.main.chat.model.ParticipantModel import org.linphone.ui.main.chat.viewmodel.ConversationInfoViewModel @@ -116,7 +116,7 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { Log.e("$TAG Failed to find conversation, going back") goBack() val message = getString(R.string.toast_cant_find_conversation_to_display) - (requireActivity() as MainActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( message, R.drawable.warning_circle ) @@ -135,7 +135,7 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { sharedViewModel.forceRefreshConversationInfo.value = Event(true) goBack() val message = getString(R.string.toast_group_conversation_left) - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( message, R.drawable.chat_teardrop_text ) @@ -148,7 +148,7 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { sharedViewModel.forceRefreshConversationEvents.value = Event(true) goBack() val message = getString(R.string.toast_conversation_history_deleted) - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( message, R.drawable.chat_teardrop_text ) @@ -181,7 +181,7 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { it.consume { pair -> val message = pair.first val icon = pair.second - (requireActivity() as MainActivity).showGreenToast(message, icon) + (requireActivity() as GenericActivity).showGreenToast(message, icon) } } @@ -189,7 +189,7 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { it.consume { pair -> val message = pair.first val icon = pair.second - (requireActivity() as MainActivity).showRedToast(message, icon) + (requireActivity() as GenericActivity).showRedToast(message, icon) } } @@ -261,7 +261,10 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { } else { Log.e("$TAG Can't go to contact page, friend ref key is null or empty!") val message = getString(R.string.toast_cant_find_contact_to_display) - (requireActivity() as MainActivity).showRedToast(message, R.drawable.warning_circle) + (requireActivity() as GenericActivity).showRedToast( + message, + R.drawable.warning_circle + ) } } @@ -275,7 +278,10 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { } else { Log.e("$TAG Can't add empty/null SIP URI to contacts!") val message = getString(R.string.toast_no_address_to_add_to_contact) - (requireActivity() as MainActivity).showRedToast(message, R.drawable.warning_circle) + (requireActivity() as GenericActivity).showRedToast( + message, + R.drawable.warning_circle + ) } } @@ -340,7 +346,10 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { } else { Log.e("$TAG Can't go to contact page, friend ref key is null or empty!") val message = getString(R.string.toast_cant_find_contact_to_display) - (requireActivity() as MainActivity).showRedToast(message, R.drawable.warning_circle) + (requireActivity() as GenericActivity).showRedToast( + message, + R.drawable.warning_circle + ) } popupWindow.dismiss() } @@ -355,7 +364,10 @@ class ConversationInfoFragment : SlidingPaneChildFragment() { } else { Log.e("$TAG Can't add empty/null SIP URI to contacts!") val message = getString(R.string.toast_no_address_to_add_to_contact) - (requireActivity() as MainActivity).showRedToast(message, R.drawable.warning_circle) + (requireActivity() as GenericActivity).showRedToast( + message, + R.drawable.warning_circle + ) } popupWindow.dismiss() } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt index bbda2fb67..58871d911 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationMediaListFragment.kt @@ -36,7 +36,7 @@ import androidx.recyclerview.widget.RecyclerView import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.ChatMediaFragmentBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.chat.adapter.ConversationsFilesAdapter import org.linphone.ui.main.chat.viewmodel.ConversationMediaListViewModel import org.linphone.ui.main.fragment.SlidingPaneChildFragment @@ -166,7 +166,7 @@ class ConversationMediaListFragment : SlidingPaneChildFragment() { R.string.toast_no_app_registered_to_handle_content_type_error ) val icon = R.drawable.file - (requireActivity() as MainActivity).showRedToast(message, icon) + (requireActivity() as GenericActivity).showRedToast(message, icon) } } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt index ee1abc1f7..86a99668a 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt @@ -36,7 +36,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.ChatListFragmentBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.chat.adapter.ConversationsListAdapter import org.linphone.ui.main.chat.viewmodel.ConversationsListViewModel import org.linphone.ui.main.fragment.AbstractTopBarFragment @@ -250,7 +250,7 @@ class ConversationsListFragment : AbstractTopBarFragment() { // Do not consume it yet val message = getString(R.string.toast_message_waiting_to_be_forwarded) val icon = R.drawable.forward - (requireActivity() as MainActivity).showGreenToast(message, icon) + (requireActivity() as GenericActivity).showGreenToast(message, icon) Log.i("$TAG Found a message waiting to be forwarded") } } @@ -264,7 +264,7 @@ class ConversationsListFragment : AbstractTopBarFragment() { filesToShare.size.toString() ) val icon = R.drawable.file - (requireActivity() as MainActivity).showGreenToast(message, icon) + (requireActivity() as GenericActivity).showGreenToast(message, icon) Log.i("$TAG Found [$count] files waiting to be shared") } } @@ -273,7 +273,7 @@ class ConversationsListFragment : AbstractTopBarFragment() { if (textToShare.isNotEmpty()) { val message = getString(R.string.toast_text_waiting_to_be_shared) val icon = R.drawable.file_text - (requireActivity() as MainActivity).showGreenToast(message, icon) + (requireActivity() as GenericActivity).showGreenToast(message, icon) Log.i("$TAG Found text waiting to be shared") } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt index 40ed78624..eb321598b 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/StartConversationFragment.kt @@ -32,7 +32,7 @@ import org.linphone.core.Address import org.linphone.core.Friend import org.linphone.core.tools.Log import org.linphone.databinding.StartChatFragmentBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.chat.viewmodel.StartConversationViewModel import org.linphone.ui.main.fragment.GenericAddressPickerFragment import org.linphone.ui.main.fragment.GroupSetOrEditSubjectDialogModel @@ -105,7 +105,10 @@ class StartConversationFragment : GenericAddressPickerFragment() { viewModel.chatRoomCreationErrorEvent.observe(viewLifecycleOwner) { it.consume { error -> Log.i("$TAG Conversation creation error, showing red toast") - (requireActivity() as MainActivity).showRedToast(error, R.drawable.warning_circle) + (requireActivity() as GenericActivity).showRedToast( + error, + R.drawable.warning_circle + ) } } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt index 84c8377f0..6c23aea4b 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt @@ -44,7 +44,7 @@ import org.linphone.R import org.linphone.core.Factory import org.linphone.core.tools.Log import org.linphone.databinding.ContactFragmentBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.contacts.model.NumberOrAddressPickerDialogModel import org.linphone.ui.main.contacts.model.TrustCallDialogModel import org.linphone.ui.main.contacts.viewmodel.ContactViewModel @@ -246,7 +246,7 @@ class ContactFragment : SlidingPaneChildFragment() { } else { getString(R.string.toast_phone_number_copied_to_clipboard) } - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( message, R.drawable.check ) diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt index d15917631..9d4f24e6f 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt @@ -40,6 +40,7 @@ import org.linphone.BR import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.ContactNewOrEditFragmentBinding +import org.linphone.ui.GenericActivity import org.linphone.ui.main.MainActivity import org.linphone.ui.main.contacts.model.NewOrEditNumberOrAddressModel import org.linphone.ui.main.contacts.viewmodel.ContactNewOrEditViewModel @@ -154,7 +155,7 @@ class EditContactFragment : SlidingPaneChildFragment() { it.consume { refKey -> if (refKey.isNotEmpty()) { Log.i("$TAG Changes were applied, going back to details page") - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.contact_editor_saved_changes_toast), R.drawable.info ) @@ -162,7 +163,7 @@ class EditContactFragment : SlidingPaneChildFragment() { backPressedCallback.isEnabled = false findNavController().popBackStack() } else { - (requireActivity() as MainActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( getString(R.string.contact_editor_error_saving_changes_toast), R.drawable.warning_circle ) diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt index c7c3f54f0..ae7b7866c 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt @@ -39,6 +39,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.ContactNewOrEditFragmentBinding +import org.linphone.ui.GenericActivity import org.linphone.ui.main.MainActivity import org.linphone.ui.main.contacts.model.NewOrEditNumberOrAddressModel import org.linphone.ui.main.contacts.viewmodel.ContactNewOrEditViewModel @@ -142,12 +143,12 @@ class NewContactFragment : GenericFragment() { findNavController().popBackStack() sharedViewModel.showContactEvent.value = Event(refKey) - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.contact_editor_saved_contact_toast), R.drawable.info ) } else { - (requireActivity() as MainActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( getString(R.string.contact_editor_error_saving_contact_toast), R.drawable.warning_circle ) diff --git a/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/FileViewerFragment.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/FileViewerFragment.kt index f4bac6b5a..22fe7c000 100644 --- a/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/FileViewerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/FileViewerFragment.kt @@ -21,7 +21,7 @@ import kotlinx.coroutines.launch import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.FileViewerFragmentBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.file_media_viewer.adapter.PdfPagesListAdapter import org.linphone.ui.main.file_media_viewer.viewmodel.FileViewModel import org.linphone.ui.main.fragment.GenericFragment @@ -143,7 +143,7 @@ class FileViewerFragment : GenericFragment() { it.consume { pair -> val message = pair.first val icon = pair.second - (requireActivity() as MainActivity).showGreenToast(message, icon) + (requireActivity() as GenericActivity).showGreenToast(message, icon) } } @@ -151,7 +151,7 @@ class FileViewerFragment : GenericFragment() { it.consume { pair -> val message = pair.first val icon = pair.second - (requireActivity() as MainActivity).showRedToast(message, icon) + (requireActivity() as GenericActivity).showRedToast(message, icon) } } } diff --git a/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt index 843c4590b..7bbf655f4 100644 --- a/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/file_media_viewer/fragment/MediaListViewerFragment.kt @@ -38,7 +38,7 @@ import kotlinx.coroutines.withContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.FileMediaViewerFragmentBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.chat.viewmodel.ConversationMediaListViewModel import org.linphone.ui.main.file_media_viewer.adapter.MediaListAdapter import org.linphone.ui.main.fragment.GenericFragment @@ -179,7 +179,7 @@ class MediaListViewerFragment : GenericFragment() { val message = AppUtils.getString( R.string.toast_file_successfully_exported_to_media_store ) - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( message, R.drawable.check ) @@ -188,7 +188,7 @@ class MediaListViewerFragment : GenericFragment() { val message = AppUtils.getString( R.string.toast_export_file_to_media_store_error ) - (requireActivity() as MainActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( message, R.drawable.warning_circle ) diff --git a/app/src/main/java/org/linphone/ui/main/help/fragment/DebugFragment.kt b/app/src/main/java/org/linphone/ui/main/help/fragment/DebugFragment.kt index f8ec26365..7df7e6dc7 100644 --- a/app/src/main/java/org/linphone/ui/main/help/fragment/DebugFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/help/fragment/DebugFragment.kt @@ -31,7 +31,7 @@ import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.HelpDebugFragmentBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.fragment.GenericFragment import org.linphone.ui.main.help.viewmodel.HelpViewModel @@ -66,7 +66,7 @@ class DebugFragment : GenericFragment() { viewModel.debugLogsCleanedEvent.observe(viewLifecycleOwner) { it.consume { - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.help_troubleshooting_debug_logs_cleaned_toast_message), R.drawable.info ) @@ -106,7 +106,7 @@ class DebugFragment : GenericFragment() { viewModel.uploadDebugLogsErrorEvent.observe(viewLifecycleOwner) { it.consume { - (requireActivity() as MainActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( getString(R.string.help_troubleshooting_debug_logs_upload_error_toast_message), R.drawable.warning_circle ) diff --git a/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt b/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt index a7d901eee..4f9efe4e1 100644 --- a/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt @@ -12,7 +12,7 @@ import androidx.navigation.navGraphViewModels import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.HelpFragmentBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.fragment.GenericFragment import org.linphone.ui.main.help.viewmodel.HelpViewModel import org.linphone.ui.main.history.model.ConfirmationDialogModel @@ -99,7 +99,7 @@ class HelpFragment : GenericFragment() { viewModel.versionUpToDateEvent.observe(viewLifecycleOwner) { it.consume { - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.help_version_up_to_date_toast_message), R.drawable.info ) @@ -108,7 +108,7 @@ class HelpFragment : GenericFragment() { viewModel.errorEvent.observe(viewLifecycleOwner) { it.consume { - (requireActivity() as MainActivity).showRedToast( + (requireActivity() as GenericActivity).showRedToast( getString(R.string.help_error_checking_version_toast_message), R.drawable.warning_circle ) diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt index f4ce4ae53..d89118638 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt @@ -39,7 +39,7 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.HistoryContactFragmentBinding import org.linphone.databinding.HistoryContactPopupMenuBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.fragment.SlidingPaneChildFragment import org.linphone.ui.main.history.adapter.ContactHistoryListAdapter import org.linphone.ui.main.history.model.ConfirmationDialogModel @@ -138,7 +138,7 @@ class HistoryContactFragment : SlidingPaneChildFragment() { it.consume { sharedViewModel.forceRefreshCallLogsListEvent.value = Event(true) - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.toast_call_history_deleted), R.drawable.check ) @@ -175,7 +175,7 @@ class HistoryContactFragment : SlidingPaneChildFragment() { val label = "SIP address" clipboard.setPrimaryClip(ClipData.newPlainText(label, value)) - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.toast_sip_address_copied_to_clipboard), R.drawable.check ) diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt index ea64a2460..4d73ee45f 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt @@ -43,7 +43,7 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.HistoryListFragmentBinding import org.linphone.databinding.HistoryListPopupMenuBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.fragment.AbstractTopBarFragment import org.linphone.ui.main.history.adapter.HistoryListAdapter import org.linphone.ui.main.history.model.ConfirmationDialogModel @@ -203,7 +203,7 @@ class HistoryListFragment : AbstractTopBarFragment() { listViewModel.historyDeletedEvent.observe(viewLifecycleOwner) { it.consume { Log.w("$TAG All call logs have been deleted") - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.toast_call_history_deleted), R.drawable.check ) @@ -279,7 +279,7 @@ class HistoryListFragment : AbstractTopBarFragment() { val label = "SIP address" clipboard.setPrimaryClip(ClipData.newPlainText(label, value)) - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.toast_sip_address_copied_to_clipboard), R.drawable.check ) diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/EditMeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/EditMeetingFragment.kt index e9d245202..08137c3b5 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/EditMeetingFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/EditMeetingFragment.kt @@ -36,7 +36,7 @@ import com.google.android.material.timepicker.TimeFormat import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.MeetingEditFragmentBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.fragment.SlidingPaneChildFragment import org.linphone.ui.main.meetings.viewmodel.ScheduleMeetingViewModel import org.linphone.utils.Event @@ -168,7 +168,7 @@ class EditMeetingFragment : SlidingPaneChildFragment() { viewModel.conferenceCreatedEvent.observe(viewLifecycleOwner) { it.consume { Log.i("$TAG Conference was scheduled, leaving fragment and ask list to refresh") - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.meeting_info_updated_toast), R.drawable.check ) diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt index 760162eb3..9bb31f7a2 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingFragment.kt @@ -41,7 +41,7 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.MeetingFragmentBinding import org.linphone.databinding.MeetingPopupMenuBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.fragment.SlidingPaneChildFragment import org.linphone.ui.main.history.model.ConfirmationDialogModel import org.linphone.ui.main.meetings.viewmodel.MeetingViewModel @@ -147,7 +147,7 @@ class MeetingFragment : SlidingPaneChildFragment() { viewModel.conferenceInfoDeletedEvent.observe(viewLifecycleOwner) { it.consume { Log.i("$TAG Meeting info has been deleted successfully") - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.meeting_info_deleted_toast), R.drawable.trash_simple ) @@ -159,7 +159,7 @@ class MeetingFragment : SlidingPaneChildFragment() { viewModel.conferenceCancelledEvent.observe(viewLifecycleOwner) { it.consume { Log.i("$TAG Meeting has been cancelled successfully, deleting it") - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.meeting_info_cancelled_toast), R.drawable.trash_simple ) @@ -208,7 +208,7 @@ class MeetingFragment : SlidingPaneChildFragment() { val label = "Meeting SIP address" clipboard.setPrimaryClip(ClipData.newPlainText(label, meetingSipUri)) - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.toast_meeting_address_copied_to_clipboard), R.drawable.check ) diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt index 7074ad953..0a0c22bf2 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/MeetingWaitingRoomFragment.kt @@ -37,9 +37,9 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.MeetingWaitingRoomFragmentBinding +import org.linphone.ui.GenericActivity import org.linphone.ui.call.fragment.AudioDevicesMenuDialogFragment import org.linphone.ui.call.model.AudioDeviceModel -import org.linphone.ui.main.MainActivity import org.linphone.ui.main.fragment.GenericFragment import org.linphone.ui.main.meetings.viewmodel.MeetingWaitingRoomViewModel @@ -140,7 +140,7 @@ class MeetingWaitingRoomFragment : GenericFragment() { R.string.toast_failed_to_join_conference ) val icon = R.drawable.warning_circle - (requireActivity() as MainActivity).showRedToast(message, icon) + (requireActivity() as GenericActivity).showRedToast(message, icon) } } diff --git a/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt b/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt index 4a289f189..52e232b88 100644 --- a/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/meetings/fragment/ScheduleMeetingFragment.kt @@ -36,7 +36,7 @@ import com.google.android.material.timepicker.TimeFormat import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.MeetingScheduleFragmentBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.fragment.GenericFragment import org.linphone.ui.main.meetings.viewmodel.ScheduleMeetingViewModel import org.linphone.utils.Event @@ -170,7 +170,7 @@ class ScheduleMeetingFragment : GenericFragment() { viewModel.conferenceCreatedEvent.observe(viewLifecycleOwner) { it.consume { Log.i("$TAG Conference was scheduled, leaving fragment and ask list to refresh") - (requireActivity() as MainActivity).showGreenToast( + (requireActivity() as GenericActivity).showGreenToast( getString(R.string.meeting_info_created_toast), R.drawable.check ) diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/CardDavAddressBookConfigurationFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/CardDavAddressBookConfigurationFragment.kt index 8fd402b00..87879bd08 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/CardDavAddressBookConfigurationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/CardDavAddressBookConfigurationFragment.kt @@ -9,7 +9,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.navArgs import org.linphone.core.tools.Log import org.linphone.databinding.SettingsContactsCarddavBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.fragment.GenericFragment import org.linphone.ui.main.settings.viewmodel.CardDavViewModel @@ -66,7 +66,7 @@ class CardDavAddressBookConfigurationFragment : GenericFragment() { it.consume { pair -> val icon = pair.first val message = pair.second - (requireActivity() as MainActivity).showRedToast(message, icon) + (requireActivity() as GenericActivity).showRedToast(message, icon) } } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/LdapServerConfigurationFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/LdapServerConfigurationFragment.kt index ff13fded5..84413e387 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/LdapServerConfigurationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/LdapServerConfigurationFragment.kt @@ -9,7 +9,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.navArgs import org.linphone.core.tools.Log import org.linphone.databinding.SettingsContactsLdapBinding -import org.linphone.ui.main.MainActivity +import org.linphone.ui.GenericActivity import org.linphone.ui.main.fragment.GenericFragment import org.linphone.ui.main.settings.viewmodel.LdapViewModel @@ -65,7 +65,7 @@ class LdapServerConfigurationFragment : GenericFragment() { it.consume { pair -> val icon = pair.first val message = pair.second - (requireActivity() as MainActivity).showRedToast(message, icon) + (requireActivity() as GenericActivity).showRedToast(message, icon) } } } diff --git a/app/src/main/res/layout/assistant_single_sign_on_activity.xml b/app/src/main/res/layout/assistant_single_sign_on_activity.xml new file mode 100644 index 000000000..14a09bc53 --- /dev/null +++ b/app/src/main/res/layout/assistant_single_sign_on_activity.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/assistant_nav_graph.xml b/app/src/main/res/navigation/assistant_nav_graph.xml index 927d71d86..6ab4de177 100644 --- a/app/src/main/res/navigation/assistant_nav_graph.xml +++ b/app/src/main/res/navigation/assistant_nav_graph.xml @@ -190,10 +190,6 @@ android:id="@+id/singleSignOnFragment" android:name="org.linphone.ui.assistant.fragment.SingleSignOnFragment" android:label="SingleSignOnFragment" - tools:layout="@layout/assistant_single_sign_on_fragment"> - - + tools:layout="@layout/assistant_single_sign_on_fragment" /> \ No newline at end of file