* 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
* wire download status to the ui and dismiss finished entries
* mark finished downloads with a checkmark instead of dismissing
* use the theme color for the done icon and guard status updates on a known task
The lints are regrouped and sorted. Also, added the following new lints:
- unnecessary_ignore
- parameter_assignments
- avoid_unused_constructor_parameters
- tighten_type_of_initializing_formals
- only_throw_errors
- deprecated_consistency
- unnecessary_statements
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* fix(mobile): decode remote thumbnails at displayed size
* use nullable decode size and reuse the tapped thumbnail in the viewer
* clean up decode size naming and guards
* fix(mobile): stop long images squishing on ios
* fix(mobile): bound the original to 16384 with fast resize
* refactor(mobile): reuse the shared request options for the original
* fix(mobile): fix squished long image previews on ios
* fix(mobile): retry with exact resize when fast resize overshoots the texture bound
* fix(mobile): clamp preview targets to a minimum of one pixel
* fix nullable cast flagged by the stricter lints
* fix(mobile): stop websocket reconnect loop draining battery when server is unreachable
* fix(mobile): reconnect when the websocket is inactive and guard resume against pause
* move the test mocks to the service mocks file