• Removed YYImage and libWebP dependencies (replaced with custom `AnimatedImageView` class)
• Fixed an issue where animated images (WebP/GIF) may not correctly render in the "All Media" grid UI
• Fixed an issue where selecting a GIF for the display picture would incorrectly convert it into a JPG instead of keeping the GIF
• Updated to GRDB 7.3.0 (from 6.29.3)
• Updated the ConfigMessageReceiveJob and MessageReceiveJob to use the `writeAsync` function (instead of the blocking `write` function) so that they aren't subject to the `Storage.transactionDeadlockTimeoutSeconds`
• Refactored the `Storage.performOperation` and `Storage.performPublisherOperation` to rely on the new cancellable async/await `Task` logic that GRDB 7 supports (as apparently the other async methods don't support cancellation...)
• Cleaned up some "Sendable" related warnings
• Minor tweaks to `Log.assertOnMainThread` to make it a little more readable
• Using a pre-built version of libSession as a SPM dependency for default builds
• Added a new scheme which will try to build libSession from source (update the `LIB_SESSION_SOURCE_DIR` User-Defined build setting to change the location - currently set to '${SRC_ROOT}/../LibSession-Util')
• Removed the libSession submodule
• Added a 'requireAllRequestsSucceed' flag to the ConfigurationSyncJob (so it'll report a failure if any individual request fails)
• Fixed an issue where a number of 'response' types weren't encoding correctly (only impacted unit tests)
• Fixed an issue where the logger wasn't correctly respecting the log level settings
• Fixed an issue where the path status indicator wouldn't default to unknown
• Fixed an issue where the generic database error didn't replace the 'app_name' variable
• Fixed an issue where notification content might not be shown correctly
• Fixed an issue where a group could be partially created due to one of it's configs failing to be stored (we now consider that a failure so the user can try again)
• Fixed an issue where processing a config message in the BackgroundPoller could result in attempting to fetch from communities after the process completed
• Fixed a crash where a database query could incorrectly be interrupted after it completed if both happened at just the right time
• Fixed broken unit tests
• Fixed an issue where leaving a group from the settings screen would just sit there until you successfully left
• Fixed an issue where admin display pictures didn't have the crown icon in the conversation screen
• Added an env variable to enable the debug disappearing message durations
• Moved the 'processUnitTestEnvVariablesIfNeeded' function into a separate file and added some docs (so we can just look at that file to see what is supported)
• Fixed an issue where the deleted message artifact variant had incorrectly gotten it's value changed (too late to change it back so need a migration)
• Attempt to fix an issue where the CI couldn't find a test simulator because it didn't exist (now try to grab the latest)
• Refactored the notification service extension logging to be more helpful and allow for better tracking
• Fixed a minor layout issue on devices with a home button
• Fixed an issue where display pictures could be given the wrong file extension because we were assuming jpeg
• Fixed an issue where disabling the "Auto dark-mode" setting may not correctly trigger a theme update
• Fixed an issue where returning to the settings screen from a child screen would result in the screen jumping
• Fixed an issue where migrating the community display picture would fail
• Fixed an issue where failing to decrypt a config message push notification would incorrectly result in the fallback notification being shown
• Refactored the 'performOperation' function to have cleaner control flow and resolve another EXC_BAD_ACCESS edge case
• Updated the code to allow legacy groups to be unpinned after they are deprecated
• Fixed an issue where the default state of the global search screen wouldn't be populated if you had a contact with no SessionThread record
• Fixed an issue with display picture placeholder generation
• Fixed an issue where the edit group screen would show the group display picture back to front
• Updated the code to set and check the 'sigTimestamp' value in order to validate the envelope.timestamp when possible
• Disabled the delete/select buttons on the attachment screens in legacy groups once deprecated
• Disabled the ability to remove reactions from the reaction list in legacy groups once deprecated
• Fixed an issue where the "expired groups" banner could incorrectly appear after creating a new group
• Fixed an issue where the ConfigSyncJob wouldn't report it's failure immediately
• Added the "expired group" banner for when the first poll of an updated group doesn't retrieve config messages
• Removed a redundant base64 encode/decode
• Removed messy extra message validation function
• Fixed an edge-case where a member granted supplemental access to the group could end up incorrectly kicked under the right conditions
• Fixed an issue where the copy for deleting a deprecated legacy group wasn't accurate
• Added a 'forceSlowDatabaseQueries' dev setting to help track down main thread database queries
• Updated the unit tests to use a NoopNetworkCache by default when running unit tests
• Updated the custom debug sync query timer to poll more frequently for the first few iterations
• Fixed the broken unit tests
• Fixed the bad memory issue again (wasn't properly fixed...)
• Fixed an issue where the keyboard wouldn't reappear after deleting a message
• Fixed an issue where the toast shown after deleting a message could do a weird appearance animation
• Fixed an issue where legacy group invites were incorrectly still being handled once legacy groups were deprecated
• Fixed an issue where control messages could incorrectly leave a deletion artifact when triggering "delete before now"
• Fixed an issue where the typing indicator logic could run on the main thread (was also overly complex)
• Fixed an issue where we were clearing the incoming typing indicator too quickly (5s vs 15s like other platforms)
• Fixed an issue where the GroupPoller could incorrectly wait for longer than it should between polls if a message was deleted (there will be a better approach we should use in the future when we have an `active_at` flag for the conversation)
• Added code to schedule any missing recurring jobs (so we no longer need to worry that the jobs have been lost or the migrations that added them ran correctly in their final state)
• Added the 'FailedGroupInvitesAndPromotionsJob' to flag invites/promotions which weren't sent before the app closed as failed
• Updated to the latest libweb
• Updated to the latest libSession
• Updated the config sync job to delay marking itself as failed if the network is not connected (it'll now observer the network status and trigger the failure callback when reconnected, which will result in another sync attempt shortly after - this will prevent a disabled network from building up the failure count excessively causing sync delays)
• Fixed a bad memory race condition which could occur with the new `Storage.performOperation` logic