From 45b6f4ff128e92bdaa56101164f574609d9380a2 Mon Sep 17 00:00:00 2001 From: tateisu Date: Tue, 25 Aug 2020 08:36:32 +0900 Subject: [PATCH] =?UTF-8?q?Unicode=E7=B5=B5=E6=96=87=E5=AD=97=E3=81=8C?= =?UTF-8?q?=E3=81=9F=E3=81=8F=E3=81=95=E3=82=93=E4=B8=A6=E3=81=B6=E3=81=A8?= =?UTF-8?q?=E6=94=B9=E8=A1=8C=E4=BD=8D=E7=BD=AE=E3=81=AE=E6=A4=9C=E5=87=BA?= =?UTF-8?q?=E3=81=8C=E3=81=A8=E3=81=A6=E3=82=82=E9=81=85=E3=81=8F=E3=81=AA?= =?UTF-8?q?=E3=82=8B=E5=95=8F=E9=A1=8C=E3=81=AE=E5=AF=BE=E7=AD=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../juggler/subwaytooter/ActAccountSetting.kt | 5 --- .../subwaytooter/util/DecodeOptions.kt | 41 +++++++++++++++---- .../juggler/subwaytooter/util/EmojiDecoder.kt | 3 +- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt b/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt index 680ac092..a233aee6 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActAccountSetting.kt @@ -1091,12 +1091,10 @@ class ActAccountSetting : AsyncActivity(), View.OnClickListener, return opener.mimeType.toMediaType() } - @Throws(IOException::class) override fun contentLength() : Long { return size } - @Throws(IOException::class) override fun writeTo(sink : BufferedSink) { opener.open().use { inData -> val tmp = ByteArray(4096) @@ -1449,7 +1447,6 @@ class ActAccountSetting : AsyncActivity(), View.OnClickListener, val uri : Uri - @Throws(IOException::class) fun open() : InputStream fun deleteTempFile() @@ -1502,7 +1499,6 @@ class ActAccountSetting : AsyncActivity(), View.OnClickListener, override val uri : Uri get() = uriArg - @Throws(IOException::class) override fun open() = FileInputStream(temp_file) override fun deleteTempFile() { @@ -1530,7 +1526,6 @@ class ActAccountSetting : AsyncActivity(), View.OnClickListener, override val uri : Uri get() = uriArg - @Throws(IOException::class) override fun open() : InputStream { return contentResolver.openInputStream(uri) ?: error("openInputStream returns null") } diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/DecodeOptions.kt b/app/src/main/java/jp/juggler/subwaytooter/util/DecodeOptions.kt index e41c23e0..6bc01d80 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/util/DecodeOptions.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/util/DecodeOptions.kt @@ -2,6 +2,8 @@ package jp.juggler.subwaytooter.util import android.content.Context import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.style.ReplacementSpan import jp.juggler.subwaytooter.api.entity.CustomEmoji import jp.juggler.subwaytooter.api.entity.NicoProfileEmoji import jp.juggler.subwaytooter.api.entity.TootAttachmentLike @@ -25,7 +27,7 @@ class DecodeOptions( var enlargeEmoji : Float = 1f, var forceHtml : Boolean = false, // force use HTML instead of Misskey Markdown var mentionFullAcct : Boolean = false, - var mentions: ArrayList? = null + var mentions : ArrayList? = null ) { internal fun isMediaAttachment(url : String?) : Boolean { @@ -38,23 +40,46 @@ class DecodeOptions( } // OUTPUT - var highlightSound: HighlightWord? = null - var highlightSpeech: HighlightWord? = null - var highlightAny: HighlightWord? = null + var highlightSound : HighlightWord? = null + var highlightSpeech : HighlightWord? = null + var highlightAny : HighlightWord? = null //////////////////////// // decoder + // AndroidのStaticLayoutはパラグラフ中に絵文字が沢山あると異常に遅いので、絵文字が連続して登場したら改行文字を挿入する + private fun SpannableStringBuilder.workaroundForEmojiLineBreak() : SpannableStringBuilder { + + val spans = getSpans(0, length, ReplacementSpan::class.java) + if(spans != null) { + val insertList = ArrayList() + spans.sortBy { getSpanStart(it) } + var repeatCount = 0 + var preEnd : Int? = null + for(span in spans) { + val start = getSpanStart(span) + if(start != preEnd) { + repeatCount = 0 + } else if(++ repeatCount >= 12) { + repeatCount = 0 + insertList.add(start) + } + preEnd = getSpanEnd(span) + } + // 後ろから順に挿入する + insertList.reversed().forEach { insert(it, "\n") } + } + return this + } + fun decodeHTML(html : String?) = - HTMLDecoder.decodeHTML(this, html) + HTMLDecoder.decodeHTML(this, html).workaroundForEmojiLineBreak() fun decodeEmoji(s : String?) : Spannable = - EmojiDecoder.decodeEmoji(this, s ?: "") + EmojiDecoder.decodeEmoji(this, s ?: "").workaroundForEmojiLineBreak() fun decodeEmojiNullable(s : String?) = when(s) { null -> null else -> EmojiDecoder.decodeEmoji(this, s) } - - } \ No newline at end of file diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/EmojiDecoder.kt b/app/src/main/java/jp/juggler/subwaytooter/util/EmojiDecoder.kt index 26b0d24e..03c3d107 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/util/EmojiDecoder.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/util/EmojiDecoder.kt @@ -2,7 +2,6 @@ package jp.juggler.subwaytooter.util import android.content.Context import android.content.SharedPreferences -import android.text.Spannable import android.text.SpannableStringBuilder import android.text.Spanned import android.util.SparseBooleanArray @@ -348,7 +347,7 @@ object EmojiDecoder { private val reNicoru = """\Anicoru\d*\z""".asciiPattern( Pattern.CASE_INSENSITIVE) private val reHohoemi = """\Ahohoemi\d*\z""".asciiPattern( Pattern.CASE_INSENSITIVE) - fun decodeEmoji(options : DecodeOptions, s : String) : Spannable { + fun decodeEmoji(options : DecodeOptions, s : String) : SpannableStringBuilder { val builder = EmojiStringBuilder(options)