* feat(mobile): slideshow view
* move slideshow settings to metadata store
* remove watch in initState
* wrap progress bar in safearea
* show slideshow button on remote albums
* fix crash on unknown assets
* always show slideshow option
* add zoom effect
* add padding to slideshow settings
* chore: styling tweak
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
fix(mobile): use correct delete for trashed assets
When viewing a trashed asset, the viewer bottom bar now shows the permanent delete button instead of the trash button, which had no effect on already-trashed assets.
* fix(mobile): clear linkedRemoteAlbumId in reset() so FK refs dont dangle
reset() runs with foreign_keys off before wiping remote_* tables, so the ON DELETE SET NULL cascade on linkedRemoteAlbumId doesnt fire. local rows keep pointing at deleted remote ids.
affects logout (clearLocalData calls reset()) and the server SyncResetV1 path (30 day idle, etc). after re-login, syncLinkedAlbum either silently warns or fires 400s (those are covered by #28299).
null the column manually inside the same transaction. cascade still works for normal SyncAlbumDeleteV1.
verified on pixel 9a with this branch built locally: logged out, deleted album from web, logged back in. without fix linkedRemoteAlbumId stayed dangling. with fix all three local rows have linkedRemoteAlbumId = NULL after the logout reset, and recovery is clean once manageLinkedAlbums runs again.
* fix(mobile): always re-enable foreign_keys in reset() + simplify the update
re-enable foreign_keys inside a try/finally so it always runs even if the transaction throws. without this, a failed reset would leave the connection with foreign_keys = OFF and silently disable cascades for everything after (per copilot review).
also drop the where filter on the linkedRemoteAlbumId update, unconditional update-all is simpler and we wipe everything in reset anyway (per ganka review).
fix(mobile): deduplicate assets in person view timeline
Previously, assets with multiple face records for the same person (e.g.,
manual Digikam imports and Immich ML detections) appeared multiple times
in the person timeline. This was caused by an inner join on the
assetFaceEntity without proper deduplication.
This commit refactors the timeline queries to use a subquery approach
instead of joins and grouping. This ensures:
- _getPersonBucketAssets: Only unique assets are fetched, even if
multiple face records exist for a single asset.
- _watchPersonBucket: Asset counts in timeline headers are accurate
and represent unique assets.
- Performance: Database overhead is reduced by avoiding complex joins
and explicit groupBy operations on large result sets.
Signed-off-by: thowdev <12428285+thowdev@users.noreply.github.com>
* refactor: app metadata
* refactor to per row store
* cleanup
* more test
* review changes
* more refactor
* refactor
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* use cookiejar
* cookie duping hook
* remove old pref
* handle network switching on logout
* remove bootstrapCookies
* dead code
* fix cast
* use constants
* use new event name
* update api
Search results are replaced with a spinner when loading the next page,
which is quite jarring. Search results now remain visible when loading
the next page with a spinner at the bottom. The next page also loads
sooner, which makes it feel a lot smoother.
Co-authored-by: Alex <alex.tran1502@gmail.com>
* feat: add playbackStyle to local asset entity and related database schema
* implement conversion function for playbackStyle in local sync service
* implement conversion function for playbackStyle in local sync service
* refactor: remove deducedPlaybackStyle from TrashedLocalAssetEntityData
* add playbackStyle column to trashed local asset entity
* make playbackStyle non-nullable across the mobile codebase
* Streamline playbackStyle backfill:
- only backfill local assets playbackStyle in flutter/dart code
- only update trashed local assets in db migration
* bump target database version to 23 and update migration logic for playbackStyle
* set playback_style to 0 in merged_asset.drift as its a getter in base asset
* run make pigeon
* Populate playbackStyle for trashed assets during native migration
* feat(mobile): add support for encoded image requests in local and remote image APIs
* fix(mobile): handle memory cleanup for cancelled image requests
* refactor(mobile): simplify memory management and response handling for encoded image requests
* fix(mobile): correct formatting in cancellation check for image requests
* Apply suggestion from @mertalev
Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
* refactor(mobile): rename 'encoded' parameter to 'preferEncoded' for clarity in image request APIs
* fix(mobile): ensure proper resource cleanup for cancelled image requests
* refactor(mobile): streamline codec handling by removing unnecessary descriptor disposal in loadCodec request
---------
Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
* feat: SyncAssetV2
* feat: mobile sync handling
* feat: request correct sync object based on server version
* fix: mobile queries
* chore: sync sql
* fix: test
* chore: switch to mapper
* fix: sql sync
* perf(mobile): optimized album sorting
* refactor: add index & sql query
* fix: migration
* refactor: enum, ordering & list
* test: update album service tests
* chore: fix enums
broken during merging main
* chore: remove unnecessary tests
* test: add tests for getSortedAlbumIds
* test: added back stubs in service test
* Change path prefix from '/memories/' to '/people/'
Updated the AndroidManifest.xml to change the path prefix from '/memories/' to '/people/'.
Memories is anyway wrong and was replaced by /memory
and now the people path completes the known deeplinks.
* Add regex for people deep link handling
Add regex for people deep link handling
* Add deep link handling for 'people' route
* fix: missing person route builder method
---------
Co-authored-by: bwees <brandonwees@gmail.com>
* feat: album exclusion filter in free up space
* feat: make keep options into persistent settings
* chore: refactor
* chore: refactor
* add free up space to app bar dialog
* fix: date selection rerender
* more copywriting
* Update i18n/en.json
Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
* add file size information
* styling
* clear up stale album id
* keep messaging album on first use
* feedback
* feedback
---------
Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>