From 984a56a48273c4a704ff94d3089e1cfdc31fccbe Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Mon, 20 Apr 2020 23:06:39 +0200 Subject: [PATCH] fix toots showing too much whitespace (#1761) * fix toots showing too much whitespace * use isWhitespace extension function --- .../com/keylesspalace/tusky/db/Converters.kt | 4 +- .../tusky/json/SpannedTypeAdapter.kt | 37 +++++++++++++++++++ .../tusky/repository/TimelineRepository.kt | 6 ++- .../keylesspalace/tusky/util/StringUtils.kt | 11 +++++- 4 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/keylesspalace/tusky/json/SpannedTypeAdapter.kt diff --git a/app/src/main/java/com/keylesspalace/tusky/db/Converters.kt b/app/src/main/java/com/keylesspalace/tusky/db/Converters.kt index 0074b8d9..d2e8dee1 100644 --- a/app/src/main/java/com/keylesspalace/tusky/db/Converters.kt +++ b/app/src/main/java/com/keylesspalace/tusky/db/Converters.kt @@ -136,7 +136,7 @@ class Converters { if(spannedString == null) { return null } - return HtmlUtils.fromHtml(spannedString) + return spannedString.parseAsHtml().trimTrailingWhitespace() } @TypeConverter @@ -149,4 +149,4 @@ class Converters { return gson.fromJson(pollJson, Poll::class.java) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/keylesspalace/tusky/json/SpannedTypeAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/json/SpannedTypeAdapter.kt new file mode 100644 index 00000000..6eabea52 --- /dev/null +++ b/app/src/main/java/com/keylesspalace/tusky/json/SpannedTypeAdapter.kt @@ -0,0 +1,37 @@ +/* Copyright 2020 Tusky Contributors + * + * This file is a part of Tusky. + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Tusky; if not, + * see . */ + +package com.keylesspalace.tusky.json + +import android.text.Spanned +import android.text.SpannedString +import androidx.core.text.HtmlCompat +import androidx.core.text.parseAsHtml +import com.google.gson.* +import com.keylesspalace.tusky.util.trimTrailingWhitespace +import java.lang.reflect.Type + +class SpannedTypeAdapter : JsonDeserializer, JsonSerializer { + @Throws(JsonParseException::class) + override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Spanned { + /* Html.fromHtml returns trailing whitespace if the html ends in a

tag, which + * all status contents do, so it should be trimmed. */ + return json.asString?.parseAsHtml()?.trimTrailingWhitespace() ?: SpannedString("") + } + + override fun serialize(src: Spanned?, typeOfSrc: Type, context: JsonSerializationContext): JsonElement { + return JsonPrimitive(HtmlCompat.toHtml(src!!, HtmlCompat.TO_HTML_PARAGRAPH_LINES_INDIVIDUAL)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/keylesspalace/tusky/repository/TimelineRepository.kt b/app/src/main/java/com/keylesspalace/tusky/repository/TimelineRepository.kt index 23d794f8..e9bcfe2f 100644 --- a/app/src/main/java/com/keylesspalace/tusky/repository/TimelineRepository.kt +++ b/app/src/main/java/com/keylesspalace/tusky/repository/TimelineRepository.kt @@ -1,5 +1,6 @@ package com.keylesspalace.tusky.repository +import android.text.Spanned import android.text.SpannedString import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -12,6 +13,7 @@ import com.keylesspalace.tusky.util.Either import com.keylesspalace.tusky.util.HtmlConverter import com.keylesspalace.tusky.util.dec import com.keylesspalace.tusky.util.inc +import com.keylesspalace.tusky.util.trimTrailingWhitespace import io.reactivex.Single import io.reactivex.schedulers.Schedulers import java.io.IOException @@ -215,7 +217,7 @@ class TimelineRepositoryImpl( inReplyToId = status.inReplyToId, inReplyToAccountId = status.inReplyToAccountId, reblog = null, - content = status.content?.let(htmlConverter::fromHtml) ?: SpannedString(""), + content = status.content?.parseAsHtml()?.trimTrailingWhitespace() ?: SpannedString(""), createdAt = Date(status.createdAt), emojis = emojis, reblogsCount = status.reblogsCount, @@ -268,7 +270,7 @@ class TimelineRepositoryImpl( inReplyToId = status.inReplyToId, inReplyToAccountId = status.inReplyToAccountId, reblog = null, - content = status.content?.let(htmlConverter::fromHtml) ?: SpannedString(""), + content = status.content?.parseAsHtml()?.trimTrailingWhitespace() ?: SpannedString(""), createdAt = Date(status.createdAt), emojis = emojis, reblogsCount = status.reblogsCount, diff --git a/app/src/main/java/com/keylesspalace/tusky/util/StringUtils.kt b/app/src/main/java/com/keylesspalace/tusky/util/StringUtils.kt index 32adaf89..c7af0ca6 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/StringUtils.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/StringUtils.kt @@ -2,7 +2,8 @@ package com.keylesspalace.tusky.util -import java.util.Random +import android.text.Spanned +import java.util.* private const val POSSIBLE_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -71,3 +72,11 @@ fun String.isLessThan(other: String): Boolean { else -> this < other } } + +fun Spanned.trimTrailingWhitespace(): Spanned { + var i = length + do { + i-- + } while (i >= 0 && get(i).isWhitespace()) + return subSequence(0, i + 1) as Spanned +}