diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt index 1e4f4f74e..c32428264 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt @@ -1,36 +1,40 @@ package com.vitorpamplona.amethyst.ui.actions -import android.graphics.Bitmap +import android.content.ContentResolver +import android.net.Uri import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper -import java.io.ByteArrayOutputStream -import java.io.IOException -import java.util.UUID -import okhttp3.Call -import okhttp3.Callback +import okhttp3.* import okhttp3.MediaType.Companion.toMediaType -import okhttp3.MultipartBody -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.RequestBody -import okhttp3.RequestBody.Companion.toRequestBody -import okhttp3.Response +import okio.BufferedSink +import okio.source +import java.io.IOException +import java.util.* object ImageUploader { - private fun encodeImage(bitmap: Bitmap): ByteArray { - val byteArrayOutPutStream = ByteArrayOutputStream() - bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutPutStream) - return byteArrayOutPutStream.toByteArray() - } + fun uploadImage( + uri: Uri, + contentResolver: ContentResolver, + onSuccess: (String) -> Unit, + ) { + val contentType = contentResolver.getType(uri) - fun uploadImage(bitmap: Bitmap, onSuccess: (String) -> Unit) { val client = OkHttpClient.Builder().build() val body: RequestBody = MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart( "image", - "${UUID.randomUUID()}.png", - encodeImage(bitmap).toRequestBody("image/png".toMediaType()) + "${UUID.randomUUID()}", + object : RequestBody() { + override fun contentType(): MediaType? = + contentType?.toMediaType() + + override fun writeTo(sink: BufferedSink) { + contentResolver.openInputStream(uri)!!.use { inputStream -> + sink.writeAll(inputStream.source()) + } + } + } ) .build() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index 9c151483f..c01078720 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -1,22 +1,14 @@ package com.vitorpamplona.amethyst.ui.actions import android.content.Context -import android.graphics.ImageDecoder import android.net.Uri -import android.os.Build -import android.provider.MediaStore import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.ViewModel -import com.vitorpamplona.amethyst.model.Account -import com.vitorpamplona.amethyst.model.LocalCache -import com.vitorpamplona.amethyst.model.Note -import com.vitorpamplona.amethyst.model.User -import com.vitorpamplona.amethyst.model.decodePublicKey -import com.vitorpamplona.amethyst.model.toHexKey +import com.vitorpamplona.amethyst.model.* import com.vitorpamplona.amethyst.ui.components.isValidURL import com.vitorpamplona.amethyst.ui.components.noProtocolUrlValidator import nostr.postr.toNpub @@ -107,17 +99,12 @@ class NewPostViewModel: ViewModel() { } fun upload(it: Uri, context: Context) { - val img = if (Build.VERSION.SDK_INT < 28) { - MediaStore.Images.Media.getBitmap(context.contentResolver, it) - } else { - ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.contentResolver, it)) - } - - img?.let { - ImageUploader.uploadImage(img) { - message = TextFieldValue(message.text + "\n\n" + it) - urlPreview = findUrlInMessage() - } + ImageUploader.uploadImage( + uri = it, + contentResolver = context.contentResolver, + ) { + message = TextFieldValue(message.text + "\n\n" + it) + urlPreview = findUrlInMessage() } }