Skip to main content

lingxia_platform/traits/
media_interaction.rs

1use std::future::Future;
2
3use crate::error::PlatformError;
4
5#[derive(Debug, Clone)]
6pub struct PreviewMediaItem {
7    pub path: String,
8    pub media_type: MediaKind,
9    pub cover_path: Option<String>,
10    pub rotate: Option<u16>,
11    pub object_fit: Option<MediaObjectFit>,
12    pub duration_ms: Option<u64>,
13}
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
16pub enum PreviewMediaAdvance {
17    #[default]
18    Manual,
19    Next,
20    Loop,
21}
22
23impl PreviewMediaAdvance {
24    pub fn as_str(self) -> &'static str {
25        match self {
26            Self::Manual => "manual",
27            Self::Next => "next",
28            Self::Loop => "loop",
29        }
30    }
31}
32
33#[derive(Debug, Clone)]
34pub struct PreviewMediaRequest {
35    pub items: Vec<PreviewMediaItem>,
36    pub start_index: i32,
37    pub advance: PreviewMediaAdvance,
38    pub show_index_indicator: bool,
39    /// Internal callback_id for abort signal support.
40    pub callback_id: u64,
41}
42
43#[derive(Debug, Clone, Copy, PartialEq, Eq)]
44pub enum MediaKind {
45    Image,
46    Video,
47    Unknown,
48}
49
50#[derive(Debug, Clone, Copy, PartialEq, Eq)]
51pub enum MediaObjectFit {
52    Cover,
53    Contain,
54    Fill,
55    Fit,
56}
57
58#[derive(Debug, Clone, Copy, PartialEq, Eq)]
59pub enum ChooseMediaMode {
60    Images,
61    Videos,
62    Mix,
63}
64
65#[derive(Debug, Clone, Copy, PartialEq, Eq)]
66pub enum MediaSource {
67    Album,
68    Camera,
69}
70
71#[derive(Debug, Clone, Copy, PartialEq, Eq)]
72pub enum CameraFacing {
73    Front,
74    Back,
75}
76
77#[derive(Debug, Clone, Copy, PartialEq, Eq)]
78pub enum MediaQuality {
79    Original,
80    Compressed,
81}
82
83#[derive(Debug, Clone)]
84pub struct ChooseMediaRequest {
85    pub max_count: u32,
86    pub mode: ChooseMediaMode,
87    pub source_types: Vec<MediaSource>,
88    pub max_duration_seconds: Option<u32>,
89    pub camera_facing: Option<CameraFacing>,
90}
91
92impl Default for ChooseMediaRequest {
93    fn default() -> Self {
94        Self {
95            max_count: 9,
96            mode: ChooseMediaMode::Images,
97            source_types: vec![MediaSource::Album, MediaSource::Camera],
98            max_duration_seconds: None,
99            camera_facing: None,
100        }
101    }
102}
103
104#[derive(Debug, Clone, Copy, PartialEq, Eq)]
105pub enum ScanType {
106    BarCode,
107    QrCode,
108    DataMatrix,
109    Pdf417,
110}
111
112#[derive(Debug, Clone)]
113pub struct ScanCodeRequest {
114    pub scan_types: Vec<ScanType>,
115    pub only_from_camera: bool,
116}
117
118impl Default for ScanCodeRequest {
119    fn default() -> Self {
120        Self {
121            scan_types: Vec::new(),
122            only_from_camera: true,
123        }
124    }
125}
126
127#[derive(Debug, Clone)]
128pub struct SaveMediaRequest {
129    pub file_uri: String,
130}
131
132pub trait MediaInteraction: Send + Sync + 'static {
133    /// Preview media. Keeps callback_id pattern for AbortSignal support.
134    fn preview_media(&self, request: PreviewMediaRequest) -> Result<(), PlatformError>;
135    fn cancel_preview(&self, callback_id: u64) -> Result<(), PlatformError>;
136
137    fn choose_media(
138        &self,
139        request: ChooseMediaRequest,
140    ) -> impl Future<Output = Result<String, PlatformError>> + Send;
141
142    fn scan_code(
143        &self,
144        request: ScanCodeRequest,
145    ) -> impl Future<Output = Result<String, PlatformError>> + Send;
146
147    fn save_image_to_photos_album(
148        &self,
149        request: SaveMediaRequest,
150    ) -> impl Future<Output = Result<(), PlatformError>> + Send;
151
152    fn save_video_to_photos_album(
153        &self,
154        request: SaveMediaRequest,
155    ) -> impl Future<Output = Result<(), PlatformError>> + Send;
156}