From 0f8eb69a4f40af02bfa86bb95fe24787e83f4bcf Mon Sep 17 00:00:00 2001 From: Tejashwadeep Jha <110051718+Tejas-67@users.noreply.github.com> Date: Wed, 6 Dec 2023 21:34:56 +0530 Subject: [PATCH] Fix #4760 In Terms of Service the website should be displayed as link and should be clickable. (#5213) ## Explanation Fix #4760 In Terms of Service the website should be displayed as link and should be clickable This Solution uses SpannableString to solve the the issue. We get the url from html spannable using regex and then set a span around it to make the link clickable. ## Essential Checklist - [x] The PR title and explanation each start with "Fix #bugnum: " (If this PR fixes part of an issue, prefix the title with "Fix part of #bugnum: ...".) - [x] Any changes to [scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets) files have their rationale included in the PR explanation. - [x] The PR follows the [style guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide). - [x] The PR does not contain any unnecessary code changes from Android Studio ([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)). - [x] The PR is made from a branch that's **not** called "develop" and is up-to-date with "develop". - [x] The PR is **assigned** to the appropriate reviewers ([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)). ## For UI-specific PRs only If your PR includes UI-related changes, then: - Add screenshots for portrait/landscape for both a tablet & phone of the before & after UI changes - For the screenshots above, include both English and pseudo-localized (RTL) screenshots (see [RTL guide](https://github.com/oppia/oppia-android/wiki/RTL-Guidelines)) - Add a video showing the full UX flow with a screen reader enabled (see [accessibility guide](https://github.com/oppia/oppia-android/wiki/Accessibility-A11y-Guide)) - For PRs introducing new UI elements or color changes, both light and dark mode screenshots must be included - Add a screenshot demonstrating that you ran affected Espresso tests locally & that they're passing ## Demo Video [oppia-.webm](https://github.com/oppia/oppia-android/assets/110051718/2d5b5bf5-3aad-43da-8b41-7146620e75ab) --------- Co-authored-by: Tejas-67 Co-authored-by: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com> --- .../app/policies/PoliciesFragmentPresenter.kt | 6 ++---- .../oppia/android/util/parser/html/HtmlParser.kt | 13 +++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/policies/PoliciesFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/policies/PoliciesFragmentPresenter.kt index 4fad16c9462..1b2bcb20a3d 100644 --- a/app/src/main/java/org/oppia/android/app/policies/PoliciesFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/policies/PoliciesFragmentPresenter.kt @@ -46,12 +46,10 @@ class PoliciesFragmentPresenter @Inject constructor( var policyWebLink = "" if (policyPage == PolicyPage.PRIVACY_POLICY) { - policyDescription = - resourceHandler.getStringInLocale(R.string.privacy_policy_content) + policyDescription = resourceHandler.getStringInLocale(R.string.privacy_policy_content) policyWebLink = resourceHandler.getStringInLocale(R.string.privacy_policy_web_link) } else if (policyPage == PolicyPage.TERMS_OF_SERVICE) { - policyDescription = - resourceHandler.getStringInLocale(R.string.terms_of_service_content) + policyDescription = resourceHandler.getStringInLocale(R.string.terms_of_service_content) policyWebLink = resourceHandler.getStringInLocale(R.string.terms_of_service_web_link) } diff --git a/utility/src/main/java/org/oppia/android/util/parser/html/HtmlParser.kt b/utility/src/main/java/org/oppia/android/util/parser/html/HtmlParser.kt index cb37742ff19..97db2dce9db 100755 --- a/utility/src/main/java/org/oppia/android/util/parser/html/HtmlParser.kt +++ b/utility/src/main/java/org/oppia/android/util/parser/html/HtmlParser.kt @@ -4,8 +4,11 @@ import android.app.Application import android.content.Context import android.text.Spannable import android.text.SpannableStringBuilder +import android.text.Spanned import android.text.method.LinkMovementMethod +import android.text.style.URLSpan import android.text.util.Linkify +import android.util.Patterns import android.view.View import android.widget.TextView import androidx.core.text.util.LinkifyCompat @@ -128,6 +131,16 @@ class HtmlParser private constructor( htmlContent, imageGetter, computeCustomTagHandlers(supportsConceptCards, htmlContentTextView) ) + val urlPattern = Patterns.WEB_URL + val matcher = urlPattern.matcher(htmlSpannable) + while (matcher.find()) { + val start = matcher.start() + val end = matcher.end() + val url = htmlSpannable.subSequence(start, end).toString() + val urlSpan = URLSpan(url) + htmlSpannable.setSpan(urlSpan, start, end, Spanned.SPAN_EXCLUSIVE_INCLUSIVE) + } + return ensureNonEmpty(trimSpannable(htmlSpannable as SpannableStringBuilder)) }