From ce49332b79dcd616bdbc3f3f1e69f854609c81bd Mon Sep 17 00:00:00 2001 From: tateisu Date: Fri, 18 Jan 2019 13:42:29 +0900 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E4=BB=98=E3=83=A1=E3=83=87=E3=82=A3?= =?UTF-8?q?=E3=82=A2=E3=81=AE=E3=82=A2=E3=83=83=E3=83=97=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E3=83=89=E6=99=82=E3=81=AB=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E5=90=8D=E3=82=92=E9=81=A9=E5=BD=93=E3=81=AB=E3=82=A8=E3=82=B9?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=83=97=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/jp/juggler/subwaytooter/ActPost.kt | 43 ++++++++++++++----- .../main/java/jp/juggler/util/StringUtils.kt | 14 +++--- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt b/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt index 9990a919..416823b4 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/ActPost.kt @@ -58,6 +58,7 @@ import java.lang.ref.WeakReference import java.util.* import java.util.concurrent.ConcurrentLinkedQueue import java.util.concurrent.atomic.AtomicBoolean +import java.util.regex.Pattern class ActPost : AppCompatActivity(), View.OnClickListener, @@ -1818,8 +1819,25 @@ class ActPost : AppCompatActivity(), ) } + fun fixDocumentName(s : String) : String { + val s_length = s.length + val m = Pattern.compile("""([^\x20-\x7f])""").matcher(s) + m.reset() + val sb = StringBuilder(s_length) + var lastEnd = 0 + while(m.find()) { + sb.append(s.substring(lastEnd,m.start())) + val escaped = m.group(1).encodeUTF8().encodeHex() + sb.append(escaped) + lastEnd = m.end() + } + if(lastEnd < s_length) sb.append(s.substring(lastEnd,s_length)) + return sb.toString() + } - if(account.isMisskey) { + val fileName = fixDocumentName(getDocumentName(contentResolver, uri)) + + return if(account.isMisskey) { val multipart_builder = MultipartBody.Builder() .setType(MultipartBody.FORM) @@ -1829,7 +1847,9 @@ class ActPost : AppCompatActivity(), } multipart_builder.addFormDataPart( - "file", getDocumentName(contentResolver, uri), object : RequestBody() { + "file", + fileName, + object : RequestBody() { override fun contentType() : MediaType? { return MediaType.parse(opener.mimeType) } @@ -1870,13 +1890,14 @@ class ActPost : AppCompatActivity(), pa.attachment = a } } - return result + result } else { + val multipart_body = MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart( "file", - getDocumentName(contentResolver, uri), + fileName, object : RequestBody() { override fun contentType() : MediaType? { return MediaType.parse(opener.mimeType) @@ -1918,7 +1939,7 @@ class ActPost : AppCompatActivity(), pa.attachment = a } } - return result + result } } catch(ex : Throwable) { @@ -2053,11 +2074,13 @@ class ActPost : AppCompatActivity(), } } - private fun showVisibility(){ - btnVisibility.setImageResource(Styler.getVisibilityIconId( - account?.isMisskey == true - , visibility ?: TootVisibility.Public - )) + private fun showVisibility() { + btnVisibility.setImageResource( + Styler.getVisibilityIconId( + account?.isMisskey == true + , visibility ?: TootVisibility.Public + ) + ) } private fun performVisibility() { diff --git a/app/src/main/java/jp/juggler/util/StringUtils.kt b/app/src/main/java/jp/juggler/util/StringUtils.kt index e7965112..02dd0411 100644 --- a/app/src/main/java/jp/juggler/util/StringUtils.kt +++ b/app/src/main/java/jp/juggler/util/StringUtils.kt @@ -88,15 +88,11 @@ fun CharArray.toByteArray() : ByteArray { //////////////////////////////////////////////////////////////////// // CharSequence -fun CharSequence.replaceFirst(pattern : Pattern, replacement : String) : String { - return pattern.matcher(this).replaceFirst(replacement) - // replaceFirstの戻り値がplatform type なので expression body 形式にすると警告がでる -} +fun CharSequence.replaceFirst(pattern : Pattern, replacement : String) : String = + pattern.matcher(this).replaceFirst(replacement) -fun CharSequence.replaceAll(pattern : Pattern, replacement : String) : String { - return pattern.matcher(this).replaceAll(replacement) - // replaceAllの戻り値がplatform type なので expression body 形式にすると警告がでる -} +fun CharSequence.replaceAll(pattern : Pattern, replacement : String) : String = + pattern.matcher(this).replaceAll(replacement) // %1$s を含む文字列リソースを利用して装飾テキストの前後に文字列を追加する fun CharSequence?.intoStringResource(context : Context, string_id : Int) : Spannable { @@ -151,7 +147,7 @@ fun String.encodeUTF8() = this.toByteArray(charsetUTF8) fun ByteArray.decodeUTF8() = this.toString(charsetUTF8) // 16進ダンプ -private fun ByteArray.encodeHex() : String { +fun ByteArray.encodeHex() : String { val sb = StringBuilder() for(b in this) { sb.appendHex2(b.toInt())