From 4752954c65a6856f947f7c3af4b720bb663bc0ac Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Mon, 26 Jan 2026 21:23:12 +0500 Subject: [PATCH] feat: Enhance file upload logging and error handling in TransportManager and ChatViewModel --- .../rosetta/messenger/network/TransportManager.kt | 13 ++++++++++++- .../com/rosetta/messenger/ui/chats/ChatViewModel.kt | 11 ++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/network/TransportManager.kt b/app/src/main/java/com/rosetta/messenger/network/TransportManager.kt index f64fdcf..529a0b1 100644 --- a/app/src/main/java/com/rosetta/messenger/network/TransportManager.kt +++ b/app/src/main/java/com/rosetta/messenger/network/TransportManager.kt @@ -88,17 +88,22 @@ object TransportManager { val server = getActiveServer() Log.d(TAG, "📤 Uploading file: $id to $server") + Log.d(TAG, "📤 Content length: ${content.length}, first 50 chars: ${content.take(50)}") // Добавляем в список загрузок _uploading.value = _uploading.value + TransportState(id, 0) try { + // 🔥 КРИТИЧНО: Преобразуем строку в байты (как desktop делает new Blob([content])) + val contentBytes = content.toByteArray(Charsets.UTF_8) + Log.d(TAG, "📤 Content bytes length: ${contentBytes.size}") + val requestBody = MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart( "file", id, - content.toRequestBody("application/octet-stream".toMediaType()) + contentBytes.toRequestBody("application/octet-stream".toMediaType()) ) .build() @@ -110,6 +115,8 @@ object TransportManager { val response = suspendCoroutine { cont -> client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { + Log.e(TAG, "❌ Upload failed for $id: ${e.message}") + Log.e(TAG, "❌ Stack trace: ${e.stackTraceToString()}") cont.resumeWithException(e) } @@ -120,12 +127,16 @@ object TransportManager { } if (!response.isSuccessful) { + val errorBody = response.body?.string() ?: "No error body" + Log.e(TAG, "❌ Upload failed: ${response.code}, body: $errorBody") throw IOException("Upload failed: ${response.code}") } val responseBody = response.body?.string() ?: throw IOException("Empty response") + Log.d(TAG, "📤 Response body: $responseBody") + // Parse JSON response to get tag val tag = org.json.JSONObject(responseBody).getString("t") diff --git a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt index 8627dd3..ef74c3d 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/chats/ChatViewModel.kt @@ -1934,9 +1934,14 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) { var uploadTag = "" if (!isSavedMessages) { - Log.d(TAG, "👤 📤 Uploading avatar to Transport Server...") - uploadTag = TransportManager.uploadFile(avatarAttachmentId, encryptedAvatarBlob) - Log.d(TAG, "👤 📤 Upload complete, tag: $uploadTag") + try { + Log.d(TAG, "👤 📤 Uploading avatar to Transport Server...") + uploadTag = TransportManager.uploadFile(avatarAttachmentId, encryptedAvatarBlob) + Log.d(TAG, "👤 📤 Upload complete, tag: $uploadTag") + } catch (e: Exception) { + Log.e(TAG, "👤 ❌ Failed to upload avatar to Transport Server", e) + throw e + } } // Preview содержит tag::blurhash (как в desktop)