From 5bec1caf4ab50bb461142045ef29c7eb94d41b5b Mon Sep 17 00:00:00 2001 From: feiyanke Date: Wed, 14 Mar 2018 17:22:26 +0800 Subject: [PATCH 1/3] add up/down/url/font extensions for SpannableStringBuilder --- api/current.txt | 4 ++ .../text/SpannableStringBuilderTest.kt | 72 +++++++++++++++++++ .../androidx/text/SpannableStringBuilder.kt | 40 +++++++++++ 3 files changed, 116 insertions(+) diff --git a/api/current.txt b/api/current.txt index 6d0ac772..4dc7070a 100644 --- a/api/current.txt +++ b/api/current.txt @@ -386,12 +386,16 @@ package androidx.text { method public static android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1 builderAction); + method public static android.text.SpannableStringBuilder down(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); + method public static android.text.SpannableStringBuilder font(android.text.SpannableStringBuilder, String family, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object[] spans, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); + method public static android.text.SpannableStringBuilder up(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); + method public static android.text.SpannableStringBuilder url(android.text.SpannableStringBuilder, String url, kotlin.jvm.functions.Function1 builderAction); } public final class SpannableStringKt { diff --git a/src/androidTest/java/androidx/text/SpannableStringBuilderTest.kt b/src/androidTest/java/androidx/text/SpannableStringBuilderTest.kt index b6d543e7..fd6fac59 100644 --- a/src/androidTest/java/androidx/text/SpannableStringBuilderTest.kt +++ b/src/androidTest/java/androidx/text/SpannableStringBuilderTest.kt @@ -29,6 +29,8 @@ import android.text.style.RelativeSizeSpan import android.text.style.StyleSpan import android.text.style.SubscriptSpan import android.text.style.SuperscriptSpan +import android.text.style.TypefaceSpan +import android.text.style.URLSpan import android.text.style.UnderlineSpan import org.junit.Assert.assertEquals import org.junit.Assert.assertSame @@ -186,6 +188,76 @@ class SpannableStringBuilderTest { assertEquals(12, result.getSpanEnd(scale)) } + @Test fun builderUp() { + val result: SpannedString = buildSpannedString { + append("Hello, ") + up { + append("World") + } + } + assertEquals("Hello, World", result.toString()) + + val spans = result.getSpans() + assertEquals(1, spans.size) + + val up = spans.filterIsInstance().single() + assertEquals(7, result.getSpanStart(up)) + assertEquals(12, result.getSpanEnd(up)) + } + + @Test fun builderDown() { + val result: SpannedString = buildSpannedString { + append("Hello, ") + down { + append("World") + } + } + assertEquals("Hello, World", result.toString()) + + val spans = result.getSpans() + assertEquals(1, spans.size) + + val down = spans.filterIsInstance().single() + assertEquals(7, result.getSpanStart(down)) + assertEquals(12, result.getSpanEnd(down)) + } + + @Test fun builderFont() { + val result: SpannedString = buildSpannedString { + append("Hello, ") + font("serif") { + append("World") + } + } + assertEquals("Hello, World", result.toString()) + + val spans = result.getSpans() + assertEquals(1, spans.size) + + val font = spans.filterIsInstance().single() + assertEquals("serif", font.family) + assertEquals(7, result.getSpanStart(font)) + assertEquals(12, result.getSpanEnd(font)) + } + + @Test fun builderUrl() { + val result: SpannedString = buildSpannedString { + append("Hello, ") + url("http://www.google.com") { + append("World") + } + } + assertEquals("Hello, World", result.toString()) + + val spans = result.getSpans() + assertEquals(1, spans.size) + + val url = spans.filterIsInstance().single() + assertEquals("http://www.google.com", url.url) + assertEquals(7, result.getSpanStart(url)) + assertEquals(12, result.getSpanEnd(url)) + } + @Test fun nested() { val result: SpannedString = buildSpannedString { color(RED) { diff --git a/src/main/java/androidx/text/SpannableStringBuilder.kt b/src/main/java/androidx/text/SpannableStringBuilder.kt index 6bc9eb5c..feacb9ba 100644 --- a/src/main/java/androidx/text/SpannableStringBuilder.kt +++ b/src/main/java/androidx/text/SpannableStringBuilder.kt @@ -27,6 +27,10 @@ import android.text.style.ForegroundColorSpan import android.text.style.StrikethroughSpan import android.text.style.RelativeSizeSpan import android.text.style.StyleSpan +import android.text.style.SubscriptSpan +import android.text.style.SuperscriptSpan +import android.text.style.TypefaceSpan +import android.text.style.URLSpan import android.text.style.UnderlineSpan /** @@ -134,3 +138,39 @@ inline fun SpannableStringBuilder.scale( proportion: Float, builderAction: SpannableStringBuilder.() -> Unit ) = inSpans(RelativeSizeSpan(proportion), builderAction = builderAction) + +/** + * Wrap appended text in [builderAction] in a [SuperscriptSpan]. + * + * @see SpannableStringBuilder.inSpans + */ +inline fun SpannableStringBuilder.up(builderAction: SpannableStringBuilder.() -> Unit) = + inSpans(SuperscriptSpan(), builderAction = builderAction) + +/** + * Wrap appended text in [builderAction] in a [SubscriptSpan]. + * + * @see SpannableStringBuilder.inSpans + */ +inline fun SpannableStringBuilder.down(builderAction: SpannableStringBuilder.() -> Unit) = + inSpans(SubscriptSpan(), builderAction = builderAction) + +/** + * Wrap appended text in [builderAction] in a [TypefaceSpan]. + * + * @see SpannableStringBuilder.inSpans + */ +inline fun SpannableStringBuilder.font( + family: String, + builderAction: SpannableStringBuilder.() -> Unit +) = inSpans(TypefaceSpan(family), builderAction = builderAction) + +/** + * Wrap appended text in [builderAction] in a [URLSpan]. + * + * @see SpannableStringBuilder.inSpans + */ +inline fun SpannableStringBuilder.url( + url: String, + builderAction: SpannableStringBuilder.() -> Unit +) = inSpans(URLSpan(url), builderAction = builderAction) From 5cf6d1f3d8d2ed250f81c38ab1a813516354f685 Mon Sep 17 00:00:00 2001 From: feiyanke Date: Mon, 26 Mar 2018 10:38:03 +0800 Subject: [PATCH 2/3] rename some methods --- .../java/androidx/text/SpannableStringBuilderTest.kt | 6 +++--- src/main/java/androidx/text/SpannableStringBuilder.kt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/androidTest/java/androidx/text/SpannableStringBuilderTest.kt b/src/androidTest/java/androidx/text/SpannableStringBuilderTest.kt index fd6fac59..94c8c163 100644 --- a/src/androidTest/java/androidx/text/SpannableStringBuilderTest.kt +++ b/src/androidTest/java/androidx/text/SpannableStringBuilderTest.kt @@ -191,7 +191,7 @@ class SpannableStringBuilderTest { @Test fun builderUp() { val result: SpannedString = buildSpannedString { append("Hello, ") - up { + superscript { append("World") } } @@ -208,7 +208,7 @@ class SpannableStringBuilderTest { @Test fun builderDown() { val result: SpannedString = buildSpannedString { append("Hello, ") - down { + subscript { append("World") } } @@ -225,7 +225,7 @@ class SpannableStringBuilderTest { @Test fun builderFont() { val result: SpannedString = buildSpannedString { append("Hello, ") - font("serif") { + typeface("serif") { append("World") } } diff --git a/src/main/java/androidx/text/SpannableStringBuilder.kt b/src/main/java/androidx/text/SpannableStringBuilder.kt index feacb9ba..e675e5eb 100644 --- a/src/main/java/androidx/text/SpannableStringBuilder.kt +++ b/src/main/java/androidx/text/SpannableStringBuilder.kt @@ -144,7 +144,7 @@ inline fun SpannableStringBuilder.scale( * * @see SpannableStringBuilder.inSpans */ -inline fun SpannableStringBuilder.up(builderAction: SpannableStringBuilder.() -> Unit) = +inline fun SpannableStringBuilder.superscript(builderAction: SpannableStringBuilder.() -> Unit) = inSpans(SuperscriptSpan(), builderAction = builderAction) /** @@ -152,7 +152,7 @@ inline fun SpannableStringBuilder.up(builderAction: SpannableStringBuilder.() -> * * @see SpannableStringBuilder.inSpans */ -inline fun SpannableStringBuilder.down(builderAction: SpannableStringBuilder.() -> Unit) = +inline fun SpannableStringBuilder.subscript(builderAction: SpannableStringBuilder.() -> Unit) = inSpans(SubscriptSpan(), builderAction = builderAction) /** @@ -160,7 +160,7 @@ inline fun SpannableStringBuilder.down(builderAction: SpannableStringBuilder.() * * @see SpannableStringBuilder.inSpans */ -inline fun SpannableStringBuilder.font( +inline fun SpannableStringBuilder.typeface( family: String, builderAction: SpannableStringBuilder.() -> Unit ) = inSpans(TypefaceSpan(family), builderAction = builderAction) From 5b1dd486482f1d4229014a35c767d1adbb5f69e3 Mon Sep 17 00:00:00 2001 From: feiyanke Date: Mon, 26 Mar 2018 10:45:22 +0800 Subject: [PATCH 3/3] updateApi --- api/current.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/current.txt b/api/current.txt index 4dc7070a..5d0355f0 100644 --- a/api/current.txt +++ b/api/current.txt @@ -386,15 +386,15 @@ package androidx.text { method public static android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1 builderAction); - method public static android.text.SpannableStringBuilder down(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); - method public static android.text.SpannableStringBuilder font(android.text.SpannableStringBuilder, String family, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object[] spans, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); + method public static android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); + method public static android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); + method public static android.text.SpannableStringBuilder typeface(android.text.SpannableStringBuilder, String family, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); - method public static android.text.SpannableStringBuilder up(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1 builderAction); method public static android.text.SpannableStringBuilder url(android.text.SpannableStringBuilder, String url, kotlin.jvm.functions.Function1 builderAction); }