From daecbd348b34522d340e6f871fdb13f566855ee6 Mon Sep 17 00:00:00 2001 From: Mihai Adrian Carare <48995920+mcarare@users.noreply.github.com> Date: Thu, 2 Jul 2020 05:13:23 +0300 Subject: [PATCH] For #11996: Open all links from add-on details in Fenix. (#12080) * For #11996: Open add-on homepage link in Fenix. * For #11996: Open add-on details links in Fenix. --- .../org/mozilla/fenix/BrowserDirection.kt | 3 +- .../java/org/mozilla/fenix/HomeActivity.kt | 2 ++ .../fenix/addons/AddonDetailsFragment.kt | 9 ++++-- .../mozilla/fenix/addons/AddonDetailsView.kt | 29 ++++++++++++++++++- 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/BrowserDirection.kt b/app/src/main/java/org/mozilla/fenix/BrowserDirection.kt index 951d8861b..739caf58d 100644 --- a/app/src/main/java/org/mozilla/fenix/BrowserDirection.kt +++ b/app/src/main/java/org/mozilla/fenix/BrowserDirection.kt @@ -27,5 +27,6 @@ enum class BrowserDirection(@IdRes val fragmentId: Int) { FromSavedLoginsFragment(R.id.savedLoginsFragment), FromAddNewDeviceFragment(R.id.addNewDeviceFragment), FromAddSearchEngineFragment(R.id.addSearchEngineFragment), - FromEditCustomSearchEngineFragment(R.id.editCustomSearchEngineFragment) + FromEditCustomSearchEngineFragment(R.id.editCustomSearchEngineFragment), + FromAddonDetailsFragment(R.id.addonDetailsFragment) } diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index db2f37b1d..541dbf6dc 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -474,6 +474,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity() { AddSearchEngineFragmentDirections.actionGlobalBrowser(customTabSessionId) BrowserDirection.FromEditCustomSearchEngineFragment -> EditCustomSearchEngineFragmentDirections.actionGlobalBrowser(customTabSessionId) + BrowserDirection.FromAddonDetailsFragment -> + EditCustomSearchEngineFragmentDirections.actionGlobalBrowser(customTabSessionId) } private fun load( diff --git a/app/src/main/java/org/mozilla/fenix/addons/AddonDetailsFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/AddonDetailsFragment.kt index 6548e311c..38d9441ad 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/AddonDetailsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/AddonDetailsFragment.kt @@ -4,7 +4,6 @@ package org.mozilla.fenix.addons -import android.content.Intent import android.net.Uri import android.os.Bundle import android.view.View @@ -19,6 +18,8 @@ import mozilla.components.feature.addons.Addon import mozilla.components.feature.addons.ui.showInformationDialog import mozilla.components.feature.addons.ui.translatedName import mozilla.components.feature.addons.update.DefaultAddonUpdater.UpdateAttemptStorage +import org.mozilla.fenix.BrowserDirection +import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.ext.showToolbar @@ -38,7 +39,11 @@ class AddonDetailsFragment : Fragment(R.layout.fragment_add_on_details), AddonDe } override fun openWebsite(addonSiteUrl: Uri) { - startActivity(Intent(Intent.ACTION_VIEW, addonSiteUrl)) + (activity as HomeActivity).openToBrowserAndLoad( + searchTermOrURL = addonSiteUrl.toString(), + newTab = true, + from = BrowserDirection.FromAddonDetailsFragment + ) } override fun showUpdaterDialog(addon: Addon) { diff --git a/app/src/main/java/org/mozilla/fenix/addons/AddonDetailsView.kt b/app/src/main/java/org/mozilla/fenix/addons/AddonDetailsView.kt index 372e3e8b5..d77e5c13c 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/AddonDetailsView.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/AddonDetailsView.kt @@ -5,10 +5,14 @@ package org.mozilla.fenix.addons import android.net.Uri +import android.text.SpannableStringBuilder import android.text.method.LinkMovementMethod +import android.text.style.ClickableSpan +import android.text.style.URLSpan import android.view.View import androidx.core.net.toUri import androidx.core.text.HtmlCompat +import androidx.core.text.getSpans import kotlinx.android.extensions.LayoutContainer import kotlinx.android.synthetic.main.fragment_add_on_details.* import mozilla.components.feature.addons.Addon @@ -102,10 +106,33 @@ class AddonDetailsView( val parsedText = detailsText.replace("\n", "
") val text = HtmlCompat.fromHtml(parsedText, HtmlCompat.FROM_HTML_MODE_COMPACT) - details.text = text + val spannableStringBuilder = SpannableStringBuilder(text) + val links = spannableStringBuilder.getSpans() + for (link in links) { + addActionToLinks(spannableStringBuilder, link) + } + details.text = spannableStringBuilder details.movementMethod = LinkMovementMethod.getInstance() } + private fun addActionToLinks( + spannableStringBuilder: SpannableStringBuilder, + link: URLSpan + ) { + val start = spannableStringBuilder.getSpanStart(link) + val end = spannableStringBuilder.getSpanEnd(link) + val flags = spannableStringBuilder.getSpanFlags(link) + val clickable: ClickableSpan = object : ClickableSpan() { + override fun onClick(view: View) { + view.setOnClickListener { + interactor.openWebsite(link.url.toUri()) + } + } + } + spannableStringBuilder.setSpan(clickable, start, end, flags) + spannableStringBuilder.removeSpan(link) + } + private fun formatDate(text: String): String { return dateFormatter.format(dateParser.parse(text)!!) }