From b08aa2ae1f8c3a9396e75f2bfb80af7d983e4fcc Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 7 Sep 2023 09:29:00 +0200 Subject: [PATCH] Added clickable links to conditions & privacy policy dialog --- .../ui/assistant/fragment/LoginFragment.kt | 28 +++++++++ .../AcceptConditionsAndPolicyDialogModel.kt | 58 +++++++++++++++++++ .../java/org/linphone/utils/DialogUtils.kt | 2 + ...assistant_accept_conditions_and_policy.xml | 11 ++-- ...nt_create_account_confirm_phone_number.xml | 4 +- .../layout/dialog_cancel_contact_changes.xml | 4 +- .../res/layout/dialog_confirm_zrtp_sas.xml | 4 +- .../dialog_contact_confirm_trust_call.xml | 4 +- .../layout/dialog_contact_trust_process.xml | 4 +- .../layout/dialog_pick_number_or_address.xml | 4 +- .../layout/dialog_remove_all_call_logs.xml | 4 +- 11 files changed, 101 insertions(+), 26 deletions(-) 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 e038db5ba..9bdf4eb87 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 @@ -194,6 +194,34 @@ class LoginFragment : Fragment() { } } + model.privacyPolicyClickedEvent.observe(viewLifecycleOwner) { + it.consume { + val browserIntent = Intent( + Intent.ACTION_VIEW, + Uri.parse("https://www.linphone.org/privacy-policy") + ) + try { + startActivity(browserIntent) + } catch (e: Exception) { + Log.e("$TAG Can't start activity: $e") + } + } + } + + model.generalTermsClickedEvent.observe(viewLifecycleOwner) { + it.consume { + val browserIntent = Intent( + Intent.ACTION_VIEW, + Uri.parse("https://www.linphone.org/general-terms") + ) + try { + startActivity(browserIntent) + } catch (e: Exception) { + Log.e("$TAG Can't start activity: $e") + } + } + } + dialog.show() } } diff --git a/app/src/main/java/org/linphone/ui/assistant/model/AcceptConditionsAndPolicyDialogModel.kt b/app/src/main/java/org/linphone/ui/assistant/model/AcceptConditionsAndPolicyDialogModel.kt index 93dadbc6d..fb6160d0a 100644 --- a/app/src/main/java/org/linphone/ui/assistant/model/AcceptConditionsAndPolicyDialogModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/model/AcceptConditionsAndPolicyDialogModel.kt @@ -19,15 +19,73 @@ */ package org.linphone.ui.assistant.model +import android.text.SpannableString +import android.text.Spanned +import android.text.style.ClickableSpan +import android.view.View import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData +import java.util.regex.Pattern +import org.linphone.core.tools.Log import org.linphone.utils.Event class AcceptConditionsAndPolicyDialogModel @UiThread constructor() { + companion object { + private const val TAG = "[Accept Terms & Policy Dialog Model]" + } + + val message = MutableLiveData() + val dismissEvent = MutableLiveData>() val conditionsAcceptedEvent = MutableLiveData>() + val generalTermsClickedEvent = MutableLiveData>() + + val privacyPolicyClickedEvent = MutableLiveData>() + + init { + val privacy = "politique de confidentialité" + val terms = "conditions d'utilisation" + + val label = "En continuant, vous notre $privacy et nos $terms." + val spannable = SpannableString(label) + + val termsMatcher = Pattern.compile(terms).matcher(label) + if (termsMatcher.find()) { + val clickableSpan: ClickableSpan = object : ClickableSpan() { + override fun onClick(widget: View) { + Log.i("$TAG Clicked on general terms link") + generalTermsClickedEvent.value = Event(true) + } + } + spannable.setSpan( + clickableSpan, + termsMatcher.start(0), + termsMatcher.end(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + + val policyMatcher = Pattern.compile(privacy).matcher(label) + if (policyMatcher.find()) { + val clickableSpan: ClickableSpan = object : ClickableSpan() { + override fun onClick(widget: View) { + Log.i("$TAG Clicked on privacy policy link") + privacyPolicyClickedEvent.value = Event(true) + } + } + spannable.setSpan( + clickableSpan, + policyMatcher.start(0), + policyMatcher.end(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + + message.value = spannable + } + @UiThread fun dismiss() { dismissEvent.value = Event(true) diff --git a/app/src/main/java/org/linphone/utils/DialogUtils.kt b/app/src/main/java/org/linphone/utils/DialogUtils.kt index 200ae97c4..c59e0dabe 100644 --- a/app/src/main/java/org/linphone/utils/DialogUtils.kt +++ b/app/src/main/java/org/linphone/utils/DialogUtils.kt @@ -23,6 +23,7 @@ import android.app.Dialog import android.content.Context import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable +import android.text.method.LinkMovementMethod import android.view.LayoutInflater import android.view.Window import android.view.WindowManager @@ -60,6 +61,7 @@ class DialogUtils { false ) binding.viewModel = viewModel + binding.message.movementMethod = LinkMovementMethod.getInstance() return getDialog(context, binding) } diff --git a/app/src/main/res/layout/dialog_assistant_accept_conditions_and_policy.xml b/app/src/main/res/layout/dialog_assistant_accept_conditions_and_policy.xml index f453f07f8..acadf0ea9 100644 --- a/app/src/main/res/layout/dialog_assistant_accept_conditions_and_policy.xml +++ b/app/src/main/res/layout/dialog_assistant_accept_conditions_and_policy.xml @@ -13,9 +13,7 @@ + android:layout_height="match_parent"> + app:layout_constraintTop_toTopOf="@id/title" + android:clickable="true" + android:focusable="true" /> + android:layout_height="match_parent"> + android:layout_height="match_parent"> + android:layout_height="match_parent"> + android:layout_height="match_parent"> + android:layout_height="match_parent"> + android:layout_height="match_parent"> + android:layout_height="match_parent">