diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index 2fd4d2579..b2809806b 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -267,7 +267,7 @@ class NotificationsManager @MainThread constructor(private val context: Context) @WorkerThread override fun onChatRoomRead(core: Core, chatRoom: ChatRoom) { Log.i( - "$TAG Conversation [$chatRoom] has been marked as read, removing notification if any" + "$TAG Conversation [${LinphoneUtils.getChatRoomId(chatRoom)}] has been marked as read, removing notification if any" ) dismissChatNotification(chatRoom) } diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/FileModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/FileModel.kt index fed9ace28..37f432c5d 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/FileModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/FileModel.kt @@ -9,6 +9,7 @@ import org.linphone.utils.FileUtils class FileModel @AnyThread constructor( val file: String, + val fileName: String, fileSize: Long, val isWaitingToBeDownloaded: Boolean = false, private val onClicked: ((model: FileModel) -> Unit)? = null @@ -17,8 +18,6 @@ class FileModel @AnyThread constructor( private const val TAG = "[File Model]" } - val fileName: String = FileUtils.getNameFromFilePath(file) - val formattedFileSize = MutableLiveData() val path = MutableLiveData() diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt index 50e4f2007..91927fff2 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt @@ -313,14 +313,19 @@ class MessageModel @WorkerThread constructor( if (content.isFile) { Log.d("$TAG Found file content with type [${content.type}/${content.subtype}]") filesContentCount += 1 + + checkAndRepairFilePathIfNeeded(content) + val path = content.filePath ?: "" + val name = content.name ?: "" if (path.isNotEmpty()) { Log.d( "$TAG Found file ready to be displayed [$path] with MIME [${content.type}/${content.subtype}] for message [${chatMessage.messageId}]" ) + when (content.type) { "image", "video" -> { - val fileModel = FileModel(path, content.fileSize.toLong()) { model -> + val fileModel = FileModel(path, name, content.fileSize.toLong()) { model -> onContentClicked?.invoke(model.file) } filesPath.add(fileModel) @@ -344,7 +349,7 @@ class MessageModel @WorkerThread constructor( displayableContentFound = true } else -> { - val fileModel = FileModel(path, content.fileSize.toLong()) { model -> + val fileModel = FileModel(path, name, content.fileSize.toLong()) { model -> onContentClicked?.invoke(model.file) } filesPath.add(fileModel) @@ -362,7 +367,7 @@ class MessageModel @WorkerThread constructor( filesContentCount += 1 val name = content.name ?: "" if (name.isNotEmpty()) { - val fileModel = FileModel(name, content.fileSize.toLong(), true) { model -> + val fileModel = FileModel(name, name, content.fileSize.toLong(), true) { model -> Log.d("$TAG Starting downloading content for file [${model.fileName}]") if (content.filePath.orEmpty().isEmpty()) { @@ -678,4 +683,33 @@ class MessageModel @WorkerThread constructor( delay(50) } } + + @WorkerThread + private fun checkAndRepairFilePathIfNeeded(content: Content): String { + val path = content.filePath ?: "" + if (path.isEmpty()) return "" + val name = content.name ?: "" + if (name.isEmpty()) return "" + + val extension = FileUtils.getExtensionFromFileName(path) + if (extension.contains("/")) { + Log.w( + "$TAG Weird extension [$extension] found for file [$path], trying with file name [$name]" + ) + val fileExtension = FileUtils.getExtensionFromFileName(name) + if (!fileExtension.contains("/")) { + Log.w("$TAG File extension [$fileExtension] seems better, renaming file") + val newPath = FileUtils.renameFile(path, name) + if (newPath.isNotEmpty()) { + content.filePath = newPath + Log.w("$TAG File [$path] has been renamed [${content.filePath}]") + return newPath + } else { + Log.e("$TAG Failed to rename file!") + } + } + } + + return "" + } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt index 1e44a8199..3008e1859 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt @@ -310,9 +310,12 @@ class SendMessageInConversationViewModel @UiThread constructor() : ViewModel() { fun addAttachment(file: String) { val list = arrayListOf() list.addAll(attachments.value.orEmpty()) - val model = FileModel(file, 0) { model -> + + val fileName = FileUtils.getNameFromFilePath(file) + val model = FileModel(file, fileName, 0) { model -> removeAttachment(model.file) } + list.add(model) attachments.value = list diff --git a/app/src/main/java/org/linphone/utils/FileUtils.kt b/app/src/main/java/org/linphone/utils/FileUtils.kt index 130aa60d4..d56bca118 100644 --- a/app/src/main/java/org/linphone/utils/FileUtils.kt +++ b/app/src/main/java/org/linphone/utils/FileUtils.kt @@ -142,7 +142,7 @@ class FileUtils { var prefix = 1 while (file.exists()) { file = File(path, prefix.toString() + "_" + fileName) - Log.w("$TAG File with that name already exists, renamed to ${file.name}") + Log.w("$TAG File with that name already exists, renamed to [${file.name}]") prefix += 1 } } @@ -159,7 +159,7 @@ class FileUtils { var prefix = 1 while (file.exists()) { file = File(path, prefix.toString() + "_" + fileName) - Log.w("$TAG File with that name already exists, renamed to ${file.name}") + Log.w("$TAG File with that name already exists, renamed to [${file.name}]") prefix += 1 } } @@ -190,7 +190,7 @@ class FileUtils { ) } catch (e: Exception) { Log.e( - "$TAG Couldn't get URI for file $file using file provider ${context.getString( + "$TAG Couldn't get URI for file [$file] using file provider ${context.getString( R.string.file_provider )}" ) @@ -289,13 +289,13 @@ class FileUtils { suspend fun copyFileTo(filePath: String, outputStream: OutputStream?): Boolean { if (outputStream == null) { - Log.e("$TAG Can't copy file $filePath to given null output stream") + Log.e("$TAG Can't copy file [$filePath] to given null output stream") return false } val file = File(filePath) if (!file.exists()) { - Log.e("$TAG Can't copy file $filePath, it doesn't exists") + Log.e("$TAG Can't copy file [$filePath], it doesn't exists") return false } @@ -315,21 +315,52 @@ class FileUtils { return false } + fun renameFile(from: String, to: String): String { + val source = File(from) + val isImage = isExtensionImage(to) + val dest = getFileStoragePath(to, isImage = isImage, overrideExisting = true) + + if (!source.exists()) { + if (dest.exists()) { + Log.w( + "$TAG Source file doesn't exists but destination does, considering renaming done" + ) + return dest.absolutePath + } + Log.e("$TAG Can't rename file [${source.absoluteFile}], it doesn't exists!") + return "" + } + + val destination = if (dest.exists()) { + getFileStoragePath(to, isImage = isImage, overrideExisting = false) + } else { + dest + } + if (source.renameTo(destination)) { + return destination.absolutePath + } + + Log.e( + "$TAG Failed to rename file [${source.absoluteFile}] to [${destination.absoluteFile}]" + ) + return "" + } + suspend fun deleteFile(filePath: String) { withContext(Dispatchers.IO) { val file = File(filePath) if (file.exists()) { try { if (file.delete()) { - Log.i("$TAG Deleted $filePath") + Log.i("$TAG Deleted [$filePath]") } else { - Log.e("$TAG Can't delete $filePath") + Log.e("$TAG Can't delete [$filePath]") } } catch (e: Exception) { - Log.e("$TAG Can't delete $filePath, exception: $e") + Log.e("$TAG Can't delete [$filePath], exception: $e") } } else { - Log.e("$TAG File $filePath doesn't exists") + Log.e("$TAG File [$filePath] doesn't exists") } } }