7185dca1a2
* feat(reader): add save/share button to image gallery toolbar Add a button to the top-right toolbar of the fullscreen image viewer that saves the currently viewed image to the device. It uses the native or web Share flow where available (iOS/Android/macOS, navigator.share) and falls back to a save dialog or browser download otherwise, reusing the existing export path via appService.saveFile. The button icon and label reflect the active flow (share vs save). Adds dataUrlToBytes/imageExtensionFromMime helpers, unit and component tests, and translations for the new strings across all locales. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(share): write shareable file to a Temp subdirectory to avoid 0-byte share On Android, Tauri's Temp dir is the app cache dir, and the sharekit plugin copies the shared file to <cacheDir>/<name> before firing the share intent. When saveFile wrote the shareable file to the Temp root, that copy became a copy onto itself whose output stream truncated the source to 0 bytes, so the shared image (and any shared export) arrived as a 0 KB file. Write the file to a Temp subdirectory instead so the plugin's copy has a distinct source. Verified on a Xiaomi device: sharing a file in the Temp root truncated it to 0 bytes, while sharing from the subdirectory produced a real, non-empty copy. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(reader): save image to system gallery on Android The Android share sheet cannot save an image to a file (no file manager registers as an ACTION_SEND target), so the Save Image button now writes the image straight into the system photo gallery via MediaStore. It lands in Pictures/Readest, visible in Gallery and the Files app, with no picker and no storage permission on Android 10+. Adds a save_image_to_gallery command to the native-bridge plugin (Rust + Kotlin MediaStore insert) and an appService.saveImageToGallery method. On Android the Save button uses it; iOS/macOS/desktop/web keep the existing share/export flow, and the button label/icon reflect the actual action. Also includes local agent memory notes that were staged alongside. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
45 lines
1.1 KiB
Rust
45 lines
1.1 KiB
Rust
const COMMANDS: &[&str] = &[
|
|
"auth_with_safari",
|
|
"auth_with_custom_tab",
|
|
"copy_uri_to_path",
|
|
"save_image_to_gallery",
|
|
"use_background_audio",
|
|
"install_package",
|
|
"set_system_ui_visibility",
|
|
"get_status_bar_height",
|
|
"get_sys_fonts_list",
|
|
"intercept_keys",
|
|
"lock_screen_orientation",
|
|
"iap_is_available",
|
|
"iap_initialize",
|
|
"iap_fetch_products",
|
|
"iap_purchase_product",
|
|
"iap_restore_purchases",
|
|
"get_system_color_scheme",
|
|
"get_safe_area_insets",
|
|
"get_screen_brightness",
|
|
"set_screen_brightness",
|
|
"get_external_sdcard_path",
|
|
"open_external_url",
|
|
"show_lookup_popover",
|
|
"get_lookup_dictionary",
|
|
"clear_lookup_dictionary",
|
|
"select_directory",
|
|
"get_storefront_region_code",
|
|
"register_listener",
|
|
"remove_listener",
|
|
"request_manage_storage_permission",
|
|
"check_permissions",
|
|
"request_permissions",
|
|
"checkPermissions",
|
|
"requestPermissions",
|
|
"clip_url",
|
|
];
|
|
|
|
fn main() {
|
|
tauri_plugin::Builder::new(COMMANDS)
|
|
.android_path("android")
|
|
.ios_path("ios")
|
|
.build();
|
|
}
|