• 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
• Refactored the remaining `SNLog` calls
• Added support for a 'customSuffix' to the log categories (similar to the 'customPrefix' it allows category name manipulation whilst keeping the existing log level settings)
• Improved logging in the PN extension
• Fixed an issue where the PN extension would end up with duplicate logs every time a new PN was received
• Fixed an issue where the PN extension would needlessly dispatch it's setup to the main thread
• Fixed an issue where the PN extension would try to read from the database after suspending it
• Fixed an issue where the PN extension could try to complete on a non-main thread (eg. db threads) which _might_ cause odd behaviours
• 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)
• Updated to the latest libSession
• Fixed some warnings
• Fixed a compilation issue on non-debug builds
• Fixed an issue with the dev settings data importer when ignoring hidden files from old exports (wouldn't move the inputStream forward correctly resulting in a crash)
• Fixed an issue where the swarm poller wasn't included synchronously processed messages in it's publisher output
• 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
• Updated the SyncPushTokensJob to wait for a bit for paths to build before failing
• Updated the PushNotification service to be selectable via the dev settings
• Updated the database timeout code to be a little more developer friendly
• Updated the code to stop blocked contacts from appearing in the main conversation list
• Removed the invalid "push-testnet" push server
• Removed the logic to configure the APNS push service based on the service network (was incorrect)
• Removed the 'Int' raw type constraint for the 'FeatureOption'
• Fixed an issue where the initial conversation query for groups would fail due to an invalid join
• Fixed an issue where the initial conversation query wouldn't include the 'markedUnread' flag (meaning the conversation wouldn't correctly get marked as read)
• Fixed a rare bad memory crash
• Fixed an issue where the modal wouldn't be dismissed after updating the group display name
• Fixed an issue where the "Recreate Group" button was the wrong height
• Removed the blocking loading indicators from a number of group actions
• Refactored the group promotions failure toast logic to match the invites failure toast logic
• Updated the actions which are allowed on messages in legacy groups once deprecated
• Updated to the latest libSession (minor PR feedback tweaks)
• Fixed a few build warnings
• Fixed a layout issue on the All Media screen
• Fixed an issue where the keyboard avoidance wouldn't be updated on the conversation screen if you went to a child screen and returned
• Fixed a couple of places where handling 'GROUP_MEMBER' changes could result in hitting the infinite loop guards so the changes wouldn't be reflected correctly
• Updated the ConfirmationModal explanation to be automatically scrollable by default
• Updated the DirectoryArchiver to ignore hidden files (based on the '.' prefix) by default as they wouldn't have been created by Session
• Minor tweak to config load order
• Pulled across reentrancy PR fixes
• Fixed an issue where some UI changes were occurring on background threads (causing crashes)
• Fixed an issue where editing a group name/description was performing a blocking action but not showing a loading indicator
• Fixed an issue where the group display picture modal would have it's "save" button enabled even when the picture hadn't been changed
• Added a separate feature flag for deprecating legacy groups
• Added the ability for a legacy group admin to "Recreate" the group (ie. pre-fill a new group with the same members)
• Updated the "Leave" button to be "Delete" for legacy groups once deprecated
• Disabled the "mark as unread" action for legacy groups once deprecated
• Disabled the input and conversation settings for legacy groups once deprecated
• Disabled the long press menu and removing reactions for legacy groups once deprecated
• Reworked synchronous database access to prevent reentrancy issues
• Updated the JobExecuter to take a "Scheduler" rather than a "DispatchQueue" (allows for a potentially refactor to use "OperationQueue" instead if we want more fine-tuned control over the number of concurrent executions which can occur)
• Reworked the database rentrancy fixes
• Added a timeout to prevent deadlocks with our custom synchronous database actions
• Fixed a case where we were incorrectly accessing the database in a reentrant way
• Updated the "Delete for Everyone" behaviour to show a blocking loading indicator if a network request is required
• Removed some duplicate code
• Fixed an issue where mentions wouldn't filter correctly for groups in some cases
• Fixed an issue where legacy group members could appear in the members list multiple times when navigating there from the conversation title
• Fixed an issue where the message deletion toasts could appear behind blurred modal backgrounds
• Fixed an issue where pasting text which is too large into an empty input field would result in the text having the default OS styling instead of the text styling we have set
• Added a 2000 limit to the input field
• Added an error when opening the share extension before completing onboarding
• Updated the code to treat an empty `adminSignature` as null (in case a client sends it incorrectly)
• Updated the code to include updated group control messages when determining unread
• Updated code to perform a supplemental key rotation (if needed) when resending invites to members flagged as supplemental (to handle a case where the initial invite request failed)
• Updated the code to schedule group config update control messages when making the local changes but make their sending contingent on the next config sync succeeding
• Updated the code to only enable the Share and Notification extensions once the onboarding process has been completed
• Updated the code to always enqueue config syncs for all configs on launch (if there are no pending changes then it won't do anything, but if there are then this will increase the likelihood that they will be synced)
• Fixed an issue where the default contacts query was based on thread records instead of contact records
• Fixed an issue where creating a conversation by tapping on a group member or avatar wasn't correctly creating the conversation in the draft state
• Fixed an issue where incoming messages could be added to the "Note to Self" conversation if the "syncTarget" was incorrectly set on them
• Added some localised copy
• Added the helpdesk article URL for the deprecated groups banner
• Updated mentions to include the current user in groups, 1-1 and NTS conversations (also made the current user appear as "you")
• Fixed a layout issue with the deleted message view
• Fixed an issue where the "mark as unread" action would incorrectly appear for the Note to Self conversation
• Fixed an issue where we were incorrectly sending an ExpirationTimerUpdate in some cases