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