add delta sync for dm-v13
This commit is contained in:
parent
76229174c0
commit
32da5f3fb2
1 changed files with 36 additions and 8 deletions
|
|
@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue