* fix(web,mobile): avoid duplicate manufacturer in camera name
Some cameras (e.g. Canon) already include the manufacturer in the EXIF
model, which made the details view show "Canon Canon EOS R6m2". Only
prepend the make when the model does not already start with it.
* refactor(web,mobile): address review feedback on camera name helper
- Use toLowerCase instead of toLocaleLowerCase for the comparison
- Hoist the whitespace regex to a static in the Dart helper
- Match any word of the make, so "EASTMAN KODAK COMPANY" with
"KODAK EASYSHARE C875" is deduplicated too
- Compute the camera name once in DetailPanel
---------
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
(cherry picked from commit cb2ea1e308d8a85f2f340f50b646f161d3528670)
* fix(mobile): hide server addresses and tokens in shared logs
* feat(mobile): share logs from the startup error screen
* use only the shared logs patterns on the startup error screen
* fix(mobile): stop writing server urls and oauth values to the log
* fix(mobile): redact logs where they are read
* redact the startup error screen share
* fix(mobile): hide server addresses and tokens in shared logs
* fix(mobile): stop writing server urls and oauth values to the log
* fix(mobile): redact logs where they are read
* fix(mobile): redact logs when they are written
* log the startup error and share it as a log row
* fix(mobile): hide ipv6 addresses and name labels after their settings
* comment why the startup error row is only added here
(cherry picked from commit f7fa8a3a2d2c3b0ab59f90fbcc3c230c58a2aede)
* fix(mobile): hide server addresses and tokens in shared logs
* fix(mobile): stop writing server urls and oauth values to the log
* fix(mobile): redact logs where they are read
* fix(mobile): redact logs when they are written
* fix(mobile): hide ipv6 addresses and name labels after their settings
(cherry picked from commit 89d2de1274a3e1a70a6169f4cfe1feebfb327791)
* 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