feat: Implement local file management for avatar attachments with download status checks
This commit is contained in:
@@ -1112,15 +1112,35 @@ fun AvatarAttachment(
|
||||
|
||||
val timeFormat = remember { java.text.SimpleDateFormat("HH:mm", java.util.Locale.getDefault()) }
|
||||
|
||||
// Определяем начальный статус (как в Desktop calcDownloadStatus для AVATAR)
|
||||
LaunchedEffect(attachment.id) {
|
||||
downloadStatus = when {
|
||||
attachment.blob.isNotEmpty() && !isDownloadTag(attachment.preview) -> {
|
||||
DownloadStatus.DOWNLOADED
|
||||
withContext(Dispatchers.IO) {
|
||||
downloadStatus = when {
|
||||
// 1. Если blob уже есть в памяти → DOWNLOADED
|
||||
attachment.blob.isNotEmpty() -> {
|
||||
Log.d(TAG, "📦 Avatar blob in memory for ${attachment.id}")
|
||||
DownloadStatus.DOWNLOADED
|
||||
}
|
||||
// 2. Если preview НЕ содержит UUID → локальный файл → DOWNLOADED
|
||||
!isDownloadTag(attachment.preview) -> {
|
||||
Log.d(TAG, "📦 No download tag for avatar ${attachment.id}")
|
||||
DownloadStatus.DOWNLOADED
|
||||
}
|
||||
// 3. Есть UUID (download tag) → проверяем файловую систему
|
||||
// Desktop: readFile(`a/${md5(attachment.id + publicKey)}`)
|
||||
else -> {
|
||||
val hasLocal = AvatarFileManager.hasAvatarByAttachmentId(
|
||||
context, attachment.id, senderPublicKey
|
||||
)
|
||||
if (hasLocal) {
|
||||
Log.d(TAG, "📦 Found local avatar file for ${attachment.id}")
|
||||
DownloadStatus.DOWNLOADED
|
||||
} else {
|
||||
Log.d(TAG, "📥 Need to download avatar ${attachment.id}")
|
||||
DownloadStatus.NOT_DOWNLOADED
|
||||
}
|
||||
}
|
||||
}
|
||||
isDownloadTag(attachment.preview) -> {
|
||||
DownloadStatus.NOT_DOWNLOADED
|
||||
}
|
||||
else -> DownloadStatus.DOWNLOADED
|
||||
}
|
||||
|
||||
// Decode blurhash
|
||||
@@ -1134,9 +1154,27 @@ fun AvatarAttachment(
|
||||
}
|
||||
}
|
||||
|
||||
if (downloadStatus == DownloadStatus.DOWNLOADED && attachment.blob.isNotEmpty()) {
|
||||
// Загружаем аватар если статус DOWNLOADED
|
||||
if (downloadStatus == DownloadStatus.DOWNLOADED) {
|
||||
withContext(Dispatchers.IO) {
|
||||
avatarBitmap = base64ToBitmap(attachment.blob)
|
||||
// 1. Сначала пробуем blob из памяти
|
||||
if (attachment.blob.isNotEmpty()) {
|
||||
Log.d(TAG, "🖼️ Loading avatar from blob")
|
||||
avatarBitmap = base64ToBitmap(attachment.blob)
|
||||
} else {
|
||||
// 2. Читаем из файловой системы (как в Desktop getBlob)
|
||||
Log.d(TAG, "🖼️ Loading avatar from local file")
|
||||
val localBlob = AvatarFileManager.readAvatarByAttachmentId(
|
||||
context, attachment.id, senderPublicKey
|
||||
)
|
||||
if (localBlob != null) {
|
||||
avatarBitmap = base64ToBitmap(localBlob)
|
||||
Log.d(TAG, "✅ Avatar loaded from local file")
|
||||
} else {
|
||||
Log.w(TAG, "⚠️ Failed to read local avatar file")
|
||||
downloadStatus = DownloadStatus.NOT_DOWNLOADED
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1164,8 +1202,18 @@ fun AvatarAttachment(
|
||||
if (decrypted != null) {
|
||||
withContext(Dispatchers.IO) {
|
||||
avatarBitmap = base64ToBitmap(decrypted)
|
||||
|
||||
// 💾 Сохраняем в файловую систему по attachment.id (как в Desktop)
|
||||
// Desktop: writeFile(`a/${md5(attachment.id + publicKey)}`, encrypted)
|
||||
AvatarFileManager.saveAvatarByAttachmentId(
|
||||
context = context,
|
||||
base64Image = decrypted,
|
||||
attachmentId = attachment.id,
|
||||
publicKey = senderPublicKey
|
||||
)
|
||||
Log.d(TAG, "💾 Avatar saved to local file system")
|
||||
}
|
||||
// Сохраняем аватар в репозиторий
|
||||
// Сохраняем аватар в репозиторий (для UI обновления)
|
||||
avatarRepository?.saveAvatar(senderPublicKey, decrypted)
|
||||
downloadStatus = DownloadStatus.DOWNLOADED
|
||||
Log.d(TAG, "✅ Avatar downloaded and saved")
|
||||
|
||||
Reference in New Issue
Block a user