* feat(mobile): mobile tags
* fix(mobile); refactoring, replaced hook
* tag provider through asset service
* make search use a tag set
* use tag action directly
* use notification listener
* untag action
* handle untag response
* fix tests and add untag action test
* fix material error from tag picker dialog
* fix(mobile): clip tag picker tiles and update tag overflow
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Santo Shakil <shakil.mezbah@gmail.com>
(cherry picked from commit 83c7ec50056bbefa10869c78457f8882c72275e2)
fix(mobile): show the memories date in every app language (#32259)
(cherry picked from commit 116a9436ad1f8164d9dee904551e5067d724be99)
Co-authored-by: Santo Shakil <santoshakil@users.noreply.github.com>
fix: show date on memories page (#32206)
* fix: show date on memories page
* Clean up API
* Drop imports
---------
(cherry picked from commit 108a3cadbfe3b3e4305c04d8e4217aafb445f626)
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: Adam Gastineau <adam@agg.im>
feat: birthday memory on mobile (#32113)
* feat: birthday memory on mobile
* chore: remove yellow bg colors
* pr feedback
(cherry picked from commit 82cfc4b28b55c660d9c2da00c57437a20585a47b)
Co-authored-by: Alex <alex.tran1502@gmail.com>
fix(mobile): don't re-upload a photo the server already has (#31941)
(cherry picked from commit 02063972e82b1bfd17b6fc2e3b3ff39936229ea5)
Co-authored-by: Santo Shakil <santoshakil@users.noreply.github.com>
fix(mobile): don't start the foreground backup in iOS background launches (#31943)
* fix(mobile): don't start the foreground backup in iOS background launches
* add a TODO to remove the background launch check
(cherry picked from commit 3e4492924541a0e73ea3c326fcfcfcd053871610)
Co-authored-by: Santo Shakil <santoshakil@users.noreply.github.com>
fix(mobile): make the iOS background batch wait for its remote sync (#31942)
* fix(mobile): make the iOS background batch wait for its remote sync
* test onIosUpload itself, the worker reads its sync services from the providers
(cherry picked from commit ad93370f0287faafa7db615c726f32bd9e6d30e7)
Co-authored-by: Santo Shakil <santoshakil@users.noreply.github.com>
fix(mobile): face thumbnail stuck blank after renaming a person (#30769)
* fix(mobile): face thumbnail stuck blank after renaming a person
* flatten the codec error guard and rework the tests around framework driven reuse
* trim the image provider tests and note the per load state rule
* keep two small image provider tests: the renamed face and a late failure of a cancelled load
* clearer image provider tests: return the created completer, comment the steps, drop the unused listener, rename to thumbWithChecksum
* use the provider constructor with a lint ignore in the cache key test
(cherry picked from commit a29153e90e127ee26ad7555f6fb7c562b97b4abe)
Co-authored-by: Santo Shakil <santoshakil@users.noreply.github.com>
* ask before deleting local only photos on android 10 and below
* move the delete consent prompt into _cleanupLocalAssets
* ask on android 11 as well before deleting local photos
* ask before deleting only where android shows no prompt
* split the local delete prompt into its own helper
* pick the local delete dialog in one flat branch and rename notBackedUp to isLocalOnly
* run the first resume after a background launch with a full local sync
* keep the untouched lines of the swift file as they were
* check the background launch at the first resume even after a pause
* play the server copy when the local video file cannot be read
* flatten the video source choice and add tests for it
* drop the platform override from the video viewer test
* fix(mobile): clamp out of range datetimes so timeline queries cannot crash
* replace the per column converters with a clamping custom type
* heal each table in one statement, rename the clamp type, read dates as stored
* one medium test for the clamp, drop the dart side bounds, private clamp type
* fix(mobile): show the real date for android local photos with no exif
photos with no exif date showed their copy-to-phone date in the "on this device" albums instead of the real date. fall back to the earlier of date_modified/date_added (matches the server + ios), plus a migration to fix the rows already saved wrong.
* persist migration progress when the date backfill fails
* fix local date migration for trash and epoch rows
* cover epoch dates in both local asset tables
* simplify the created date pick and rework the migration test
* heal no-exif dates from mediastore in the v27 migration
* check gallery access from dart and skip dates that do not parse
* let the date heal run once and never block the version
* read the trashed assets through the same cast the sync uses
* feat(mobile): stack edited photos over the original on upload
* stack through the asset service and give the live photo still its task metadata
* add plain photo stacking tests and the 2x2 edit detection matrix
* chore(mobile): static Store to unify and streamline reactivity
* Add tests of caching and new stores
* Don't instantiate PeopleDbRepository
* Slight DB rename and fix throwing store methods
* fix(mobile): rewrite slideshow controller system
* Normalize playback status changes
* Improve preloading assets
* Added controller and widget tests
* Minor fixes from PR comments
* More minor fixes
* Move slideshow test after rename
* fix(mobile): keep the original filename when sharing downloaded assets
* use ordinal suffixes for duplicate share filenames
* rename display name maps to totals and duplicates seen
* drop the display name totals map and keep the first copy name clean
* fold the ordinal suffix into the share display name derivation
* resolve share names after download and test through the public flow
* use the renamed store repository in the share tests
* add docstrings to the share file helpers
* simplify the share name resolver to a single set
* note the share_plus cache folder behavior on the resolver
* drop the version pin from the resolver comment
* pin the share_plus version in the resolver comment
* undo the accidental reformat, keep the version pin
* explain the test harness and cut the teardown and wait noise
* say why the storage is stubbed, drop the platform override and busy wait for the share cleanup
* spy on the cleanup in the share tests instead of waiting for it
* feat(mobile): show asset owner in asset details
* refactor(mobile): fetch asset owner from local DB instead of API
* cleanup
* review changes
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* fix: do not exit screen on back multiselect search
* chore: apply suggestion
Co-authored-by: Alex <alex.tran1502@gmail.com>
* refactor: fix in timeline widget
* chore(server): AssetOcrSyncReset.ts
* Revert "chore(server): AssetOcrSyncReset.ts"
This reverts commit c0647382cd63d046fee893ea0ee69503484d19f6.
* fix: test crash
* refactor: fix test instead of code workaround
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* permanently delete local copies when moving to the locked folder
* simplify the delete path and move the stubs into the mock defaults
* drop the kept count from the partial message and log the mismatch instead
* fix(mobile): dedupe stale remote_asset rows on sync
queue a pre-delete on the matching partial-index tuple before each
upsert in updateAssetsV1/V2 so the second insert does not crash on
SqliteException(2067) when the server re-issues a new id for the
same (ownerId, checksum). closes#22522#27186.
* run the dedupe deletes before the inserts and keep only the last duplicate per payload
* switch the asset upsert to insert or replace
* trim the dedupe tests to the essentials
* fix(mobile): order album/place/person timelines by local date
* fold the timeline date ordering into one helper and tighten the tests
* drop the redundant none guard from the place asset query
* format