Skip to content

Releases: t0ma5/tomato-gallery

Release list

1.2

Choose a tag to compare

@github-actions github-actions released this 24 Oct 20:39

New in 1.2

Files

  1. Safe overwrite — Editor Overwrite and Resize encode the new image first, then swap it in atomically. A crash or out-of-memory error mid-save no longer leaves the original at 0 bytes.
  2. Recycle Bin — Burst and RAW+JPEG stack members, and files deleted from Search, now show up in the bin and can be restored. Two files with the same name no longer replace each other in the bin. A failed move keeps the original. Restore deletes the bin copy and skips a file that copied short.
  3. Rotate formats — In-place rotate only rewrites JPEG, PNG and WebP. HEIC, AVIF, JXL, APNG, GIF and animated WebP get a message instead of being turned into JPEG under the old name. Lossless WebP stays lossless. EXIF is kept.
  4. Save errors — A failed copy is reported as a failure. The editor no longer closes as if it saved, and the backup is kept.
  5. Duplicate finder — Matches by size, then a sampled fingerprint, then a full SHA-256, so files that only look alike are never offered for deletion. The list shows full paths with Keep and Delete. Tap a group to choose which copy stays.
  6. Rename and move — Renaming, moving, hiding or deleting a file now updates its cache row, favorite, tags and date. Renaming a locked folder keeps it locked.

Privacy and security

  1. App lock on return — Every screen asks again when you come back after the 5-minute grace period. The grace counts from when you left the app.
  2. Strip metadata on share — Applies to multi-select shares and videos from the player too. A file that cannot be stripped is skipped with a message instead of being sent with its GPS.
  3. Other apps — Other apps can no longer make the gallery write over its own data through a pick or crop request, or open files from locked folders and the Recycle Bin through the editor. The file provider no longer exposes the whole filesystem.
  4. Settings export — Hidden, excluded and included folder lists are left out while their PIN is on.
  5. Boot receiver — Ignores broadcasts other than device boot, so other apps cannot trigger repeated rescans.

Viewer

  1. More sheet — Keeps all its actions after a swipe or a favorite toggle. It used to drop to Rotate only.
  2. Memory — Closed viewers, grid tiles and More sheets are freed. Motion photo players, video players and their surfaces are released on exit, and leftover motion photo clips are cleaned up.
  3. Swipe down — Grabbing the photo again stops the spring under your finger. Dismiss uses real fling speed, so drag, pause and lift no longer closes the photo.
  4. Smoother paging — Extended details, content-link images and large JPEG XL files load off the main thread. Static JXL decodes at screen size instead of full size. Each page reads the file head once for panorama and motion photo checks.
  5. Multi-window and foldables — Resizing no longer restarts the viewer, and tapping still toggles full screen after a restart. Rotating the player no longer stacks extra timers.
  6. Favorites star — No longer shows an outline star on a favorite before favorites finish loading.

Editor

  1. Share with text — Sharing an edit with text or stickers no longer crashes. The shared file is a real PNG.
  2. Save as cancel — Cancelling Save as after a filter keeps the image and filters.
  3. Filters — Filter previews run off the main thread on a screen-sized copy. Undo no longer doubles memory per step.
  4. Video trim — Save is disabled while exporting, so a double tap cannot corrupt the clip. Leaving the screen cancels the export. Long clips no longer time out. The last fraction of a second can be kept.
  5. Lossless rotate edge — The fallback rotate trims partial edge blocks instead of leaving an unrotated strip.

Library

  1. Faster show-all, search and duplicates — The MediaStore is scanned once instead of once per folder on Android 11+. Favorites, recycle bin lookups, name sorting and select-all are much faster on large libraries. Thumbnails no longer read the disk while scrolling.
  2. Search — Results arrive in typing order with a short debounce. Tag search treats _ and % as plain characters. Folders with _ in the name no longer pick up files from look-alike folders.
  3. Folder cache — Rescanning a folder, for example after unhiding it, no longer empties its cache.

