add delta sync for dm-v13

This commit is contained in:
eric 2026-08-05 17:56:59 +08:00
parent 76229174c0
commit 32da5f3fb2

View file

@ -85,6 +85,12 @@ data class AudioItem(
val duration: Long val duration: Long
) )
// 影片資料結構
data class VideoItem(
val uri: Uri,
val duration: Long
)
data class AttachmentOption( data class AttachmentOption(
val title: String, val title: String,
val icon: ImageVector, val icon: ImageVector,
@ -108,7 +114,7 @@ fun MessageAttachmentBar(
// 資料狀態 // 資料狀態
val localImages = remember { mutableStateListOf<Uri>() } val localImages = remember { mutableStateListOf<Uri>() }
val localVideos = remember { mutableStateListOf<Uri>() } val localVideos = remember { mutableStateListOf<VideoItem>() }
val localAudios = remember { mutableStateListOf<AudioItem>() } val localAudios = remember { mutableStateListOf<AudioItem>() }
var refreshTrigger by remember { mutableStateOf(0) } var refreshTrigger by remember { mutableStateOf(0) }
@ -167,21 +173,28 @@ fun MessageAttachmentBar(
// 🎯 新增:讀取影片的 Effect // 🎯 新增:讀取影片的 Effect
LaunchedEffect(refreshTrigger) { LaunchedEffect(refreshTrigger) {
val videoUris = mutableListOf<Uri>() val videoItems = mutableListOf<VideoItem>()
val projection = arrayOf(MediaStore.Video.Media._ID, MediaStore.Video.Media.DATE_TAKEN) val projection = arrayOf(
MediaStore.Video.Media._ID,
MediaStore.Video.Media.DATE_TAKEN,
MediaStore.Video.Media.DURATION
)
val sortOrder = "${MediaStore.Video.Media.DATE_TAKEN} DESC" val sortOrder = "${MediaStore.Video.Media.DATE_TAKEN} DESC"
try { try {
context.contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, null, null, sortOrder)?.use { cursor -> context.contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, projection, null, null, sortOrder)?.use { cursor ->
val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID) val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)
val durationColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)
var count = 0 var count = 0
while (cursor.moveToNext() && count < 24) { while (cursor.moveToNext() && count < 24) {
val id = cursor.getLong(idColumn) val id = cursor.getLong(idColumn)
videoUris.add(ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id)) val duration = cursor.getLong(durationColumn)
val uri = ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id)
videoItems.add(VideoItem(uri, duration))
count++ count++
} }
} }
localVideos.clear() localVideos.clear()
localVideos.addAll(videoUris) localVideos.addAll(videoItems)
} catch (e: SecurityException) { } catch (e: SecurityException) {
localVideos.clear() localVideos.clear()
} }
@ -358,15 +371,15 @@ fun MessageAttachmentBar(
} }
} }
items(localVideos) { uri -> items(localVideos) { video ->
Box( Box(
modifier = Modifier modifier = Modifier
.aspectRatio(1f) .aspectRatio(1f)
.clip(RoundedCornerShape(12.dp)) .clip(RoundedCornerShape(12.dp))
.clickable { onVideoSelected(uri) } .clickable { onVideoSelected(video.uri) }
) { ) {
AsyncImage( AsyncImage(
model = uri, model = video.uri,
contentDescription = "影片預覽", contentDescription = "影片預覽",
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
contentScale = androidx.compose.ui.layout.ContentScale.Crop contentScale = androidx.compose.ui.layout.ContentScale.Crop
@ -380,6 +393,21 @@ fun MessageAttachmentBar(
.size(32.dp) .size(32.dp)
.align(Alignment.Center) .align(Alignment.Center)
) )
// 🎯 新增:顯示影片時長
Box(
modifier = Modifier
.align(Alignment.BottomEnd)
.padding(4.dp)
.background(Color.Black.copy(alpha = 0.6f), RoundedCornerShape(4.dp))
.padding(horizontal = 4.dp, vertical = 2.dp)
) {
Text(
text = formatDuration(video.duration),
color = Color.White,
style = MaterialTheme.typography.labelSmall
)
}
} }
} }
} }