baldav/docs/session-logs/2026-09-14_share-image.md
4aiman 5fe30399ab Share image Stage 2: native save/share + settings background picker
Rust export_image(filename,base64,action) + read_file_base64(path) (registered).
Kotlin exportimg: branch — base64-decode, then SAF-save the PNG (CreateDocument
image/png) or share it via FileProvider + ACTION_SEND chooser. Settings gets a
'Фон для картинки' row: pick a photo (pickLocalFile image/*), read it as base64,
downscale to <=1080 and store as a data URL in localStorage for the 'С фото'
variant. Rust compiles in tauri dev; native paths need an APK rebuild to test.
2026-09-14 10:38:29 +03:00

3.6 KiB
Raw Permalink Blame History

Сессия 2026-09-14 — шэр-картинка трека («Похвастаться»)

Контекст

Пользователь хочет делиться картинкой поездки: форма трека + крупные статы (как на скрине), прозрачная или на фото-подложке. План docs/plans/2026-09-14-share-image.md. Согласовано: кнопка даёт «Поделиться» и «Сохранить»; в диалоге переключатель прозрачный/фото; статы — дистанция, время, средняя скорость + набор/ккал/дата.

Разведка: save_file (SAF, текст) — не годится для бинаря PNG; нужен нативный бинарный сейв + ACTION_SEND (FileProvider уже в манифесте, file_paths с cache-path есть) + чтение фото в base64 (Rust). Canvas в WebView доступен.

Сделано — Стадия 1 (рендер + модалка + кнопка), чистый JS

  • buildShareImage(session, stats, points, opts) (main.js): холст 1080×1920; фон прозрачный или фото (cover-fit + тёмный градиент); форма трека (проекция точек, линия цвета трека со свечением); статы крупно Distance/Time/Speed + мелко ↑набор/ккал/дата; белый текст с тенью.
  • showShareModal — предпросмотр <img> + переключатель Прозрачный/С фото + кнопки Поделиться/Сохранить/Закрыть. exportShareImage(dataUrl, filename, action) зовёт invoke("export_image") (нативной команды пока нет — на десктопе тост-ошибка, это ок).
  • Кнопка #sd-share «Похвастаться» в детали трека. CSS .share-modal (шахматка под прозрачность).

Сделано — Стадия 2 (нативный вывод + подложка)

  • Rust export_image(filename, base64, action) (пишет base64 + команду exportimg: в мост) и read_file_base64(path) (для чтения выбранного фото); зарегистрированы.
  • Kotlin: ветка exportimg: — Base64-декод; save → saveImageLauncher (CreateDocument image/png, байты), share → запись в cacheDir/shared, FileProvider URI, ACTION_SEND image/png через чузер.
  • Настройки: строка «Фон для картинки» (Выбрать/Сброс): pickLocalFile("image/*") → read_file_base64 → даунскейл ≤1080 → localStorage.baldav_share_bg (jpeg 0.85).

Проверка

  • Стадия 1 рендер — ПРОВЕРЕНО на десктопе (Xvfb): модалка рисует форму трека + Distance/Time/ Speed + ↑набор/ккал/дата, прозрачный PNG (шахматка), переключатель/кнопки. Скрин.
  • lib.rs пересобрался в tauri dev без ошибок (команды компилируются/регистрируются).
  • Нативный save/share/чтение фото и Kotlin — ТОЛЬКО на теле после ./build.sh android -d -i.

Дальше

  • Пересборка APK и тест на теле: «Поделиться» (чузер), «Сохранить» (SAF), выбор подложки → вариант «С фото». По явной просьбе.