Add TravelAlbum, ProfileSpace, and wired camera transfer modules.
Introduce travel album entry with Sony PTP tethering pipeline, profile space settings page, home routing updates, Launch Screen storyboard, and related tests/docs. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@ -0,0 +1,33 @@
|
||||
import Foundation
|
||||
|
||||
enum CameraServiceError: LocalizedError {
|
||||
case notConnected
|
||||
case assetNotFound
|
||||
case downloadFailed(String)
|
||||
case permissionDenied
|
||||
|
||||
var errorDescription: String? {
|
||||
switch self {
|
||||
case .notConnected:
|
||||
"相机未连接"
|
||||
case .assetNotFound:
|
||||
"找不到相机内的文件"
|
||||
case .downloadFailed(let reason):
|
||||
"下载失败:\(reason)"
|
||||
case .permissionDenied:
|
||||
"未获得相机访问权限"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protocol CameraServiceProtocol: AnyObject {
|
||||
var brand: CameraBrand { get }
|
||||
var connectionState: CameraConnectionState { get }
|
||||
var onConnectionStateChange: ((CameraConnectionState) -> Void)? { get set }
|
||||
var onNewAsset: ((CameraAsset) -> Void)? { get set }
|
||||
|
||||
func connect() async
|
||||
func disconnect() async
|
||||
func listAssets() async throws -> [CameraAsset]
|
||||
func downloadAsset(_ asset: CameraAsset) async throws -> URL
|
||||
}
|
||||
Reference in New Issue
Block a user