From cea087826713aaf59d199716ba16655d7986b140 Mon Sep 17 00:00:00 2001 From: Johan von Forstner Date: Thu, 30 Oct 2025 16:02:02 +0100 Subject: [PATCH] OnboardingFragment: use CustomTabs for privacy policy --- .../evmap/fragment/OnboardingFragment.kt | 11 ++++++-- .../net/vonforst/evmap/ui/CustomUrlSpan.kt | 27 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/net/vonforst/evmap/ui/CustomUrlSpan.kt diff --git a/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt index 5e95a443..686c23a7 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt @@ -6,6 +6,9 @@ import android.annotation.SuppressLint import android.content.Context import android.graphics.drawable.AnimatedVectorDrawable import android.os.Bundle +import android.text.SpannableString +import android.text.SpannableStringBuilder +import android.text.style.URLSpan import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -13,6 +16,7 @@ import android.view.animation.DecelerateInterpolator import android.widget.ImageView import androidx.core.content.ContextCompat import androidx.core.text.HtmlCompat +import androidx.core.text.getSpans import androidx.core.text.method.LinkMovementMethodCompat import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController @@ -27,6 +31,8 @@ import net.vonforst.evmap.databinding.FragmentOnboardingWelcomeBinding import net.vonforst.evmap.model.FILTERS_DISABLED import net.vonforst.evmap.navigation.safeNavigate import net.vonforst.evmap.storage.PreferenceDataSource +import net.vonforst.evmap.ui.CustomUrlSpan +import net.vonforst.evmap.ui.replaceUrlSpansWithCustom import net.vonforst.evmap.waitForLayout class OnboardingFragment : Fragment() { @@ -237,13 +243,14 @@ class DataSourceSelectFragment : OnboardingPageFragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - binding.cbAcceptPrivacy.text = + val text = HtmlCompat.fromHtml( getString( R.string.accept_privacy, getString(R.string.privacy_link) ), HtmlCompat.FROM_HTML_MODE_LEGACY - ) + ).replaceUrlSpansWithCustom() + binding.cbAcceptPrivacy.text = text binding.cbAcceptPrivacy.linksClickable = true binding.cbAcceptPrivacy.movementMethod = LinkMovementMethodCompat.getInstance() binding.btnGetStarted.visibility = View.INVISIBLE diff --git a/app/src/main/java/net/vonforst/evmap/ui/CustomUrlSpan.kt b/app/src/main/java/net/vonforst/evmap/ui/CustomUrlSpan.kt new file mode 100644 index 00000000..b0f785c7 --- /dev/null +++ b/app/src/main/java/net/vonforst/evmap/ui/CustomUrlSpan.kt @@ -0,0 +1,27 @@ +package net.vonforst.evmap.ui + +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.URLSpan +import android.view.View +import androidx.core.text.getSpans +import net.vonforst.evmap.MapsActivity + +class CustomUrlSpan(url: String): URLSpan(url) { + override fun onClick(widget: View) { + (widget.context as? MapsActivity)?.let { + it.openUrl(url, widget.rootView) + } ?: { + super.onClick(widget) + } + } +} + +fun Spanned.replaceUrlSpansWithCustom(): Spanned { + val builder = SpannableStringBuilder(this) + builder.getSpans().forEach { + builder.setSpan(CustomUrlSpan(it.url), builder.getSpanStart(it), builder.getSpanEnd(it), builder.getSpanFlags(it)) + builder.removeSpan(it) + } + return builder +} \ No newline at end of file