对齐旅拍相册详情页 Android UI,并修复网格预览与布局问题。

重构相册详情为信息卡片、Tab 筛选、排序、批量删除与底部上传栏;修复网格重叠、禁用按钮蒙层,并支持点击预览大图。同步扩展素材列表 API 与 ViewModel 分页逻辑,并优化有线传图缩略图与传输性能。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-30 13:53:59 +08:00
parent c71b45bdfd
commit 5e620623eb
23 changed files with 2000 additions and 288 deletions

View File

@ -24,6 +24,8 @@ struct CameraTransferTask: Identifiable, Equatable, Codable {
let filename: String
var localPath: String?
var remoteURL: String?
/// `yyyy-MM-dd HH:mm:ss`
var capturedAt: String?
var status: CameraTransferStatus
var progress: Int
var errorMessage: String?
@ -34,6 +36,7 @@ struct CameraTransferTask: Identifiable, Equatable, Codable {
filename: String,
localPath: String? = nil,
remoteURL: String? = nil,
capturedAt: String? = nil,
status: CameraTransferStatus = .pending,
progress: Int = 0,
errorMessage: String? = nil
@ -43,11 +46,36 @@ struct CameraTransferTask: Identifiable, Equatable, Codable {
self.filename = filename
self.localPath = localPath
self.remoteURL = remoteURL
self.capturedAt = capturedAt
self.status = status
self.progress = progress
self.errorMessage = errorMessage
}
/// 使
static func capturedAtString(from date: Date?) -> String {
Self.capturedAtFormatter.string(from: date ?? Date())
}
///
static func capturedAtString(forLocalPath path: String) -> String? {
guard let url = CameraDownloadStorage.resolveLocalURL(from: path),
FileManager.default.fileExists(atPath: url.path),
let attributes = try? FileManager.default.attributesOfItem(atPath: url.path)
else { return nil }
let date = (attributes[.creationDate] as? Date)
?? (attributes[.modificationDate] as? Date)
return date.map { capturedAtString(from: $0) }
}
private static let capturedAtFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "zh_CN")
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
return formatter
}()
/// URL
var localURL: URL? {
guard let localPath, !localPath.isEmpty else { return nil }