1
0
Fork 0

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.
master
Mihai Adrian Carare 2020-07-02 05:13:23 +03:00 committed by GitHub
parent d51faea6c5
commit daecbd348b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 4 deletions

View File

@ -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)
} }

View File

@ -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(

View File

@ -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) {

View File

@ -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)!!)
} }