• 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
• 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
• 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 logic to trigger a full refetch when getting promoted to admin within a group
• Added a timeout to display picture uploads
• Updated the code to inject the DisplayPictureManager via dependencies
• Updated the resend invite functionality to have a blocking loading indicator as well
• Refactored some closure-based logic for display picture uploads to use Combine instead
• Refactored the SnodeReceivedMessageInfo (with a migration) so it's no longer using a weird constructed key (now have individual queryable columns for the values)
• Updated to the latest Lucide version
• Updated the bin icons to use the new Lucide icon
• Fixed an issue where flagging a members messages to be deleted when kicking them wasn't using the standard message removal process
• Fixed an issue where you couldn't delete a group after it was destroyed
• Fixed an issue where being promoted to admin would fail because you weren't already an admin
• Fixed an issue where the share extension wasn't populating it's conversation list
• Fixed an issue where the share extension had a translucent header
• Fixed an issue where messages could incorrectly be considered disappearing messages (with no duration)
• Fixed an issue where non-admins couldn't locally delete messages in community conversations
• Fixed an issue where deleting Note to Self messages for all devices was incorrectly leaving an artifact
• Fixed an issue where emoji reacts added to messages which have been deleted locally would still get added to the deleted artifact
• Fixed a layout issue in groups/communities with the "this message was deleted" artifact
• Fixed an issue where highlighting and unhighlighting a "danger" action in the context menu would result in it changing to a non-danger colour
• Fixed an issue where the community poller always thought it was the initial poll
• Added a loading indicator while config syncing is happening while sending group invitations/promotions
• Added a mechanism to trigger a libSession config change but prevent the change from enqueuing a config sync (so we can do a blocking sync)
• Fixed a couple of bugs where the disappearing message control messages could behave incorrectly in updated groups
• Fixed an issue where deleting a message which was quoted by another message wouldn't remove the quoted content until returning to the screen
• Fixed an issue where a leaving member could appear to be removed before they were actually removed
• Fixed an issue where a group member wouldn't return to the "sending" state when resending an invitation
• Fixed an issue where the current user could see group admins actions before they had been flagged as an accepted admin
• Added some missing accessibility identifiers
• Added the inline Lucide icon on the Conversation screen for legacy groups
• Added a temporary fix for a crash when restoring an account (really need to fix up the reentrant Atomic<T> access issues)
• Updated the in-conversation blocked state as per UX feedback
• Updated the code to insert the "members added" control message on the admins device after creating a group
• Minor copy tweak
• Fixed a crash which could happen during onboarding due to the poller getting incorrectly created when entering the background before the account is created
• Fixed a bug where sync messages weren't working correctly
• Fixed an issue where the "delete before" behaviours weren't leaving behind the "this message was deleted" messages
• Fixed an issue where group admins wouldn't appear in mentions
• Fixed a couple of layout issues with the incoming call banner
• Fixed an issue with the network callback registration
• Cleaned up the libSession Cache interface a bit
• Fixed the ThreadSettingsViewModel unit tests
• Fixed a rare issue which could occur where the libSession network change callbacks could be called before the network finished initialising and being stored in dependencies
• Hardcoded a bunch of future groups functionality strings (so at least there is something for testing)
• Updated the 'performAndPushChange' function to be on the LibSessionCacheType so it can be mocked
• Updated the Mock logic to support specifying a dynamic return value via a closure
• Tweaked some variable naming to remove ambiguity
• Updated the code so an admin will update their 'promotion_status' as part of processing a 'GROUP_MEMBERS' message
• Updated the handling of the `GroupUpdateInviteResponseMessage` to take the `isApproved` flag into account
• Updated the logic to update the group name in 'USER_GROUPS' when getting kicked (so linked devices have the same name)
• Removed the 'ManualResultJob' (have better ways to do it now)
• Maintain the 'ServiceNetwork' setting after clearing account data
Updated the code to use the libSession encrypt/decrypt functions for the 'groupKicked' message
Updated the code to use the libSession function to load the admin key when receiving a promotion instead of reloading the config state
Changed the NotificationsManager and NotificationActionHandler to be injected via dependencies instead of the Environment
Mocked out the NotificationsManager for unit testing
Added the DeveloperSettingsViewModel and dependency-controlled feature flags
Added the generic 'SessionListViewModel' to reduce duplicate code when we want to just display a selectable list of items
Added an indicator on the home screen to show when using testnet
Added group promotions behind a feature flag
Updated the PushNotificationAPI to use bulk subscribe/unsubscribe requests
Updated the 'GroupUpdateDeleteMessage' and 'GroupUpdateDeleteMemberContentMessage' to support additional behaviours
Updated the SessionCell to have better RTL support (swapped some left/right things to leading/trailing)
Updated the revoke/unrevoke endpoints to take arrays of subaccount tokens
Refactored the Bencode logic to properly support Codable types
Started adding logic to subscribe and unsubscribe for updated group push notifications
Updated the keychain service to be injected via dependencies
Reworked the Dependencies logic to avoid a concurrent access issue
Fixed an issue where some keychain data might not be cleared in some cases
Fixed an issue where being kicked and readded to a group would make it seem to disappear ("invited" message wasn't getting created)
Added the updated revoke & unrevoke endpoints when removing and adding group members
Updated the group creation to upload the provided image and set it to the group correctly
Added logic to handle promotion messages
Added a debounced toast for promotion failures
Added support for the 'delete_before' and 'attach_delete_before' functionality
Added in the deprecated legacy groups banner.
Cleaned up the UserListViewModel a little
Updated the 'User count' header subtitle to take the user to the 'Group Members' or 'Edit Group' screens based on admin status
Updated the sorting of the group member lists to match the requirements
Fixed the debounced group invite failure toast
Fixed an issue where some libSession errors wouldn't get propagated back into the Swift code resulting in invalid database changes
Fixed an issue where admins couldn't properly leave groups
Added invitation statuses for updated groups
Added the invite and failed invite toasts
Added proper support for the group description
Refactored the EditClosedGroupVC and UserSelectionVC to use the SessionTableViewModel
Updated the ObservableTableSource to support forcing a refresh either before or after the database observation
Removed support for the per-thread notification sound
Added logic for Group Message Requests
Added a 'ManualResultJob' which allows for a way to add a dependency to a job which can be resolved separately from the job system (it's not persistent though)
Added the ability for admins to delete select messages from updated groups
Swapped 'save'/'saved' calls to be 'upsert'/'upserted' as that's the actual behaviour we expect (unique key based rather than primary key based)
Fixed a bug where the 'limitedReuse' 'drainBehaviour' could get stuck in an invalid state
Fixed a bug where job dependencies could swap queues which could theoretically result in deadlocks in some cases
Added logic to trigger and handle destroyed groups
Added logic to trigger and handle handle supplementary key rotations (libSession implementation is WIP)
Added logic for 'remove user and their content'
Added the ability to associate a callback to any arbitrary job
Added data support for the group description value
Added logic to handle being kicked from a group
Added logs for failed GROUP_KEYS merges (already have for other config types)
Fixed an issue where the initial key generation didn't include the initial members
Fixed a crash which could occur when creating a conversation via handling a USER_GROUPS config
Fixed an issue where manually triggering the ConfigurationSyncJob might not ever get a callback
Updated to have the latest Protobuf tweaks
Removed recognition of the LegacyConfigurationMessage
Got a number of the GroupUpdate messages working properly
Updated the DisplayPictureDownloadJob to support OpenGroup room images
Updated the Poller to process messages by namespace (sorted) and added support for synchronous handling of messages
Reworked the ProfileManager to be a more reusable DisplayPictureManager
Cleaned up the conversion from milliseconds to TimeInterval (which is documented as seconds) for clarity
Fixed a read/write crash due to the SnodeAPI cache setup
Fixed an issue where dependencies could incorrectly overwrite each other when based on protocols
Fixed the incorrect Group Namespaces
Fixed an incorrect identity generation which could create invalid accounts
Fixed an issue where adding group members would remove admins incorrectly
Finished updating the SnodeAPI to use prepared requests
Added 'name' value to updated groups USER_GROUP entry
Added ConvoInfoVolatile for updated groups
Cleaned up a bunch of direct sodium usages
Updated the code to create GroupMember entries based on the GROUP_MEMBERS config
Updated to the latest libSession
Fixed a bunch of group authentication issues
Fixed a minor threading issue
Fixed an issue with the PreparedRequest type conversion
Added a work around for getting an SQLite Busy exception on startup (should only be caused by edge-cases, unsure what the impact of the workaround will be if the db is actually busy)
Updated the auth to work for updated groups
Cleaned up group creation to seemingly work properly (not syncing for some reason)
Started writing up wrappers and unit tests for group config types
Refactored some duplicate batch & prepared request code to be more generic and reusable
Renamed a number of legacy closed group functions to have the term 'legacy' in them for ease of coding