Create MimeTypes object
This commit is contained in:
parent
21271b6510
commit
ca75eae0aa
@ -21,6 +21,7 @@ import android.os.Parcelable
|
|||||||
import androidx.exifinterface.media.ExifInterface
|
import androidx.exifinterface.media.ExifInterface
|
||||||
import com.squareup.moshi.JsonClass
|
import com.squareup.moshi.JsonClass
|
||||||
import kotlinx.android.parcel.Parcelize
|
import kotlinx.android.parcel.Parcelize
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes.normalizeMimeType
|
||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
@ -45,5 +46,5 @@ data class ContentAttachmentData(
|
|||||||
VIDEO
|
VIDEO
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getSafeMimeType() = if (mimeType == "image/jpg") "image/jpeg" else mimeType
|
fun getSafeMimeType() = mimeType?.normalizeMimeType()
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ import com.squareup.moshi.Json
|
|||||||
import com.squareup.moshi.JsonClass
|
import com.squareup.moshi.JsonClass
|
||||||
import org.matrix.android.sdk.api.session.events.model.Content
|
import org.matrix.android.sdk.api.session.events.model.Content
|
||||||
import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent
|
import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileInfo
|
import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileInfo
|
||||||
|
|
||||||
@JsonClass(generateAdapter = true)
|
@JsonClass(generateAdapter = true)
|
||||||
@ -54,5 +55,5 @@ data class MessageImageContent(
|
|||||||
@Json(name = "file") override val encryptedFileInfo: EncryptedFileInfo? = null
|
@Json(name = "file") override val encryptedFileInfo: EncryptedFileInfo? = null
|
||||||
) : MessageImageInfoContent {
|
) : MessageImageInfoContent {
|
||||||
override val mimeType: String?
|
override val mimeType: String?
|
||||||
get() = encryptedFileInfo?.mimetype ?: info?.mimeType ?: "image/*"
|
get() = encryptedFileInfo?.mimetype ?: info?.mimeType ?: MimeTypes.Images
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 The Matrix.org Foundation C.I.C.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.matrix.android.sdk.api.util
|
||||||
|
|
||||||
|
import org.matrix.android.sdk.api.extensions.orFalse
|
||||||
|
|
||||||
|
// The Android SDK does not provide constant for mime type, add some of them here
|
||||||
|
object MimeTypes {
|
||||||
|
const val Any: String = "*/*"
|
||||||
|
const val OctetStream = "application/octet-stream"
|
||||||
|
|
||||||
|
const val Images = "image/*"
|
||||||
|
|
||||||
|
const val Png = "image/png"
|
||||||
|
const val BadJpg = "image/jpg"
|
||||||
|
const val Jpeg = "image/jpeg"
|
||||||
|
const val Gif = "image/gif"
|
||||||
|
|
||||||
|
fun String?.normalizeMimeType() = if (this == BadJpg) Jpeg else this
|
||||||
|
|
||||||
|
fun String?.isMimeTypeImage() = this?.startsWith("image/").orFalse()
|
||||||
|
fun String?.isMimeTypeVideo() = this?.startsWith("video/").orFalse()
|
||||||
|
fun String?.isMimeTypeAudio() = this?.startsWith("audio/").orFalse()
|
||||||
|
}
|
@ -20,6 +20,7 @@ import android.content.Context
|
|||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.media.MediaMetadataRetriever
|
import android.media.MediaMetadataRetriever
|
||||||
import org.matrix.android.sdk.api.session.content.ContentAttachmentData
|
import org.matrix.android.sdk.api.session.content.ContentAttachmentData
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
|
|
||||||
@ -58,7 +59,7 @@ internal object ThumbnailExtractor {
|
|||||||
height = thumbnailHeight,
|
height = thumbnailHeight,
|
||||||
size = thumbnailSize.toLong(),
|
size = thumbnailSize.toLong(),
|
||||||
bytes = outputStream.toByteArray(),
|
bytes = outputStream.toByteArray(),
|
||||||
mimeType = "image/jpeg"
|
mimeType = MimeTypes.Jpeg
|
||||||
)
|
)
|
||||||
thumbnail.recycle()
|
thumbnail.recycle()
|
||||||
outputStream.reset()
|
outputStream.reset()
|
||||||
|
@ -29,6 +29,7 @@ import org.matrix.android.sdk.api.session.room.model.message.MessageContent
|
|||||||
import org.matrix.android.sdk.api.session.room.model.message.MessageFileContent
|
import org.matrix.android.sdk.api.session.room.model.message.MessageFileContent
|
||||||
import org.matrix.android.sdk.api.session.room.model.message.MessageImageContent
|
import org.matrix.android.sdk.api.session.room.model.message.MessageImageContent
|
||||||
import org.matrix.android.sdk.api.session.room.model.message.MessageVideoContent
|
import org.matrix.android.sdk.api.session.room.model.message.MessageVideoContent
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
import org.matrix.android.sdk.internal.crypto.attachments.MXEncryptedAttachments
|
import org.matrix.android.sdk.internal.crypto.attachments.MXEncryptedAttachments
|
||||||
import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileInfo
|
import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileInfo
|
||||||
import org.matrix.android.sdk.internal.database.mapper.ContentMapper
|
import org.matrix.android.sdk.internal.database.mapper.ContentMapper
|
||||||
@ -153,7 +154,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter
|
|||||||
|
|
||||||
if (attachment.type == ContentAttachmentData.Type.IMAGE
|
if (attachment.type == ContentAttachmentData.Type.IMAGE
|
||||||
// Do not compress gif
|
// Do not compress gif
|
||||||
&& attachment.mimeType != "image/gif"
|
&& attachment.mimeType != MimeTypes.Gif
|
||||||
&& params.compressBeforeSending) {
|
&& params.compressBeforeSending) {
|
||||||
fileToUpload = imageCompressor.compress(context, workingFile, MAX_IMAGE_SIZE, MAX_IMAGE_SIZE)
|
fileToUpload = imageCompressor.compress(context, workingFile, MAX_IMAGE_SIZE, MAX_IMAGE_SIZE)
|
||||||
.also { compressedFile ->
|
.also { compressedFile ->
|
||||||
@ -194,7 +195,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter
|
|||||||
Timber.v("## FileService: Uploading file")
|
Timber.v("## FileService: Uploading file")
|
||||||
|
|
||||||
fileUploader
|
fileUploader
|
||||||
.uploadFile(encryptedFile, attachment.name, "application/octet-stream", progressListener)
|
.uploadFile(encryptedFile, attachment.name, MimeTypes.OctetStream, progressListener)
|
||||||
} else {
|
} else {
|
||||||
Timber.v("## FileService: Clear file")
|
Timber.v("## FileService: Clear file")
|
||||||
encryptedFile = null
|
encryptedFile = null
|
||||||
@ -261,7 +262,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter
|
|||||||
val encryptionResult = MXEncryptedAttachments.encryptAttachment(thumbnailData.bytes.inputStream(), thumbnailData.mimeType)
|
val encryptionResult = MXEncryptedAttachments.encryptAttachment(thumbnailData.bytes.inputStream(), thumbnailData.mimeType)
|
||||||
val contentUploadResponse = fileUploader.uploadByteArray(encryptionResult.encryptedByteArray,
|
val contentUploadResponse = fileUploader.uploadByteArray(encryptionResult.encryptedByteArray,
|
||||||
"thumb_${params.attachment.name}",
|
"thumb_${params.attachment.name}",
|
||||||
"application/octet-stream",
|
MimeTypes.OctetStream,
|
||||||
thumbnailProgressListener)
|
thumbnailProgressListener)
|
||||||
UploadThumbnailResult(
|
UploadThumbnailResult(
|
||||||
contentUploadResponse.contentUri,
|
contentUploadResponse.contentUri,
|
||||||
|
@ -26,6 +26,7 @@ import org.matrix.android.sdk.api.session.identity.ThreePid
|
|||||||
import org.matrix.android.sdk.api.session.profile.ProfileService
|
import org.matrix.android.sdk.api.session.profile.ProfileService
|
||||||
import org.matrix.android.sdk.api.util.Cancelable
|
import org.matrix.android.sdk.api.util.Cancelable
|
||||||
import org.matrix.android.sdk.api.util.JsonDict
|
import org.matrix.android.sdk.api.util.JsonDict
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
import org.matrix.android.sdk.api.util.Optional
|
import org.matrix.android.sdk.api.util.Optional
|
||||||
import org.matrix.android.sdk.internal.database.model.PendingThreePidEntity
|
import org.matrix.android.sdk.internal.database.model.PendingThreePidEntity
|
||||||
import org.matrix.android.sdk.internal.database.model.UserThreePidEntity
|
import org.matrix.android.sdk.internal.database.model.UserThreePidEntity
|
||||||
@ -80,7 +81,7 @@ internal class DefaultProfileService @Inject constructor(private val taskExecuto
|
|||||||
|
|
||||||
override fun updateAvatar(userId: String, newAvatarUri: Uri, fileName: String, matrixCallback: MatrixCallback<Unit>): Cancelable {
|
override fun updateAvatar(userId: String, newAvatarUri: Uri, fileName: String, matrixCallback: MatrixCallback<Unit>): Cancelable {
|
||||||
return taskExecutor.executorScope.launchToCallback(coroutineDispatchers.main, matrixCallback) {
|
return taskExecutor.executorScope.launchToCallback(coroutineDispatchers.main, matrixCallback) {
|
||||||
val response = fileUploader.uploadFromUri(newAvatarUri, fileName, "image/jpeg")
|
val response = fileUploader.uploadFromUri(newAvatarUri, fileName, MimeTypes.Jpeg)
|
||||||
setAvatarUrlTask.execute(SetAvatarUrlTask.Params(userId = userId, newAvatarUrl = response.contentUri))
|
setAvatarUrlTask.execute(SetAvatarUrlTask.Params(userId = userId, newAvatarUrl = response.contentUri))
|
||||||
userStore.updateAvatar(userId, response.contentUri)
|
userStore.updateAvatar(userId, response.contentUri)
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ import org.matrix.android.sdk.api.session.events.model.EventType
|
|||||||
import org.matrix.android.sdk.api.session.identity.IdentityServiceError
|
import org.matrix.android.sdk.api.session.identity.IdentityServiceError
|
||||||
import org.matrix.android.sdk.api.session.identity.toMedium
|
import org.matrix.android.sdk.api.session.identity.toMedium
|
||||||
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
|
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
import org.matrix.android.sdk.internal.crypto.DeviceListManager
|
import org.matrix.android.sdk.internal.crypto.DeviceListManager
|
||||||
import org.matrix.android.sdk.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
|
import org.matrix.android.sdk.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
|
||||||
import org.matrix.android.sdk.internal.di.AuthenticatedIdentity
|
import org.matrix.android.sdk.internal.di.AuthenticatedIdentity
|
||||||
@ -96,7 +97,7 @@ internal class CreateRoomBodyBuilder @Inject constructor(
|
|||||||
fileUploader.uploadFromUri(
|
fileUploader.uploadFromUri(
|
||||||
uri = avatarUri,
|
uri = avatarUri,
|
||||||
filename = UUID.randomUUID().toString(),
|
filename = UUID.randomUUID().toString(),
|
||||||
mimeType = "image/jpeg")
|
mimeType = MimeTypes.Jpeg)
|
||||||
}
|
}
|
||||||
?.let { response ->
|
?.let { response ->
|
||||||
Event(
|
Event(
|
||||||
|
@ -34,6 +34,7 @@ import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesContent
|
|||||||
import org.matrix.android.sdk.api.session.room.state.StateService
|
import org.matrix.android.sdk.api.session.room.state.StateService
|
||||||
import org.matrix.android.sdk.api.util.Cancelable
|
import org.matrix.android.sdk.api.util.Cancelable
|
||||||
import org.matrix.android.sdk.api.util.JsonDict
|
import org.matrix.android.sdk.api.util.JsonDict
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
import org.matrix.android.sdk.api.util.Optional
|
import org.matrix.android.sdk.api.util.Optional
|
||||||
import org.matrix.android.sdk.internal.session.content.FileUploader
|
import org.matrix.android.sdk.internal.session.content.FileUploader
|
||||||
import org.matrix.android.sdk.internal.session.room.alias.AddRoomAliasTask
|
import org.matrix.android.sdk.internal.session.room.alias.AddRoomAliasTask
|
||||||
@ -164,7 +165,7 @@ internal class DefaultStateService @AssistedInject constructor(@Assisted private
|
|||||||
|
|
||||||
override fun updateAvatar(avatarUri: Uri, fileName: String, callback: MatrixCallback<Unit>): Cancelable {
|
override fun updateAvatar(avatarUri: Uri, fileName: String, callback: MatrixCallback<Unit>): Cancelable {
|
||||||
return taskExecutor.executorScope.launchToCallback(coroutineDispatchers.main, callback) {
|
return taskExecutor.executorScope.launchToCallback(coroutineDispatchers.main, callback) {
|
||||||
val response = fileUploader.uploadFromUri(avatarUri, fileName, "image/jpeg")
|
val response = fileUploader.uploadFromUri(avatarUri, fileName, MimeTypes.Jpeg)
|
||||||
awaitCallback<Unit> {
|
awaitCallback<Unit> {
|
||||||
sendStateEvent(
|
sendStateEvent(
|
||||||
eventType = EventType.STATE_ROOM_AVATAR,
|
eventType = EventType.STATE_ROOM_AVATAR,
|
||||||
|
@ -20,17 +20,11 @@ import android.content.Context
|
|||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.webkit.MimeTypeMap
|
import android.webkit.MimeTypeMap
|
||||||
import im.vector.app.core.utils.getFileExtension
|
import im.vector.app.core.utils.getFileExtension
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes.normalizeMimeType
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
|
|
||||||
/**
|
|
||||||
* Mime types
|
|
||||||
*/
|
|
||||||
const val MIME_TYPE_JPEG = "image/jpeg"
|
|
||||||
const val MIME_TYPE_JPG = "image/jpg"
|
|
||||||
const val MIME_TYPE_IMAGE_ALL = "image/*"
|
|
||||||
const val MIME_TYPE_ALL_CONTENT = "*/*"
|
|
||||||
|
|
||||||
data class Resource(
|
data class Resource(
|
||||||
var mContentStream: InputStream? = null,
|
var mContentStream: InputStream? = null,
|
||||||
var mMimeType: String? = null
|
var mMimeType: String? = null
|
||||||
@ -55,7 +49,7 @@ data class Resource(
|
|||||||
* @return true if the opened resource is a jpeg one.
|
* @return true if the opened resource is a jpeg one.
|
||||||
*/
|
*/
|
||||||
fun isJpegResource(): Boolean {
|
fun isJpegResource(): Boolean {
|
||||||
return MIME_TYPE_JPEG == mMimeType || MIME_TYPE_JPG == mMimeType
|
return mMimeType.normalizeMimeType() == MimeTypes.Jpeg
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +48,10 @@ import okio.buffer
|
|||||||
import okio.sink
|
import okio.sink
|
||||||
import okio.source
|
import okio.source
|
||||||
import org.matrix.android.sdk.api.extensions.tryOrNull
|
import org.matrix.android.sdk.api.extensions.tryOrNull
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes.isMimeTypeAudio
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes.isMimeTypeImage
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes.isMimeTypeVideo
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileInputStream
|
import java.io.FileInputStream
|
||||||
@ -138,7 +142,7 @@ fun openFileSelection(activity: Activity,
|
|||||||
fileIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, allowMultipleSelection)
|
fileIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, allowMultipleSelection)
|
||||||
|
|
||||||
fileIntent.addCategory(Intent.CATEGORY_OPENABLE)
|
fileIntent.addCategory(Intent.CATEGORY_OPENABLE)
|
||||||
fileIntent.type = "*/*"
|
fileIntent.type = MimeTypes.Any
|
||||||
|
|
||||||
try {
|
try {
|
||||||
activityResultLauncher
|
activityResultLauncher
|
||||||
@ -182,7 +186,7 @@ fun openCamera(activity: Activity, titlePrefix: String, requestCode: Int): Strin
|
|||||||
// The Galaxy S not only requires the name of the file to output the image to, but will also not
|
// The Galaxy S not only requires the name of the file to output the image to, but will also not
|
||||||
// set the mime type of the picture it just took (!!!). We assume that the Galaxy S takes image/jpegs
|
// set the mime type of the picture it just took (!!!). We assume that the Galaxy S takes image/jpegs
|
||||||
// so the attachment uploader doesn't freak out about there being no mimetype in the content database.
|
// so the attachment uploader doesn't freak out about there being no mimetype in the content database.
|
||||||
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
|
values.put(MediaStore.Images.Media.MIME_TYPE, MimeTypes.Jpeg)
|
||||||
var dummyUri: Uri? = null
|
var dummyUri: Uri? = null
|
||||||
try {
|
try {
|
||||||
dummyUri = activity.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
|
dummyUri = activity.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
|
||||||
@ -344,10 +348,10 @@ fun saveMedia(context: Context, file: File, title: String, mediaMimeType: String
|
|||||||
put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis())
|
put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis())
|
||||||
}
|
}
|
||||||
val externalContentUri = when {
|
val externalContentUri = when {
|
||||||
mediaMimeType?.startsWith("image/") == true -> MediaStore.Images.Media.EXTERNAL_CONTENT_URI
|
mediaMimeType?.isMimeTypeImage() == true -> MediaStore.Images.Media.EXTERNAL_CONTENT_URI
|
||||||
mediaMimeType?.startsWith("video/") == true -> MediaStore.Video.Media.EXTERNAL_CONTENT_URI
|
mediaMimeType?.isMimeTypeVideo() == true -> MediaStore.Video.Media.EXTERNAL_CONTENT_URI
|
||||||
mediaMimeType?.startsWith("audio/") == true -> MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
|
mediaMimeType?.isMimeTypeAudio() == true -> MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
|
||||||
else -> MediaStore.Downloads.EXTERNAL_CONTENT_URI
|
else -> MediaStore.Downloads.EXTERNAL_CONTENT_URI
|
||||||
}
|
}
|
||||||
|
|
||||||
val uri = context.contentResolver.insert(externalContentUri, values)
|
val uri = context.contentResolver.insert(externalContentUri, values)
|
||||||
@ -365,7 +369,7 @@ fun saveMedia(context: Context, file: File, title: String, mediaMimeType: String
|
|||||||
notificationUtils.buildDownloadFileNotification(
|
notificationUtils.buildDownloadFileNotification(
|
||||||
uri,
|
uri,
|
||||||
filename,
|
filename,
|
||||||
mediaMimeType ?: "application/octet-stream"
|
mediaMimeType ?: MimeTypes.OctetStream
|
||||||
).let { notification ->
|
).let { notification ->
|
||||||
notificationUtils.showNotificationMessage("DL", uri.hashCode(), notification)
|
notificationUtils.showNotificationMessage("DL", uri.hashCode(), notification)
|
||||||
}
|
}
|
||||||
@ -385,10 +389,10 @@ private fun saveMediaLegacy(context: Context, mediaMimeType: String?, title: Str
|
|||||||
|
|
||||||
GlobalScope.launch(Dispatchers.IO) {
|
GlobalScope.launch(Dispatchers.IO) {
|
||||||
val dest = when {
|
val dest = when {
|
||||||
mediaMimeType?.startsWith("image/") == true -> Environment.DIRECTORY_PICTURES
|
mediaMimeType?.isMimeTypeImage() == true -> Environment.DIRECTORY_PICTURES
|
||||||
mediaMimeType?.startsWith("video/") == true -> Environment.DIRECTORY_MOVIES
|
mediaMimeType?.isMimeTypeVideo() == true -> Environment.DIRECTORY_MOVIES
|
||||||
mediaMimeType?.startsWith("audio/") == true -> Environment.DIRECTORY_MUSIC
|
mediaMimeType?.isMimeTypeAudio() == true -> Environment.DIRECTORY_MUSIC
|
||||||
else -> Environment.DIRECTORY_DOWNLOADS
|
else -> Environment.DIRECTORY_DOWNLOADS
|
||||||
}
|
}
|
||||||
val downloadDir = Environment.getExternalStoragePublicDirectory(dest)
|
val downloadDir = Environment.getExternalStoragePublicDirectory(dest)
|
||||||
try {
|
try {
|
||||||
@ -405,7 +409,7 @@ private fun saveMediaLegacy(context: Context, mediaMimeType: String?, title: Str
|
|||||||
savedFile.name,
|
savedFile.name,
|
||||||
title,
|
title,
|
||||||
true,
|
true,
|
||||||
mediaMimeType ?: "application/octet-stream",
|
mediaMimeType ?: MimeTypes.OctetStream,
|
||||||
savedFile.absolutePath,
|
savedFile.absolutePath,
|
||||||
savedFile.length(),
|
savedFile.length(),
|
||||||
true)
|
true)
|
||||||
|
@ -23,6 +23,9 @@ import im.vector.lib.multipicker.entity.MultiPickerFileType
|
|||||||
import im.vector.lib.multipicker.entity.MultiPickerImageType
|
import im.vector.lib.multipicker.entity.MultiPickerImageType
|
||||||
import im.vector.lib.multipicker.entity.MultiPickerVideoType
|
import im.vector.lib.multipicker.entity.MultiPickerVideoType
|
||||||
import org.matrix.android.sdk.api.session.content.ContentAttachmentData
|
import org.matrix.android.sdk.api.session.content.ContentAttachmentData
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes.isMimeTypeAudio
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes.isMimeTypeImage
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes.isMimeTypeVideo
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
|
||||||
fun MultiPickerContactType.toContactAttachment(): ContactAttachment {
|
fun MultiPickerContactType.toContactAttachment(): ContactAttachment {
|
||||||
@ -59,10 +62,10 @@ fun MultiPickerAudioType.toContentAttachmentData(): ContentAttachmentData {
|
|||||||
|
|
||||||
private fun MultiPickerBaseType.mapType(): ContentAttachmentData.Type {
|
private fun MultiPickerBaseType.mapType(): ContentAttachmentData.Type {
|
||||||
return when {
|
return when {
|
||||||
mimeType?.startsWith("image/") == true -> ContentAttachmentData.Type.IMAGE
|
mimeType?.isMimeTypeImage() == true -> ContentAttachmentData.Type.IMAGE
|
||||||
mimeType?.startsWith("video/") == true -> ContentAttachmentData.Type.VIDEO
|
mimeType?.isMimeTypeVideo() == true -> ContentAttachmentData.Type.VIDEO
|
||||||
mimeType?.startsWith("audio/") == true -> ContentAttachmentData.Type.AUDIO
|
mimeType?.isMimeTypeAudio() == true -> ContentAttachmentData.Type.AUDIO
|
||||||
else -> ContentAttachmentData.Type.FILE
|
else -> ContentAttachmentData.Type.FILE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,8 +17,14 @@
|
|||||||
package im.vector.app.features.attachments
|
package im.vector.app.features.attachments
|
||||||
|
|
||||||
import org.matrix.android.sdk.api.session.content.ContentAttachmentData
|
import org.matrix.android.sdk.api.session.content.ContentAttachmentData
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
|
|
||||||
private val listOfPreviewableMimeTypes = listOf("image/jpeg", "image/png", "image/jpg", "image/gif")
|
private val listOfPreviewableMimeTypes = listOf(
|
||||||
|
MimeTypes.Jpeg,
|
||||||
|
MimeTypes.BadJpg,
|
||||||
|
MimeTypes.Png,
|
||||||
|
MimeTypes.Gif
|
||||||
|
)
|
||||||
|
|
||||||
fun ContentAttachmentData.isPreviewable(): Boolean {
|
fun ContentAttachmentData.isPreviewable(): Boolean {
|
||||||
// For now the preview only supports still image
|
// For now the preview only supports still image
|
||||||
|
@ -17,12 +17,14 @@
|
|||||||
package im.vector.app.features.attachments.preview
|
package im.vector.app.features.attachments.preview
|
||||||
|
|
||||||
import org.matrix.android.sdk.api.session.content.ContentAttachmentData
|
import org.matrix.android.sdk.api.session.content.ContentAttachmentData
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes.isMimeTypeImage
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All images are editable, expect Gif
|
* All images are editable, expect Gif
|
||||||
*/
|
*/
|
||||||
fun ContentAttachmentData.isEditable(): Boolean {
|
fun ContentAttachmentData.isEditable(): Boolean {
|
||||||
return type == ContentAttachmentData.Type.IMAGE
|
return type == ContentAttachmentData.Type.IMAGE
|
||||||
&& getSafeMimeType()?.startsWith("image/") == true
|
&& getSafeMimeType()?.isMimeTypeImage() == true
|
||||||
&& getSafeMimeType() != "image/gif"
|
&& getSafeMimeType() != MimeTypes.Gif
|
||||||
}
|
}
|
||||||
|
@ -88,6 +88,7 @@ import org.matrix.android.sdk.api.session.room.model.message.getFileName
|
|||||||
import org.matrix.android.sdk.api.session.room.model.message.getFileUrl
|
import org.matrix.android.sdk.api.session.room.model.message.getFileUrl
|
||||||
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
|
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
|
||||||
import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent
|
import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
import org.matrix.android.sdk.internal.crypto.attachments.toElementToDecrypt
|
import org.matrix.android.sdk.internal.crypto.attachments.toElementToDecrypt
|
||||||
import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent
|
import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@ -311,7 +312,7 @@ class MessageItemFactory @Inject constructor(
|
|||||||
.leftGuideline(avatarSizeProvider.leftGuideline)
|
.leftGuideline(avatarSizeProvider.leftGuideline)
|
||||||
.imageContentRenderer(imageContentRenderer)
|
.imageContentRenderer(imageContentRenderer)
|
||||||
.contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
|
.contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
|
||||||
.playable(messageContent.info?.mimeType == "image/gif")
|
.playable(messageContent.info?.mimeType == MimeTypes.Gif)
|
||||||
.highlighted(highlight)
|
.highlighted(highlight)
|
||||||
.mediaData(data)
|
.mediaData(data)
|
||||||
.apply {
|
.apply {
|
||||||
|
@ -23,6 +23,7 @@ import org.matrix.android.sdk.api.MatrixCallback
|
|||||||
import org.matrix.android.sdk.api.session.file.FileService
|
import org.matrix.android.sdk.api.session.file.FileService
|
||||||
import org.matrix.android.sdk.api.session.room.Room
|
import org.matrix.android.sdk.api.session.room.Room
|
||||||
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
|
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class DataAttachmentRoomProvider(
|
class DataAttachmentRoomProvider(
|
||||||
@ -38,7 +39,7 @@ class DataAttachmentRoomProvider(
|
|||||||
return getItem(position).let {
|
return getItem(position).let {
|
||||||
when (it) {
|
when (it) {
|
||||||
is ImageContentRenderer.Data -> {
|
is ImageContentRenderer.Data -> {
|
||||||
if (it.mimeType == "image/gif") {
|
if (it.mimeType == MimeTypes.Gif) {
|
||||||
AttachmentInfo.AnimatedImage(
|
AttachmentInfo.AnimatedImage(
|
||||||
uid = it.eventId,
|
uid = it.eventId,
|
||||||
url = it.url ?: "",
|
url = it.url ?: "",
|
||||||
|
@ -28,6 +28,7 @@ import org.matrix.android.sdk.api.session.room.model.message.MessageVideoContent
|
|||||||
import org.matrix.android.sdk.api.session.room.model.message.MessageWithAttachmentContent
|
import org.matrix.android.sdk.api.session.room.model.message.MessageWithAttachmentContent
|
||||||
import org.matrix.android.sdk.api.session.room.model.message.getFileUrl
|
import org.matrix.android.sdk.api.session.room.model.message.getFileUrl
|
||||||
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
|
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
import org.matrix.android.sdk.internal.crypto.attachments.toElementToDecrypt
|
import org.matrix.android.sdk.internal.crypto.attachments.toElementToDecrypt
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@ -56,7 +57,7 @@ class RoomEventsAttachmentProvider(
|
|||||||
allowNonMxcUrls = it.root.sendState.isSending()
|
allowNonMxcUrls = it.root.sendState.isSending()
|
||||||
|
|
||||||
)
|
)
|
||||||
if (content.mimeType == "image/gif") {
|
if (content.mimeType == MimeTypes.Gif) {
|
||||||
AttachmentInfo.AnimatedImage(
|
AttachmentInfo.AnimatedImage(
|
||||||
uid = it.eventId,
|
uid = it.eventId,
|
||||||
url = content.url ?: "",
|
url = content.url ?: "",
|
||||||
|
@ -46,6 +46,7 @@ import okhttp3.Response
|
|||||||
import org.json.JSONException
|
import org.json.JSONException
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import org.matrix.android.sdk.api.Matrix
|
import org.matrix.android.sdk.api.Matrix
|
||||||
|
import org.matrix.android.sdk.api.util.MimeTypes
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
@ -274,7 +275,7 @@ class BugReporter @Inject constructor(
|
|||||||
|
|
||||||
// add the gzipped files
|
// add the gzipped files
|
||||||
for (file in gzippedFiles) {
|
for (file in gzippedFiles) {
|
||||||
builder.addFormDataPart("compressed-log", file.name, file.asRequestBody("application/octet-stream".toMediaTypeOrNull()))
|
builder.addFormDataPart("compressed-log", file.name, file.asRequestBody(MimeTypes.OctetStream.toMediaTypeOrNull()))
|
||||||
}
|
}
|
||||||
|
|
||||||
mBugReportFiles.addAll(gzippedFiles)
|
mBugReportFiles.addAll(gzippedFiles)
|
||||||
@ -295,7 +296,7 @@ class BugReporter @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
builder.addFormDataPart("file",
|
builder.addFormDataPart("file",
|
||||||
logCatScreenshotFile.name, logCatScreenshotFile.asRequestBody("application/octet-stream".toMediaTypeOrNull()))
|
logCatScreenshotFile.name, logCatScreenshotFile.asRequestBody(MimeTypes.OctetStream.toMediaTypeOrNull()))
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Timber.e(e, "## sendBugReport() : fail to write screenshot$e")
|
Timber.e(e, "## sendBugReport() : fail to write screenshot$e")
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user