From 7e8aa8a03c16a84f394f5226f60d3eacacea66e7 Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Wed, 24 Aug 2022 18:52:10 +0200 Subject: [PATCH 01/24] App Layout: Onboarding screen, missing image for page 2 Fixed --- .../Contents.json | 4 +- .../all_chats_onboarding2.png | Bin 0 -> 22361 bytes .../all_chats_onboarding2.svg | 40 ------------------ .../all_chats_onboarding2@2x.png | Bin 0 -> 55653 bytes .../all_chats_onboarding2@3x.png | Bin 0 -> 96423 bytes .../Contents.json | 11 +---- .../Contents.json | 11 +---- .../Contents.json | 11 +---- changelog.d/6624.bugfix | 1 + 9 files changed, 7 insertions(+), 71 deletions(-) create mode 100644 Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2.png delete mode 100644 Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2.svg create mode 100644 Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2@2x.png create mode 100644 Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2@3x.png create mode 100644 changelog.d/6624.bugfix diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/Contents.json b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/Contents.json index 68a004064..99aa89f84 100644 --- a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/Contents.json +++ b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/Contents.json @@ -1,15 +1,17 @@ { "images" : [ { - "filename" : "all_chats_onboarding2.svg", + "filename" : "all_chats_onboarding2.png", "idiom" : "universal", "scale" : "1x" }, { + "filename" : "all_chats_onboarding2@2x.png", "idiom" : "universal", "scale" : "2x" }, { + "filename" : "all_chats_onboarding2@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2.png b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2.png new file mode 100644 index 0000000000000000000000000000000000000000..119903ee62c4584ee49a1f23837ba5dd5c74756d GIT binary patch literal 22361 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2@2x.png b/Riot/Assets/Images.xcassets/AllChatsOnboarding/all_chats_onboarding2.imageset/all_chats_onboarding2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5e33559accae8560798ff9e4a796003ff559f9e9 GIT binary patch literal 55653 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

|! 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 Vo!gB!+WMdW3NotF)skkR{|~Qu5q$sv literal 0 HcmV?d00001 diff --git a/Riot/Assets/Images.xcassets/Home/all_chats_edit_icon.imageset/Contents.json b/Riot/Assets/Images.xcassets/Home/all_chats_edit_icon.imageset/Contents.json index f00e7d1d2..4716ddef7 100644 --- a/Riot/Assets/Images.xcassets/Home/all_chats_edit_icon.imageset/Contents.json +++ b/Riot/Assets/Images.xcassets/Home/all_chats_edit_icon.imageset/Contents.json @@ -2,16 +2,7 @@ "images" : [ { "filename" : "all_chats_edit_icon.svg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "idiom" : "universal" } ], "info" : { diff --git a/Riot/Assets/Images.xcassets/Home/all_chats_empty_list_placeholder_icon.imageset/Contents.json b/Riot/Assets/Images.xcassets/Home/all_chats_empty_list_placeholder_icon.imageset/Contents.json index 90791b942..49e4118aa 100644 --- a/Riot/Assets/Images.xcassets/Home/all_chats_empty_list_placeholder_icon.imageset/Contents.json +++ b/Riot/Assets/Images.xcassets/Home/all_chats_empty_list_placeholder_icon.imageset/Contents.json @@ -2,16 +2,7 @@ "images" : [ { "filename" : "all_chats_empty_list_placeholder_icon.svg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "idiom" : "universal" } ], "info" : { diff --git a/Riot/Assets/Images.xcassets/Home/all_chats_spaces_icon.imageset/Contents.json b/Riot/Assets/Images.xcassets/Home/all_chats_spaces_icon.imageset/Contents.json index 20c13cc1f..d29454793 100644 --- a/Riot/Assets/Images.xcassets/Home/all_chats_spaces_icon.imageset/Contents.json +++ b/Riot/Assets/Images.xcassets/Home/all_chats_spaces_icon.imageset/Contents.json @@ -2,16 +2,7 @@ "images" : [ { "filename" : "all_chats_spaces_icon.svg", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "idiom" : "universal" } ], "info" : { diff --git a/changelog.d/6624.bugfix b/changelog.d/6624.bugfix new file mode 100644 index 000000000..4d991dcc9 --- /dev/null +++ b/changelog.d/6624.bugfix @@ -0,0 +1 @@ +App Layout: Updated missing image for Onboarding screen page 2 From 4a61e726611792e0431a4b3d1e8b19495d0cd367 Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Wed, 24 Aug 2022 20:55:38 +0200 Subject: [PATCH 02/24] App Layout: number of invites is limited to 10 in the All Chats screen - fixed --- Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m | 2 +- changelog.d/6625.bugfix | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 changelog.d/6625.bugfix diff --git a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m index 18ea65eca..cce8b3714 100644 --- a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m +++ b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m @@ -1101,7 +1101,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou { RecentsInvitesTableViewCell *tableViewCell = [tableView dequeueReusableCellWithIdentifier:[RecentsInvitesTableViewCell defaultReuseIdentifier]]; - tableViewCell.invitesCount = self.recentsListService.invitedRoomListData.counts.numberOfRooms; + tableViewCell.invitesCount = self.recentsListService.invitedRoomListData.counts.total.numberOfRooms; return tableViewCell; } diff --git a/changelog.d/6625.bugfix b/changelog.d/6625.bugfix new file mode 100644 index 000000000..81c125e72 --- /dev/null +++ b/changelog.d/6625.bugfix @@ -0,0 +1 @@ +App Layout: fixed limited number of invites in the All Chats screen From 877e170cfa2a387e066000c6a7a4c879c00be657 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Thu, 25 Aug 2022 10:11:05 +0300 Subject: [PATCH 03/24] Render the PIN entry screen correctly on landscape --- .../SetPinCode/SetPinCoordinatorBridgePresenter.swift | 7 +------ changelog.d/pr-6629.bugfix | 1 + 2 files changed, 2 insertions(+), 6 deletions(-) create mode 100644 changelog.d/pr-6629.bugfix diff --git a/Riot/Modules/SetPinCode/SetPinCoordinatorBridgePresenter.swift b/Riot/Modules/SetPinCode/SetPinCoordinatorBridgePresenter.swift index 2351e5f61..c381b76eb 100644 --- a/Riot/Modules/SetPinCode/SetPinCoordinatorBridgePresenter.swift +++ b/Riot/Modules/SetPinCode/SetPinCoordinatorBridgePresenter.swift @@ -95,13 +95,8 @@ final class SetPinCoordinatorBridgePresenter: NSObject { let setPinCoordinator = SetPinCoordinator(session: self.session, viewMode: self.viewMode, pinCodePreferences: .shared) setPinCoordinator.delegate = self - guard let view = setPinCoordinator.toPresentable().view else { return } - pinCoordinatorWindow.addSubview(view) - view.leadingAnchor.constraint(equalTo: pinCoordinatorWindow.leadingAnchor, constant: 0).isActive = true - view.trailingAnchor.constraint(equalTo: pinCoordinatorWindow.trailingAnchor, constant: 0).isActive = true - view.topAnchor.constraint(equalTo: pinCoordinatorWindow.topAnchor, constant: 0).isActive = true - view.bottomAnchor.constraint(equalTo: pinCoordinatorWindow.bottomAnchor, constant: 0).isActive = true + pinCoordinatorWindow.rootViewController = setPinCoordinator.toPresentable() pinCoordinatorWindow.makeKeyAndVisible() setPinCoordinator.start() diff --git a/changelog.d/pr-6629.bugfix b/changelog.d/pr-6629.bugfix new file mode 100644 index 000000000..00dec48ea --- /dev/null +++ b/changelog.d/pr-6629.bugfix @@ -0,0 +1 @@ +Render the PIN entry screen correctly on landscape \ No newline at end of file From b08b756074f5b5e83b493a18490d5bf5a8bf50f4 Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Thu, 25 Aug 2022 10:20:03 +0200 Subject: [PATCH 04/24] App Layout: added support for transparent avatar icons in the all chats screen --- Riot/Modules/TabBar/TabBarCoordinator.swift | 5 ++++- changelog.d/6556.bugfix | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 changelog.d/6556.bugfix diff --git a/Riot/Modules/TabBar/TabBarCoordinator.swift b/Riot/Modules/TabBar/TabBarCoordinator.swift index d059aa5d3..0e70a2c37 100644 --- a/Riot/Modules/TabBar/TabBarCoordinator.swift +++ b/Riot/Modules/TabBar/TabBarCoordinator.swift @@ -703,6 +703,7 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { // MARK: Navigation bar items management private weak var rightMenuAvatarView: AvatarView? + private weak var rightMenuButton: UIButton? private func createLeftButtonItem(for viewController: UIViewController) { guard !BuildSettings.newAppLayoutEnabled else { @@ -776,6 +777,7 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { button.showsMenuAsPrimaryAction = true button.autoresizingMask = [.flexibleHeight, .flexibleWidth] view.addSubview(button) + self.rightMenuButton = button let avatarView = UserAvatarView(frame: view.bounds.inset(by: UIEdgeInsets(top: 7, left: 7, bottom: 7, right: 7))) avatarView.isUserInteractionEnabled = false @@ -792,10 +794,11 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { } private func updateAvatarButtonItem() { - guard let avatarView = rightMenuAvatarView, let avatar = userAvatarViewData(from: currentMatrixSession) else { + guard let avatarView = rightMenuAvatarView, let button = rightMenuButton, let avatar = userAvatarViewData(from: currentMatrixSession) else { return } + button.setImage(nil, for: .normal) avatarView.fill(with: avatar) } diff --git a/changelog.d/6556.bugfix b/changelog.d/6556.bugfix new file mode 100644 index 000000000..80bb47484 --- /dev/null +++ b/changelog.d/6556.bugfix @@ -0,0 +1 @@ +App Layout: added support for transparent avatar icons in the all chats screen From 4568d85d3cc4c4cccdddce6048af9413ef366141 Mon Sep 17 00:00:00 2001 From: Andy Uhnak Date: Thu, 25 Aug 2022 10:15:03 +0100 Subject: [PATCH 05/24] Upload Sentry Dsyms for App Store builds --- Riot/Modules/Analytics/SentryMonitoringClient.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Modules/Analytics/SentryMonitoringClient.swift b/Riot/Modules/Analytics/SentryMonitoringClient.swift index b848c02a9..38b91960b 100644 --- a/Riot/Modules/Analytics/SentryMonitoringClient.swift +++ b/Riot/Modules/Analytics/SentryMonitoringClient.swift @@ -34,6 +34,7 @@ struct SentryMonitoringClient { options.dsn = Self.sentryDSN // Collecting only 10% of all events + options.sampleRate = 0.1 options.tracesSampleRate = 0.1 options.beforeSend = { event in From aca89e86dce39531e42b2987a8fcfc8d71313134 Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Thu, 25 Aug 2022 11:30:11 +0200 Subject: [PATCH 06/24] App Layout: Removed Low Priority Rooms from Filters --- .../Recents/Service/MatrixSDK/RecentsListService.swift | 4 ++-- .../Home/AllChats/AllChatsLayoutSettingsManager.swift | 5 +++++ changelog.d/6577.bugfix | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 changelog.d/6577.bugfix diff --git a/Riot/Modules/Common/Recents/Service/MatrixSDK/RecentsListService.swift b/Riot/Modules/Common/Recents/Service/MatrixSDK/RecentsListService.swift index 7370f0f94..74effcd99 100644 --- a/Riot/Modules/Common/Recents/Service/MatrixSDK/RecentsListService.swift +++ b/Riot/Modules/Common/Recents/Service/MatrixSDK/RecentsListService.swift @@ -132,7 +132,7 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { if let fetcher = conversationRoomListDataFetcherForRooms, fetcherTypes.contains(.conversationRooms) { result.append(fetcher) } - if let fetcher = lowPriorityRoomListDataFetcher, fetcherTypes.contains(.lowPriority) { + if let fetcher = lowPriorityRoomListDataFetcher, fetcherTypes.contains(.lowPriority), shouldShowLowPriority { result.append(fetcher) } if let fetcher = serverNoticeRoomListDataFetcher, fetcherTypes.contains(.serverNotice) { @@ -482,7 +482,7 @@ public class RecentsListService: NSObject, RecentsListServiceProtocol { } private var shouldShowLowPriority: Bool { - return fetcherTypesForMode[mode]?.contains(.lowPriority) ?? false + return ((mode != .allChats) || !AllChatsLayoutSettingsManager.shared.hasAnActiveFilter) && fetcherTypesForMode[mode]?.contains(.lowPriority) ?? false } private var shouldShowServerNotice: Bool { diff --git a/Riot/Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift b/Riot/Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift index 065c54cb3..33b1ee335 100644 --- a/Riot/Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift +++ b/Riot/Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift @@ -105,6 +105,11 @@ final class AllChatsLayoutSettingsManager: NSObject { } } + /// `true` if filters are activated in the All Chats Layout screen and a filter other than `.all` is active + var hasAnActiveFilter: Bool { + return !allChatLayoutSettings.filters.isEmpty && !activeFilters.isEmpty && activeFilters != .all + } + // MARK: - Private private func track(activeFilters: AllChatsLayoutFilterType?) { diff --git a/changelog.d/6577.bugfix b/changelog.d/6577.bugfix new file mode 100644 index 000000000..bd0ab00a4 --- /dev/null +++ b/changelog.d/6577.bugfix @@ -0,0 +1 @@ +App Layout: Removed Low Priority Rooms from Filters From edcf221a5971820d42f02673b55b686b861ff950 Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Thu, 25 Aug 2022 13:51:50 +0200 Subject: [PATCH 07/24] App Layout: fixed reactions background in timeline --- .../SessionsStatus/UserVerificationSessionStatusCell.swift | 2 +- .../Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.swift | 4 ++-- .../KeyVerification/KeyVerificationCellInnerContentView.swift | 2 +- .../Reactions/RoomReactionActionViewCell.swift | 2 +- .../Reactions/RoomReactionImageViewCell.swift | 2 +- .../TimelineDecorations/Reactions/RoomReactionViewCell.swift | 2 +- changelog.d/6557.bugfix | 1 + 7 files changed, 8 insertions(+), 7 deletions(-) create mode 100644 changelog.d/6557.bugfix diff --git a/Riot/Modules/KeyVerification/User/SessionsStatus/UserVerificationSessionStatusCell.swift b/Riot/Modules/KeyVerification/User/SessionsStatus/UserVerificationSessionStatusCell.swift index d0b6de6e7..548ce70b0 100644 --- a/Riot/Modules/KeyVerification/User/SessionsStatus/UserVerificationSessionStatusCell.swift +++ b/Riot/Modules/KeyVerification/User/SessionsStatus/UserVerificationSessionStatusCell.swift @@ -63,7 +63,7 @@ final class UserVerificationSessionStatusCell: UITableViewCell, NibReusable, The func update(theme: Theme) { self.theme = theme - self.backgroundColor = theme.headerBackgroundColor + self.backgroundColor = theme.colors.system self.sessionNameLabel.textColor = theme.textPrimaryColor self.updateStatusTextColor() } diff --git a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.swift b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.swift index b539368c3..b72b31ac0 100644 --- a/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.swift +++ b/Riot/Modules/Room/ContextualMenu/ReactionsMenu/ReactionsMenuView.swift @@ -73,8 +73,8 @@ final class ReactionsMenuView: UIView, Themable, NibLoadable { // MARK: - Public func update(theme: Theme) { - self.reactionsBackgroundView.backgroundColor = theme.headerBackgroundColor - self.moreReactionsBackgroundView.backgroundColor = theme.headerBackgroundColor + self.reactionsBackgroundView.backgroundColor = theme.colors.system + self.moreReactionsBackgroundView.backgroundColor = theme.colors.system self.moreReactionsButton.tintColor = theme.tintColor } diff --git a/Riot/Modules/Room/TimelineCells/KeyVerification/KeyVerificationCellInnerContentView.swift b/Riot/Modules/Room/TimelineCells/KeyVerification/KeyVerificationCellInnerContentView.swift index cac389332..62bc9b7e6 100644 --- a/Riot/Modules/Room/TimelineCells/KeyVerification/KeyVerificationCellInnerContentView.swift +++ b/Riot/Modules/Room/TimelineCells/KeyVerification/KeyVerificationCellInnerContentView.swift @@ -130,7 +130,7 @@ final class KeyVerificationCellInnerContentView: UIView, NibLoadable { // MARK: - Public func update(theme: Theme) { - self.backgroundColor = theme.headerBackgroundColor + self.backgroundColor = theme.colors.system self.titleLabel.textColor = theme.textPrimaryColor self.otherUserInformationLabel.textColor = theme.textSecondaryColor diff --git a/Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionActionViewCell.swift b/Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionActionViewCell.swift index 9b966de0f..433401bca 100644 --- a/Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionActionViewCell.swift +++ b/Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionActionViewCell.swift @@ -87,6 +87,6 @@ final class RoomReactionActionViewCell: UICollectionViewCell, NibReusable, Thema self.actionLabel.textColor = self.theme?.textSecondaryColor self.reactionBackgroundView.layer.borderWidth = 0.0 - self.reactionBackgroundView.backgroundColor = self.theme?.headerBackgroundColor + self.reactionBackgroundView.backgroundColor = self.theme?.colors.system } } diff --git a/Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionImageViewCell.swift b/Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionImageViewCell.swift index a063db721..454822478 100644 --- a/Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionImageViewCell.swift +++ b/Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionImageViewCell.swift @@ -79,6 +79,6 @@ final class RoomReactionImageViewCell: UICollectionViewCell, NibReusable, Themab self.imageView.tintColor = self.theme?.textSecondaryColor self.reactionBackgroundView.layer.borderWidth = 0.0 - self.reactionBackgroundView.backgroundColor = self.theme?.headerBackgroundColor + self.reactionBackgroundView.backgroundColor = self.theme?.colors.system } } diff --git a/Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionViewCell.swift b/Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionViewCell.swift index 7e509e923..1e530b126 100644 --- a/Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionViewCell.swift +++ b/Riot/Modules/Room/TimelineDecorations/Reactions/RoomReactionViewCell.swift @@ -97,7 +97,7 @@ final class RoomReactionViewCell: UICollectionViewCell, NibReusable, Themable { reactionBackgroundColor = self.theme?.tintBackgroundColor reactionBackgroundBorderWidth = Constants.selectedBorderWidth } else { - reactionBackgroundColor = self.theme?.headerBackgroundColor + reactionBackgroundColor = self.theme?.colors.system reactionBackgroundBorderWidth = 0.0 } diff --git a/changelog.d/6557.bugfix b/changelog.d/6557.bugfix new file mode 100644 index 000000000..1d0ce6a82 --- /dev/null +++ b/changelog.d/6557.bugfix @@ -0,0 +1 @@ +App Layout: fixed reactions background in timeline From c878088bdd6f1254fed1931b62b17c0c872aa2c2 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Fri, 26 Aug 2022 14:12:13 +0300 Subject: [PATCH 08/24] Fix a race in room data source initializer, by adding `threadId` parameter in every case --- .../PublicRoomContextMenuProvider.swift | 2 +- .../RecentCellContextMenuProvider.swift | 2 +- .../MatrixKit/Models/Room/MXKRoomDataSource.h | 6 ++++-- .../MatrixKit/Models/Room/MXKRoomDataSource.m | 12 ++++++------ .../MatrixKit/Models/Room/MXKRoomDataSourceManager.m | 2 +- Riot/Modules/Room/DataSources/RoomDataSource.m | 4 ++-- Riot/Modules/Room/RoomInfo/RoomInfoCoordinator.swift | 2 +- Riot/Modules/Room/RoomViewController.m | 1 + Riot/Modules/SplitView/SplitViewCoordinator.swift | 2 +- 9 files changed, 18 insertions(+), 15 deletions(-) diff --git a/Riot/Modules/ContextMenu/ContextMenuProviders/PublicRoomContextMenuProvider.swift b/Riot/Modules/ContextMenu/ContextMenuProviders/PublicRoomContextMenuProvider.swift index da2502668..d30594110 100644 --- a/Riot/Modules/ContextMenu/ContextMenuProviders/PublicRoomContextMenuProvider.swift +++ b/Riot/Modules/ContextMenu/ContextMenuProviders/PublicRoomContextMenuProvider.swift @@ -37,7 +37,7 @@ class PublicRoomContextMenuProvider: NSObject { } roomViewController.isContextPreview = true - RoomPreviewDataSource.load(withRoomId: room.roomId, andMatrixSession: session) { [weak roomViewController] roomDataSource in + RoomPreviewDataSource.load(withRoomId: room.roomId, threadId: nil, andMatrixSession: session) { [weak roomViewController] roomDataSource in guard let dataSource = roomDataSource as? RoomPreviewDataSource else { return } diff --git a/Riot/Modules/ContextMenu/ContextMenuProviders/RecentCellContextMenuProvider.swift b/Riot/Modules/ContextMenu/ContextMenuProviders/RecentCellContextMenuProvider.swift index a748b7649..c696932db 100644 --- a/Riot/Modules/ContextMenu/ContextMenuProviders/RecentCellContextMenuProvider.swift +++ b/Riot/Modules/ContextMenu/ContextMenuProviders/RecentCellContextMenuProvider.swift @@ -57,7 +57,7 @@ class RecentCellContextMenuProvider: NSObject { } roomViewController.isContextPreview = true - RoomPreviewDataSource.load(withRoomId: room.roomId, andMatrixSession: session) { [weak roomViewController] roomDataSource in + RoomPreviewDataSource.load(withRoomId: room.roomId, threadId: nil, andMatrixSession: session) { [weak roomViewController] roomDataSource in guard let dataSource = roomDataSource as? RoomPreviewDataSource else { return } diff --git a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.h b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.h index a5c542880..d7c4b2db2 100644 --- a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.h +++ b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.h @@ -261,10 +261,11 @@ extern NSString *const kMXKRoomDataSourceTimelineErrorErrorKey; the room data source is created. @param roomId the id of the room to get data from. + @param threadId the id of the thread to load. If provided, thread data source will be loaded from the room specified with `roomId`. @param mxSession the Matrix session to get data from. @param onComplete a block providing the newly created instance. */ -+ (void)loadRoomDataSourceWithRoomId:(NSString*)roomId andMatrixSession:(MXSession*)mxSession onComplete:(void (^)(id roomDataSource))onComplete; ++ (void)loadRoomDataSourceWithRoomId:(NSString*)roomId threadId:(NSString*)threadId andMatrixSession:(MXSession*)mxSession onComplete:(void (^)(id roomDataSource))onComplete; /** Asynchronously create adata source to serve data corresponding to an event in the @@ -306,10 +307,11 @@ extern NSString *const kMXKRoomDataSourceTimelineErrorErrorKey; Initialise the data source to serve data corresponding to the passed room. @param roomId the id of the room to get data from. + @param threadId the id of the thread to initialize. If provided, thread data source will be initialized from the room specified with `roomId`. @param mxSession the Matrix session to get data from. @return the newly created instance. */ -- (instancetype)initWithRoomId:(NSString*)roomId andMatrixSession:(MXSession*)mxSession; +- (instancetype)initWithRoomId:(NSString*)roomId andMatrixSession:(MXSession*)mxSession threadId:(NSString*)threadId; /** Initialise the data source to serve data corresponding to an event in the diff --git a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m index 5872eee2d..f07a2a996 100644 --- a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m +++ b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m @@ -208,9 +208,9 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) { @implementation MXKRoomDataSource -+ (void)loadRoomDataSourceWithRoomId:(NSString*)roomId andMatrixSession:(MXSession*)mxSession onComplete:(void (^)(id roomDataSource))onComplete ++ (void)loadRoomDataSourceWithRoomId:(NSString*)roomId threadId:(NSString*)threadId andMatrixSession:(MXSession*)mxSession onComplete:(void (^)(id roomDataSource))onComplete { - MXKRoomDataSource *roomDataSource = [[self alloc] initWithRoomId:roomId andMatrixSession:mxSession]; + MXKRoomDataSource *roomDataSource = [[self alloc] initWithRoomId:roomId andMatrixSession:mxSession threadId:threadId]; [self ensureSessionStateForDataSource:roomDataSource initialEventId:nil andMatrixSession:mxSession onComplete:onComplete]; } @@ -284,7 +284,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) { } } -- (instancetype)initWithRoomId:(NSString *)roomId andMatrixSession:(MXSession *)matrixSession +- (instancetype)initWithRoomId:(NSString *)roomId andMatrixSession:(MXSession *)matrixSession threadId:(NSString *)threadId { self = [super initWithMatrixSession:matrixSession]; if (self) @@ -292,6 +292,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) { MXLogVerbose(@"[MXKRoomDataSource][%p] initWithRoomId: %@", self, roomId); _roomId = roomId; + _threadId = threadId; _secondaryRoomEventTypes = @[ kMXEventTypeStringCallInvite, kMXEventTypeStringCallCandidates, @@ -368,7 +369,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) { - (instancetype)initWithRoomId:(NSString*)roomId initialEventId:(NSString*)initialEventId2 threadId:(NSString*)threadId andMatrixSession:(MXSession*)mxSession { - self = [self initWithRoomId:roomId andMatrixSession:mxSession]; + self = [self initWithRoomId:roomId andMatrixSession:mxSession threadId:threadId]; if (self) { if (initialEventId2) @@ -376,7 +377,6 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) { initialEventId = initialEventId2; _isLive = NO; } - _threadId = threadId; } return self; @@ -584,7 +584,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) { - (void)destroy { - MXLogDebug(@"[MXKRoomDataSource][%p] Destroy - room id: %@", self, _roomId); + MXLogDebug(@"[MXKRoomDataSource][%p] Destroy - room id: %@ - thread id: %@", self, _roomId, _threadId); [self unregisterScanManagerNotifications]; [self unregisterReactionsChangeListener]; diff --git a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSourceManager.m b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSourceManager.m index fd4e54c8a..c028768eb 100644 --- a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSourceManager.m +++ b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSourceManager.m @@ -200,7 +200,7 @@ static Class _roomDataSourceClass; if (!roomDataSource && create && roomId) { - [_roomDataSourceClass loadRoomDataSourceWithRoomId:roomId andMatrixSession:mxSession onComplete:^(id roomDataSource) { + [_roomDataSourceClass loadRoomDataSourceWithRoomId:roomId threadId:nil andMatrixSession:mxSession onComplete:^(id roomDataSource) { [self addRoomDataSource:roomDataSource]; onComplete(roomDataSource); }]; diff --git a/Riot/Modules/Room/DataSources/RoomDataSource.m b/Riot/Modules/Room/DataSources/RoomDataSource.m index 958403acc..ed48741db 100644 --- a/Riot/Modules/Room/DataSources/RoomDataSource.m +++ b/Riot/Modules/Room/DataSources/RoomDataSource.m @@ -68,9 +68,9 @@ const CGFloat kTypingCellHeight = 24; @implementation RoomDataSource -- (instancetype)initWithRoomId:(NSString *)roomId andMatrixSession:(MXSession *)matrixSession +- (instancetype)initWithRoomId:(NSString *)roomId andMatrixSession:(MXSession *)matrixSession threadId:(NSString *)threadId { - self = [super initWithRoomId:roomId andMatrixSession:matrixSession]; + self = [super initWithRoomId:roomId andMatrixSession:matrixSession threadId:threadId]; if (self) { // Replace default Cell data class diff --git a/Riot/Modules/Room/RoomInfo/RoomInfoCoordinator.swift b/Riot/Modules/Room/RoomInfo/RoomInfoCoordinator.swift index 5d75ed1b8..44ddb735b 100644 --- a/Riot/Modules/Room/RoomInfo/RoomInfoCoordinator.swift +++ b/Riot/Modules/Room/RoomInfo/RoomInfoCoordinator.swift @@ -47,7 +47,7 @@ final class RoomInfoCoordinator: NSObject, RoomInfoCoordinatorType { let files = RoomFilesViewController() files.finalizeInit() files.screenTracker = AnalyticsScreenTracker(screen: .roomUploads) - MXKRoomDataSource.load(withRoomId: self.room.roomId, andMatrixSession: self.session) { (dataSource) in + MXKRoomDataSource.load(withRoomId: self.room.roomId, threadId: nil, andMatrixSession: self.session) { (dataSource) in guard let dataSource = dataSource as? MXKRoomDataSource else { return } dataSource.filterMessagesWithURL = true dataSource.finalizeInitialization() diff --git a/Riot/Modules/Room/RoomViewController.m b/Riot/Modules/Room/RoomViewController.m index 1c9114ab1..7d3da462f 100644 --- a/Riot/Modules/Room/RoomViewController.m +++ b/Riot/Modules/Room/RoomViewController.m @@ -5687,6 +5687,7 @@ static CGSize kThreadListBarButtonItemImageSize; if (self.isContextPreview) { [RoomPreviewDataSource loadRoomDataSourceWithRoomId:self.roomDataSource.roomId + threadId:nil andMatrixSession:self.mainSession onComplete:^(RoomPreviewDataSource *roomDataSource) { diff --git a/Riot/Modules/SplitView/SplitViewCoordinator.swift b/Riot/Modules/SplitView/SplitViewCoordinator.swift index eff81d0e5..a3de10ee5 100644 --- a/Riot/Modules/SplitView/SplitViewCoordinator.swift +++ b/Riot/Modules/SplitView/SplitViewCoordinator.swift @@ -227,7 +227,7 @@ final class SplitViewCoordinator: NSObject, SplitViewCoordinatorType { } let existingRoomCoordinatorWithSameRoomId = self.detailModules.first { presentable -> Bool in - if let currentRoomCoordinator = presentable as? RoomCoordinatorProtocol { + if let currentRoomCoordinator = presentable as? RoomCoordinatorProtocol, currentRoomCoordinator.threadId == nil { return currentRoomCoordinator.roomId == roomCoordinator.roomId } return false From 559d4b4362ae7c136d8bb819c2478ac1d02ea7d5 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Fri, 26 Aug 2022 14:12:55 +0300 Subject: [PATCH 09/24] Fix navigation controller toolbar when opening the from a notification --- Riot/Modules/Room/MXKRoomViewController.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Riot/Modules/Room/MXKRoomViewController.m b/Riot/Modules/Room/MXKRoomViewController.m index 2002d7344..ebfe5f06e 100644 --- a/Riot/Modules/Room/MXKRoomViewController.m +++ b/Riot/Modules/Room/MXKRoomViewController.m @@ -291,6 +291,8 @@ - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; + + [self.navigationController setToolbarHidden:YES animated:NO]; // Observe server sync process at room data source level too [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMatrixSessionChange) name:kMXKRoomDataSourceSyncStatusChanged object:nil]; From ee37f5074572b2f66bc76080eedb5fa7d3f1bac0 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Fri, 26 Aug 2022 14:13:37 +0300 Subject: [PATCH 10/24] Call delegate method of room data source only if there is a change --- .../Modules/MatrixKit/Models/Room/MXKRoomDataSource.m | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m index f07a2a996..a781926ce 100644 --- a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m +++ b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m @@ -2848,11 +2848,14 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) { - (void)setState:(MXKDataSourceState)newState { - self->state = newState; - - if (self.delegate && [self.delegate respondsToSelector:@selector(dataSource:didStateChange:)]) + if (self->state != newState) { - [self.delegate dataSource:self didStateChange:self->state]; + self->state = newState; + + if (self.delegate && [self.delegate respondsToSelector:@selector(dataSource:didStateChange:)]) + { + [self.delegate dataSource:self didStateChange:self->state]; + } } } From 34a83a98c01331357ebc1d0bc361e574711eed93 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Fri, 26 Aug 2022 16:53:50 +0300 Subject: [PATCH 11/24] Nullify thread on data source reset --- Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m index a781926ce..7770efd89 100644 --- a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m +++ b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSource.m @@ -553,6 +553,7 @@ typedef NS_ENUM (NSUInteger, MXKRoomDataSourceError) { } self.room = nil; + self.thread = nil; self.secondaryRoom = nil; } From 6bf102c9afeb6276112414b4a31a918c0d05297a Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Fri, 26 Aug 2022 16:54:11 +0300 Subject: [PATCH 12/24] Add a sync method to check a room data source existence --- .../MatrixKit/Models/Room/MXKRoomDataSourceManager.h | 7 +++++++ .../MatrixKit/Models/Room/MXKRoomDataSourceManager.m | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSourceManager.h b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSourceManager.h index 46f6709da..28a62e80e 100644 --- a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSourceManager.h +++ b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSourceManager.h @@ -78,6 +78,13 @@ typedef enum : NSUInteger { */ - (void)reset; +/** + Flag indicating the manager has a room data source for a given room id. + + @param roomId the room id to check. + */ +- (BOOL)hasRoomDataSourceForRoom:(NSString*)roomId; + /** Get a room data source corresponding to a room id. diff --git a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSourceManager.m b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSourceManager.m index c028768eb..181552e53 100644 --- a/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSourceManager.m +++ b/Riot/Modules/MatrixKit/Models/Room/MXKRoomDataSourceManager.m @@ -191,6 +191,11 @@ static Class _roomDataSourceClass; } } +- (BOOL)hasRoomDataSourceForRoom:(NSString *)roomId +{ + return roomDataSources[roomId] != nil; +} + - (void)roomDataSourceForRoom:(NSString *)roomId create:(BOOL)create onComplete:(void (^)(MXKRoomDataSource *roomDataSource))onComplete { NSParameterAssert(roomId); From 1acb99ccca475c4f8032b817e90d0c152e69fdd6 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Fri, 26 Aug 2022 16:55:08 +0300 Subject: [PATCH 13/24] Implement caching for thread data sources --- .../Room/DataSources/ThreadDataSource.swift | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/Riot/Modules/Room/DataSources/ThreadDataSource.swift b/Riot/Modules/Room/DataSources/ThreadDataSource.swift index 4c46a1f42..3f69f7a04 100644 --- a/Riot/Modules/Room/DataSources/ThreadDataSource.swift +++ b/Riot/Modules/Room/DataSources/ThreadDataSource.swift @@ -15,15 +15,31 @@ // import Foundation +import UIKit @objcMembers public class ThreadDataSource: RoomDataSource { + + private typealias ThreadID = String + + /// Map of cached data sources. Keys are thread identifiers. + private static var dataSourceCache: [ThreadID: ThreadDataSource] = [:] public override func finalizeInitialization() { super.finalizeInitialization() showReadMarker = false showBubbleReceipts = false showTypingRow = false + + NotificationCenter.default.addObserver(self, + selector: #selector(didReceiveMemoryWarning), + name: UIApplication.didReceiveMemoryWarningNotification, + object: nil) + + NotificationCenter.default.addObserver(self, + selector: #selector(didLeaveRoom(_:)), + name: .mxSessionDidLeaveRoom, + object: nil) } public override var showReadMarker: Bool { @@ -41,5 +57,47 @@ public class ThreadDataSource: RoomDataSource { _ = newValue } } + + public override class func load(withRoomId roomId: String!, + initialEventId: String!, + threadId: String!, + andMatrixSession mxSession: MXSession!, + onComplete: ((Any?) -> Void)!) { + if let dataSource = dataSourceCache[threadId] { + onComplete(dataSource) + return + } + super.load(withRoomId: roomId, initialEventId: initialEventId, threadId: threadId, andMatrixSession: mxSession) { dataSource in + if let dataSource = dataSource as? ThreadDataSource { + Self.dataSourceCache[threadId] = dataSource + } + onComplete(dataSource) + } + } + + @objc + private func didReceiveMemoryWarning() { + MXLog.debug("[ThreadDataSource] didReceiveMemoryWarning. Will reload not active data sources in cache.") + + Self.dataSourceCache.forEach { + if $1.delegate == nil { + $1.reload() + } + } + } + + @objc + private func didLeaveRoom(_ notification: Notification) { + MXLog.debug("[ThreadDataSource] didReceiveMemoryWarning. Will reload not active data sources in cache.") + + guard let session = notification.object as? MXSession, + session == mxSession, + let roomId = notification.userInfo?[kMXSessionNotificationRoomIdKey] as? String else { + return + } + + let threadIds = Array(Self.dataSourceCache.filter { $1.roomId == roomId }.keys) + threadIds.forEach { Self.dataSourceCache.removeValue(forKey: $0) } + } } From 41cb6f424af8a62f21715f15791ee8c73bc69a04 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Fri, 26 Aug 2022 16:55:25 +0300 Subject: [PATCH 14/24] Do not destroy thread data sources --- Riot/Modules/Room/RoomCoordinator.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Riot/Modules/Room/RoomCoordinator.swift b/Riot/Modules/Room/RoomCoordinator.swift index 1728aac21..643cd803e 100644 --- a/Riot/Modules/Room/RoomCoordinator.swift +++ b/Riot/Modules/Room/RoomCoordinator.swift @@ -67,7 +67,10 @@ final class RoomCoordinator: NSObject, RoomCoordinatorProtocol { var canReleaseRoomDataSource: Bool { // If the displayed data is not a preview, let the manager release the room data source // (except if the view controller has the room data source ownership). - return self.parameters.previewData == nil && self.roomViewController.roomDataSource != nil && self.roomViewController.hasRoomDataSourceOwnership == false + return self.parameters.previewData == nil + && self.roomViewController.roomDataSource != nil + && self.roomViewController.roomDataSource.threadId == nil + && self.roomViewController.hasRoomDataSourceOwnership == false } // MARK: - Setup @@ -238,7 +241,7 @@ final class RoomCoordinator: NSObject, RoomCoordinatorProtocol { self.roomViewController.displayRoom(threadDataSource) // Give the data source ownership to the room view controller. - self.roomViewController.hasRoomDataSourceOwnership = true + self.roomViewController.hasRoomDataSourceOwnership = false self.mxSession?.updateBreadcrumbsWithRoom(withId: roomId, success: nil, failure: nil) From 418dec3c6334450ef8a32276483acffecdb92d09 Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Fri, 26 Aug 2022 16:56:39 +0300 Subject: [PATCH 15/24] Paginate through room events if needed when opening the app from a notification --- Riot/Modules/Application/LegacyAppDelegate.m | 63 +++++++++++++++++--- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index 8a8545a4c..f7c083ba5 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -1114,21 +1114,66 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni threadId:(NSString *)threadId sender:(NSString *)userId { - if (roomId) - { - MXRoom *room = [self.mxSessions.firstObject roomWithRoomId:roomId]; - if (room.summary.membership != MXMembershipJoin) + void(^sessionReadyBlock)(MXSession*) = ^(MXSession *session){ + if (roomId) { - Analytics.shared.joinedRoomTrigger = AnalyticsJoinedRoomTriggerNotification; + MXRoom *room = [session roomWithRoomId:roomId]; + if (room.summary.membership != MXMembershipJoin) + { + Analytics.shared.joinedRoomTrigger = AnalyticsJoinedRoomTriggerNotification; + } + else + { + Analytics.shared.viewRoomTrigger = AnalyticsViewRoomTriggerNotification; + } + } + + self.lastNavigatedRoomIdFromPush = roomId; + + if (threadId) + { + if(![[MXKRoomDataSourceManager sharedManagerForMatrixSession:session] hasRoomDataSourceForRoom:roomId]) + { + // the room having this thread probably was not opened before, paginate room messages to build threads + MXRoom *room = [session roomWithRoomId:roomId]; + [room liveTimeline:^(id liveTimeline) { + [liveTimeline resetPagination]; + [liveTimeline paginate:NSUIntegerMax direction:MXTimelineDirectionBackwards onlyFromStore:YES complete:^{ + [liveTimeline resetPagination]; + [self navigateToRoomById:roomId threadId:threadId sender:userId]; + } failure:^(NSError * _Nonnull error) { + [self navigateToRoomById:roomId threadId:threadId sender:userId]; + }]; + }]; + } + else + { + // the room has been opened before, we should be ok to continue + [self navigateToRoomById:roomId threadId:threadId sender:userId]; + } } else { - Analytics.shared.viewRoomTrigger = AnalyticsViewRoomTriggerNotification; + [self navigateToRoomById:roomId threadId:threadId sender:userId]; } - } + }; - _lastNavigatedRoomIdFromPush = roomId; - [self navigateToRoomById:roomId threadId:threadId sender:userId]; + MXSession *mxSession = self.mxSessions.firstObject; + if (mxSession.state >= MXSessionStateSyncInProgress) + { + sessionReadyBlock(mxSession); + } + else + { + // wait for session state to be sync in progress + __block id sessionStateObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXSessionStateDidChangeNotification object:mxSession queue:nil usingBlock:^(NSNotification * _Nonnull note) { + if (mxSession.state >= MXSessionStateSyncInProgress) + { + [[NSNotificationCenter defaultCenter] removeObserver:sessionStateObserver]; + sessionReadyBlock(mxSession); + } + }]; + } } #pragma mark - Badge Count From acdbee921f5fa6551ab0305c9604ff4b28140efa Mon Sep 17 00:00:00 2001 From: ismailgulek Date: Fri, 26 Aug 2022 17:34:37 +0300 Subject: [PATCH 16/24] Add changelog --- changelog.d/6628.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/6628.bugfix diff --git a/changelog.d/6628.bugfix b/changelog.d/6628.bugfix new file mode 100644 index 000000000..b195cf9b1 --- /dev/null +++ b/changelog.d/6628.bugfix @@ -0,0 +1 @@ +Fix notification issues for threads. From b224d907ce06254df53f5f80db612028f657b4d4 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Fri, 26 Aug 2022 14:00:58 +0300 Subject: [PATCH 17/24] Fixes vector-im/element-ios/issues/5279 - Stop waiting for biometric unlock if disabled system wide --- Riot/Modules/SetPinCode/PinCodePreferences.swift | 4 ++++ changelog.d/5279.bugfix | 1 + 2 files changed, 5 insertions(+) create mode 100644 changelog.d/5279.bugfix diff --git a/Riot/Modules/SetPinCode/PinCodePreferences.swift b/Riot/Modules/SetPinCode/PinCodePreferences.swift index 386dc26a0..a55530f1f 100644 --- a/Riot/Modules/SetPinCode/PinCodePreferences.swift +++ b/Riot/Modules/SetPinCode/PinCodePreferences.swift @@ -127,6 +127,10 @@ final class PinCodePreferences: NSObject { var canUseBiometricsToUnlock: Bool? { get { + guard isBiometricsAvailable == true else { + return false + } + do { return try store.bool(forKey: StoreKeys.canUseBiometricsToUnlock) } catch let error { diff --git a/changelog.d/5279.bugfix b/changelog.d/5279.bugfix new file mode 100644 index 000000000..350ae95d3 --- /dev/null +++ b/changelog.d/5279.bugfix @@ -0,0 +1 @@ +Stop waiting for biometric unlock if disabled system wide \ No newline at end of file From 7a00355e58c078a80709fe3c665decee11aad603 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Fri, 26 Aug 2022 13:32:56 +0300 Subject: [PATCH 18/24] Ensure rest client async responses are processed on the main queue --- Riot/Categories/MXRestClient+Async.swift | 3 +++ changelog.d/pr-6642.bugfix | 1 + 2 files changed, 4 insertions(+) create mode 100644 changelog.d/pr-6642.bugfix diff --git a/Riot/Categories/MXRestClient+Async.swift b/Riot/Categories/MXRestClient+Async.swift index 6d13c798f..d72bb9ce1 100644 --- a/Riot/Categories/MXRestClient+Async.swift +++ b/Riot/Categories/MXRestClient+Async.swift @@ -158,6 +158,7 @@ extension MXRestClient { // MARK: - Private + @MainActor private func getResponse(_ callback: (@escaping (MXResponse) -> Void) -> MXHTTPOperation) async throws -> T { try await withCheckedThrowingContinuation { continuation in _ = callback { response in @@ -171,6 +172,7 @@ extension MXRestClient { } } + @MainActor private func getResponse(_ callback: (@escaping (T?) -> Void, @escaping (Error?) -> Void) -> MXHTTPOperation) async throws -> T { try await withCheckedThrowingContinuation { continuation in _ = callback { response in @@ -186,6 +188,7 @@ extension MXRestClient { } } + @MainActor private func getResponse(_ callback: (@escaping (T?, U?, V?) -> Void, @escaping (Error?) -> Void) -> MXHTTPOperation) async throws -> (T?, U?, V?) { try await withCheckedThrowingContinuation { continuation in _ = callback { arg1, arg2, arg3 in diff --git a/changelog.d/pr-6642.bugfix b/changelog.d/pr-6642.bugfix new file mode 100644 index 000000000..c5633cdf9 --- /dev/null +++ b/changelog.d/pr-6642.bugfix @@ -0,0 +1 @@ +Ensure rest client async responses are processed on the main queue \ No newline at end of file From cf3e08259cef3a4136c19c54b8fc883a1b2d9342 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Mon, 29 Aug 2022 10:10:56 +0300 Subject: [PATCH 19/24] Fix tests missing data source parameter --- RiotTests/MatrixKitTests/MXKRoomDataSourceTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RiotTests/MatrixKitTests/MXKRoomDataSourceTests.swift b/RiotTests/MatrixKitTests/MXKRoomDataSourceTests.swift index ce8a3d44e..cd7f8db15 100644 --- a/RiotTests/MatrixKitTests/MXKRoomDataSourceTests.swift +++ b/RiotTests/MatrixKitTests/MXKRoomDataSourceTests.swift @@ -93,7 +93,7 @@ private final class StubMXKRoomDataSource: MXKRoomDataSource { private final class FakeMXKRoomDataSource: MXKRoomDataSource { class func make() throws -> FakeMXKRoomDataSource { - let dataSource = try XCTUnwrap(FakeMXKRoomDataSource(roomId: "!foofoofoofoofoofoo:matrix.org", andMatrixSession: nil)) + let dataSource = try XCTUnwrap(FakeMXKRoomDataSource(roomId: "!foofoofoofoofoofoo:matrix.org", andMatrixSession: nil, threadId: nil)) dataSource.registerCellDataClass(CollapsibleBubbleCellData.self, forCellIdentifier: kMXKRoomBubbleCellDataIdentifier) dataSource.eventFormatter = CountingEventFormatter(matrixSession: nil) return dataSource From 5187cf9107df8326f05e90a37af3720ee3b40fca Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Mon, 29 Aug 2022 14:59:09 +0200 Subject: [PATCH 20/24] Added Labs flag for the new App Layout --- Config/BuildSettings.swift | 9 +++++- Riot/Assets/en.lproj/Vector.strings | 1 + Riot/Generated/Strings.swift | 4 +++ Riot/Managers/Settings/RiotSettings.swift | 9 ++++++ Riot/Managers/Theme/Themes/BlackTheme.swift | 10 +++++-- Riot/Managers/Theme/Themes/DarkTheme.swift | 8 ++++-- Riot/Managers/Theme/Themes/DefaultTheme.swift | 10 +++++-- Riot/Modules/Application/AppCoordinator.swift | 10 ++++++- Riot/Modules/Application/LegacyAppDelegate.m | 2 +- .../Recents/DataSources/RecentsDataSource.m | 6 ++-- .../UnifiedSearchViewController.m | 2 +- Riot/Modules/Home/HomeViewController.m | 5 ++++ Riot/Modules/Room/MXKRoomViewController.m | 2 +- .../Modules/Settings/SettingsViewController.m | 28 ++++++++++++++++++- Riot/Modules/TabBar/MasterTabBarController.m | 14 +++++----- Riot/Modules/TabBar/TabBarCoordinator.swift | 28 +++++++++++++------ changelog.d/6649.change | 1 + 17 files changed, 118 insertions(+), 31 deletions(-) create mode 100644 changelog.d/6649.change diff --git a/Config/BuildSettings.swift b/Config/BuildSettings.swift index 7315755ac..358121704 100644 --- a/Config/BuildSettings.swift +++ b/Config/BuildSettings.swift @@ -419,7 +419,14 @@ final class BuildSettings: NSObject { static let syncLocalContacts: Bool = false // MARK: - New App Layout - static let newAppLayoutEnabled = true + static let newAppLayoutEnabled = false + + static var isSideMenuActivated: Bool { + enableSideMenu && !RiotSettings.shared.newAppLayoutBetaEnabled + } + static var isNewAppLayoutActivated: Bool { + newAppLayoutEnabled || RiotSettings.shared.newAppLayoutBetaEnabled + } // MARK: - Device manager diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index 90fbf058d..f642e3993 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -761,6 +761,7 @@ Tap the + to start adding people."; "settings_labs_enable_auto_report_decryption_errors" = "Auto Report Decryption Errors"; "settings_labs_use_only_latest_user_avatar_and_name" = "Show latest avatar and name for users in message history"; "settings_labs_enable_live_location_sharing" = "Live location sharing - share current location (active development, and temporarily, locations persist in room history)"; +"settings_labs_enable_new_app_layout" = "New Application Layout"; "settings_version" = "Version %@"; "settings_olm_version" = "Olm Version %@"; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 086139eec..1a079a716 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -7351,6 +7351,10 @@ public class VectorL10n: NSObject { public static var settingsLabsEnableLiveLocationSharing: String { return VectorL10n.tr("Vector", "settings_labs_enable_live_location_sharing") } + /// New Application Layout + public static var settingsLabsEnableNewAppLayout: String { + return VectorL10n.tr("Vector", "settings_labs_enable_new_app_layout") + } /// Ring for group calls public static var settingsLabsEnableRingingForGroupCalls: String { return VectorL10n.tr("Vector", "settings_labs_enable_ringing_for_group_calls") diff --git a/Riot/Managers/Settings/RiotSettings.swift b/Riot/Managers/Settings/RiotSettings.swift index c3732c144..e1fd18a75 100644 --- a/Riot/Managers/Settings/RiotSettings.swift +++ b/Riot/Managers/Settings/RiotSettings.swift @@ -381,9 +381,18 @@ final class RiotSettings: NSObject { @UserDefault(key: "allChatsOnboardingHasBeenDisplayed", defaultValue: false, storage: defaults) var allChatsOnboardingHasBeenDisplayed + + // MARK: - New App Layout + @UserDefault(key: "newAppLayoutBetaEnabled", defaultValue: false, storage: defaults) + var newAppLayoutBetaEnabled { + didSet { + NotificationCenter.default.post(name: RiotSettings.newAppLayoutBetaToggleDidChange, object: self) + } + } } // MARK: - RiotSettings notification constants extension RiotSettings { public static let didUpdateLiveLocationSharingActivation = Notification.Name("RiotSettingsDidUpdateLiveLocationSharingActivation") + public static let newAppLayoutBetaToggleDidChange = Notification.Name("RiotSettingsNewAppLayoutBetaToggleDidChange") } diff --git a/Riot/Managers/Theme/Themes/BlackTheme.swift b/Riot/Managers/Theme/Themes/BlackTheme.swift index d0ff58cd9..c05964236 100644 --- a/Riot/Managers/Theme/Themes/BlackTheme.swift +++ b/Riot/Managers/Theme/Themes/BlackTheme.swift @@ -22,8 +22,14 @@ class BlackTheme: DarkTheme { super.init() self.identifier = ThemeIdentifier.black.rawValue self.backgroundColor = UIColor(rgb: 0x000000) - self.baseColor = UIColor(rgb: 0x000000) - self.headerBackgroundColor = UIColor(rgb: 0x000000) self.headerBorderColor = UIColor(rgb: 0x15191E) } + + override var baseColor: UIColor { + UIColor(rgb: 0x000000) + } + + override var headerBackgroundColor: UIColor { + UIColor(rgb: 0x000000) + } } diff --git a/Riot/Managers/Theme/Themes/DarkTheme.swift b/Riot/Managers/Theme/Themes/DarkTheme.swift index 35651e6b1..dc4e89f1b 100644 --- a/Riot/Managers/Theme/Themes/DarkTheme.swift +++ b/Riot/Managers/Theme/Themes/DarkTheme.swift @@ -26,7 +26,9 @@ class DarkTheme: NSObject, Theme { var backgroundColor: UIColor = UIColor(rgb: 0x15191E) - var baseColor: UIColor = BuildSettings.newAppLayoutEnabled ? UIColor(rgb: 0x15191E) : UIColor(rgb: 0x21262C) + var baseColor: UIColor { + BuildSettings.isNewAppLayoutActivated ? UIColor(rgb: 0x15191E) : UIColor(rgb: 0x21262C) + } var baseIconPrimaryColor: UIColor = UIColor(rgb: 0xEDF3FF) var baseTextPrimaryColor: UIColor = UIColor(rgb: 0xFFFFFF) var baseTextSecondaryColor: UIColor = UIColor(rgb: 0xA9B2BC) @@ -35,7 +37,9 @@ class DarkTheme: NSObject, Theme { var searchPlaceholderColor: UIColor = UIColor(rgb: 0xA9B2BC) var searchResultHighlightColor: UIColor = UIColor(rgb: 0xFCC639).withAlphaComponent(0.3) - var headerBackgroundColor: UIColor = BuildSettings.newAppLayoutEnabled ? UIColor(rgb: 0x15191E) : UIColor(rgb: 0x21262C) + var headerBackgroundColor: UIColor { + BuildSettings.isNewAppLayoutActivated ? UIColor(rgb: 0x15191E) : UIColor(rgb: 0x21262C) + } var headerBorderColor: UIColor = UIColor(rgb: 0x15191E) var headerTextPrimaryColor: UIColor = UIColor(rgb: 0xFFFFFF) var headerTextSecondaryColor: UIColor = UIColor(rgb: 0xA9B2BC) diff --git a/Riot/Managers/Theme/Themes/DefaultTheme.swift b/Riot/Managers/Theme/Themes/DefaultTheme.swift index 412390a47..d58a1a6d0 100644 --- a/Riot/Managers/Theme/Themes/DefaultTheme.swift +++ b/Riot/Managers/Theme/Themes/DefaultTheme.swift @@ -26,7 +26,9 @@ class DefaultTheme: NSObject, Theme { var backgroundColor: UIColor = UIColor(rgb: 0xFFFFFF) - var baseColor: UIColor = BuildSettings.newAppLayoutEnabled ? UIColor(rgb: 0xFFFFFF) : UIColor(rgb: 0xF5F7FA) + var baseColor: UIColor { + BuildSettings.isNewAppLayoutActivated ? UIColor(rgb: 0xFFFFFF) : UIColor(rgb: 0xF5F7FA) + } var baseIconPrimaryColor: UIColor = UIColor(rgb: 0xFFFFFF) var baseTextPrimaryColor: UIColor = UIColor(rgb: 0xFFFFFF) var baseTextSecondaryColor: UIColor = UIColor(rgb: 0x8F97A3) @@ -35,7 +37,9 @@ class DefaultTheme: NSObject, Theme { var searchPlaceholderColor: UIColor = UIColor(rgb: 0x8F97A3) var searchResultHighlightColor: UIColor = UIColor(rgb: 0xFCC639).withAlphaComponent(0.2) - var headerBackgroundColor: UIColor = BuildSettings.newAppLayoutEnabled ? UIColor(rgb: 0xFFFFFF) : UIColor(rgb: 0xF5F7FA) + var headerBackgroundColor: UIColor { + BuildSettings.isNewAppLayoutActivated ? UIColor(rgb: 0xFFFFFF) : UIColor(rgb: 0xF5F7FA) + } var headerBorderColor: UIColor = UIColor(rgb: 0xE9EDF1) var headerTextPrimaryColor: UIColor = UIColor(rgb: 0x17191C) var headerTextSecondaryColor: UIColor = UIColor(rgb: 0x737D8C) @@ -169,7 +173,7 @@ class DefaultTheme: NSObject, Theme { searchBar.backgroundImage = UIImage() // Remove top and bottom shadow searchBar.tintColor = self.tintColor - guard !BuildSettings.newAppLayoutEnabled else { + guard !BuildSettings.isNewAppLayoutActivated else { return } diff --git a/Riot/Modules/Application/AppCoordinator.swift b/Riot/Modules/Application/AppCoordinator.swift index 202e698a0..3553148f3 100755 --- a/Riot/Modules/Application/AppCoordinator.swift +++ b/Riot/Modules/Application/AppCoordinator.swift @@ -91,7 +91,7 @@ final class AppCoordinator: NSObject, AppCoordinatorType { // Setup user location services _ = UserLocationServiceProvider.shared - if BuildSettings.enableSideMenu { + if BuildSettings.isSideMenuActivated { self.addSideMenu() } @@ -105,6 +105,8 @@ final class AppCoordinator: NSObject, AppCoordinatorType { } } + NotificationCenter.default.addObserver(self, selector: #selector(self.newAppLayoutToggleDidChange(notification:)), name: RiotSettings.newAppLayoutBetaToggleDidChange, object: nil) + // NOTE: When split view is shown there can be no Matrix sessions ready. Keep this behavior or use a loading screen before showing the split view. self.showSplitView() MXLog.debug("[AppCoordinator] Showed split view") @@ -160,6 +162,12 @@ final class AppCoordinator: NSObject, AppCoordinatorType { ThemePublisher.shared.republish(themeIdPublisher: themeIdPublisher) } + @objc private func newAppLayoutToggleDidChange(notification: Notification) { + if BuildSettings.isSideMenuActivated { + self.addSideMenu() + } + } + private func excludeAllItemsFromBackup() { let manager = FileManager.default diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index f7c083ba5..1b3ce1db7 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -4257,7 +4257,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni } // Need to set `showAllRoomsInHomeSpace` to `true` for the new App Layout - if (BuildSettings.newAppLayoutEnabled) + if (BuildSettings.isNewAppLayoutActivated) { RiotSettings.shared.showAllRoomsInHomeSpace = YES; } diff --git a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m index cce8b3714..228751d31 100644 --- a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m +++ b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m @@ -84,7 +84,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou _crossSigningBannerDisplay = CrossSigningBannerDisplayNone; _secureBackupBannerDisplay = SecureBackupBannerDisplayNone; - _areSectionsShrinkable = !BuildSettings.newAppLayoutEnabled; + _areSectionsShrinkable = !BuildSettings.isNewAppLayoutActivated; shrinkedSectionsBitMask = 0; roomTagsListenerByUserId = [[NSMutableDictionary alloc] init]; @@ -758,7 +758,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou } - if (count && !(sectionType == RecentsDataSourceSectionTypeInvites) && !BuildSettings.newAppLayoutEnabled) + if (count && !(sectionType == RecentsDataSourceSectionTypeInvites) && !BuildSettings.isNewAppLayoutActivated) { NSString *roomCount = [NSString stringWithFormat:@" %tu", count]; @@ -987,7 +987,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou sectionHeader.bottomView = nil; } - if (!BuildSettings.newAppLayoutEnabled || !sectionHeader.bottomView) + if (!BuildSettings.isNewAppLayoutActivated || !sectionHeader.bottomView) { // Add label frame.size.height = RECENTSDATASOURCE_DEFAULT_SECTION_HEADER_HEIGHT - 10; diff --git a/Riot/Modules/GlobalSearch/UnifiedSearchViewController.m b/Riot/Modules/GlobalSearch/UnifiedSearchViewController.m index 8703623bb..fb27ec4b4 100644 --- a/Riot/Modules/GlobalSearch/UnifiedSearchViewController.m +++ b/Riot/Modules/GlobalSearch/UnifiedSearchViewController.m @@ -146,7 +146,7 @@ [self updateSearch]; - if (BuildSettings.newAppLayoutEnabled) + if (BuildSettings.isNewAppLayoutActivated) { [self.searchBar vc_searchTextField].backgroundColor = nil; [self vc_setLargeTitleDisplayMode: UINavigationItemLargeTitleDisplayModeAutomatic]; diff --git a/Riot/Modules/Home/HomeViewController.m b/Riot/Modules/Home/HomeViewController.m index 0ef4f7c48..c46e9d577 100644 --- a/Riot/Modules/Home/HomeViewController.m +++ b/Riot/Modules/Home/HomeViewController.m @@ -80,6 +80,11 @@ { [super viewDidLoad]; + if (!BuildSettings.isNewAppLayoutActivated) + { + [self.tabBarController vc_setLargeTitleDisplayMode:UINavigationItemLargeTitleDisplayModeNever]; + } + self.roomListDataReady = NO; self.view.accessibilityIdentifier = @"HomeVCView"; diff --git a/Riot/Modules/Room/MXKRoomViewController.m b/Riot/Modules/Room/MXKRoomViewController.m index ebfe5f06e..e007b8595 100644 --- a/Riot/Modules/Room/MXKRoomViewController.m +++ b/Riot/Modules/Room/MXKRoomViewController.m @@ -341,7 +341,7 @@ _bubblesTableView.hidden = NO; } - if (BuildSettings.newAppLayoutEnabled) + if (BuildSettings.isNewAppLayoutActivated) { [self vc_setLargeTitleDisplayMode: UINavigationItemLargeTitleDisplayModeNever]; } diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index 6b9a19f97..d86706ebb 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -172,7 +172,8 @@ typedef NS_ENUM(NSUInteger, LABS_ENABLE) LABS_ENABLE_RINGING_FOR_GROUP_CALLS_INDEX = 0, LABS_ENABLE_THREADS_INDEX, LABS_ENABLE_AUTO_REPORT_DECRYPTION_ERRORS, - LABS_ENABLE_LIVE_LOCATION_SHARING + LABS_ENABLE_LIVE_LOCATION_SHARING, + LABS_ENABLE_NEW_APP_LAYOUT }; typedef NS_ENUM(NSUInteger, SECURITY) @@ -595,6 +596,7 @@ ChangePasswordCoordinatorBridgePresenterDelegate> { [sectionLabs addRowWithTag:LABS_ENABLE_LIVE_LOCATION_SHARING]; } + [sectionLabs addRowWithTag:LABS_ENABLE_NEW_APP_LAYOUT]; sectionLabs.headerTitle = [VectorL10n settingsLabs]; if (sectionLabs.hasAnyRows) { @@ -1497,6 +1499,21 @@ ChangePasswordCoordinatorBridgePresenterDelegate> return labelAndSwitchCell; } +- (UITableViewCell *)buildNewAppLayoutCellForTableView:(UITableView*)tableView + atIndexPath:(NSIndexPath*)indexPath +{ + MXKTableViewCellWithLabelAndSwitch* labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath]; + + labelAndSwitchCell.mxkLabel.text = [VectorL10n settingsLabsEnableNewAppLayout]; + + labelAndSwitchCell.mxkSwitch.on = RiotSettings.shared.newAppLayoutBetaEnabled; + labelAndSwitchCell.mxkSwitch.onTintColor = ThemeService.shared.theme.tintColor; + labelAndSwitchCell.mxkSwitch.enabled = YES; + [labelAndSwitchCell.mxkSwitch addTarget:self action:@selector(toggleEnableNewAppLayout:) forControlEvents:UIControlEventTouchUpInside]; + + return labelAndSwitchCell; +} + #pragma mark - 3Pid Add - (void)showAuthenticationIfNeededForAdding:(MX3PIDMedium)medium withSession:(MXSession*)session completion:(void (^)(NSDictionary* authParams))completion @@ -2532,6 +2549,10 @@ ChangePasswordCoordinatorBridgePresenterDelegate> { cell = [self buildLiveLocationSharingCellForTableView:tableView atIndexPath:indexPath]; } + else if (row == LABS_ENABLE_NEW_APP_LAYOUT) + { + cell = [self buildNewAppLayoutCellForTableView:tableView atIndexPath:indexPath]; + } } else if (section == SECTION_TAG_SECURITY) { @@ -3971,6 +3992,11 @@ ChangePasswordCoordinatorBridgePresenterDelegate> RiotSettings.shared.enableLiveLocationSharing = sender.isOn; } +- (void)toggleEnableNewAppLayout:(UISwitch *)sender +{ + RiotSettings.shared.newAppLayoutBetaEnabled = sender.isOn; +} + #pragma mark - TextField listener - (IBAction)textFieldDidChange:(id)sender diff --git a/Riot/Modules/TabBar/MasterTabBarController.m b/Riot/Modules/TabBar/MasterTabBarController.m index b9f926407..96cc0880f 100644 --- a/Riot/Modules/TabBar/MasterTabBarController.m +++ b/Riot/Modules/TabBar/MasterTabBarController.m @@ -156,7 +156,7 @@ [self userInterfaceThemeDidChange]; } - self.tabBar.hidden = BuildSettings.newAppLayoutEnabled; + self.tabBar.hidden = BuildSettings.isNewAppLayoutActivated; } - (void)viewDidAppear:(BOOL)animated @@ -213,8 +213,8 @@ } [[AppDelegate theDelegate] checkAppVersion]; - - if (BuildSettings.newAppLayoutEnabled && !RiotSettings.shared.allChatsOnboardingHasBeenDisplayed) + + if (BuildSettings.isNewAppLayoutActivated && !RiotSettings.shared.allChatsOnboardingHasBeenDisplayed) { [self showAllChatsOnboardingScreen]; } @@ -633,7 +633,7 @@ { if (roomParentId) { NSString *parentName = [mxSession roomSummaryWithRoomId:roomParentId].displayname; - if (!BuildSettings.newAppLayoutEnabled) + if (!BuildSettings.isNewAppLayoutActivated) { NSMutableArray *breadcrumbs = [[NSMutableArray alloc] initWithObjects:parentName, nil]; @@ -649,7 +649,7 @@ } else { - if (!BuildSettings.newAppLayoutEnabled) + if (!BuildSettings.isNewAppLayoutActivated) { titleView.breadcrumbView.breadcrumbs = @[]; } @@ -661,7 +661,7 @@ - (void)updateSideMenuNotifcationIcon { - if (BuildSettings.newAppLayoutEnabled) { return; } + if (BuildSettings.isNewAppLayoutActivated) { return; } BOOL displayNotification = NO; @@ -693,7 +693,7 @@ -(void)setupTitleView { - if (!BuildSettings.newAppLayoutEnabled) + if (!BuildSettings.isNewAppLayoutActivated) { titleView = [MainTitleView new]; self.navigationItem.titleView = titleView; diff --git a/Riot/Modules/TabBar/TabBarCoordinator.swift b/Riot/Modules/TabBar/TabBarCoordinator.swift index 0e70a2c37..711e1e1cf 100644 --- a/Riot/Modules/TabBar/TabBarCoordinator.swift +++ b/Riot/Modules/TabBar/TabBarCoordinator.swift @@ -116,13 +116,15 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { self.addMatrixSessionToMasterTabBarController(userSession.matrixSession) } - if BuildSettings.enableSideMenu { + if BuildSettings.isSideMenuActivated { self.setupSideMenuGestures() } self.registerUserSessionsServiceNotifications() self.registerSessionChange() + NotificationCenter.default.addObserver(self, selector: #selector(self.newAppLayoutToggleDidChange(notification:)), name: RiotSettings.newAppLayoutBetaToggleDidChange, object: nil) + self.updateMasterTabBarController(with: spaceId, forceReload: true) } else { self.updateMasterTabBarController(with: spaceId) @@ -239,6 +241,15 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { // MARK: - Private methods + @objc private func newAppLayoutToggleDidChange(notification: Notification) { + self.masterTabBarController = nil + start() +// updateMasterTabBarController(with: self.currentSpaceId, forceReload: true) +// createLeftButtonItem(for: self.masterTabBarController) +// createRightButtonItem(for: self.masterTabBarController) +// popToHome(animated: true, completion: nil) + } + private func createMasterTabBarController() -> MasterTabBarController { let tabBarController = MasterTabBarController() @@ -367,10 +378,10 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { private func updateTabControllers(for tabBarController: MasterTabBarController, showCommunities: Bool) { var viewControllers: [UIViewController] = [] - let homeViewController = BuildSettings.newAppLayoutEnabled ? self.createAllChatsViewController() : self.createHomeViewController() + let homeViewController = BuildSettings.isNewAppLayoutActivated ? self.createAllChatsViewController() : self.createHomeViewController() viewControllers.append(homeViewController) - if !BuildSettings.newAppLayoutEnabled { + if !BuildSettings.isNewAppLayoutActivated { if RiotSettings.shared.homeScreenShowFavouritesTab { let favouritesViewController = self.createFavouritesViewController() viewControllers.append(favouritesViewController) @@ -706,12 +717,12 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { private weak var rightMenuButton: UIButton? private func createLeftButtonItem(for viewController: UIViewController) { - guard !BuildSettings.newAppLayoutEnabled else { + guard !BuildSettings.isNewAppLayoutActivated else { createAvatarButtonItem(for: viewController) return } - guard BuildSettings.enableSideMenu else { + guard BuildSettings.isSideMenuActivated else { let settingsBarButtonItem: MXKBarButtonItem = MXKBarButtonItem(image: Asset.Images.settingsIcon.image, style: .plain) { [weak self] in self?.showSettings() } @@ -730,7 +741,7 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { } private func createRightButtonItem(for viewController: UIViewController) { - guard !BuildSettings.newAppLayoutEnabled else { + guard !BuildSettings.isNewAppLayoutActivated else { return } @@ -788,6 +799,7 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { if let avatar = userAvatarViewData(from: currentMatrixSession) { avatarView.fill(with: avatar) + button.setImage(nil, for: .normal) } viewController.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: view) @@ -893,7 +905,7 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { private var windowOverlay: WindowOverlayPresenter? func showCoachMessageIfNeeded(with session: MXSession) { - guard !BuildSettings.newAppLayoutEnabled else { + guard !BuildSettings.isNewAppLayoutActivated else { // Showing coach message makes no sense with the new App Layout return } @@ -940,7 +952,7 @@ extension TabBarCoordinator: MasterTabBarControllerDelegate { } func masterTabBarController(_ masterTabBarController: MasterTabBarController!, needsSideMenuIconWithNotification displayNotification: Bool) { - guard BuildSettings.enableSideMenu else { + guard BuildSettings.isSideMenuActivated else { return } diff --git a/changelog.d/6649.change b/changelog.d/6649.change new file mode 100644 index 000000000..cb6bb5216 --- /dev/null +++ b/changelog.d/6649.change @@ -0,0 +1 @@ +Added Labs flag for the new App Layout. From 8b9c2ad5f1c33e041509889d7961c6521b1e530c Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Mon, 29 Aug 2022 15:24:10 +0200 Subject: [PATCH 21/24] Added Labs flag for the new App Layout - Make CI happy --- Config/BuildSettings.swift | 9 +-------- Riot/Managers/Settings/RiotSettings.swift | 7 +++++++ Riot/Managers/Theme/Themes/DarkTheme.swift | 4 ++-- Riot/Managers/Theme/Themes/DefaultTheme.swift | 6 +++--- Riot/Modules/Application/AppCoordinator.swift | 4 ++-- Riot/Modules/Application/LegacyAppDelegate.m | 2 +- .../Recents/DataSources/RecentsDataSource.m | 6 +++--- .../GlobalSearch/UnifiedSearchViewController.m | 2 +- Riot/Modules/Home/HomeViewController.m | 2 +- Riot/Modules/Room/MXKRoomViewController.m | 2 +- Riot/Modules/Settings/SettingsViewController.m | 4 ++++ Riot/Modules/TabBar/MasterTabBarController.m | 12 ++++++------ Riot/Modules/TabBar/TabBarCoordinator.swift | 16 ++++++++-------- 13 files changed, 40 insertions(+), 36 deletions(-) diff --git a/Config/BuildSettings.swift b/Config/BuildSettings.swift index 358121704..97f5f0942 100644 --- a/Config/BuildSettings.swift +++ b/Config/BuildSettings.swift @@ -420,14 +420,7 @@ final class BuildSettings: NSObject { // MARK: - New App Layout static let newAppLayoutEnabled = false - - static var isSideMenuActivated: Bool { - enableSideMenu && !RiotSettings.shared.newAppLayoutBetaEnabled - } - static var isNewAppLayoutActivated: Bool { - newAppLayoutEnabled || RiotSettings.shared.newAppLayoutBetaEnabled - } - + // MARK: - Device manager static let deviceManagerEnabled = false diff --git a/Riot/Managers/Settings/RiotSettings.swift b/Riot/Managers/Settings/RiotSettings.swift index e1fd18a75..fa76d1867 100644 --- a/Riot/Managers/Settings/RiotSettings.swift +++ b/Riot/Managers/Settings/RiotSettings.swift @@ -389,6 +389,13 @@ final class RiotSettings: NSObject { NotificationCenter.default.post(name: RiotSettings.newAppLayoutBetaToggleDidChange, object: self) } } + + var isSideMenuActivated: Bool { + BuildSettings.enableSideMenu && !newAppLayoutBetaEnabled + } + var isNewAppLayoutActivated: Bool { + BuildSettings.newAppLayoutEnabled || newAppLayoutBetaEnabled + } } // MARK: - RiotSettings notification constants diff --git a/Riot/Managers/Theme/Themes/DarkTheme.swift b/Riot/Managers/Theme/Themes/DarkTheme.swift index dc4e89f1b..feebfe432 100644 --- a/Riot/Managers/Theme/Themes/DarkTheme.swift +++ b/Riot/Managers/Theme/Themes/DarkTheme.swift @@ -27,7 +27,7 @@ class DarkTheme: NSObject, Theme { var backgroundColor: UIColor = UIColor(rgb: 0x15191E) var baseColor: UIColor { - BuildSettings.isNewAppLayoutActivated ? UIColor(rgb: 0x15191E) : UIColor(rgb: 0x21262C) + RiotSettings.shared.isNewAppLayoutActivated ? UIColor(rgb: 0x15191E) : UIColor(rgb: 0x21262C) } var baseIconPrimaryColor: UIColor = UIColor(rgb: 0xEDF3FF) var baseTextPrimaryColor: UIColor = UIColor(rgb: 0xFFFFFF) @@ -38,7 +38,7 @@ class DarkTheme: NSObject, Theme { var searchResultHighlightColor: UIColor = UIColor(rgb: 0xFCC639).withAlphaComponent(0.3) var headerBackgroundColor: UIColor { - BuildSettings.isNewAppLayoutActivated ? UIColor(rgb: 0x15191E) : UIColor(rgb: 0x21262C) + RiotSettings.shared.isNewAppLayoutActivated ? UIColor(rgb: 0x15191E) : UIColor(rgb: 0x21262C) } var headerBorderColor: UIColor = UIColor(rgb: 0x15191E) var headerTextPrimaryColor: UIColor = UIColor(rgb: 0xFFFFFF) diff --git a/Riot/Managers/Theme/Themes/DefaultTheme.swift b/Riot/Managers/Theme/Themes/DefaultTheme.swift index d58a1a6d0..5519babdc 100644 --- a/Riot/Managers/Theme/Themes/DefaultTheme.swift +++ b/Riot/Managers/Theme/Themes/DefaultTheme.swift @@ -27,7 +27,7 @@ class DefaultTheme: NSObject, Theme { var backgroundColor: UIColor = UIColor(rgb: 0xFFFFFF) var baseColor: UIColor { - BuildSettings.isNewAppLayoutActivated ? UIColor(rgb: 0xFFFFFF) : UIColor(rgb: 0xF5F7FA) + RiotSettings.shared.isNewAppLayoutActivated ? UIColor(rgb: 0xFFFFFF) : UIColor(rgb: 0xF5F7FA) } var baseIconPrimaryColor: UIColor = UIColor(rgb: 0xFFFFFF) var baseTextPrimaryColor: UIColor = UIColor(rgb: 0xFFFFFF) @@ -38,7 +38,7 @@ class DefaultTheme: NSObject, Theme { var searchResultHighlightColor: UIColor = UIColor(rgb: 0xFCC639).withAlphaComponent(0.2) var headerBackgroundColor: UIColor { - BuildSettings.isNewAppLayoutActivated ? UIColor(rgb: 0xFFFFFF) : UIColor(rgb: 0xF5F7FA) + RiotSettings.shared.isNewAppLayoutActivated ? UIColor(rgb: 0xFFFFFF) : UIColor(rgb: 0xF5F7FA) } var headerBorderColor: UIColor = UIColor(rgb: 0xE9EDF1) var headerTextPrimaryColor: UIColor = UIColor(rgb: 0x17191C) @@ -173,7 +173,7 @@ class DefaultTheme: NSObject, Theme { searchBar.backgroundImage = UIImage() // Remove top and bottom shadow searchBar.tintColor = self.tintColor - guard !BuildSettings.isNewAppLayoutActivated else { + guard !RiotSettings.shared.isNewAppLayoutActivated else { return } diff --git a/Riot/Modules/Application/AppCoordinator.swift b/Riot/Modules/Application/AppCoordinator.swift index 3553148f3..a63690311 100755 --- a/Riot/Modules/Application/AppCoordinator.swift +++ b/Riot/Modules/Application/AppCoordinator.swift @@ -91,7 +91,7 @@ final class AppCoordinator: NSObject, AppCoordinatorType { // Setup user location services _ = UserLocationServiceProvider.shared - if BuildSettings.isSideMenuActivated { + if RiotSettings.shared.isSideMenuActivated { self.addSideMenu() } @@ -163,7 +163,7 @@ final class AppCoordinator: NSObject, AppCoordinatorType { } @objc private func newAppLayoutToggleDidChange(notification: Notification) { - if BuildSettings.isSideMenuActivated { + if RiotSettings.shared.isSideMenuActivated { self.addSideMenu() } } diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index 1b3ce1db7..03b71f090 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -4257,7 +4257,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni } // Need to set `showAllRoomsInHomeSpace` to `true` for the new App Layout - if (BuildSettings.isNewAppLayoutActivated) + if (RiotSettings.shared.isNewAppLayoutActivated) { RiotSettings.shared.showAllRoomsInHomeSpace = YES; } diff --git a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m index 228751d31..7524572b3 100644 --- a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m +++ b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m @@ -84,7 +84,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou _crossSigningBannerDisplay = CrossSigningBannerDisplayNone; _secureBackupBannerDisplay = SecureBackupBannerDisplayNone; - _areSectionsShrinkable = !BuildSettings.isNewAppLayoutActivated; + _areSectionsShrinkable = !RiotSettings.shared.isNewAppLayoutActivated; shrinkedSectionsBitMask = 0; roomTagsListenerByUserId = [[NSMutableDictionary alloc] init]; @@ -758,7 +758,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou } - if (count && !(sectionType == RecentsDataSourceSectionTypeInvites) && !BuildSettings.isNewAppLayoutActivated) + if (count && !(sectionType == RecentsDataSourceSectionTypeInvites) && !RiotSettings.shared.isNewAppLayoutActivated) { NSString *roomCount = [NSString stringWithFormat:@" %tu", count]; @@ -987,7 +987,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou sectionHeader.bottomView = nil; } - if (!BuildSettings.isNewAppLayoutActivated || !sectionHeader.bottomView) + if (!RiotSettings.shared.isNewAppLayoutActivated || !sectionHeader.bottomView) { // Add label frame.size.height = RECENTSDATASOURCE_DEFAULT_SECTION_HEADER_HEIGHT - 10; diff --git a/Riot/Modules/GlobalSearch/UnifiedSearchViewController.m b/Riot/Modules/GlobalSearch/UnifiedSearchViewController.m index fb27ec4b4..baa1392d2 100644 --- a/Riot/Modules/GlobalSearch/UnifiedSearchViewController.m +++ b/Riot/Modules/GlobalSearch/UnifiedSearchViewController.m @@ -146,7 +146,7 @@ [self updateSearch]; - if (BuildSettings.isNewAppLayoutActivated) + if (RiotSettings.shared.isNewAppLayoutActivated) { [self.searchBar vc_searchTextField].backgroundColor = nil; [self vc_setLargeTitleDisplayMode: UINavigationItemLargeTitleDisplayModeAutomatic]; diff --git a/Riot/Modules/Home/HomeViewController.m b/Riot/Modules/Home/HomeViewController.m index c46e9d577..0c8e2f084 100644 --- a/Riot/Modules/Home/HomeViewController.m +++ b/Riot/Modules/Home/HomeViewController.m @@ -80,7 +80,7 @@ { [super viewDidLoad]; - if (!BuildSettings.isNewAppLayoutActivated) + if (!RiotSettings.shared.isNewAppLayoutActivated) { [self.tabBarController vc_setLargeTitleDisplayMode:UINavigationItemLargeTitleDisplayModeNever]; } diff --git a/Riot/Modules/Room/MXKRoomViewController.m b/Riot/Modules/Room/MXKRoomViewController.m index e007b8595..0ceec61d8 100644 --- a/Riot/Modules/Room/MXKRoomViewController.m +++ b/Riot/Modules/Room/MXKRoomViewController.m @@ -341,7 +341,7 @@ _bubblesTableView.hidden = NO; } - if (BuildSettings.isNewAppLayoutActivated) + if (RiotSettings.shared.isNewAppLayoutActivated) { [self vc_setLargeTitleDisplayMode: UINavigationItemLargeTitleDisplayModeNever]; } diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index d86706ebb..2da06cdf9 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -3994,6 +3994,10 @@ ChangePasswordCoordinatorBridgePresenterDelegate> - (void)toggleEnableNewAppLayout:(UISwitch *)sender { + if (sender.isOn) + { + RiotSettings.shared.showAllRoomsInHomeSpace = YES; + } RiotSettings.shared.newAppLayoutBetaEnabled = sender.isOn; } diff --git a/Riot/Modules/TabBar/MasterTabBarController.m b/Riot/Modules/TabBar/MasterTabBarController.m index 96cc0880f..82b7afad5 100644 --- a/Riot/Modules/TabBar/MasterTabBarController.m +++ b/Riot/Modules/TabBar/MasterTabBarController.m @@ -156,7 +156,7 @@ [self userInterfaceThemeDidChange]; } - self.tabBar.hidden = BuildSettings.isNewAppLayoutActivated; + self.tabBar.hidden = RiotSettings.shared.isNewAppLayoutActivated; } - (void)viewDidAppear:(BOOL)animated @@ -214,7 +214,7 @@ [[AppDelegate theDelegate] checkAppVersion]; - if (BuildSettings.isNewAppLayoutActivated && !RiotSettings.shared.allChatsOnboardingHasBeenDisplayed) + if (RiotSettings.shared.isNewAppLayoutActivated && !RiotSettings.shared.allChatsOnboardingHasBeenDisplayed) { [self showAllChatsOnboardingScreen]; } @@ -633,7 +633,7 @@ { if (roomParentId) { NSString *parentName = [mxSession roomSummaryWithRoomId:roomParentId].displayname; - if (!BuildSettings.isNewAppLayoutActivated) + if (!RiotSettings.shared.isNewAppLayoutActivated) { NSMutableArray *breadcrumbs = [[NSMutableArray alloc] initWithObjects:parentName, nil]; @@ -649,7 +649,7 @@ } else { - if (!BuildSettings.isNewAppLayoutActivated) + if (!RiotSettings.shared.isNewAppLayoutActivated) { titleView.breadcrumbView.breadcrumbs = @[]; } @@ -661,7 +661,7 @@ - (void)updateSideMenuNotifcationIcon { - if (BuildSettings.isNewAppLayoutActivated) { return; } + if (RiotSettings.shared.isNewAppLayoutActivated) { return; } BOOL displayNotification = NO; @@ -693,7 +693,7 @@ -(void)setupTitleView { - if (!BuildSettings.isNewAppLayoutActivated) + if (!RiotSettings.shared.isNewAppLayoutActivated) { titleView = [MainTitleView new]; self.navigationItem.titleView = titleView; diff --git a/Riot/Modules/TabBar/TabBarCoordinator.swift b/Riot/Modules/TabBar/TabBarCoordinator.swift index 711e1e1cf..b09fd5fc7 100644 --- a/Riot/Modules/TabBar/TabBarCoordinator.swift +++ b/Riot/Modules/TabBar/TabBarCoordinator.swift @@ -116,7 +116,7 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { self.addMatrixSessionToMasterTabBarController(userSession.matrixSession) } - if BuildSettings.isSideMenuActivated { + if RiotSettings.shared.isSideMenuActivated { self.setupSideMenuGestures() } @@ -378,10 +378,10 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { private func updateTabControllers(for tabBarController: MasterTabBarController, showCommunities: Bool) { var viewControllers: [UIViewController] = [] - let homeViewController = BuildSettings.isNewAppLayoutActivated ? self.createAllChatsViewController() : self.createHomeViewController() + let homeViewController = RiotSettings.shared.isNewAppLayoutActivated ? self.createAllChatsViewController() : self.createHomeViewController() viewControllers.append(homeViewController) - if !BuildSettings.isNewAppLayoutActivated { + if !RiotSettings.shared.isNewAppLayoutActivated { if RiotSettings.shared.homeScreenShowFavouritesTab { let favouritesViewController = self.createFavouritesViewController() viewControllers.append(favouritesViewController) @@ -717,12 +717,12 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { private weak var rightMenuButton: UIButton? private func createLeftButtonItem(for viewController: UIViewController) { - guard !BuildSettings.isNewAppLayoutActivated else { + guard !RiotSettings.shared.isNewAppLayoutActivated else { createAvatarButtonItem(for: viewController) return } - guard BuildSettings.isSideMenuActivated else { + guard RiotSettings.shared.isSideMenuActivated else { let settingsBarButtonItem: MXKBarButtonItem = MXKBarButtonItem(image: Asset.Images.settingsIcon.image, style: .plain) { [weak self] in self?.showSettings() } @@ -741,7 +741,7 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { } private func createRightButtonItem(for viewController: UIViewController) { - guard !BuildSettings.isNewAppLayoutActivated else { + guard !RiotSettings.shared.isNewAppLayoutActivated else { return } @@ -905,7 +905,7 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { private var windowOverlay: WindowOverlayPresenter? func showCoachMessageIfNeeded(with session: MXSession) { - guard !BuildSettings.isNewAppLayoutActivated else { + guard !RiotSettings.shared.isNewAppLayoutActivated else { // Showing coach message makes no sense with the new App Layout return } @@ -952,7 +952,7 @@ extension TabBarCoordinator: MasterTabBarControllerDelegate { } func masterTabBarController(_ masterTabBarController: MasterTabBarController!, needsSideMenuIconWithNotification displayNotification: Bool) { - guard BuildSettings.isSideMenuActivated else { + guard RiotSettings.shared.isSideMenuActivated else { return } From bbb0dc1b5ae5e0ba0cb6eecb714114cb65f29c21 Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Mon, 29 Aug 2022 16:01:34 +0200 Subject: [PATCH 22/24] Added Labs flag for the new App Layout - Make CI happy --- Config/BuildSettings.swift | 3 +++ Riot/Managers/Settings/RiotSettings.swift | 10 ++++------ Riot/Managers/Theme/Themes/DarkTheme.swift | 4 ++-- Riot/Managers/Theme/Themes/DefaultTheme.swift | 6 +++--- Riot/Modules/Application/AppCoordinator.swift | 4 ++-- Riot/Modules/Application/LegacyAppDelegate.m | 2 +- .../Recents/DataSources/RecentsDataSource.m | 6 +++--- .../GlobalSearch/UnifiedSearchViewController.m | 2 +- Riot/Modules/Home/HomeViewController.m | 2 +- Riot/Modules/Room/MXKRoomViewController.m | 2 +- Riot/Modules/TabBar/MasterTabBarController.m | 12 ++++++------ Riot/Modules/TabBar/TabBarCoordinator.swift | 16 ++++++++-------- 12 files changed, 35 insertions(+), 34 deletions(-) diff --git a/Config/BuildSettings.swift b/Config/BuildSettings.swift index 97f5f0942..cc648923b 100644 --- a/Config/BuildSettings.swift +++ b/Config/BuildSettings.swift @@ -421,6 +421,9 @@ final class BuildSettings: NSObject { // MARK: - New App Layout static let newAppLayoutEnabled = false + static var isSideMenuActivated: Bool = enableSideMenu + static var isNewAppLayoutActivated: Bool = newAppLayoutEnabled + // MARK: - Device manager static let deviceManagerEnabled = false diff --git a/Riot/Managers/Settings/RiotSettings.swift b/Riot/Managers/Settings/RiotSettings.swift index fa76d1867..240c04a3c 100644 --- a/Riot/Managers/Settings/RiotSettings.swift +++ b/Riot/Managers/Settings/RiotSettings.swift @@ -46,6 +46,8 @@ final class RiotSettings: NSObject { private override init() { super.init() + BuildSettings.isSideMenuActivated = BuildSettings.enableSideMenu && !newAppLayoutBetaEnabled + BuildSettings.isNewAppLayoutActivated = BuildSettings.newAppLayoutEnabled || newAppLayoutBetaEnabled } /// Indicate if UserDefaults suite has been migrated once. @@ -386,16 +388,12 @@ final class RiotSettings: NSObject { @UserDefault(key: "newAppLayoutBetaEnabled", defaultValue: false, storage: defaults) var newAppLayoutBetaEnabled { didSet { + BuildSettings.isSideMenuActivated = BuildSettings.enableSideMenu && !newAppLayoutBetaEnabled + BuildSettings.isNewAppLayoutActivated = BuildSettings.newAppLayoutEnabled || newAppLayoutBetaEnabled NotificationCenter.default.post(name: RiotSettings.newAppLayoutBetaToggleDidChange, object: self) } } - var isSideMenuActivated: Bool { - BuildSettings.enableSideMenu && !newAppLayoutBetaEnabled - } - var isNewAppLayoutActivated: Bool { - BuildSettings.newAppLayoutEnabled || newAppLayoutBetaEnabled - } } // MARK: - RiotSettings notification constants diff --git a/Riot/Managers/Theme/Themes/DarkTheme.swift b/Riot/Managers/Theme/Themes/DarkTheme.swift index feebfe432..dc4e89f1b 100644 --- a/Riot/Managers/Theme/Themes/DarkTheme.swift +++ b/Riot/Managers/Theme/Themes/DarkTheme.swift @@ -27,7 +27,7 @@ class DarkTheme: NSObject, Theme { var backgroundColor: UIColor = UIColor(rgb: 0x15191E) var baseColor: UIColor { - RiotSettings.shared.isNewAppLayoutActivated ? UIColor(rgb: 0x15191E) : UIColor(rgb: 0x21262C) + BuildSettings.isNewAppLayoutActivated ? UIColor(rgb: 0x15191E) : UIColor(rgb: 0x21262C) } var baseIconPrimaryColor: UIColor = UIColor(rgb: 0xEDF3FF) var baseTextPrimaryColor: UIColor = UIColor(rgb: 0xFFFFFF) @@ -38,7 +38,7 @@ class DarkTheme: NSObject, Theme { var searchResultHighlightColor: UIColor = UIColor(rgb: 0xFCC639).withAlphaComponent(0.3) var headerBackgroundColor: UIColor { - RiotSettings.shared.isNewAppLayoutActivated ? UIColor(rgb: 0x15191E) : UIColor(rgb: 0x21262C) + BuildSettings.isNewAppLayoutActivated ? UIColor(rgb: 0x15191E) : UIColor(rgb: 0x21262C) } var headerBorderColor: UIColor = UIColor(rgb: 0x15191E) var headerTextPrimaryColor: UIColor = UIColor(rgb: 0xFFFFFF) diff --git a/Riot/Managers/Theme/Themes/DefaultTheme.swift b/Riot/Managers/Theme/Themes/DefaultTheme.swift index 5519babdc..d58a1a6d0 100644 --- a/Riot/Managers/Theme/Themes/DefaultTheme.swift +++ b/Riot/Managers/Theme/Themes/DefaultTheme.swift @@ -27,7 +27,7 @@ class DefaultTheme: NSObject, Theme { var backgroundColor: UIColor = UIColor(rgb: 0xFFFFFF) var baseColor: UIColor { - RiotSettings.shared.isNewAppLayoutActivated ? UIColor(rgb: 0xFFFFFF) : UIColor(rgb: 0xF5F7FA) + BuildSettings.isNewAppLayoutActivated ? UIColor(rgb: 0xFFFFFF) : UIColor(rgb: 0xF5F7FA) } var baseIconPrimaryColor: UIColor = UIColor(rgb: 0xFFFFFF) var baseTextPrimaryColor: UIColor = UIColor(rgb: 0xFFFFFF) @@ -38,7 +38,7 @@ class DefaultTheme: NSObject, Theme { var searchResultHighlightColor: UIColor = UIColor(rgb: 0xFCC639).withAlphaComponent(0.2) var headerBackgroundColor: UIColor { - RiotSettings.shared.isNewAppLayoutActivated ? UIColor(rgb: 0xFFFFFF) : UIColor(rgb: 0xF5F7FA) + BuildSettings.isNewAppLayoutActivated ? UIColor(rgb: 0xFFFFFF) : UIColor(rgb: 0xF5F7FA) } var headerBorderColor: UIColor = UIColor(rgb: 0xE9EDF1) var headerTextPrimaryColor: UIColor = UIColor(rgb: 0x17191C) @@ -173,7 +173,7 @@ class DefaultTheme: NSObject, Theme { searchBar.backgroundImage = UIImage() // Remove top and bottom shadow searchBar.tintColor = self.tintColor - guard !RiotSettings.shared.isNewAppLayoutActivated else { + guard !BuildSettings.isNewAppLayoutActivated else { return } diff --git a/Riot/Modules/Application/AppCoordinator.swift b/Riot/Modules/Application/AppCoordinator.swift index a63690311..3553148f3 100755 --- a/Riot/Modules/Application/AppCoordinator.swift +++ b/Riot/Modules/Application/AppCoordinator.swift @@ -91,7 +91,7 @@ final class AppCoordinator: NSObject, AppCoordinatorType { // Setup user location services _ = UserLocationServiceProvider.shared - if RiotSettings.shared.isSideMenuActivated { + if BuildSettings.isSideMenuActivated { self.addSideMenu() } @@ -163,7 +163,7 @@ final class AppCoordinator: NSObject, AppCoordinatorType { } @objc private func newAppLayoutToggleDidChange(notification: Notification) { - if RiotSettings.shared.isSideMenuActivated { + if BuildSettings.isSideMenuActivated { self.addSideMenu() } } diff --git a/Riot/Modules/Application/LegacyAppDelegate.m b/Riot/Modules/Application/LegacyAppDelegate.m index 03b71f090..1b3ce1db7 100644 --- a/Riot/Modules/Application/LegacyAppDelegate.m +++ b/Riot/Modules/Application/LegacyAppDelegate.m @@ -4257,7 +4257,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni } // Need to set `showAllRoomsInHomeSpace` to `true` for the new App Layout - if (RiotSettings.shared.isNewAppLayoutActivated) + if (BuildSettings.isNewAppLayoutActivated) { RiotSettings.shared.showAllRoomsInHomeSpace = YES; } diff --git a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m index 7524572b3..228751d31 100644 --- a/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m +++ b/Riot/Modules/Common/Recents/DataSources/RecentsDataSource.m @@ -84,7 +84,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou _crossSigningBannerDisplay = CrossSigningBannerDisplayNone; _secureBackupBannerDisplay = SecureBackupBannerDisplayNone; - _areSectionsShrinkable = !RiotSettings.shared.isNewAppLayoutActivated; + _areSectionsShrinkable = !BuildSettings.isNewAppLayoutActivated; shrinkedSectionsBitMask = 0; roomTagsListenerByUserId = [[NSMutableDictionary alloc] init]; @@ -758,7 +758,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou } - if (count && !(sectionType == RecentsDataSourceSectionTypeInvites) && !RiotSettings.shared.isNewAppLayoutActivated) + if (count && !(sectionType == RecentsDataSourceSectionTypeInvites) && !BuildSettings.isNewAppLayoutActivated) { NSString *roomCount = [NSString stringWithFormat:@" %tu", count]; @@ -987,7 +987,7 @@ NSString *const kRecentsDataSourceTapOnDirectoryServerChange = @"kRecentsDataSou sectionHeader.bottomView = nil; } - if (!RiotSettings.shared.isNewAppLayoutActivated || !sectionHeader.bottomView) + if (!BuildSettings.isNewAppLayoutActivated || !sectionHeader.bottomView) { // Add label frame.size.height = RECENTSDATASOURCE_DEFAULT_SECTION_HEADER_HEIGHT - 10; diff --git a/Riot/Modules/GlobalSearch/UnifiedSearchViewController.m b/Riot/Modules/GlobalSearch/UnifiedSearchViewController.m index baa1392d2..fb27ec4b4 100644 --- a/Riot/Modules/GlobalSearch/UnifiedSearchViewController.m +++ b/Riot/Modules/GlobalSearch/UnifiedSearchViewController.m @@ -146,7 +146,7 @@ [self updateSearch]; - if (RiotSettings.shared.isNewAppLayoutActivated) + if (BuildSettings.isNewAppLayoutActivated) { [self.searchBar vc_searchTextField].backgroundColor = nil; [self vc_setLargeTitleDisplayMode: UINavigationItemLargeTitleDisplayModeAutomatic]; diff --git a/Riot/Modules/Home/HomeViewController.m b/Riot/Modules/Home/HomeViewController.m index 0c8e2f084..c46e9d577 100644 --- a/Riot/Modules/Home/HomeViewController.m +++ b/Riot/Modules/Home/HomeViewController.m @@ -80,7 +80,7 @@ { [super viewDidLoad]; - if (!RiotSettings.shared.isNewAppLayoutActivated) + if (!BuildSettings.isNewAppLayoutActivated) { [self.tabBarController vc_setLargeTitleDisplayMode:UINavigationItemLargeTitleDisplayModeNever]; } diff --git a/Riot/Modules/Room/MXKRoomViewController.m b/Riot/Modules/Room/MXKRoomViewController.m index 0ceec61d8..e007b8595 100644 --- a/Riot/Modules/Room/MXKRoomViewController.m +++ b/Riot/Modules/Room/MXKRoomViewController.m @@ -341,7 +341,7 @@ _bubblesTableView.hidden = NO; } - if (RiotSettings.shared.isNewAppLayoutActivated) + if (BuildSettings.isNewAppLayoutActivated) { [self vc_setLargeTitleDisplayMode: UINavigationItemLargeTitleDisplayModeNever]; } diff --git a/Riot/Modules/TabBar/MasterTabBarController.m b/Riot/Modules/TabBar/MasterTabBarController.m index 82b7afad5..96cc0880f 100644 --- a/Riot/Modules/TabBar/MasterTabBarController.m +++ b/Riot/Modules/TabBar/MasterTabBarController.m @@ -156,7 +156,7 @@ [self userInterfaceThemeDidChange]; } - self.tabBar.hidden = RiotSettings.shared.isNewAppLayoutActivated; + self.tabBar.hidden = BuildSettings.isNewAppLayoutActivated; } - (void)viewDidAppear:(BOOL)animated @@ -214,7 +214,7 @@ [[AppDelegate theDelegate] checkAppVersion]; - if (RiotSettings.shared.isNewAppLayoutActivated && !RiotSettings.shared.allChatsOnboardingHasBeenDisplayed) + if (BuildSettings.isNewAppLayoutActivated && !RiotSettings.shared.allChatsOnboardingHasBeenDisplayed) { [self showAllChatsOnboardingScreen]; } @@ -633,7 +633,7 @@ { if (roomParentId) { NSString *parentName = [mxSession roomSummaryWithRoomId:roomParentId].displayname; - if (!RiotSettings.shared.isNewAppLayoutActivated) + if (!BuildSettings.isNewAppLayoutActivated) { NSMutableArray *breadcrumbs = [[NSMutableArray alloc] initWithObjects:parentName, nil]; @@ -649,7 +649,7 @@ } else { - if (!RiotSettings.shared.isNewAppLayoutActivated) + if (!BuildSettings.isNewAppLayoutActivated) { titleView.breadcrumbView.breadcrumbs = @[]; } @@ -661,7 +661,7 @@ - (void)updateSideMenuNotifcationIcon { - if (RiotSettings.shared.isNewAppLayoutActivated) { return; } + if (BuildSettings.isNewAppLayoutActivated) { return; } BOOL displayNotification = NO; @@ -693,7 +693,7 @@ -(void)setupTitleView { - if (!RiotSettings.shared.isNewAppLayoutActivated) + if (!BuildSettings.isNewAppLayoutActivated) { titleView = [MainTitleView new]; self.navigationItem.titleView = titleView; diff --git a/Riot/Modules/TabBar/TabBarCoordinator.swift b/Riot/Modules/TabBar/TabBarCoordinator.swift index b09fd5fc7..711e1e1cf 100644 --- a/Riot/Modules/TabBar/TabBarCoordinator.swift +++ b/Riot/Modules/TabBar/TabBarCoordinator.swift @@ -116,7 +116,7 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { self.addMatrixSessionToMasterTabBarController(userSession.matrixSession) } - if RiotSettings.shared.isSideMenuActivated { + if BuildSettings.isSideMenuActivated { self.setupSideMenuGestures() } @@ -378,10 +378,10 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { private func updateTabControllers(for tabBarController: MasterTabBarController, showCommunities: Bool) { var viewControllers: [UIViewController] = [] - let homeViewController = RiotSettings.shared.isNewAppLayoutActivated ? self.createAllChatsViewController() : self.createHomeViewController() + let homeViewController = BuildSettings.isNewAppLayoutActivated ? self.createAllChatsViewController() : self.createHomeViewController() viewControllers.append(homeViewController) - if !RiotSettings.shared.isNewAppLayoutActivated { + if !BuildSettings.isNewAppLayoutActivated { if RiotSettings.shared.homeScreenShowFavouritesTab { let favouritesViewController = self.createFavouritesViewController() viewControllers.append(favouritesViewController) @@ -717,12 +717,12 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { private weak var rightMenuButton: UIButton? private func createLeftButtonItem(for viewController: UIViewController) { - guard !RiotSettings.shared.isNewAppLayoutActivated else { + guard !BuildSettings.isNewAppLayoutActivated else { createAvatarButtonItem(for: viewController) return } - guard RiotSettings.shared.isSideMenuActivated else { + guard BuildSettings.isSideMenuActivated else { let settingsBarButtonItem: MXKBarButtonItem = MXKBarButtonItem(image: Asset.Images.settingsIcon.image, style: .plain) { [weak self] in self?.showSettings() } @@ -741,7 +741,7 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { } private func createRightButtonItem(for viewController: UIViewController) { - guard !RiotSettings.shared.isNewAppLayoutActivated else { + guard !BuildSettings.isNewAppLayoutActivated else { return } @@ -905,7 +905,7 @@ final class TabBarCoordinator: NSObject, TabBarCoordinatorType { private var windowOverlay: WindowOverlayPresenter? func showCoachMessageIfNeeded(with session: MXSession) { - guard !RiotSettings.shared.isNewAppLayoutActivated else { + guard !BuildSettings.isNewAppLayoutActivated else { // Showing coach message makes no sense with the new App Layout return } @@ -952,7 +952,7 @@ extension TabBarCoordinator: MasterTabBarControllerDelegate { } func masterTabBarController(_ masterTabBarController: MasterTabBarController!, needsSideMenuIconWithNotification displayNotification: Bool) { - guard RiotSettings.shared.isSideMenuActivated else { + guard BuildSettings.isSideMenuActivated else { return } From c5d87676fa11d2eb3fa0341b8848edf587dfe01a Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Mon, 29 Aug 2022 18:03:32 +0300 Subject: [PATCH 23/24] version++ --- CHANGES.md | 19 +++++++++++++++++++ Config/AppVersion.xcconfig | 4 ++-- changelog.d/5279.bugfix | 1 - changelog.d/6556.bugfix | 1 - changelog.d/6557.bugfix | 1 - changelog.d/6577.bugfix | 1 - changelog.d/6624.bugfix | 1 - changelog.d/6625.bugfix | 1 - changelog.d/6628.bugfix | 1 - changelog.d/6649.change | 1 - changelog.d/pr-6629.bugfix | 1 - changelog.d/pr-6642.bugfix | 1 - 12 files changed, 21 insertions(+), 12 deletions(-) delete mode 100644 changelog.d/5279.bugfix delete mode 100644 changelog.d/6556.bugfix delete mode 100644 changelog.d/6557.bugfix delete mode 100644 changelog.d/6577.bugfix delete mode 100644 changelog.d/6624.bugfix delete mode 100644 changelog.d/6625.bugfix delete mode 100644 changelog.d/6628.bugfix delete mode 100644 changelog.d/6649.change delete mode 100644 changelog.d/pr-6629.bugfix delete mode 100644 changelog.d/pr-6642.bugfix diff --git a/CHANGES.md b/CHANGES.md index 048c6c97b..988944819 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,22 @@ +## Changes in 1.9.1 (2022-08-29) + +🙌 Improvements + +- Added Labs flag for the new App Layout. ([#6649](https://github.com/vector-im/element-ios/issues/6649)) + +🐛 Bugfixes + +- Render the PIN entry screen correctly on landscape ([#6629](https://github.com/vector-im/element-ios/pull/6629)) +- Ensure rest client async responses are processed on the main queue ([#6642](https://github.com/vector-im/element-ios/pull/6642)) +- Stop waiting for biometric unlock if disabled system wide ([#5279](https://github.com/vector-im/element-ios/issues/5279)) +- App Layout: added support for transparent avatar icons in the all chats screen ([#6556](https://github.com/vector-im/element-ios/issues/6556)) +- App Layout: fixed reactions background in timeline ([#6557](https://github.com/vector-im/element-ios/issues/6557)) +- App Layout: Removed Low Priority Rooms from Filters ([#6577](https://github.com/vector-im/element-ios/issues/6577)) +- App Layout: Updated missing image for Onboarding screen page 2 ([#6624](https://github.com/vector-im/element-ios/issues/6624)) +- App Layout: fixed limited number of invites in the All Chats screen ([#6625](https://github.com/vector-im/element-ios/issues/6625)) +- Fix notification issues for threads. ([#6628](https://github.com/vector-im/element-ios/issues/6628)) + + ## Changes in 1.9.0 (2022-08-24) 🙌 Improvements diff --git a/Config/AppVersion.xcconfig b/Config/AppVersion.xcconfig index 05b88688a..fba787b2a 100644 --- a/Config/AppVersion.xcconfig +++ b/Config/AppVersion.xcconfig @@ -15,5 +15,5 @@ // // Version -MARKETING_VERSION = 1.9.0 -CURRENT_PROJECT_VERSION = 1.9.0 +MARKETING_VERSION = 1.9.1 +CURRENT_PROJECT_VERSION = 1.9.1 diff --git a/changelog.d/5279.bugfix b/changelog.d/5279.bugfix deleted file mode 100644 index 350ae95d3..000000000 --- a/changelog.d/5279.bugfix +++ /dev/null @@ -1 +0,0 @@ -Stop waiting for biometric unlock if disabled system wide \ No newline at end of file diff --git a/changelog.d/6556.bugfix b/changelog.d/6556.bugfix deleted file mode 100644 index 80bb47484..000000000 --- a/changelog.d/6556.bugfix +++ /dev/null @@ -1 +0,0 @@ -App Layout: added support for transparent avatar icons in the all chats screen diff --git a/changelog.d/6557.bugfix b/changelog.d/6557.bugfix deleted file mode 100644 index 1d0ce6a82..000000000 --- a/changelog.d/6557.bugfix +++ /dev/null @@ -1 +0,0 @@ -App Layout: fixed reactions background in timeline diff --git a/changelog.d/6577.bugfix b/changelog.d/6577.bugfix deleted file mode 100644 index bd0ab00a4..000000000 --- a/changelog.d/6577.bugfix +++ /dev/null @@ -1 +0,0 @@ -App Layout: Removed Low Priority Rooms from Filters diff --git a/changelog.d/6624.bugfix b/changelog.d/6624.bugfix deleted file mode 100644 index 4d991dcc9..000000000 --- a/changelog.d/6624.bugfix +++ /dev/null @@ -1 +0,0 @@ -App Layout: Updated missing image for Onboarding screen page 2 diff --git a/changelog.d/6625.bugfix b/changelog.d/6625.bugfix deleted file mode 100644 index 81c125e72..000000000 --- a/changelog.d/6625.bugfix +++ /dev/null @@ -1 +0,0 @@ -App Layout: fixed limited number of invites in the All Chats screen diff --git a/changelog.d/6628.bugfix b/changelog.d/6628.bugfix deleted file mode 100644 index b195cf9b1..000000000 --- a/changelog.d/6628.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix notification issues for threads. diff --git a/changelog.d/6649.change b/changelog.d/6649.change deleted file mode 100644 index cb6bb5216..000000000 --- a/changelog.d/6649.change +++ /dev/null @@ -1 +0,0 @@ -Added Labs flag for the new App Layout. diff --git a/changelog.d/pr-6629.bugfix b/changelog.d/pr-6629.bugfix deleted file mode 100644 index 00dec48ea..000000000 --- a/changelog.d/pr-6629.bugfix +++ /dev/null @@ -1 +0,0 @@ -Render the PIN entry screen correctly on landscape \ No newline at end of file diff --git a/changelog.d/pr-6642.bugfix b/changelog.d/pr-6642.bugfix deleted file mode 100644 index c5633cdf9..000000000 --- a/changelog.d/pr-6642.bugfix +++ /dev/null @@ -1 +0,0 @@ -Ensure rest client async responses are processed on the main queue \ No newline at end of file From 3b6d6d15ec8c79bb49fe7db7ae1b446a91b0da06 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Mon, 29 Aug 2022 19:13:40 +0300 Subject: [PATCH 24/24] finish version++