tauri_plugin_android_fs/
lib.rs1#![cfg_attr(not(target_os = "android"), allow(unused_variables))]
4
5mod models;
6mod cmds;
7mod config;
8mod consts;
9mod utils;
10mod protocols;
11
12pub mod api;
13
14use utils::*;
15
16pub use models::*;
17pub use consts::*;
18
19pub fn init<R: tauri::Runtime>() -> tauri::plugin::TauriPlugin<R, Option<config::Config>> {
33 let builder = tauri::plugin::Builder::<R, Option<config::Config>>::new("android-fs")
34 .setup(|app, api| {
35 use tauri::Manager as _;
36
37 #[cfg(target_os = "android")] {
38 let handle = api.register_android_plugin("com.plugin.android_fs", "AndroidFsPlugin")?;
39 let afs_sync = crate::api::api_sync::AndroidFs { handle: handle.clone() };
40 let afs_async = crate::api::api_async::AndroidFs { handle: handle.clone() };
41 app.manage(afs_sync);
42 app.manage(afs_async);
43
44 app.manage(cmds::new_file_stream_resources_state(app.app_handle().clone()));
45 app.manage(cmds::new_file_writer_resources_state(app.app_handle().clone()));
46
47 #[cfg(any(feature = "protocol-content", feature = "protocol-thumbnail"))] {
48 app.manage(protocols::new_config_state(api.config().as_ref(), app));
49 }
50
51 let app_handle = app.app_handle().clone();
53 std::thread::spawn(move || {
54 let afs = app_handle.android_fs();
55 afs.impls().remove_all_temp_files().ok();
56 });
57 }
58 #[cfg(not(target_os = "android"))] {
59 let afs_sync = crate::api::api_sync::AndroidFs::<R> { handle: Default::default() };
60 let afs_async = crate::api::api_async::AndroidFs::<R> { handle: Default::default() };
61 app.manage(afs_sync);
62 app.manage(afs_async);
63 }
64
65 Ok(())
66 })
67 .js_init_script(format!(
68 "window.__TAURI_ANDROID_FS_PLUGIN_INTERNALS__ = {{ isAndroid: {} }};",
69 cfg!(target_os = "android")
70 ))
71 .invoke_handler(tauri::generate_handler![
72 cmds::get_android_api_level,
73 cmds::get_name,
74 cmds::get_byte_length,
75 cmds::get_mime_type,
76 cmds::get_type,
77 cmds::get_metadata,
78 cmds::get_fs_path,
79 cmds::get_thumbnail,
80 cmds::get_thumbnail_as_bytes,
81 cmds::get_thumbnail_as_base64,
82 cmds::get_thumbnail_as_data_url,
83 cmds::list_volumes,
84 cmds::create_new_public_file,
85 cmds::create_new_public_image_file,
86 cmds::create_new_public_video_file,
87 cmds::create_new_public_audio_file,
88 cmds::scan_public_file,
89 cmds::set_public_file_pending,
90 cmds::request_public_files_permission,
91 cmds::check_public_files_permission,
92 cmds::has_public_files_permission,
93 cmds::create_new_file,
94 cmds::create_dir,
95 cmds::count_all_file_streams,
96 cmds::close_all_file_streams,
97 cmds::open_read_file_stream,
98 cmds::open_read_text_file_lines_stream,
99 cmds::open_write_file_stream,
100 cmds::read_file,
101 cmds::read_file_as_base64,
102 cmds::read_file_as_data_url,
103 cmds::read_text_file,
104 cmds::write_file,
105 cmds::write_text_file,
106 cmds::copy_file,
107 cmds::truncate_file,
108 cmds::read_dir,
109 cmds::rename_file,
110 cmds::rename_dir,
111 cmds::remove_file,
112 cmds::remove_empty_dir,
113 cmds::remove_dir_all,
114 cmds::check_picker_uri_permission,
115 cmds::persist_picker_uri_permission,
116 cmds::check_persisted_picker_uri_permission,
117 cmds::release_persisted_picker_uri_permission,
118 cmds::release_all_persisted_picker_uri_permissions,
119 cmds::show_open_file_picker,
120 cmds::show_open_dir_picker,
121 cmds::show_save_file_picker,
122 cmds::show_share_file_dialog,
123 cmds::show_view_file_dialog,
124 cmds::show_view_dir_dialog,
125 ]);
126
127 #[cfg(all(target_os = "android", feature = "protocol-thumbnail"))]
128 let builder = builder
129 .register_asynchronous_uri_scheme_protocol(
130 protocols::protocol_thumbnail::URI_SCHEME,
131 protocols::protocol_thumbnail::protocol,
132 );
133
134 #[cfg(all(target_os = "android", feature = "protocol-content"))]
135 let builder = builder
136 .register_asynchronous_uri_scheme_protocol(
137 protocols::protocol_content::URI_SCHEME,
138 protocols::protocol_content::protocol,
139 );
140
141 builder.build()
142}
143
144pub trait AndroidFsExt<R: tauri::Runtime> {
145
146 fn android_fs(&self) -> &api::api_sync::AndroidFs<R>;
147
148 fn android_fs_async(&self) -> &api::api_async::AndroidFs<R>;
149}
150
151impl<R: tauri::Runtime, T: tauri::Manager<R>> AndroidFsExt<R> for T {
152
153 fn android_fs(&self) -> &api::api_sync::AndroidFs<R> {
154 self.try_state::<api::api_sync::AndroidFs<R>>()
155 .map(|i| i.inner())
156 .expect("tauri_plugin_android_fs should be initialized to use; see https://crates.io/crates/tauri-plugin-android-fs")
157 }
158
159 fn android_fs_async(&self) -> &api::api_async::AndroidFs<R> {
160 self.try_state::<api::api_async::AndroidFs<R>>()
161 .map(|i| i.inner())
162 .expect("tauri_plugin_android_fs should be initialized to use; see https://crates.io/crates/tauri-plugin-android-fs")
163 }
164}