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 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 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}