Fixes

  1. Settings import — A bad value is skipped instead of crashing the app. Column count 0 can no longer crash every launch.
  2. Wallpaper — Launchers that report a 0 wallpaper size no longer crash Set as wallpaper.
  3. Unofficial package warning — Shows once per app start instead of on every return to Settings.
  4. Widgets — The setup screen shows nothing until the lock is passed. Each widget is sized on its own, and a folder without a thumbnail still opens on tap.

New in 1.1

Motion

  1. Fluid viewer — Swipe down tracks the photo and springs closed or back. Open and back scale from the thumbnail. Toolbar and bottom bar slide on the same path and keep the old gradient. Favorite, share, edit, and delete stay on the bar; the rest sit in a More sheet. Editor tools slide up from the icon that opened them. Grid tiles scale on press. A touch during the slideshow takes the pager. Animator duration scale 0 uses fades only.
  2. Video end — Playback that reaches the end clears the saved resume point, so the next open starts at the beginning. Double-tap skip shows a short chevron on the tapped side. Brightness and volume readouts ease at 0% and 100%.
  3. Hide and unhide — A second hide or unhide of the same file waits until the first rename finishes.
  4. What's new — The dialog stays closed on a normal launch. Older notes used ids above this version, so they matched every time.
  5. Unofficial package — About no longer shows the warning. Settings shows it after 50 starts, and only when the package is not tomato.gallery. OK opens https://github.com/t0ma5/tomato-gallery/

New in 1.0

App

  1. App id tomato.gallery — New application id. Launcher name stays Gallery.

Copy text

  1. Copy text — The photo viewer reads printed text and numbers with on-device PaddleOCR PP-OCRv5, via the ncnnandroidppocr library, and copies them. Nothing is uploaded. This adds ~20MB extra to the apk file but it's a handy feature I wanted to have.

Editor

  1. Lossless JPEG rotate — Viewer Rotate → Save as and editor rotate-only rewrite DCT coefficients (mozjpeg jpegtran) instead of decoding and re-encoding. File size stays about the same.
  2. Save-as EXIF crash — The temp JPEG is closed before EXIF is written, so saveAttributes() no longer throws on a truncated stream.
  3. Editor rotate-only — The initial image load no longer blocks the lossless path. Rotate without crop, filters, or flips uses the same lossless save as the viewer.
  4. Size-capped re-encode — If lossless rotate cannot run, JPEG saves match the source quality and stay near the original file size instead of inflating at quality 90/100.
  5. Editor undo — Undo last tool keeps up to 3 snapshots.
  6. Editor — Font picker for text. Larger adjust slider labels. Toolbar sits below the status bar. Tap 4:3 or 16:9 again to switch to 3:4 or 9:16. Unchecking folder tree view restores the previous grid or list. Draw/text composite onto the full-res bitmap. Text and stickers rotate a full 360°. Double-tap text to edit it. Size slider max is 25% larger. Adjust uses a color-matrix preview. Image rotation keeps unsaved work; Back asks to discard.

Photos

  1. JPEG optimize — jpegoptim: lossless Huffman or lossy max quality (default 85). Atomic write-back, SAF restore on failure, skip Ultra HDR/container JPEGs. EXIF/XMP/ICC/IPTC kept.
  2. Save fixes — Saving over the original on Android 11+ no longer stalls on an invalid MediaStore uri when the file is not indexed yet. List view thumbnails follow the Rounded corners / Square setting like the grid.
  3. EXIF orientation — Viewer and pinch-zoom tiles honour the embedded orientation tag.
  4. Formats — WebP pinch-zoom. Animated JPEG XL plays in the viewer.
  5. Scroll-back — Closing the viewer returns the folder grid to the photo you were on.
  6. Metadata — Remove GPS or all EXIF metadata from photos.
  7. Inherited viewer bug — Fix for a bug inherited from the original code and still present in Fossify Gallery.
  8. Darker dark theme — Dark and Dark red backgrounds are #111111 instead of #2D2D2D. Existing installs are moved over automatically.

