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