* feat(mobile): avif decoder
* decode avif in the core first on android, tone-map hdr like jxl and support premultiplied alpha
* decode avif with rav1d's safe api
* use rav1d's assembly
* thread avif decodes by their tile count
* convert colour-managed avif in bands
* use the codec dependencies' simd kernels
* free avif pictures before resizing
* map avif alpha through a table
* premultiply avif while writing alpha
* drop the avif container after decoding
* use core avif decoder on ios
* fall back to imageio on ios when the core can't decode an avif
---------
Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
* feat(mobile): passkey bridge for android
* fix(mobile): passkey plugin on the main engine only
* register it in configureFlutterEngine and cancel its scope on detach
* pass coroutine cancellation through instead of treating it as an error
* check for Play services 23.08+ before Android 14 in isSupported
* explain why NotAllowedError counts as a cancel
* share one perform function between register and authenticate
* refactor(mobile): move the native core decoders into a codecs crate
* make Format private
* rename the decode export and options for what they hold
* drop the unused ios and server groups and rename the target params
(cherry picked from commit 11bf875313782b8a9e10269bb6f85226b7bdcd72)
* 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
* fix(mobile): retry the background backup when connectivity is restored
* return the backup result from the zone and drop the unrelated upload test
* flip the background worker bool to needsRetry
* decide the background retry from the upload callbacks
* run the background worker offline again and retry on reconnect with a separate connected gated request
* retry the background backup when any upload fails and keep one worker at a time
* always hand the retry to the connected worker and release the worker lock if startWork throws
* respect the charging only setting on the connected retry worker
* 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
* 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