Video and panorama

  1. Video trim — Cut a clip to a start/end range and save it next to the original. The toolbar sits below the status bar.
  2. Save frame — Grab the current video frame as a JPEG from the viewer or in-app player.
  3. Motion photos — Play Google / Samsung motion photos in the viewer and save the embedded clip as an MP4. Container:Item XMP is parsed per element. Extracted MP4s are deleted after playback.
  4. 360° panoramas — Open panoramas and photospheres in an OpenGL viewer (touch, pinch, gyroscope).
  5. Status-bar padding — Trim video and 360° panorama toolbars no longer draw under the phone status bar.

Organize

  1. Favorites — Tap the star on a thumbnail or in the viewer; it updates without a reload. Overflow: Show favorites only. Folders stay filled after starring. Properties works on Favorites and Recycle Bin.
  2. Tags — Add or remove tags from the grid or viewer (tap × on a chip). Commas make separate tags. Search matches tag names.
  3. Duplicates — Scan a folder (or all) and delete extra copies. The overflow item sits above Settings.
  4. Collages — CAB on 2–4 photos: side by s...
Read more

1.1

1.1

Choose a tag to compare

@github-actions github-actions released this 10 Oct 20:03

New in 1.1

Motion

  1. Fluid viewer — Swipe down tracks the photo and springs closed or back. Open and back scale from the thumbnail. Toolbar and bottom bar slide on the same path and keep the old gradient. Favorite, share, edit, and delete stay on the bar; the rest sit in a More sheet. Editor tools slide up from the icon that opened them. Grid tiles scale on press. A touch during the slideshow takes the pager. Animator duration scale 0 uses fades only.
  2. Video end — Playback that reaches the end clears the saved resume point, so the next open starts at the beginning. Double-tap skip shows a short chevron on the tapped side. Brightness and volume readouts ease at 0% and 100%.
  3. Hide and unhide — A second hide or unhide of the same file waits until the first rename finishes.
  4. What's new — The dialog stays closed on a normal launch. Older notes used ids above this version, so they matched every time.
  5. Unofficial package — About no longer shows the warning. Settings shows it after 50 starts, and only when the package is not tomato.gallery. OK opens https://github.com/t0ma5/tomato-gallery/

New in 1.0

App

  1. App id tomato.gallery — New application id. Launcher name stays Gallery.

Copy text

  1. Copy text — The photo viewer reads printed text and numbers with on-device PaddleOCR PP-OCRv5, via the ncnnandroidppocr library, and copies them. Nothing is uploaded. This adds ~20MB extra to the apk file but it's a handy feature I wanted to have.

Editor

  1. Lossless JPEG rotate — Viewer Rotate → Save as and editor rotate-only rewrite DCT coefficients (mozjpeg jpegtran) instead of decoding and re-encoding. File size stays about the same.
  2. Save-as EXIF crash — The temp JPEG is closed before EXIF is written, so saveAttributes() no longer throws on a truncated stream.
  3. Editor rotate-only — The initial image load no longer blocks the lossless path. Rotate without crop, filters, or flips uses the same lossless save as the viewer.
  4. Size-capped re-encode — If lossless rotate cannot run, JPEG saves match the source quality and stay near the original file size instead of inflating at quality 90/100.
  5. Editor undo — Undo last tool keeps up to 3 snapshots.
  6. Editor — Font picker for text. Larger adjust slider labels. Toolbar sits below the status bar. Tap 4:3 or 16:9 again to switch to 3:4 or 9:16. Unchecking folder tree view restores the previous grid or list. Draw/text composite onto the full-res bitmap. Text and stickers rotate a full 360°. Double-tap text to edit it. Size slider max is 25% larger. Adjust uses a color-matrix preview. Image rotation keeps unsaved work; Back asks to discard.

