diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt index d9cd50e96..2829c9769 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt @@ -145,7 +145,7 @@ class AccountProfileFragment : GenericFragment() { viewModel.accountRemovedEvent.observe(viewLifecycleOwner) { it.consume { Log.i("$TAG Account has been removed, leaving profile") - findNavController().popBackStack() + goBack() } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileModeFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileModeFragment.kt index ff55b9f57..ef1590f4c 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileModeFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileModeFragment.kt @@ -24,19 +24,26 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread -import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController +import androidx.navigation.navGraphViewModels +import org.linphone.R +import org.linphone.core.tools.Log import org.linphone.databinding.AccountProfileSecureModeFragmentBinding +import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.main.settings.viewmodel.AccountProfileViewModel import org.linphone.utils.DialogUtils @UiThread -class AccountProfileModeFragment : Fragment() { +class AccountProfileModeFragment : GenericFragment() { companion object { private const val TAG = "[Account Profile Mode Fragment]" } private lateinit var binding: AccountProfileSecureModeFragmentBinding + private val viewModel: AccountProfileViewModel by navGraphViewModels( + R.id.main_nav_graph + ) + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -50,13 +57,17 @@ class AccountProfileModeFragment : Fragment() { super.onViewCreated(view, savedInstanceState) binding.lifecycleOwner = viewLifecycleOwner + binding.viewModel = viewModel binding.setBackClickListener { - findNavController().popBackStack() + Log.i("$TAG Leaving without saving changes...") + goBack() } binding.setContinueClickListener { - findNavController().popBackStack() + Log.i("$TAG Applying changes and leaving...") + viewModel.applySelectedMode() + goBack() } binding.setDefaultModeTooltipClickListener { diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt index 14e7d2dc6..92cb9a800 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt @@ -4,14 +4,13 @@ import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext -import org.linphone.R import org.linphone.core.Account import org.linphone.core.DialPlan import org.linphone.core.Factory import org.linphone.core.tools.Log import org.linphone.ui.main.model.AccountModel +import org.linphone.ui.main.model.isInSecureMode import org.linphone.ui.main.settings.model.AccountDeviceModel -import org.linphone.utils.AppUtils import org.linphone.utils.Event class AccountProfileViewModel @UiThread constructor() : ViewModel() { @@ -33,7 +32,7 @@ class AccountProfileViewModel @UiThread constructor() : ViewModel() { val registerEnabled = MutableLiveData() - val currentMode = MutableLiveData() + val isCurrentlySelectedModeSecure = MutableLiveData() val devices = MutableLiveData>() @@ -83,9 +82,7 @@ class AccountProfileViewModel @UiThread constructor() : ViewModel() { Log.i("$TAG Found matching account [$found]") account = found accountModel.postValue(AccountModel(account)) - currentMode.postValue( - AppUtils.getString(R.string.manage_account_secure_mode_default_title) - ) // TODO: use real API when available + isCurrentlySelectedModeSecure.postValue(account.isInSecureMode()) registerEnabled.postValue(account.params.isRegisterEnabled) sipAddress.postValue(account.params.identityAddress?.asStringUriOnly()) @@ -241,4 +238,19 @@ class AccountProfileViewModel @UiThread constructor() : ViewModel() { ) } } + + @UiThread + fun switchToSecureMode() { + isCurrentlySelectedModeSecure.value = true + } + + @UiThread + fun switchToInteropMode() { + isCurrentlySelectedModeSecure.value = false + } + + @UiThread + fun applySelectedMode() { + // TODO + } } diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index a9f3ec751..d50d22209 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -227,6 +227,15 @@ fun ShapeableImageView.loadAvatarWithCoil(model: AbstractAvatarModel?) { } } +@UiThread +@BindingAdapter("coilAvatarNoTrust") +fun ShapeableImageView.loadAvatarWithCoilWithoutTrust(model: AbstractAvatarModel?) { + val imageView = this + (context as AppCompatActivity).lifecycleScope.launch { + loadContactPictureWithCoil(imageView, model, skipTrust = true) + } +} + @UiThread @BindingAdapter("coilBubbleAvatar") fun ShapeableImageView.loadBubbleAvatarWithCoil(model: AbstractAvatarModel?) { @@ -279,31 +288,36 @@ private suspend fun loadContactPictureWithCoil( imageView: ShapeableImageView, model: AbstractAvatarModel?, @DimenRes size: Int = 0, - @DimenRes textSize: Int = 0 + @DimenRes textSize: Int = 0, + skipTrust: Boolean = false ) { withContext(Dispatchers.IO) { imageView.dispose() val context = imageView.context if (model != null) { - if (model.showTrust.value == true) { - when (model.trust.value) { - ChatRoom.SecurityLevel.Safe -> { - imageView.setStrokeColorResource(R.color.blue_info_500) - imageView.setStrokeWidthResource(R.dimen.avatar_trust_border_width) - } - ChatRoom.SecurityLevel.Unsafe -> { - imageView.setStrokeColorResource(R.color.red_danger_500) - imageView.setStrokeWidthResource(R.dimen.avatar_trust_border_width) - } - else -> { - imageView.setStrokeColorResource(R.color.transparent_color) - imageView.setStrokeWidthResource(R.dimen.zero) + if (!skipTrust) { + if (model.showTrust.value == true) { + when (model.trust.value) { + ChatRoom.SecurityLevel.Safe -> { + imageView.setStrokeColorResource(R.color.blue_info_500) + imageView.setStrokeWidthResource(R.dimen.avatar_trust_border_width) + } + + ChatRoom.SecurityLevel.Unsafe -> { + imageView.setStrokeColorResource(R.color.red_danger_500) + imageView.setStrokeWidthResource(R.dimen.avatar_trust_border_width) + } + + else -> { + imageView.setStrokeColorResource(R.color.transparent_color) + imageView.setStrokeWidthResource(R.dimen.zero) + } } + } else { + imageView.setStrokeColorResource(R.color.transparent_color) + imageView.setStrokeWidthResource(R.dimen.zero) } - } else { - imageView.setStrokeColorResource(R.color.transparent_color) - imageView.setStrokeWidthResource(R.dimen.zero) } val images = model.images.value.orEmpty() diff --git a/app/src/main/res/layout/account_profile_fragment.xml b/app/src/main/res/layout/account_profile_fragment.xml index cdfa49d12..960498ffa 100644 --- a/app/src/main/res/layout/account_profile_fragment.xml +++ b/app/src/main/res/layout/account_profile_fragment.xml @@ -397,7 +397,7 @@ android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" - android:text="@{viewModel.currentMode, default=@string/manage_account_secure_mode_default_title}" + android:text="@{viewModel.isCurrentlySelectedModeSecure ? @string/manage_account_secure_mode_default_title : @string/manage_account_secure_mode_interoperable_title, default=@string/manage_account_secure_mode_default_title}" app:layout_constraintTop_toTopOf="@id/mode_background" app:layout_constraintStart_toStartOf="@id/mode_background" app:layout_constraintBottom_toBottomOf="@id/mode_background"/> diff --git a/app/src/main/res/layout/account_profile_secure_mode_fragment.xml b/app/src/main/res/layout/account_profile_secure_mode_fragment.xml index 1ec547006..912f3b959 100644 --- a/app/src/main/res/layout/account_profile_secure_mode_fragment.xml +++ b/app/src/main/res/layout/account_profile_secure_mode_fragment.xml @@ -17,6 +17,9 @@ + Account settings Delete account Choose account mode - Apply + Apply Default mode Interoperable mode - Blah - Blah + End-to-end encryption of your communications + Allows to communicate with other SIP services, point to point encryption Remove Last connection: