From afc639b9519c12e5a792bbb6f2da57a6e19f807a Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Fri, 29 Nov 2019 16:58:48 +0530 Subject: [PATCH 01/10] Improvised bullet code --- .../java/org/oppia/util/parser/HtmlParser.kt | 33 ++++++--- .../oppia/util/parser/ImprovedBulletSpan.kt | 71 +++++++++++++++++++ .../org/oppia/util/parser/LiTagHandler.kt | 37 ++++++++++ 3 files changed, 131 insertions(+), 10 deletions(-) create mode 100755 utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt create mode 100755 utility/src/main/java/org/oppia/util/parser/LiTagHandler.kt diff --git a/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt b/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt index affe7096d5f..a513f57f4df 100755 --- a/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt +++ b/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt @@ -1,8 +1,11 @@ package org.oppia.util.parser +import android.os.Build import android.text.Html import android.text.Spannable import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.BulletSpan import android.widget.TextView import javax.inject.Inject @@ -44,18 +47,28 @@ class HtmlParser private constructor( } val imageGetter = urlImageParserFactory.create(htmlContentTextView, entityType, entityId, imageCenterAlign) - return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { - trimSpannable( - Html.fromHtml( - htmlContent, - Html.FROM_HTML_MODE_LEGACY, - imageGetter, /* tagHandler= */ - null - ) as SpannableStringBuilder - ) + + @Suppress("DEPRECATION") + val htmlSpannable = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + Html.fromHtml(htmlContent, Html.FROM_HTML_MODE_LEGACY, imageGetter, LiTagHandler()) } else { - trimSpannable(Html.fromHtml(htmlContent, imageGetter, /* tagHandler= */ null) as SpannableStringBuilder) + Html.fromHtml(htmlContent, imageGetter, LiTagHandler()) + } + + val spannableBuilder = SpannableStringBuilder(htmlSpannable) + val bulletSpans = spannableBuilder.getSpans(0, spannableBuilder.length, BulletSpan::class.java) + bulletSpans.forEach { + val start = spannableBuilder.getSpanStart(it) + val end = spannableBuilder.getSpanEnd(it) + spannableBuilder.removeSpan(it) + spannableBuilder.setSpan( + ImprovedBulletSpan(), + start, + end, + Spanned.SPAN_INCLUSIVE_EXCLUSIVE + ) } + return trimSpannable(spannableBuilder) } private fun trimSpannable(spannable: SpannableStringBuilder): SpannableStringBuilder { diff --git a/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt b/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt new file mode 100755 index 00000000000..57257426017 --- /dev/null +++ b/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt @@ -0,0 +1,71 @@ +package org.oppia.util.parser + +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Path +import android.graphics.Path.Direction +import android.text.Layout +import android.text.Spanned +import android.text.style.LeadingMarginSpan + +/** + * Copy of [android.text.style.BulletSpan] from android SDK 28 with removed internal code. + * + * Reference: https://github.com/davidbilik/bullet-span-sample + */ +class ImprovedBulletSpan( + private val bulletRadius: Int = STANDARD_BULLET_RADIUS, + private val gapWidth: Int = STANDARD_GAP_WIDTH, + val color: Int = STANDARD_COLOR +) : LeadingMarginSpan { + + companion object { + private const val STANDARD_BULLET_RADIUS = 6 + private const val STANDARD_GAP_WIDTH = 6 + private const val STANDARD_COLOR = 0 + } + + private var mBulletPath: Path? = null + + override fun getLeadingMargin(first: Boolean): Int { + return 2 * bulletRadius + gapWidth + } + + override fun drawLeadingMargin( + canvas: Canvas, paint: Paint, x: Int, dir: Int, + top: Int, baseline: Int, bottom: Int, + text: CharSequence, start: Int, end: Int, + first: Boolean, + layout: Layout? + ) { + if ((text as Spanned).getSpanStart(this) == start) { + val style = paint.style + paint.style = Paint.Style.FILL + + val yPosition = if (layout != null) { + val line = layout.getLineForOffset(start) + layout.getLineBaseline(line).toFloat() - bulletRadius * 2f + } else { + (top + bottom) / 2f + } + + val xPosition = (x + dir * bulletRadius).toFloat() + + if (canvas.isHardwareAccelerated) { + if (mBulletPath == null) { + mBulletPath = Path() + mBulletPath!!.addCircle(0.0f, 0.0f, bulletRadius.toFloat(), Direction.CW) + } + + canvas.save() + canvas.translate(xPosition, yPosition) + canvas.drawPath(mBulletPath!!, paint) + canvas.restore() + } else { + canvas.drawCircle(xPosition, yPosition, bulletRadius.toFloat(), paint) + } + + paint.style = style + } + } +} diff --git a/utility/src/main/java/org/oppia/util/parser/LiTagHandler.kt b/utility/src/main/java/org/oppia/util/parser/LiTagHandler.kt new file mode 100755 index 00000000000..b4bb82404d8 --- /dev/null +++ b/utility/src/main/java/org/oppia/util/parser/LiTagHandler.kt @@ -0,0 +1,37 @@ +package org.oppia.util.parser + +import android.text.Editable +import android.text.Html +import android.text.Spannable +import android.text.Spanned +import android.text.style.BulletSpan +import org.xml.sax.XMLReader + +/** + * [Html.TagHandler] implementation that processes
  • tags and creates bullets. + * + * Reference: https://github.com/davidbilik/bullet-span-sample + */ +class LiTagHandler : Html.TagHandler { + /** + * Helper marker class. Idea stolen from [Html.fromHtml] implementation + */ + class Bullet + + override fun handleTag(opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader) { + if (tag == "li" && opening) { + output.setSpan(Bullet(), output.length, output.length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) + } + if (tag == "li" && !opening) { + output.append("\n\n") + val lastMark = output.getSpans(0, output.length, Bullet::class.java).lastOrNull() + lastMark?.let { + val start = output.getSpanStart(it) + output.removeSpan(it) + if (start != output.length) { + output.setSpan(BulletSpan(), start, output.length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE) + } + } + } + } +} From 7b992e54011e6dee79ca1cb5b2d80f2bfb615f78 Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Mon, 2 Dec 2019 19:34:42 +0530 Subject: [PATCH 02/10] Updated bullets --- .../src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt b/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt index 57257426017..34e03bbfd4f 100755 --- a/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt +++ b/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt @@ -20,8 +20,8 @@ class ImprovedBulletSpan( ) : LeadingMarginSpan { companion object { - private const val STANDARD_BULLET_RADIUS = 6 - private const val STANDARD_GAP_WIDTH = 6 + private const val STANDARD_BULLET_RADIUS = 8 + private const val STANDARD_GAP_WIDTH = 32 private const val STANDARD_COLOR = 0 } From 97ff918782eb32f835286d35ed709482ca0d2d99 Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Thu, 5 Dec 2019 10:27:02 +0530 Subject: [PATCH 03/10] Fixes for MDPI devices --- .../java/org/oppia/util/parser/HtmlParser.kt | 8 +++++--- .../oppia/util/parser/ImprovedBulletSpan.kt | 19 ++++++++++--------- utility/src/main/res/values/dimens.xml | 5 +++++ 3 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 utility/src/main/res/values/dimens.xml diff --git a/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt b/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt index a513f57f4df..95287612874 100755 --- a/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt +++ b/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt @@ -7,6 +7,7 @@ import android.text.SpannableStringBuilder import android.text.Spanned import android.text.style.BulletSpan import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity import javax.inject.Inject private const val CUSTOM_IMG_TAG = "oppia-noninteractive-image" @@ -17,6 +18,7 @@ private const val REPLACE_IMG_FILE_PATH_ATTRIBUTE = "src" /** Html Parser to parse custom Oppia tags with Android-compatible versions. */ class HtmlParser private constructor( private val urlImageParserFactory: UrlImageParser.Factory, + private val activity: AppCompatActivity, private val entityType: String, private val entityId: String, private val imageCenterAlign: Boolean @@ -62,7 +64,7 @@ class HtmlParser private constructor( val end = spannableBuilder.getSpanEnd(it) spannableBuilder.removeSpan(it) spannableBuilder.setSpan( - ImprovedBulletSpan(), + ImprovedBulletSpan(activity), start, end, Spanned.SPAN_INCLUSIVE_EXCLUSIVE @@ -90,9 +92,9 @@ class HtmlParser private constructor( return spannable.delete(0, trimStart).delete(spannable.length - trimEnd, spannable.length) } - class Factory @Inject constructor(private val urlImageParserFactory: UrlImageParser.Factory) { + class Factory @Inject constructor(private val urlImageParserFactory: UrlImageParser.Factory, private val activity: AppCompatActivity) { fun create(entityType: String, entityId: String, imageCenterAlign: Boolean): HtmlParser { - return HtmlParser(urlImageParserFactory, entityType, entityId, imageCenterAlign) + return HtmlParser(urlImageParserFactory, activity, entityType, entityId, imageCenterAlign) } } } diff --git a/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt b/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt index 34e03bbfd4f..b0f5c539cf4 100755 --- a/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt +++ b/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt @@ -1,5 +1,6 @@ package org.oppia.util.parser +import android.content.Context import android.graphics.Canvas import android.graphics.Paint import android.graphics.Path @@ -7,22 +8,22 @@ import android.graphics.Path.Direction import android.text.Layout import android.text.Spanned import android.text.style.LeadingMarginSpan +import androidx.appcompat.app.AppCompatActivity +import org.oppia.util.R /** * Copy of [android.text.style.BulletSpan] from android SDK 28 with removed internal code. * * Reference: https://github.com/davidbilik/bullet-span-sample */ -class ImprovedBulletSpan( - private val bulletRadius: Int = STANDARD_BULLET_RADIUS, - private val gapWidth: Int = STANDARD_GAP_WIDTH, - val color: Int = STANDARD_COLOR -) : LeadingMarginSpan { +class ImprovedBulletSpan(activity: AppCompatActivity) : LeadingMarginSpan { - companion object { - private const val STANDARD_BULLET_RADIUS = 8 - private const val STANDARD_GAP_WIDTH = 32 - private const val STANDARD_COLOR = 0 + private var bulletRadius: Int = 0 + private var gapWidth: Int = 0 + + init { + bulletRadius = (activity as Context).resources.getDimensionPixelSize(R.dimen.bullet_radius) + gapWidth = (activity as Context).resources.getDimensionPixelSize(R.dimen.bullet_gap_width) } private var mBulletPath: Path? = null diff --git a/utility/src/main/res/values/dimens.xml b/utility/src/main/res/values/dimens.xml new file mode 100644 index 00000000000..e1d217755ce --- /dev/null +++ b/utility/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ + + + 4dp + 16dp + \ No newline at end of file From a775f02cb42684d224e43096789abf11981618bc Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Thu, 5 Dec 2019 10:35:49 +0530 Subject: [PATCH 04/10] EOF added --- utility/src/main/res/values/dimens.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utility/src/main/res/values/dimens.xml b/utility/src/main/res/values/dimens.xml index e1d217755ce..665c7d81de6 100644 --- a/utility/src/main/res/values/dimens.xml +++ b/utility/src/main/res/values/dimens.xml @@ -2,4 +2,4 @@ 4dp 16dp - \ No newline at end of file + From 68c686dc6e70a20fe89fb507aa97f4b395d45e6b Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Thu, 5 Dec 2019 11:44:21 +0530 Subject: [PATCH 05/10] Added yoffset in bullets --- .../main/java/org/oppia/util/parser/ImprovedBulletSpan.kt | 5 ++++- utility/src/main/res/values/dimens.xml | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt b/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt index b0f5c539cf4..1d2ecc3fc2b 100755 --- a/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt +++ b/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt @@ -20,10 +20,12 @@ class ImprovedBulletSpan(activity: AppCompatActivity) : LeadingMarginSpan { private var bulletRadius: Int = 0 private var gapWidth: Int = 0 + private var yOffset: Int = 0 init { bulletRadius = (activity as Context).resources.getDimensionPixelSize(R.dimen.bullet_radius) gapWidth = (activity as Context).resources.getDimensionPixelSize(R.dimen.bullet_gap_width) + yOffset = (activity as Context).resources.getDimensionPixelSize(R.dimen.bullet_y_offset) } private var mBulletPath: Path? = null @@ -43,12 +45,13 @@ class ImprovedBulletSpan(activity: AppCompatActivity) : LeadingMarginSpan { val style = paint.style paint.style = Paint.Style.FILL - val yPosition = if (layout != null) { + var yPosition = if (layout != null) { val line = layout.getLineForOffset(start) layout.getLineBaseline(line).toFloat() - bulletRadius * 2f } else { (top + bottom) / 2f } + yPosition += yOffset val xPosition = (x + dir * bulletRadius).toFloat() diff --git a/utility/src/main/res/values/dimens.xml b/utility/src/main/res/values/dimens.xml index 665c7d81de6..d8cd1ff90c8 100644 --- a/utility/src/main/res/values/dimens.xml +++ b/utility/src/main/res/values/dimens.xml @@ -2,4 +2,5 @@ 4dp 16dp + 2dp From 6b3b93bfcd10b534d19905e402527d30fe5e63fa Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Wed, 11 Dec 2019 15:55:47 +0530 Subject: [PATCH 06/10] Nit changes --- .../{ImprovedBulletSpan.kt => CustomBulletSpan.kt} | 12 +++++------- .../main/java/org/oppia/util/parser/HtmlParser.kt | 2 +- .../main/java/org/oppia/util/parser/LiTagHandler.kt | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) rename utility/src/main/java/org/oppia/util/parser/{ImprovedBulletSpan.kt => CustomBulletSpan.kt} (81%) diff --git a/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt b/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt similarity index 81% rename from utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt rename to utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt index 1d2ecc3fc2b..d356f0a9de6 100755 --- a/utility/src/main/java/org/oppia/util/parser/ImprovedBulletSpan.kt +++ b/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt @@ -1,6 +1,5 @@ package org.oppia.util.parser -import android.content.Context import android.graphics.Canvas import android.graphics.Paint import android.graphics.Path @@ -13,19 +12,18 @@ import org.oppia.util.R /** * Copy of [android.text.style.BulletSpan] from android SDK 28 with removed internal code. - * + * This class helps us to customise bullet radius, gap width and offset present in rich-text. * Reference: https://github.com/davidbilik/bullet-span-sample */ -class ImprovedBulletSpan(activity: AppCompatActivity) : LeadingMarginSpan { - +class CustomBulletSpan(activity: AppCompatActivity) : LeadingMarginSpan { private var bulletRadius: Int = 0 private var gapWidth: Int = 0 private var yOffset: Int = 0 init { - bulletRadius = (activity as Context).resources.getDimensionPixelSize(R.dimen.bullet_radius) - gapWidth = (activity as Context).resources.getDimensionPixelSize(R.dimen.bullet_gap_width) - yOffset = (activity as Context).resources.getDimensionPixelSize(R.dimen.bullet_y_offset) + bulletRadius = activity.resources.getDimensionPixelSize(R.dimen.bullet_radius) + gapWidth = activity.resources.getDimensionPixelSize(R.dimen.bullet_gap_width) + yOffset = activity.resources.getDimensionPixelSize(R.dimen.bullet_y_offset) } private var mBulletPath: Path? = null diff --git a/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt b/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt index 95287612874..fbc6c51a53b 100755 --- a/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt +++ b/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt @@ -64,7 +64,7 @@ class HtmlParser private constructor( val end = spannableBuilder.getSpanEnd(it) spannableBuilder.removeSpan(it) spannableBuilder.setSpan( - ImprovedBulletSpan(activity), + CustomBulletSpan(activity), start, end, Spanned.SPAN_INCLUSIVE_EXCLUSIVE diff --git a/utility/src/main/java/org/oppia/util/parser/LiTagHandler.kt b/utility/src/main/java/org/oppia/util/parser/LiTagHandler.kt index b4bb82404d8..ce23fb9a519 100755 --- a/utility/src/main/java/org/oppia/util/parser/LiTagHandler.kt +++ b/utility/src/main/java/org/oppia/util/parser/LiTagHandler.kt @@ -14,7 +14,7 @@ import org.xml.sax.XMLReader */ class LiTagHandler : Html.TagHandler { /** - * Helper marker class. Idea stolen from [Html.fromHtml] implementation + * Helper marker class. Based on [Html.fromHtml] implementation. */ class Bullet From 53cab7b8f3288b16f638748a2f189385d91c081d Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Wed, 11 Dec 2019 16:21:45 +0530 Subject: [PATCH 07/10] Directly added context instead of activity --- .../java/org/oppia/util/parser/CustomBulletSpan.kt | 10 +++++----- .../src/main/java/org/oppia/util/parser/HtmlParser.kt | 8 +++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt b/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt index d356f0a9de6..22c46965f48 100755 --- a/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt +++ b/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt @@ -1,5 +1,6 @@ package org.oppia.util.parser +import android.content.Context import android.graphics.Canvas import android.graphics.Paint import android.graphics.Path @@ -7,7 +8,6 @@ import android.graphics.Path.Direction import android.text.Layout import android.text.Spanned import android.text.style.LeadingMarginSpan -import androidx.appcompat.app.AppCompatActivity import org.oppia.util.R /** @@ -15,15 +15,15 @@ import org.oppia.util.R * This class helps us to customise bullet radius, gap width and offset present in rich-text. * Reference: https://github.com/davidbilik/bullet-span-sample */ -class CustomBulletSpan(activity: AppCompatActivity) : LeadingMarginSpan { +class CustomBulletSpan(context: Context) : LeadingMarginSpan { private var bulletRadius: Int = 0 private var gapWidth: Int = 0 private var yOffset: Int = 0 init { - bulletRadius = activity.resources.getDimensionPixelSize(R.dimen.bullet_radius) - gapWidth = activity.resources.getDimensionPixelSize(R.dimen.bullet_gap_width) - yOffset = activity.resources.getDimensionPixelSize(R.dimen.bullet_y_offset) + bulletRadius = context.resources.getDimensionPixelSize(R.dimen.bullet_radius) + gapWidth = context.resources.getDimensionPixelSize(R.dimen.bullet_gap_width) + yOffset = context.resources.getDimensionPixelSize(R.dimen.bullet_y_offset) } private var mBulletPath: Path? = null diff --git a/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt b/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt index fbc6c51a53b..ba65ab504f9 100755 --- a/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt +++ b/utility/src/main/java/org/oppia/util/parser/HtmlParser.kt @@ -7,7 +7,6 @@ import android.text.SpannableStringBuilder import android.text.Spanned import android.text.style.BulletSpan import android.widget.TextView -import androidx.appcompat.app.AppCompatActivity import javax.inject.Inject private const val CUSTOM_IMG_TAG = "oppia-noninteractive-image" @@ -18,7 +17,6 @@ private const val REPLACE_IMG_FILE_PATH_ATTRIBUTE = "src" /** Html Parser to parse custom Oppia tags with Android-compatible versions. */ class HtmlParser private constructor( private val urlImageParserFactory: UrlImageParser.Factory, - private val activity: AppCompatActivity, private val entityType: String, private val entityId: String, private val imageCenterAlign: Boolean @@ -64,7 +62,7 @@ class HtmlParser private constructor( val end = spannableBuilder.getSpanEnd(it) spannableBuilder.removeSpan(it) spannableBuilder.setSpan( - CustomBulletSpan(activity), + CustomBulletSpan(htmlContentTextView.context), start, end, Spanned.SPAN_INCLUSIVE_EXCLUSIVE @@ -92,9 +90,9 @@ class HtmlParser private constructor( return spannable.delete(0, trimStart).delete(spannable.length - trimEnd, spannable.length) } - class Factory @Inject constructor(private val urlImageParserFactory: UrlImageParser.Factory, private val activity: AppCompatActivity) { + class Factory @Inject constructor(private val urlImageParserFactory: UrlImageParser.Factory) { fun create(entityType: String, entityId: String, imageCenterAlign: Boolean): HtmlParser { - return HtmlParser(urlImageParserFactory, activity, entityType, entityId, imageCenterAlign) + return HtmlParser(urlImageParserFactory, entityType, entityId, imageCenterAlign) } } } From 727e896246e6e34a23fd4cb52589562543cdb6e1 Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Wed, 11 Dec 2019 16:42:26 +0530 Subject: [PATCH 08/10] Added test cases --- .../org/oppia/app/parser/HtmlParserTest.kt | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/app/src/sharedTest/java/org/oppia/app/parser/HtmlParserTest.kt b/app/src/sharedTest/java/org/oppia/app/parser/HtmlParserTest.kt index d594645404c..dbae5b8a9f0 100644 --- a/app/src/sharedTest/java/org/oppia/app/parser/HtmlParserTest.kt +++ b/app/src/sharedTest/java/org/oppia/app/parser/HtmlParserTest.kt @@ -39,6 +39,7 @@ import org.oppia.util.logging.EnableConsoleLog import org.oppia.util.logging.EnableFileLog import org.oppia.util.logging.GlobalLogLevel import org.oppia.util.logging.LogLevel +import org.oppia.util.parser.CustomBulletSpan import org.oppia.util.parser.DefaultGcsPrefix import org.oppia.util.parser.DefaultGcsResource import org.oppia.util.parser.GlideImageLoader @@ -57,8 +58,7 @@ import javax.inject.Singleton class HtmlParserTest { private lateinit var launchedActivity: Activity - @Inject - lateinit var htmlParserFactory: HtmlParser.Factory + @Inject lateinit var htmlParserFactory: HtmlParser.Factory @get:Rule var activityTestRule: ActivityTestRule = ActivityTestRule( @@ -85,7 +85,7 @@ class HtmlParserTest { fun tearDown() { Intents.release() } - + private fun setUpTestApplicationComponent() { DaggerHtmlParserTest_TestApplicationComponent.builder() .setApplication(ApplicationProvider.getApplicationContext()) @@ -128,14 +128,35 @@ class HtmlParserTest { onView(withId(R.id.test_html_content_text_view)).check(matches(not(textView.text.toString()))) } + @Test + fun testHtmlContent_customSpan_isAdded() { + val textView = activityTestRule.activity.findViewById(R.id.test_html_content_text_view) as TextView + val htmlParser = htmlParserFactory.create(/* entityType= */ "", /* entityId= */ "", /* imageCenterAlign= */ true) + val htmlResult: Spannable = htmlParser.parseOppiaHtml( + "

    You should know the following before going on:

    " + + "
    • The counting numbers (1, 2, 3, 4, 5 ….)
    • " + + "
    • How to tell whether one counting number is bigger or smaller than another
    ", + textView + ) + + /* Reference: https://medium.com/androiddevelopers/spantastic-text-styling-with-spans-17b0c16b4568#e345 */ + val bulletSpans = htmlResult.getSpans(0, htmlResult.length, Any::class.java) + assertThat(bulletSpans.size.toLong()).isEqualTo(2) + + val bulletSpan0 = bulletSpans[0] as CustomBulletSpan + assertThat(bulletSpan0).isNotNull() + + val bulletSpan1 = bulletSpans[1] as CustomBulletSpan + assertThat(bulletSpan1).isNotNull() + } + class FakeImageLoader : ImageLoader { override fun load(imageUrl: String, target: CustomTarget) { } } - @Qualifier - annotation class TestDispatcher + @Qualifier annotation class TestDispatcher // TODO(#89): Move this to a common test application component. @Module From d4e3d141d7158758008a60e2e6d124c96c29c5f4 Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Wed, 18 Dec 2019 13:21:03 +0530 Subject: [PATCH 09/10] Nit changes --- .../sharedTest/java/org/oppia/app/parser/HtmlParserTest.kt | 7 ++++++- .../main/java/org/oppia/util/parser/CustomBulletSpan.kt | 4 +++- .../src/main/java/org/oppia/util/parser/LiTagHandler.kt | 2 +- utility/src/main/res/values/dimens.xml | 1 + 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/sharedTest/java/org/oppia/app/parser/HtmlParserTest.kt b/app/src/sharedTest/java/org/oppia/app/parser/HtmlParserTest.kt index dbae5b8a9f0..7326f30ec2a 100644 --- a/app/src/sharedTest/java/org/oppia/app/parser/HtmlParserTest.kt +++ b/app/src/sharedTest/java/org/oppia/app/parser/HtmlParserTest.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.app.Application import android.content.Context import android.content.Intent +import android.content.res.Resources import android.graphics.Bitmap import android.text.Spannable import android.widget.TextView @@ -140,7 +141,7 @@ class HtmlParserTest { ) /* Reference: https://medium.com/androiddevelopers/spantastic-text-styling-with-spans-17b0c16b4568#e345 */ - val bulletSpans = htmlResult.getSpans(0, htmlResult.length, Any::class.java) + val bulletSpans = htmlResult.getSpans(0, htmlResult.length, CustomBulletSpan::class.java) assertThat(bulletSpans.size.toLong()).isEqualTo(2) val bulletSpan0 = bulletSpans[0] as CustomBulletSpan @@ -156,6 +157,10 @@ class HtmlParserTest { } } + private fun getResources(): Resources { + return ApplicationProvider.getApplicationContext().resources + } + @Qualifier annotation class TestDispatcher // TODO(#89): Move this to a common test application component. diff --git a/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt b/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt index 22c46965f48..c9cc500aaa9 100755 --- a/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt +++ b/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt @@ -19,17 +19,19 @@ class CustomBulletSpan(context: Context) : LeadingMarginSpan { private var bulletRadius: Int = 0 private var gapWidth: Int = 0 private var yOffset: Int = 0 + private var bulletLeadingMargin: Int = 0 init { bulletRadius = context.resources.getDimensionPixelSize(R.dimen.bullet_radius) gapWidth = context.resources.getDimensionPixelSize(R.dimen.bullet_gap_width) yOffset = context.resources.getDimensionPixelSize(R.dimen.bullet_y_offset) + bulletLeadingMargin = context.resources.getDimensionPixelSize(R.dimen.bullet_leading_margin) } private var mBulletPath: Path? = null override fun getLeadingMargin(first: Boolean): Int { - return 2 * bulletRadius + gapWidth + return bulletLeadingMargin } override fun drawLeadingMargin( diff --git a/utility/src/main/java/org/oppia/util/parser/LiTagHandler.kt b/utility/src/main/java/org/oppia/util/parser/LiTagHandler.kt index ce23fb9a519..83d86f1aa7d 100755 --- a/utility/src/main/java/org/oppia/util/parser/LiTagHandler.kt +++ b/utility/src/main/java/org/oppia/util/parser/LiTagHandler.kt @@ -23,7 +23,7 @@ class LiTagHandler : Html.TagHandler { output.setSpan(Bullet(), output.length, output.length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE) } if (tag == "li" && !opening) { - output.append("\n\n") + output.append("
    ") val lastMark = output.getSpans(0, output.length, Bullet::class.java).lastOrNull() lastMark?.let { val start = output.getSpanStart(it) diff --git a/utility/src/main/res/values/dimens.xml b/utility/src/main/res/values/dimens.xml index d8cd1ff90c8..021b9b756e3 100644 --- a/utility/src/main/res/values/dimens.xml +++ b/utility/src/main/res/values/dimens.xml @@ -3,4 +3,5 @@ 4dp 16dp 2dp + 24dp From 2bf41cd4ebbdcf5a0af6b621acce2f4440853b5d Mon Sep 17 00:00:00 2001 From: Rajat Talesra Date: Wed, 18 Dec 2019 15:31:32 +0530 Subject: [PATCH 10/10] Added TODO --- utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt b/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt index c9cc500aaa9..5b4512cd69c 100755 --- a/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt +++ b/utility/src/main/java/org/oppia/util/parser/CustomBulletSpan.kt @@ -10,6 +10,8 @@ import android.text.Spanned import android.text.style.LeadingMarginSpan import org.oppia.util.R +// TODO(#562): Add screenshot tests to check whether the drawing logic works correctly on all devices. + /** * Copy of [android.text.style.BulletSpan] from android SDK 28 with removed internal code. * This class helps us to customise bullet radius, gap width and offset present in rich-text.