Photos

  1. JPEG optimize — jpegoptim: lossless Huffman or lossy max quality (default 85). Atomic write-back, SAF restore on failure, skip Ultra HDR/container JPEGs. EXIF/XMP/ICC/IPTC kept.
  2. Save fixes — Saving over the original on Android 11+ no longer stalls on an invalid MediaStore uri when the file is not indexed yet. List view thumbnails follow the Rounded corners / Square setting like the grid.
  3. EXIF orientation — Viewer and pinch-zoom tiles honour the embedded orientation tag.
  4. Formats — WebP pinch-zoom. Animated JPEG XL plays in the viewer.
  5. Scroll-back — Closing the viewer returns the folder grid to the photo you were on.
  6. Metadata — Remove GPS or all EXIF metadata from photos.
  7. Inherited viewer bug — Fix for a bug inherited from the original code and still present in Fossify Gallery.
  8. Darker dark theme — Dark and Dark red backgrounds are #111111 instead of #2D2D2D. Existing installs are moved over automatically.

Video and panorama

  1. Video trim — Cut a clip to a start/end range and save it next to the original. The toolbar sits below the status bar.
  2. Save frame — Grab the current video frame as a JPEG from the viewer or in-app player.
  3. Motion photos — Play Google / Samsung motion photos in the viewer and save the embedded clip as an MP4. Container:Item XMP is parsed per element. Extracted MP4s are deleted after playback.
  4. 360° panoramas — Open panoramas and photospheres in an OpenGL viewer (touch, pinch, gyroscope).
  5. Status-bar padding — Trim video and 360° panorama toolbars no longer draw under the phone status bar.

Organize

  1. Favorites — Tap the star on a thumbnail or in the viewer; it updates without a reload. Overflow: Show favorites only. Folders stay filled after starring. Properties works on Favorites and Recycle Bin.
  2. Tags — Add or remove tags from the grid or viewer (tap × on a chip). Commas make separate tags. Search matches tag names.
  3. Duplicates — Scan a folder (or all) and delete extra copies. The overflow item sits above Settings.
  4. Collages — CAB on 2–4 photos: side by side, stacked, or 2×2.
  5. Stacks — Stack RAW+JPEG pairs, bursts, and edited copies in the grid. Optional. Sharing can strip GPS/EXIF.
  6. Folders menu — Show hidden and Show excluded are persistent overflow toggles. Tree view is a third option in Change view type: Grid, List, Tree.

Privacy

  1. Lock and intents — Untrusted viewer launches ignore skip-authentication and hidden-path extras. App lock uses a 5-minute grace. Settings import skips PIN-protected keys.
  2. Recycle Bin / backup — Bin lives in files/recycle_bin. Android backup of the bin, database, and PIN hashes is off.
  3. Android Trash / favorites — Optional MediaStore trash on Android 11+ instead of the app Recycle Bin. Favorites also write IS_FAVORITE when the system allows it.

Platform

  1. 16 KB / size — Native libs target 16 KB pages. GitHub ships arm64-v8a, armeabi-v7a, x86_64, and universal FOSS APKs.
  2. Android 16 — compileSdk/targetSdk 36. Media3 1.10.1, JPEG XL decoder 2.6.1.
  3. Other — Locked Favorites/Bin/widget thumbnails; hide/unhide race fix; seeking keeps pause; okio CVE bump; unit tests; translations for new strings.

1.0

1.0

Choose a tag to compare

@github-actions github-actions released this 01 Oct 21:11

New in 1.0

Copy text

  1. Copy text — The photo viewer reads printed text and numbers with on-device PaddleOCR PP-OCRv5, via the ncnnandroidppocr library, and copies them. Nothing is uploaded. This adds ~20MB extra to the apk file but it's a handy feature I wanted to have.

