Commit Graph

1126 Commits (2ad8041b59608ed99c22e9f536ba8d8328b63d2d)

Author SHA1 Message Date
Morgan Pretty 91802e4812 Fixed a number of crashes and bugs
Fixed a crash which would occur when rendering a message containing both a mention and a url
Fixed a crash which could occur during migration due to the openGroupServerMessageId essentially being the max UInt64 value which was overflowing the Int64 storage
Fixed a bug where empty read receipt updates were sending messages (even for non one-to-one conversations)
Fixed a bug where loading in large numbers of messages (via the poller) was auto scrolling to the bottom if the user was close to the bottom (now limited to <5)
Fixed a memory leak with the AllMediaViewController (strong delegate references)
Fixed an issue where non-alphanumeric characters would cause issues with global search
Fixed an issue where search result highlighting wasn't working properly
Fixed an issue where the app switcher UI blocking wasn't working
Updated the conversations to mark messages as read while scrolling (rather than all messages when entering/participating in a conversation)
Updated the modal button font weight to be closer to the designs
Added the ability to delete "unsent" messages
2 years ago
Morgan Pretty 5b1e19dd2e Increased the max username length from 26 bytes to 64 bytes 2 years ago
Morgan Pretty 40109e0bea Cleaned up the config-based table view controller to be more reusable
Updated the settings screens to have the "rounded group" styling
Added a "loading conversations" label to the Message Requests screen before the conversations load
Removed the legacy UserCell (replaced with the more reusable 'SessionCell')
Renamed a few things to make them more generic and reusable
2 years ago
Morgan Pretty d9c6f2fc90 Fixed an issue where some data wasn't getting removed when handling an UnsendRequest 2 years ago
Morgan Pretty f98e2a157e Added rounding to the settings and updated the SettingVC to use the config approach
Removed some unused code
2 years ago
Morgan Pretty 6099bd94d8 Updated the rest of the SnodeAPI static variables to be atomic to prevent threading crashes 2 years ago
Morgan Pretty 8109a326cf Merge remote-tracking branch 'upstream/dev' into feature/theming
# Conflicts:
#	Session.xcodeproj/project.pbxproj
#	Session/Closed Groups/NewClosedGroupVC.swift
#	Session/Conversations/ConversationVC+Interaction.swift
#	Session/Conversations/Message Cells/CallMessageCell.swift
#	Session/Conversations/Views & Modals/JoinOpenGroupModal.swift
#	Session/Home/HomeVC.swift
#	Session/Home/New Conversation/NewDMVC.swift
#	Session/Home/NewConversationButtonSet.swift
#	Session/Meta/Translations/de.lproj/Localizable.strings
#	Session/Meta/Translations/en.lproj/Localizable.strings
#	Session/Meta/Translations/es.lproj/Localizable.strings
#	Session/Meta/Translations/fa.lproj/Localizable.strings
#	Session/Meta/Translations/fi.lproj/Localizable.strings
#	Session/Meta/Translations/fr.lproj/Localizable.strings
#	Session/Meta/Translations/hi.lproj/Localizable.strings
#	Session/Meta/Translations/hr.lproj/Localizable.strings
#	Session/Meta/Translations/id-ID.lproj/Localizable.strings
#	Session/Meta/Translations/it.lproj/Localizable.strings
#	Session/Meta/Translations/ja.lproj/Localizable.strings
#	Session/Meta/Translations/nl.lproj/Localizable.strings
#	Session/Meta/Translations/pl.lproj/Localizable.strings
#	Session/Meta/Translations/pt_BR.lproj/Localizable.strings
#	Session/Meta/Translations/ru.lproj/Localizable.strings
#	Session/Meta/Translations/si.lproj/Localizable.strings
#	Session/Meta/Translations/sk.lproj/Localizable.strings
#	Session/Meta/Translations/sv.lproj/Localizable.strings
#	Session/Meta/Translations/th.lproj/Localizable.strings
#	Session/Meta/Translations/vi-VN.lproj/Localizable.strings
#	Session/Meta/Translations/zh-Hant.lproj/Localizable.strings
#	Session/Meta/Translations/zh_CN.lproj/Localizable.strings
#	Session/Open Groups/JoinOpenGroupVC.swift
#	Session/Open Groups/OpenGroupSuggestionGrid.swift
#	Session/Settings/SettingsVC.swift
#	Session/Shared/BaseVC.swift
#	Session/Shared/OWSQRCodeScanningViewController.m
#	Session/Shared/ScanQRCodeWrapperVC.swift
#	Session/Shared/UserCell.swift
#	SessionMessagingKit/Configuration.swift
#	SessionShareExtension/SAEScreenLockViewController.swift
#	SessionUIKit/Style Guide/Gradients.swift
#	SignalUtilitiesKit/Media Viewing & Editing/OWSViewController+ImageEditor.swift
#	SignalUtilitiesKit/Screen Lock/ScreenLockViewController.m
2 years ago
Morgan Pretty f7fd15dae0 Finished removing usages to non-theme colour variables
Updated theming throughout
Fixed a couple of bugs with the media gallery
2 years ago
Morgan Pretty a59d1b8153 Fixed a few bugs found during regression testing
Increased version & build numbers for release
Fixed a bug where the closed group info messages might not include names for members added/removed when the profile was unknown
Fixed a bug where removing members from closed groups wasn't showing an info message correctly
Fixed a minor layout issue in the CallMessageCell
2 years ago
Morgan Pretty 7dc75af361 Fixed some bugs with disappearing messages
Fixed an issue where the DisappearingMessages job could incorrectly overwrite it's nextRunTimestamp
Fixed an issue where sent/self-send messages wouldn't correctly trigger the disappearing messages job
Fixed an issue where sending the mnemonic along with an attachment wasn't showing the warning prompt
Fixed an issue where the home screen wasn't updating on launch if the displayed messages were removed disappearing messages
Fixed a small UI glitch where the input field wouldn't immediately get cleared when sending a message (unfortunately there is a slight delay before the message appears still)
2 years ago
ryanzhao d14cd07a5c minor refactor 2 years ago
Ryan Zhao 07fb498664 minor fix 2 years ago
Ryan Zhao 05bb1e1e61 clean up Permissions 2 years ago
Ryan Zhao 0539e4b192 clean up 2 years ago
Ryan Zhao 30e0e40ffa feat: disable typing and message requests in open groups if you don’t have "write" permission 2 years ago
Morgan Pretty 1bc6b0bdba Merge remote-tracking branch 'upstream/dev' into feature/theming
# Conflicts:
#	Session.xcodeproj/project.pbxproj
#	Session/Conversations/ConversationVC+Interaction.swift
#	Session/Conversations/ConversationVC.swift
#	Session/Conversations/ConversationViewModel.swift
#	Session/Conversations/Message Cells/VisibleMessageCell.swift
#	Session/Home/HomeVC.swift
#	Session/Home/Message Requests/MessageRequestsViewController.swift
#	Session/Media Viewing & Editing/MediaTileViewController.swift
#	Session/Meta/AppDelegate.swift
#	Session/Meta/Translations/de.lproj/Localizable.strings
#	Session/Meta/Translations/en.lproj/Localizable.strings
#	Session/Meta/Translations/es.lproj/Localizable.strings
#	Session/Meta/Translations/fa.lproj/Localizable.strings
#	Session/Meta/Translations/fi.lproj/Localizable.strings
#	Session/Meta/Translations/fr.lproj/Localizable.strings
#	Session/Meta/Translations/hi.lproj/Localizable.strings
#	Session/Meta/Translations/hr.lproj/Localizable.strings
#	Session/Meta/Translations/id-ID.lproj/Localizable.strings
#	Session/Meta/Translations/it.lproj/Localizable.strings
#	Session/Meta/Translations/ja.lproj/Localizable.strings
#	Session/Meta/Translations/nl.lproj/Localizable.strings
#	Session/Meta/Translations/pl.lproj/Localizable.strings
#	Session/Meta/Translations/pt_BR.lproj/Localizable.strings
#	Session/Meta/Translations/ru.lproj/Localizable.strings
#	Session/Meta/Translations/si.lproj/Localizable.strings
#	Session/Meta/Translations/sk.lproj/Localizable.strings
#	Session/Meta/Translations/sv.lproj/Localizable.strings
#	Session/Meta/Translations/th.lproj/Localizable.strings
#	Session/Meta/Translations/vi-VN.lproj/Localizable.strings
#	Session/Meta/Translations/zh-Hant.lproj/Localizable.strings
#	Session/Meta/Translations/zh_CN.lproj/Localizable.strings
#	Session/Onboarding/LandingVC.swift
#	SessionMessagingKitTests/_TestUtilities/MockGeneralCache.swift
2 years ago
RyanZhao 570883e28a
Merge pull request #687 from RyanRory/badcall-fix
Voice & video call fix
2 years ago
RyanZhao 31b62e28a7
Merge pull request #685 from RyanRory/emoji-react-tweak-2
Emoji reacts tweaks
2 years ago
Morgan Pretty 7715c5ea09 Did some more styling and fixed a few UI bugs
Fixed a bug where the time label would no longer appear in the context menu
Fixed a bug where the tile label in the context menu could be clipped
Tweaked the context menu appearance animation to look less jumpy when at the edges of the screen
2 years ago
Morgan Pretty fe14bb1b31 Fixed a couple of bugs and did some more theming
Started trying to add the unit tests that were in the settings refactor branch (need to be refactored due to the implementation changes)
Fixed a bug where the typing indicators wouldn't get cleaned up in some cases
2 years ago
ryanzhao 47463280d2 Merge branch 'dev' into quote-standardise 2 years ago
ryanzhao c121f99b22 Merge branch 'dev' into add-silence-audio 2 years ago
Morgan Pretty 93c2f0f503 Fixed some bugs with disappearing messages
Fixed an issue where the DisappearingMessages job could incorrectly overwrite it's nextRunTimestamp
Fixed an issue where sent/self-send messages wouldn't correctly trigger the disappearing messages job
Fixed an issue where sending the mnemonic along with an attachment wasn't showing the warning prompt
Fixed an issue where the home screen wasn't updating on launch if the displayed messages were removed disappearing messages
Fixed a small UI glitch where the input field wouldn't immediately get cleared when sending a message (unfortunately there is a slight delay before the message appears still)
2 years ago
Morgan Pretty c707a2f80c Started refactoring the conversation image picker screens
Fixed a bug where returning from the background on the conversation screen would result in the input view being hidden
Refactored the PhotoCollectionPickerViewController to use the SettingsTableViewController convention
Updated the SettingsTableViewModel to worked based on Combine instead of the DatabaseObservable so it's more reusable for non-db cases
2 years ago
Morgan Pretty face9da02b Fixed search performance, started styling in-conversaiton settings
Fixed a bug where the scroll to bottom button wasn't working
Fixed an issue where searching was running on the main thread (which could cause UI issues)
Updated the searching to interrupt the previous query when the search term changes
Updated the in-conversation settings to be use the new config-based approach (deleted the OWSConversationSettingsViewController)
2 years ago
Ryan Zhao ccbf4e0945 clean 2 years ago
Ryan Zhao 31605672e2 fix call threading issues 2 years ago
ryanzhao a5ede8c6a2 fix a case when the app goes into background with an ongoing call 2 years ago
ryanzhao 3eb7a5c5d9 fix self-send reaction notification 2 years ago
ryanzhao 3e8abd1952 tweak: make seqNo optional 2 years ago
ryanzhao 82e55a8d5b tweak: local reaction entry logic change 2 years ago
ryanzhao ddbbf63d14 Merge branch 'dev' into emoji-react-tweak-1 2 years ago
Morgan Pretty fc860e3957 Added fixes and defensive coding for a number of crashes
Fixed a crash which could occur due to multithreaded dependency access
Fixed a crash which could occur if the 'keyWindow' wasn't set on the LandingVC in time since we were force-unwrapping
Fixed a crash which could occur due to multithreaded swarm cache access
Fixed the broken unit tests
2 years ago
ryanzhao 931a356537 Merge branch 'dev' into emoji-react-tweak-1 2 years ago
Ryan Zhao 31dcb3c985 feat: cache remove all for open group emoji reacts 2 years ago
Morgan Pretty 08a52f9497 Fixed an issue which could cause the DB migration to fail for users with closed groups 2 years ago
ryanzhao 29dd85ebe7 minor refactor 2 years ago
Morgan Pretty c82ee0c44b Finished off the updated settings sections and fixed a couple of bugs
Added the Blocked contacts screen
Added a setting to control whether concurrent audio messages should auto-play
Finished updating the settings screens
Fixed an issue where items that should be removed from the PagedDatabaseObserver due to filter logic weren't getting removed in some cases
2 years ago
Morgan Pretty a1e88329db Merge branch 'dev' into feature/theming
# Conflicts:
#	Podfile.lock
#	Session.xcodeproj/project.pbxproj
#	Session/Conversations/Message Cells/VisibleMessageCell.swift
#	Session/Meta/Translations/de.lproj/Localizable.strings
#	Session/Meta/Translations/en.lproj/Localizable.strings
#	Session/Meta/Translations/es.lproj/Localizable.strings
#	Session/Meta/Translations/fa.lproj/Localizable.strings
#	Session/Meta/Translations/fi.lproj/Localizable.strings
#	Session/Meta/Translations/fr.lproj/Localizable.strings
#	Session/Meta/Translations/hi.lproj/Localizable.strings
#	Session/Meta/Translations/hr.lproj/Localizable.strings
#	Session/Meta/Translations/id-ID.lproj/Localizable.strings
#	Session/Meta/Translations/it.lproj/Localizable.strings
#	Session/Meta/Translations/ja.lproj/Localizable.strings
#	Session/Meta/Translations/nl.lproj/Localizable.strings
#	Session/Meta/Translations/pl.lproj/Localizable.strings
#	Session/Meta/Translations/pt_BR.lproj/Localizable.strings
#	Session/Meta/Translations/ru.lproj/Localizable.strings
#	Session/Meta/Translations/si.lproj/Localizable.strings
#	Session/Meta/Translations/sk.lproj/Localizable.strings
#	Session/Meta/Translations/sv.lproj/Localizable.strings
#	Session/Meta/Translations/th.lproj/Localizable.strings
#	Session/Meta/Translations/vi-VN.lproj/Localizable.strings
#	Session/Meta/Translations/zh-Hant.lproj/Localizable.strings
#	Session/Meta/Translations/zh_CN.lproj/Localizable.strings
#	Session/Notifications/AppNotifications.swift
#	SessionMessagingKit/Shared Models/MessageViewModel.swift
#	SessionMessagingKit/Shared Models/SessionThreadViewModel.swift
#	SignalUtilitiesKit/Profile Pictures/ProfilePictureView.swift
2 years ago
ryanzhao 287fabb390 Merge branch 'dev' into emoji-reacts-tweaks 2 years ago
Ryan Zhao 81ef5a744a fix count logic 2 years ago
Ryan Zhao 543f729247 feat: add local cache and deal with merging for reaction changes 2 years ago
Morgan Pretty a0e43875e7
Merge pull request #674 from mpretty-cyro/fix/data-extraction-timestamp
Fixed a bug where the "DataExtractionNotification" messages weren't correctly setting their tmestamps
2 years ago
Morgan Pretty 84ccb63b35 Fixed a bug where the "DataExtractionNotification" messages weren't correctly setting their tmestamps 2 years ago
Morgan Pretty c73bb43c56 Fixed a few bugs
Fixed a bug where open group message deletion wasn't thread-specific
Fixed a bug where the user couldn't delete pending/failed messages being sent to an open group
Fixed a bug where deleting content from "related" tables wouldn't correctly trigger an update within the PagedDatabaseObserver
Fixed a bug where a user that was an admin/mod of one open group would incorrectly appear to be an admin/mod of all open groups
2 years ago
Ryan Zhao 3a81ffc752 feat: add response for reaction endpoints 2 years ago
Ryan Zhao 128ef747b3 tweak: only fetch and show 5 reactors for open group reactions 2 years ago
Ryan Zhao f9c2a2ce99 tweak: fix an issue where we may delete the wrong open group message and update reactions to wrong open group messages in other threads with the same server id 2 years ago
Morgan Pretty 823006a892 Updated the colours to source from direct theme values (instead of individual)
Removed an unused notification
Refactored the PrivacySettingsViewController
Refactored the ScreenLock code to Swift
Fixed an issue where the match dark/light setting wasn't getting applied on launch
Update the modal styling for the various settings modals
2 years ago
ryanzhao 851ad6c4c9 minor refactor 2 years ago
Ryan Zhao c7c92f747c Merge branch 'various-bugs-and-optimisations' into emoji-reacts 2 years ago
Morgan Pretty 7097853d58 A few bugs fixes and some optimisations
Fixed a bug where notifications could incorrectly appear for messages in the current thread
Fixed a bug where swiping left/right on images in the MediaDetailViewController could load images from other threads
Fixed a bug where the unread count wouldn't appear correctly when opening a conversation
Fixed a bug where the unread count on the conversation cell could get truncated
Fixed a bug where notifications weren't working correctly when the app is in the foreground
Fixed a bug where we weren't clearing the 'received X new messages' count when in the foreground
Fixed a bug where outgoing messages could get marked as read in a very specific case
Updated the "group notification" logic to only apply to Open Groups (and always doing it rather than just in the background)
Added a placeholder person icon when you have a closed group with a single member
Added a couple of indexes to improve the HomeVC database query performance (reduce launch time by ~15% in some cases)
Added a background task to give message sending the chance to complete when sending the app to the background
Removed an unneeded query from the HomeViewModel init (reduce launch time by ~10% in some cases)
Optimised one of the queries used to load the data needed for the conversation screen
2 years ago
Ryan Zhao 651373234a feat: add capability check for open group emoji reacts 2 years ago
Ryan Zhao a41a2f12bb Merge branch 'dev' into quote-standardise 2 years ago
Ryan Zhao f7a4c92d38 Merge branch 'dev' into emoji-reacts 2 years ago
Morgan Pretty d116ac0ebe Fixed an issue where the 2.0.2 migration broke the original _003_ migration 2 years ago
ryanzhao 0a9856d49a tweak: fix reaction notifications 2 years ago
ryanzhao f93820362c add silence audio file 2 years ago
ryanzhao 29ed636285 Merge branch 'dev' into quote-standardise 2 years ago
ryanzhao c26e6f7e9e Merge branch 'dev' into emoji-reacts 2 years ago
Morgan Pretty 20d63d106c Updated the app settings screens
Updated the MessageRequestViewModel to have the same page size as the HomeViewModel
Fixed a couple minor UI discrepancies
Refactored the old app settings child screens to be configuration based and all in Swift
2 years ago
ryanzhao 8d43eac608 Merge branch 'dev' into quote-standardise 2 years ago
ryanzhao 131cb9170b Merge branch 'dev' into emoji-reacts 2 years ago
Morgan Pretty 362986e73a Fixed a bug where the notification sound "preview" playing wasn't working 2 years ago
Morgan Pretty 3ab8bdec77 Fixed an issue where hidden mods/admins wouldn't be properly recognised
Added an isHidden flag to the GroupMember
Reset the OpenGroup 'infoUpdates' value to force a re-fetch of the data and fix users affected by this bug
Fixed the broken unit tests
2 years ago
Morgan Pretty 9f4d1a678a Fixed a bug where deleted incoming messages could incorrectly be counted as unread 2 years ago
Morgan Pretty 0ce96976bf Fixed an issue where the open group seqNo wasn't updated for deletions 2 years ago
Morgan Pretty ea32e407a9 Applied theming to a number of screens, some minor cleanup and bug fixes
Updated the HomeVC, SettingsVC and GlobalSearch UI to use theming
Removed the "fade view" gradients from the various screens
Added a simple log to the PagedDatabaseObserver to make debugging easier
Updated the FullConversationCell to also show the "read" state for messages
Updated the read receipt icons to use SFSymbols directly
Updated the PlaceholderIcon to use the PrimaryColour's as it's colour options
2 years ago
Morgan Pretty d56cee8234 Progressing on theming functionality
Created the ThemeManager and the system to control the dynamic theming
Started updating the main settings screens
Added the AppearanceViewController and connected it to the ThemeManager
Started adding theme values
Started applying theme values throughout
2 years ago
ryanzhao 6565c3fe73 feat: quotes refer to original attachments. 2 years ago
ryanzhao 9c9f1e3cd3 tweak: encode and sign reaction endpoints with raw emoji 2 years ago
Morgan Pretty e007870c34 Fixed a bug where disappearing messages weren't working for local outgoing messages 2 years ago
Ryan Zhao 229e8376e5 WIP: observe quote update 2 years ago
Ryan Zhao 8ba7f927d8 feat: deal with quoted text 2 years ago
Ryan Zhao 88e419aac0 clean 2 years ago
Ryan Zhao 645f8e1d24 tweak: add update types of reaction to query parameter 2 years ago
Ryan Zhao bedf3ab44b WIP: select quote body from original interaction 2 years ago
Ryan Zhao 4a5674f7b3 tweak: keep the old logic of removing open group messsages 2 years ago
Ryan Zhao 4cb2d81670 clean up 2 years ago
ryanzhao 8bedaa39fd Merge branch 'dev' into quote-standardise 2 years ago
ryanzhao ba578fcb3c Merge branch 'dev' into emoji-reacts 2 years ago
Morgan Pretty 201c59fd2b Updated the logic for the background fetch timeout
Updated the logic for the background fetch timeout to happen in the AppDelegate and be based on a system property to avoid a few edge-cases
Removed the ID Blinding error handling 'e' suffix (as it's not actually part of the error)
2 years ago
Ryan Zhao aaf91c3327 Merge branch 'database-refactor' into emoji-reacts 2 years ago
Ryan Zhao c36520b420 Merge branch 'database-refactor' into quote-standardise 2 years ago
Morgan Pretty 2025fd2638 Fixed a crash and the SOGS deletion logic to continue to support the deprecated approach for the time being
Fixed an issue where the app could crash when entering the background during migration
Added the old 'messageServerIdsToRemove' code back for the time being to support the deprecated deletion behaviour
2 years ago
Ryan Zhao 7383ddad04 update sortId logic after open group reaction index 2 years ago
Ryan Zhao 91afad99d5 Merge branch 'database-refactor' into emoji-reacts 2 years ago
Ryan Zhao d4237828a8 Merge branch 'database-refactor' into quote-standardise 2 years ago
Morgan Pretty 1224e539ea Reduced unneeded DB write operations and fixed a few minor UI bugs
Updated the database to better support the application getting suspended (0xdead10cc crash)
Updated the SOGS message handling to delete messages based on a new 'deleted' flag instead of 'data' being null
Updated the code to prevent the typing indicator from needing a DB write block as frequently
Updated the code to stop any pending jobs when entering the background (in an attempt to prevent the database suspension from causing issues)
Removed the duplicate 'Capabilities.Capability' type (updated 'Capability.Variant' to work in the same way)
Fixed a bug where a number of icons (inc. the "download document" icon) were the wrong colour in dark mode
Fixed a bug where the '@You' highlight could incorrectly have it's width reduced in some cases (had protection to prevent it being larger than the line, but that is a valid case)
Fixed a bug where the JobRunner was starting the background (which could lead to trying to access the database once it had been suspended)
Updated to the latest version of GRDB
Added some logic to the BackgroundPoller process to try and stop processing if the timeout is triggered (will catch some cases but others will end up logging a bunch of "Database is suspended" errors)
Added in some protection to prevent future deferral loops in the JobRunner
2 years ago
ryanzhao 073516ae78 feat: add sortId for reaction sorting 2 years ago
ryanzhao 34f6cf4646 Merge branch 'database-refactor' into quote-standardise 2 years ago
ryanzhao 99e4614bf8 Merge branch 'database-refactor' into emoji-reacts 2 years ago
Morgan Pretty ecbded3819 Cleaned up the poller logic a bit 2 years ago
Ryan Zhao a2c9bee269 WIP: add sortId 2 years ago
Ryan Zhao 37f876dffd deal with blinded id reactor 2 years ago
Morgan Pretty f8b2f73f7b Fixed a few issues found during QA
Fixed an issue where quotes containing images wouldn't send
Fixed an issue where a MessageSend job could get stuck in an infinite retry loop if it had an attachment in an invalid state
Fixed an issue where quotes containing non-media files wouldn't contain the correct data
Fixed an issue where the quote thumbnail was getting the wrong content mode set
Fixed an issue where the local disappearing messages config wasn't getting generated correctly
Fixed an issue where the format parameters for the disappearing message info message were the wrong way around in one case
Updated the AttachmentUploadJob to try to support images which haven't completed downloading (untested as it's not supported via the UI)
2 years ago
Ryan Zhao 4d0b47fa7f clean 2 years ago
Ryan Zhao 6e0c812c6d fix a crash where reactors in open group doesn't have a profile 2 years ago
ryanzhao 30e48209e2 feat: persist open group reactions into local database 2 years ago
ryanzhao cd08c792d3 WIP: include reactions into open group message detail info 2 years ago