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.
releases/v79.1.0
Mihai Adrian Carare 4 years ago committed by GitHub
parent d51faea6c5
commit daecbd348b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -27,5 +27,6 @@ enum class BrowserDirection(@IdRes val fragmentId: Int) {
FromSavedLoginsFragment(R.id.savedLoginsFragment), FromSavedLoginsFragment(R.id.savedLoginsFragment),
FromAddNewDeviceFragment(R.id.addNewDeviceFragment), FromAddNewDeviceFragment(R.id.addNewDeviceFragment),
FromAddSearchEngineFragment(R.id.addSearchEngineFragment), FromAddSearchEngineFragment(R.id.addSearchEngineFragment),
FromEditCustomSearchEngineFragment(R.id.editCustomSearchEngineFragment) FromEditCustomSearchEngineFragment(R.id.editCustomSearchEngineFragment),
FromAddonDetailsFragment(R.id.addonDetailsFragment)
} }

@ -474,6 +474,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity() {
AddSearchEngineFragmentDirections.actionGlobalBrowser(customTabSessionId) AddSearchEngineFragmentDirections.actionGlobalBrowser(customTabSessionId)
BrowserDirection.FromEditCustomSearchEngineFragment -> BrowserDirection.FromEditCustomSearchEngineFragment ->
EditCustomSearchEngineFragmentDirections.actionGlobalBrowser(customTabSessionId) EditCustomSearchEngineFragmentDirections.actionGlobalBrowser(customTabSessionId)
BrowserDirection.FromAddonDetailsFragment ->
EditCustomSearchEngineFragmentDirections.actionGlobalBrowser(customTabSessionId)
} }
private fun load( private fun load(

@ -4,7 +4,6 @@
package org.mozilla.fenix.addons package org.mozilla.fenix.addons
import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.view.View 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.showInformationDialog
import mozilla.components.feature.addons.ui.translatedName import mozilla.components.feature.addons.ui.translatedName
import mozilla.components.feature.addons.update.DefaultAddonUpdater.UpdateAttemptStorage 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.R
import org.mozilla.fenix.ext.showToolbar 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) { 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) { override fun showUpdaterDialog(addon: Addon) {

@ -5,10 +5,14 @@
package org.mozilla.fenix.addons package org.mozilla.fenix.addons
import android.net.Uri import android.net.Uri
import android.text.SpannableStringBuilder
import android.text.method.LinkMovementMethod import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.text.style.URLSpan
import android.view.View import android.view.View
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.core.text.getSpans
import kotlinx.android.extensions.LayoutContainer import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.fragment_add_on_details.* import kotlinx.android.synthetic.main.fragment_add_on_details.*
import mozilla.components.feature.addons.Addon import mozilla.components.feature.addons.Addon
@ -102,10 +106,33 @@ class AddonDetailsView(
val parsedText = detailsText.replace("\n", "<br/>") val parsedText = detailsText.replace("\n", "<br/>")
val text = HtmlCompat.fromHtml(parsedText, HtmlCompat.FROM_HTML_MODE_COMPACT) val text = HtmlCompat.fromHtml(parsedText, HtmlCompat.FROM_HTML_MODE_COMPACT)
details.text = text val spannableStringBuilder = SpannableStringBuilder(text)
val links = spannableStringBuilder.getSpans<URLSpan>()
for (link in links) {
addActionToLinks(spannableStringBuilder, link)
}
details.text = spannableStringBuilder
details.movementMethod = LinkMovementMethod.getInstance() 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 { private fun formatDate(text: String): String {
return dateFormatter.format(dateParser.parse(text)!!) return dateFormatter.format(dateParser.parse(text)!!)
} }

Loading…
Cancel
Save