Editor

  1. Lossless JPEG rotate — Viewer Rotate → Save as and editor rotate-only rewrite DCT coefficients (mozjpeg jpegtran) instead of decoding and re-encoding. File size stays about the same.
  2. Save-as EXIF crash — The temp JPEG is closed before EXIF is written, so saveAttributes() no longer throws on a truncated stream.
  3. Editor rotate-only — The initial image load no longer blocks the lossless path. Rotate without crop, filters, or flips uses the same lossless save as the viewer.
  4. Size-capped re-encode — If lossless rotate cannot run, JPEG saves match the source quality and stay near the original file size instead of inflating at quality 90/100.
  5. Editor undo — Undo last tool keeps up to 3 snapshots.
  6. Editor — Font picker for text. Larger adjust slider labels. Toolbar sits below the status bar. Tap 4:3 or 16:9 again to switch to 3:4 or 9:16. Unchecking folder tree view restores the previous grid or list. Draw/text composite onto the full-res bitmap. Text and stickers rotate a full 360°. Double-tap text to edit it. Size slider max is 25% larger. Adjust uses a color-matrix preview. Image rotation keeps unsaved work; Back asks to discard.

Photos

  1. JPEG optimize — jpegoptim: lossless Huffman or lossy max quality (default 85). Atomic write-back, SAF restore on failure, skip Ultra HDR/container JPEGs. EXIF/XMP/ICC/IPTC kept.
  2. Save fixes — Saving over the original on Android 11+ no longer stalls on an invalid MediaStore uri when the file is not indexed yet. List view thumbnails follow the Rounded corners / Square setting like the grid.
  3. EXIF orientation — Viewer and pinch-zoom tiles honour the embedded orientation tag.
  4. Formats — WebP pinch-zoom. Animated JPEG XL plays in the viewer.
  5. Scroll-back — Closing the viewer returns the folder grid to the photo you were on.
  6. Metadata — Remove GPS or all EXIF metadata from photos.
  7. Inherited viewer bug — Fix for a bug inherited from the original code and still present in Fossify Gallery.
  8. Darker dark theme — Dark and Dark red backgrounds are #111111 instead of #2D2D2D. Existing installs are moved over automatically.

Video and panorama

  1. Video trim — Cut a clip to a start/end range and save it next to the original. The toolbar sits below the status bar.
  2. Save frame — Grab the current video frame as a JPEG from the viewer or in-app player.
  3. Motion photos — Play Google / Samsung motion photos in the viewer and save the embedded clip as an MP4. Container:Item XMP is parsed per element. Extracted MP4s are deleted after playback.
  4. 360° panoramas — Open panoramas and photospheres in an OpenGL viewer (touch, pinch, gyroscope).
  5. Status-bar padding — Trim video and 360° panorama toolbars no longer draw under the phone status bar.

Organize

  1. Favorites — Tap the star on a thumbnail or in the viewer; it updates without a reload. Overflow: Show favorites only. Folders stay filled after starring. Properties works on Favorites and Recycle Bin.
  2. Tags — Add or remove tags from the grid or viewer (tap × on a chip). Commas make separate tags. Search matches tag names.
  3. Duplicates — Scan a folder (or all) and delete extra copies. The overflow item sits above Settings.
  4. Collages — CAB on 2–4 photos: side by side, stacked, or 2×2.
  5. Stacks — Stack RAW+JPEG pairs, bursts, and edited copies in the grid. Optional. Sharing can strip GPS/EXIF.
  6. Folders menu — Show hidden and Show excluded are persistent overflow toggles. Tree view is a third option in Change view type: Grid, List, Tree.

Privacy

  1. Lock and intents — Untrusted viewer launches ignore skip-authentication and hidden-path extras. App lock uses a 5-minute grace. Settings import skips PIN-protected keys.
  2. Recycle Bin / backup — Bin lives in files/recycle_bin. Android backup of the bin, database, and PIN hashes is off.
  3. Android Trash / favorites — Optional MediaStore trash on Android 11+ instead of the app Recycle Bin. Favorites also write IS_FAVORITE when the system allows it.

Platform

  1. 16 KB / size — Native libs target 16 KB pages. GitHub ships arm64-v8a, armeabi-v7a, x86_64, and universal FOSS APKs.
  2. Android 16 — compileSdk/targetSdk 36. Media3 1.10.1, JPEG XL decoder 2.6.1.
  3. Other — Locked Favorites/Bin/widget thumbnails; hide/unhide race fix; seeking keeps pause; okio CVE bump; unit tests; translations for new strings.