From 661f7cc187cdfe4da8c399309cd965966852f51a Mon Sep 17 00:00:00 2001 From: tateisu Date: Thu, 20 Jul 2023 14:03:28 +0900 Subject: [PATCH] =?UTF-8?q?=E7=94=BB=E5=83=8F=E3=82=92=E5=A4=89=E6=8F=9B?= =?UTF-8?q?=E3=81=97=E3=81=9F=E5=B7=AE=E7=95=B0=E3=80=81=E5=A4=89=E6=8F=9B?= =?UTF-8?q?=E5=BE=8C=E3=81=AE=E3=83=95=E3=82=A9=E3=83=BC=E3=83=9E=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=81=AB=E5=90=88=E3=81=A3=E3=81=9F=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E6=8B=A1=E5=BC=B5=E5=AD=90=E3=81=A7=E3=82=B5?= =?UTF-8?q?=E3=83=BC=E3=83=90=E3=81=AB=E9=80=81=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subwaytooter/util/AttachmentRequest.kt | 13 ++++++++++--- .../subwaytooter/util/AttachmentUploader.kt | 19 ++++++++++++++----- .../subwaytooter/util/InputStreamOpener.kt | 4 ++++ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/AttachmentRequest.kt b/app/src/main/java/jp/juggler/subwaytooter/util/AttachmentRequest.kt index ae486554..ad6decd4 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/util/AttachmentRequest.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/util/AttachmentRequest.kt @@ -176,7 +176,7 @@ class AttachmentRequest( false } - val canUseOriginal = when { + val canUseOriginal: Boolean = when { // WebPを使っていい場合、PNG画像をWebPに変換したい canUseWebP && mimeType == MIME_TYPE_PNG -> false // WebPを使わない場合、入力がWebPなら強制的にPNGかJPEGにする @@ -219,7 +219,7 @@ class AttachmentRequest( @Suppress("DEPRECATION") Bitmap.CompressFormat.WEBP } - return compressToTempFileOpener(MIME_TYPE_WEBP, format, 90) + return compressToTempFileOpener("webp", MIME_TYPE_WEBP, format, 90) } catch (ex: Throwable) { log.w(ex, "compress to WebP lossy failed.") // 失敗したらJPEG or PNG にフォールバック @@ -234,12 +234,14 @@ class AttachmentRequest( } return when (hasAlpha) { true -> compressToTempFileOpener( + "png", MIME_TYPE_PNG, Bitmap.CompressFormat.PNG, 100 ) else -> compressToTempFileOpener( + "jpg", MIME_TYPE_JPEG, Bitmap.CompressFormat.JPEG, 95 @@ -255,6 +257,7 @@ class AttachmentRequest( * 失敗したら例外を投げる */ private fun Bitmap.compressToTempFileOpener( + fixExt: String?, outMimeType: String, format: Bitmap.CompressFormat, quality: Int, @@ -262,7 +265,7 @@ class AttachmentRequest( val tempFile = context.generateTempFile("createResizedImageOpener") try { FileOutputStream(tempFile).use { compress(format, quality, it) } - return tempFileOpener(tempFile, outMimeType, isImage = true) + return tempFileOpener(tempFile, outMimeType, isImage = true, fixExt = fixExt) } catch (ex: Throwable) { tempFile.delete() throw ex @@ -362,6 +365,10 @@ class AttachmentRequest( else -> "video/mp4" }, isImage = false, + fixExt = when (result) { + tempFile -> null + else -> "mp4" + }, ) } finally { if (outFile != resultFile) outFile.delete() diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/AttachmentUploader.kt b/app/src/main/java/jp/juggler/subwaytooter/util/AttachmentUploader.kt index 400cdecb..1e21face 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/util/AttachmentUploader.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/util/AttachmentUploader.kt @@ -177,7 +177,10 @@ class AttachmentUploader( error(safeContext.getString(R.string.mime_type_not_acceptable, opener.mimeType)) } - val fileName = fixDocumentName(getDocumentName(safeContext.contentResolver, uri)) + val fileName = fixDocumentName( + getDocumentName(safeContext.contentResolver, uri), + fixExt = opener.fixExt, + ) pa.progress = safeContext.getString(R.string.attachment_handling_uploading, 0) fun writeProgress(percent: Int) { pa.progress = if (percent < 100) { @@ -289,7 +292,7 @@ class AttachmentUploader( } } - private fun fixDocumentName(s: String): String { + private fun fixDocumentName(s: String, fixExt: String?): String { val sLength = s.length val m = """([^\x20-\x7f])""".asciiPattern().matcher(s) m.reset() @@ -302,7 +305,11 @@ class AttachmentUploader( lastEnd = m.end() } if (lastEnd < sLength) sb.append(s.substring(lastEnd, sLength)) - return sb.toString() + var escaped = sb.toString() + if (!fixExt.isNullOrEmpty()) { + escaped = """\.[^./\\]*\z""".toRegex().replace(escaped, "") + ".${fixExt}" + } + return escaped } /////////////////////////////////////////////////////////////// @@ -339,8 +346,10 @@ class AttachmentUploader( ) } - val fileName = - fixDocumentName(getDocumentName(safeContext.contentResolver, src.uri)) + val fileName = fixDocumentName( + getDocumentName(safeContext.contentResolver, src.uri), + fixExt = opener.fixExt, + ) if (account.isMisskey) { TootApiResult("custom thumbnail is not supported on misskey account.") diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/InputStreamOpener.kt b/app/src/main/java/jp/juggler/subwaytooter/util/InputStreamOpener.kt index e7081d8c..b5025091 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/util/InputStreamOpener.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/util/InputStreamOpener.kt @@ -16,6 +16,8 @@ abstract class InputStreamOpener { abstract val mimeType: String abstract val isImage: Boolean + open val fixExt :String? = null + @Throws(IOException::class) abstract fun open(): InputStream @@ -74,9 +76,11 @@ fun tempFileOpener( file: File, mimeType: String, isImage: Boolean, + fixExt:String? = null, ) = object : InputStreamOpener() { override val mimeType = mimeType override val isImage = isImage + override val fixExt = fixExt @Throws(IOException::class) override fun open() = FileInputStream(file)