From 7319de32a0e93ef6b388eacc3cb57ae3ed2c5ebe Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Wed, 24 Aug 2022 09:52:40 +0200 Subject: [PATCH 1/5] App Layout: Add usage measures --- .../UserSessions/UserSessionProperties.swift | 20 +++++++++++ Riot/Modules/Analytics/Analytics.swift | 5 +-- Riot/Modules/Analytics/AnalyticsScreen.swift | 11 ++++++- .../Analytics/AnalyticsUIElement.swift | 32 +++++++++++++++++- .../Analytics/AnalyticsViewRoomTrigger.swift | 3 ++ .../AllChatsActiveFilter+Analytics.swift | 33 +++++++++++++++++++ .../Helpers/UserProperties+Element.swift | 3 +- .../Analytics/PostHogAnalyticsClient.swift | 2 +- .../AllChatsActionProvider.swift | 2 ++ .../Home/AllChats/AllChatsFilterOptions.swift | 13 +++++++- .../AllChatsLayoutSettingsManager.swift | 28 ++++++++++++++++ .../AllChats/AllChatsViewController.swift | 1 + .../AllChats/RoomInvitesViewController.swift | 3 +- .../SpaceCreationCoordinator.swift | 2 ++ ...SpaceSelectorBottomSheetCoordinator.swift} | 8 ++++- ...ttomSheetCoordinatorBridgePresenter.swift} | 0 .../SpaceSelectorCoordinator.swift | 4 +++ 17 files changed, 160 insertions(+), 10 deletions(-) create mode 100644 Riot/Modules/Analytics/Helpers/AllChatsActiveFilter+Analytics.swift rename RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/{SpaceSelectorBottomCoordinator.swift => SpaceSelectorBottomSheetCoordinator.swift} (95%) rename RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/{SpaceSelectorBottomCoordinatorBridgePresenter.swift => SpaceSelectorBottomSheetCoordinatorBridgePresenter.swift} (100%) diff --git a/Riot/Managers/UserSessions/UserSessionProperties.swift b/Riot/Managers/UserSessions/UserSessionProperties.swift index 4bac875797..3cbc03403b 100644 --- a/Riot/Managers/UserSessions/UserSessionProperties.swift +++ b/Riot/Managers/UserSessions/UserSessionProperties.swift @@ -22,6 +22,7 @@ class UserSessionProperties: NSObject { // MARK: - Constants private enum Constants { static let useCaseKey = "useCase" + static let activeFilterKey = "activeFilter" } // MARK: - Properties @@ -64,6 +65,25 @@ class UserSessionProperties: NSObject { case skipped } + /// The active filter in the All Chats screen. + var allChatsActiveFilter: AllChatsActiveFilter? { + get { + guard let rawValue = dictionary[Constants.activeFilterKey] as? String else { return nil } + return AllChatsActiveFilter(rawValue: rawValue) + } set { + dictionary[Constants.activeFilterKey] = newValue?.rawValue + } + } + + /// Represents the active filter in the All Chats screen. + /// Note: The raw string value is used for storage. + public enum AllChatsActiveFilter: String { + case all + case favourites + case people + case unreads + } + // MARK: - Setup /// Create new properties for the specified user ID. diff --git a/Riot/Modules/Analytics/Analytics.swift b/Riot/Modules/Analytics/Analytics.swift index 030b4463c3..7a18b9a01c 100644 --- a/Riot/Modules/Analytics/Analytics.swift +++ b/Riot/Modules/Analytics/Analytics.swift @@ -229,10 +229,11 @@ extension Analytics { /// Updates any user properties to help with creating cohorts. /// /// Only non-nil properties will be updated when calling this method. - func updateUserProperties(ftueUseCase: UserSessionProperties.UseCase? = nil, numFavouriteRooms: Int? = nil, numSpaces: Int? = nil) { + func updateUserProperties(ftueUseCase: UserSessionProperties.UseCase? = nil, numFavouriteRooms: Int? = nil, numSpaces: Int? = nil, allChatsActiveFilter: UserSessionProperties.AllChatsActiveFilter? = nil) { let userProperties = AnalyticsEvent.UserProperties(ftueUseCaseSelection: ftueUseCase?.analyticsName, numFavouriteRooms: numFavouriteRooms, - numSpaces: numSpaces) + numSpaces: numSpaces, + allChatsActiveFilter: allChatsActiveFilter?.analyticsName) client.updateUserProperties(userProperties) } diff --git a/Riot/Modules/Analytics/AnalyticsScreen.swift b/Riot/Modules/Analytics/AnalyticsScreen.swift index 85e304b9d1..4c207a3aea 100644 --- a/Riot/Modules/Analytics/AnalyticsScreen.swift +++ b/Riot/Modules/Analytics/AnalyticsScreen.swift @@ -58,7 +58,10 @@ import AnalyticsEvents case spaceMembers case spaceExploreRooms case dialpad - + case spaceBottomSheet + case invites + case createSpace + /// The screen name reported to the AnalyticsEvent. var screenName: AnalyticsEvent.MobileScreen.ScreenName { switch self { @@ -142,6 +145,12 @@ import AnalyticsEvents return .SpaceExploreRooms case .dialpad: return .Dialpad + case .spaceBottomSheet: + return .SpaceBottomSheet + case .invites: + return .Invites + case .createSpace: + return .CreateSpace } } } diff --git a/Riot/Modules/Analytics/AnalyticsUIElement.swift b/Riot/Modules/Analytics/AnalyticsUIElement.swift index 75a9761263..3374a5ce22 100644 --- a/Riot/Modules/Analytics/AnalyticsUIElement.swift +++ b/Riot/Modules/Analytics/AnalyticsUIElement.swift @@ -24,7 +24,17 @@ import AnalyticsEvents case threadListFilterItem case spacePanelSelectedSpace case spacePanelSwitchSpace - + case spacePanelSwitchSubSpace + case allChatsRecentsEnabled + case allChatsRecentsDisabled + case allChatsFiltersEnabled + case allChatsFiltersDisabled + case allChatsFilterAll + case allChatsFilterFavourites + case allChatsFilterUnreads + case allChatsFilterPeople + case spaceCreationValidated + /// The element name reported to the AnalyticsEvent. var name: AnalyticsEvent.Interaction.Name { switch self { @@ -40,6 +50,26 @@ import AnalyticsEvents return .SpacePanelSelectedSpace case .spacePanelSwitchSpace: return .SpacePanelSwitchSpace + case .spacePanelSwitchSubSpace: + return .SpacePanelSwitchSubSpace + case .allChatsRecentsEnabled: + return .MobileAllChatsRecentsEnabled + case .allChatsRecentsDisabled: + return .MobileAllChatsRecentsDisabled + case .allChatsFiltersEnabled: + return .MobileAllChatsFiltersEnabled + case .allChatsFiltersDisabled: + return .MobileAllChatsFiltersDisabled + case .allChatsFilterAll: + return .MobileAllChatsFilterAll + case .allChatsFilterFavourites: + return .MobileAllChatsFilterFavourites + case .allChatsFilterUnreads: + return .MobileAllChatsFilterUnreads + case .allChatsFilterPeople: + return .MobileAllChatsFilterPeople + case .spaceCreationValidated: + return .MobileSpaceCreationValidated } } } diff --git a/Riot/Modules/Analytics/AnalyticsViewRoomTrigger.swift b/Riot/Modules/Analytics/AnalyticsViewRoomTrigger.swift index 65c6b4429f..eba8c90cce 100644 --- a/Riot/Modules/Analytics/AnalyticsViewRoomTrigger.swift +++ b/Riot/Modules/Analytics/AnalyticsViewRoomTrigger.swift @@ -44,6 +44,7 @@ import AnalyticsEvents case linkShare case exploreRooms case spaceMembers + case spaceBottomSheet var trigger: AnalyticsEvent.ViewRoom.Trigger? { switch self { @@ -99,6 +100,8 @@ import AnalyticsEvents return .MobileExploreRooms case .spaceMembers: return .MobileSpaceMembers + case .spaceBottomSheet: + return .MobileSpaceBottomSheet } } } diff --git a/Riot/Modules/Analytics/Helpers/AllChatsActiveFilter+Analytics.swift b/Riot/Modules/Analytics/Helpers/AllChatsActiveFilter+Analytics.swift new file mode 100644 index 0000000000..f2519f6793 --- /dev/null +++ b/Riot/Modules/Analytics/Helpers/AllChatsActiveFilter+Analytics.swift @@ -0,0 +1,33 @@ +// +// Copyright 2022 New Vector Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import AnalyticsEvents + +extension UserSessionProperties.AllChatsActiveFilter { + var analyticsName: AnalyticsEvent.UserProperties.AllChatsActiveFilter { + switch self { + case .all: + return .All + case .unreads: + return .Unreads + case .favourites: + return .Favourites + case .people: + return .People + } + } +} diff --git a/Riot/Modules/Analytics/Helpers/UserProperties+Element.swift b/Riot/Modules/Analytics/Helpers/UserProperties+Element.swift index 341f0789a4..e0d2192797 100644 --- a/Riot/Modules/Analytics/Helpers/UserProperties+Element.swift +++ b/Riot/Modules/Analytics/Helpers/UserProperties+Element.swift @@ -20,12 +20,13 @@ import AnalyticsEvents extension AnalyticsEvent.UserProperties { // Initializer for Element. Strips all Web properties. - public init(ftueUseCaseSelection: FtueUseCaseSelection?, numFavouriteRooms: Int?, numSpaces: Int?) { + public init(ftueUseCaseSelection: FtueUseCaseSelection?, numFavouriteRooms: Int?, numSpaces: Int?, allChatsActiveFilter: AllChatsActiveFilter?) { self.init(WebMetaSpaceFavouritesEnabled: nil, WebMetaSpaceHomeAllRooms: nil, WebMetaSpaceHomeEnabled: nil, WebMetaSpaceOrphansEnabled: nil, WebMetaSpacePeopleEnabled: nil, + allChatsActiveFilter: allChatsActiveFilter, ftueUseCaseSelection: ftueUseCaseSelection, numFavouriteRooms: numFavouriteRooms, numSpaces: numSpaces) diff --git a/Riot/Modules/Analytics/PostHogAnalyticsClient.swift b/Riot/Modules/Analytics/PostHogAnalyticsClient.swift index 8d6dd4d502..7dec86dd41 100644 --- a/Riot/Modules/Analytics/PostHogAnalyticsClient.swift +++ b/Riot/Modules/Analytics/PostHogAnalyticsClient.swift @@ -81,7 +81,7 @@ class PostHogAnalyticsClient: AnalyticsClientProtocol { // Merge the updated user properties with the existing ones self.pendingUserProperties = AnalyticsEvent.UserProperties(ftueUseCaseSelection: userProperties.ftueUseCaseSelection ?? pendingUserProperties.ftueUseCaseSelection, numFavouriteRooms: userProperties.numFavouriteRooms ?? pendingUserProperties.numFavouriteRooms, - numSpaces: userProperties.numSpaces ?? pendingUserProperties.numSpaces) + numSpaces: userProperties.numSpaces ?? pendingUserProperties.numSpaces, allChatsActiveFilter: userProperties.allChatsActiveFilter ?? pendingUserProperties.allChatsActiveFilter) } // MARK: - Private diff --git a/Riot/Modules/ContextMenu/ActionProviders/AllChatsActionProvider.swift b/Riot/Modules/ContextMenu/ActionProviders/AllChatsActionProvider.swift index ded2fe69a4..7081c2b36c 100644 --- a/Riot/Modules/ContextMenu/ActionProviders/AllChatsActionProvider.swift +++ b/Riot/Modules/ContextMenu/ActionProviders/AllChatsActionProvider.swift @@ -50,6 +50,7 @@ class AllChatsActionProvider { filters: settings.filters, sorting: settings.sorting) AllChatsLayoutSettingsManager.shared.allChatLayoutSettings = newSettings + Analytics.shared.trackInteraction(action.state == .on ? .allChatsRecentsDisabled : .allChatsRecentsEnabled) } } @@ -62,6 +63,7 @@ class AllChatsActionProvider { filters: action.state == .on ? [] : [.unreads, .favourites, .people], sorting: settings.sorting) AllChatsLayoutSettingsManager.shared.allChatLayoutSettings = newSettings + Analytics.shared.trackInteraction(action.state == .on ? .allChatsFiltersDisabled : .allChatsFiltersEnabled) } } diff --git a/Riot/Modules/Home/AllChats/AllChatsFilterOptions.swift b/Riot/Modules/Home/AllChats/AllChatsFilterOptions.swift index b79aa59c19..4191c1dc6b 100644 --- a/Riot/Modules/Home/AllChats/AllChatsFilterOptions.swift +++ b/Riot/Modules/Home/AllChats/AllChatsFilterOptions.swift @@ -40,7 +40,18 @@ class AllChatsFilterOptions: NSObject { AllChatsLayoutSettingsManager.shared.activeFilters = [] return } - + + switch filter { + case .all: + Analytics.shared.trackInteraction(.allChatsFilterAll) + case .favourites: + Analytics.shared.trackInteraction(.allChatsFilterFavourites) + case .people: + Analytics.shared.trackInteraction(.allChatsFilterPeople) + case .unreads: + Analytics.shared.trackInteraction(.allChatsFilterUnreads) + default: break + } AllChatsLayoutSettingsManager.shared.activeFilters = filter } diff --git a/Riot/Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift b/Riot/Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift index de55c71a54..ee2a35997c 100644 --- a/Riot/Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift +++ b/Riot/Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift @@ -61,6 +61,8 @@ final class AllChatsLayoutSettingsManager: NSObject { set { RiotSettings.defaults.set(newValue.rawValue, forKey: Constants.activeFiltersKey) + track(activeFilters: newValue) + DispatchQueue.main.async { NotificationCenter.default.post(name: AllChatsLayoutSettingsManager.didUpdateActiveFilters, object: self) } @@ -84,6 +86,12 @@ final class AllChatsLayoutSettingsManager: NSObject { NotificationCenter.default.post(name: AllChatsLayoutSettingsManager.willUpdateSettings, object: self) } + if newValue.filters.isEmpty { + track(activeFilters: nil) + } else { + track(activeFilters: activeFilters) + } + guard let data = try? NSKeyedArchiver.archivedData(withRootObject: newValue, requiringSecureCoding: false) else { MXLog.warning("[AllChatsLayoutSettingsManager] set allChatLayoutSettings: failed to archive settings") return @@ -96,4 +104,24 @@ final class AllChatsLayoutSettingsManager: NSObject { } } } + + // MARK: - Private + + private func track(activeFilters: AllChatsLayoutFilterType?) { + guard let activeFilters = activeFilters else { + Analytics.shared.updateUserProperties(allChatsActiveFilter: nil) + return + } + + switch activeFilters { + case .unreads: + Analytics.shared.updateUserProperties(allChatsActiveFilter: .unreads) + case .favourites: + Analytics.shared.updateUserProperties(allChatsActiveFilter: .favourites) + case .people: + Analytics.shared.updateUserProperties(allChatsActiveFilter: .people) + default: + Analytics.shared.updateUserProperties(allChatsActiveFilter: .all) + } + } } diff --git a/Riot/Modules/Home/AllChats/AllChatsViewController.swift b/Riot/Modules/Home/AllChats/AllChatsViewController.swift index 47b8fd167e..5760c3a811 100644 --- a/Riot/Modules/Home/AllChats/AllChatsViewController.swift +++ b/Riot/Modules/Home/AllChats/AllChatsViewController.swift @@ -121,6 +121,7 @@ class AllChatsViewController: HomeViewController { // MARK: - Actions @objc private func showSpaceSelectorAction(sender: AnyObject) { + Analytics.shared.viewRoomTrigger = .roomList let currentSpaceId = self.dataSource.currentSpace?.spaceId ?? SpaceSelectorConstants.homeSpaceId let spaceSelectorBridgePresenter = SpaceSelectorBottomSheetCoordinatorBridgePresenter(session: self.mainSession, selectedSpaceId: currentSpaceId, showHomeSpace: true) spaceSelectorBridgePresenter.present(from: self, animated: true) diff --git a/Riot/Modules/Home/AllChats/RoomInvitesViewController.swift b/Riot/Modules/Home/AllChats/RoomInvitesViewController.swift index e8ff9328f2..3f9f1e0c74 100644 --- a/Riot/Modules/Home/AllChats/RoomInvitesViewController.swift +++ b/Riot/Modules/Home/AllChats/RoomInvitesViewController.swift @@ -73,8 +73,7 @@ class RoomInvitesViewController: RecentsViewController { super.finalizeInit() title = VectorL10n.roomRecentsInvitesSection.capitalized - // TODO: add right screen tracker -// self.screenTracker = AnalyticsScreenTracker(screen: .rooms) + self.screenTracker = AnalyticsScreenTracker(screen: .invites) tableViewPaginationThrottler = MXThrottler(minimumDelay: 0.1) } diff --git a/RiotSwiftUI/Modules/Spaces/SpaceCreation/Coordinator/SpaceCreationCoordinator.swift b/RiotSwiftUI/Modules/Spaces/SpaceCreation/Coordinator/SpaceCreationCoordinator.swift index 12f0214597..592fe50bda 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceCreation/Coordinator/SpaceCreationCoordinator.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceCreation/Coordinator/SpaceCreationCoordinator.swift @@ -89,6 +89,8 @@ final class SpaceCreationCoordinator: Coordinator { func start() { MXLog.debug("[SpaceCreationCoordinator] did start.") + Analytics.shared.trackScreen(.createSpace) + let rootCoordinator = self.createMenuCoordinator(with: spaceVisibilityMenuParameters) rootCoordinator.start() diff --git a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomCoordinator.swift b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomSheetCoordinator.swift similarity index 95% rename from RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomCoordinator.swift rename to RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomSheetCoordinator.swift index 801ea1779a..7237b0aa32 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomCoordinator.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomSheetCoordinator.swift @@ -71,6 +71,7 @@ final class SpaceSelectorBottomSheetCoordinator: NSObject, Coordinator, Presenta // MARK: - Public func start() { + Analytics.shared.trackScreen(.spaceBottomSheet) push(createSpaceSelectorCoordinator(parentSpaceId: nil)) } @@ -135,6 +136,7 @@ final class SpaceSelectorBottomSheetCoordinator: NSObject, Coordinator, Presenta self.push(self.createSpaceDetailCoordinator(forSpaceWithId: item.id)) } case .spaceDisclosure(let item): + Analytics.shared.viewRoomTrigger = .spaceBottomSheet self.push(self.createSpaceSelectorCoordinator(parentSpaceId: item.id)) case .createSpace(let parentSpaceId): self.completion?(.createSpace(parentSpaceId)) @@ -181,7 +183,11 @@ final class SpaceSelectorBottomSheetCoordinator: NSObject, Coordinator, Presenta return } - Analytics.shared.trackInteraction(.spacePanelSwitchSpace) + if spaceIdStack.isEmpty { + Analytics.shared.trackInteraction(.spacePanelSwitchSpace) + } else { + Analytics.shared.trackInteraction(.spacePanelSwitchSubSpace) + } } } diff --git a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomCoordinatorBridgePresenter.swift b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomSheetCoordinatorBridgePresenter.swift similarity index 100% rename from RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomCoordinatorBridgePresenter.swift rename to RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/Coordinator/SpaceSelectorBottomSheetCoordinatorBridgePresenter.swift diff --git a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/Coordinator/SpaceSelectorCoordinator.swift b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/Coordinator/SpaceSelectorCoordinator.swift index 5e655ecbd0..8c13f02163 100644 --- a/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/Coordinator/SpaceSelectorCoordinator.swift +++ b/RiotSwiftUI/Modules/Spaces/SpaceSelectorBottomSheet/SpaceSelector/Coordinator/SpaceSelectorCoordinator.swift @@ -75,6 +75,10 @@ final class SpaceSelectorCoordinator: Coordinator, Presentable { // MARK: - Public func start() { + if let room = parameters.session.room(withRoomId: parameters.parentSpaceId) { + Analytics.shared.trackViewRoom(room) + } + MXLog.debug("[SpaceSelectorCoordinator] did start.") viewModel.completion = { [weak self] result in guard let self = self else { return } From 20634925da2462e8706f9f14247d34a0ae46fc9d Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Wed, 24 Aug 2022 09:54:50 +0200 Subject: [PATCH 2/5] App Layout: Add usage measures - Added changelog --- changelog.d/6618.change | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/6618.change diff --git a/changelog.d/6618.change b/changelog.d/6618.change new file mode 100644 index 0000000000..d5e829c0e0 --- /dev/null +++ b/changelog.d/6618.change @@ -0,0 +1 @@ +App Layout: Added usage measures From aa8469c719009fb5d426b32a9e9431f22fc9607e Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Wed, 24 Aug 2022 10:43:51 +0200 Subject: [PATCH 3/5] App Layout: Add usage measures - Update after review --- Riot/Modules/Analytics/PostHogAnalyticsClient.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Riot/Modules/Analytics/PostHogAnalyticsClient.swift b/Riot/Modules/Analytics/PostHogAnalyticsClient.swift index 7dec86dd41..6b27affea8 100644 --- a/Riot/Modules/Analytics/PostHogAnalyticsClient.swift +++ b/Riot/Modules/Analytics/PostHogAnalyticsClient.swift @@ -81,7 +81,8 @@ class PostHogAnalyticsClient: AnalyticsClientProtocol { // Merge the updated user properties with the existing ones self.pendingUserProperties = AnalyticsEvent.UserProperties(ftueUseCaseSelection: userProperties.ftueUseCaseSelection ?? pendingUserProperties.ftueUseCaseSelection, numFavouriteRooms: userProperties.numFavouriteRooms ?? pendingUserProperties.numFavouriteRooms, - numSpaces: userProperties.numSpaces ?? pendingUserProperties.numSpaces, allChatsActiveFilter: userProperties.allChatsActiveFilter ?? pendingUserProperties.allChatsActiveFilter) + numSpaces: userProperties.numSpaces ?? pendingUserProperties.numSpaces, + allChatsActiveFilter: userProperties.allChatsActiveFilter ?? pendingUserProperties.allChatsActiveFilter) } // MARK: - Private From f30fc8ad07866704f2876dce47fd9b14a00a2cbb Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Wed, 24 Aug 2022 11:16:10 +0200 Subject: [PATCH 4/5] App Layout: Add usage measures - Updated pod file --- Gemfile.lock | 72 ++++++++++++++++++++++++++-------------------------- Podfile.lock | 22 ++++++++-------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 033ac31083..6590decc42 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,37 +3,37 @@ GEM specs: CFPropertyList (3.0.5) rexml - activesupport (6.1.6) + activesupport (6.1.6.1) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) zeitwerk (~> 2.3) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.1) + public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.598.0) - aws-sdk-core (3.131.1) + aws-partitions (1.621.0) + aws-sdk-core (3.134.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.525.0) aws-sigv4 (~> 1.1) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.57.0) + aws-sdk-kms (1.58.0) aws-sdk-core (~> 3, >= 3.127.0) aws-sigv4 (~> 1.1) aws-sdk-s3 (1.114.0) aws-sdk-core (~> 3, >= 3.127.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.4) - aws-sigv4 (1.5.0) + aws-sigv4 (1.5.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) - claide (1.0.3) + claide (1.1.0) clamp (1.3.2) cocoapods (1.11.3) addressable (~> 2.8) @@ -82,13 +82,13 @@ GEM rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) - dotenv (2.7.6) + dotenv (2.8.1) emoji_regex (3.2.3) escape (0.0.4) ethon (0.15.0) ffi (>= 1.15.0) - excon (0.92.3) - faraday (1.10.0) + excon (0.92.4) + faraday (1.10.2) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -117,7 +117,7 @@ GEM faraday_middleware (1.2.0) faraday (~> 1.0) fastimage (2.2.6) - fastlane (2.206.2) + fastlane (2.209.1) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -159,17 +159,17 @@ GEM fastlane-plugin-brew (0.1.1) fastlane-plugin-diawi (2.1.0) rest-client (>= 2.0.0) - fastlane-plugin-sentry (1.12.1) - fastlane-plugin-versioning (0.5.0) + fastlane-plugin-sentry (1.12.2) + fastlane-plugin-versioning (0.5.1) fastlane-plugin-xcodegen (1.1.0) fastlane-plugin-brew (~> 0.1.1) ffi (1.15.5) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.22.0) - google-apis-core (>= 0.5, < 2.a) - google-apis-core (0.5.0) + google-apis-androidpublisher_v3 (0.25.0) + google-apis-core (>= 0.7, < 2.a) + google-apis-core (0.7.0) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -178,27 +178,27 @@ GEM retriable (>= 2.0, < 4.a) rexml webrick - google-apis-iamcredentials_v1 (0.11.0) - google-apis-core (>= 0.5, < 2.a) - google-apis-playcustomapp_v1 (0.8.0) - google-apis-core (>= 0.5, < 2.a) - google-apis-storage_v1 (0.15.0) - google-apis-core (>= 0.5, < 2.a) + google-apis-iamcredentials_v1 (0.13.0) + google-apis-core (>= 0.7, < 2.a) + google-apis-playcustomapp_v1 (0.10.0) + google-apis-core (>= 0.7, < 2.a) + google-apis-storage_v1 (0.17.0) + google-apis-core (>= 0.7, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) google-cloud-errors (1.2.0) - google-cloud-storage (1.36.2) + google-cloud-storage (1.38.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.17.0) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.1.3) + googleauth (1.2.0) faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) memoist (~> 0.16) @@ -210,7 +210,7 @@ GEM http-cookie (1.0.5) domain_name (~> 0.5) httpclient (2.8.3) - i18n (1.10.0) + i18n (1.12.0) concurrent-ruby (~> 1.0) jmespath (1.6.1) json (2.6.2) @@ -222,7 +222,7 @@ GEM mini_magick (4.11.0) mini_mime (1.1.2) mini_portile2 (2.8.0) - minitest (5.15.0) + minitest (5.16.3) molinillo (0.8.0) multi_json (1.15.0) multipart-post (2.0.0) @@ -230,7 +230,7 @@ GEM nap (1.1.0) naturally (2.2.1) netrc (0.11.0) - nokogiri (1.13.6) + nokogiri (1.13.8) mini_portile2 (~> 2.8.0) racc (~> 1.4) optparse (0.1.1) @@ -255,9 +255,9 @@ GEM ruby2_keywords (0.0.5) rubyzip (2.3.2) security (0.1.3) - signet (0.16.1) + signet (0.17.0) addressable (~> 2.8) - faraday (>= 0.17.5, < 3.0) + faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) simctl (1.6.8) @@ -279,7 +279,7 @@ GEM tty-cursor (~> 0.7) typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (2.0.4) + tzinfo (2.0.5) concurrent-ruby (~> 1.0) uber (0.1.0) unf (0.1.4) @@ -288,10 +288,10 @@ GEM unicode-display_width (1.8.0) webrick (1.7.0) word_wrap (1.0.0) - xcode-install (2.8.0) - claide (>= 0.9.1, < 1.1.0) + xcode-install (2.8.1) + claide (>= 0.9.1) fastlane (>= 2.1.0, < 3.0.0) - xcodeproj (1.21.0) + xcodeproj (1.22.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -318,4 +318,4 @@ DEPENDENCIES xcode-install BUNDLED WITH - 2.3.14 + 2.3.20 diff --git a/Podfile.lock b/Podfile.lock index 77370969ed..e92bfbcac5 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -72,11 +72,11 @@ PODS: - JitsiMeetSDK (= 5.0.2) - MatrixSDK/Core - MatrixSDKCrypto (0.1.0) - - OLMKit (3.2.5): - - OLMKit/olmc (= 3.2.5) - - OLMKit/olmcpp (= 3.2.5) - - OLMKit/olmc (3.2.5) - - OLMKit/olmcpp (3.2.5) + - OLMKit (3.2.12): + - OLMKit/olmc (= 3.2.12) + - OLMKit/olmcpp (= 3.2.12) + - OLMKit/olmc (3.2.12) + - OLMKit/olmcpp (3.2.12) - PostHog (1.4.4) - ReadMoreTextView (3.0.1) - Realm (10.27.0): @@ -92,7 +92,7 @@ PODS: - Sentry/Core (7.15.0) - SideMenu (6.5.0) - SwiftBase32 (0.9.0) - - SwiftGen (6.5.1) + - SwiftGen (6.6.2) - SwiftJWT (3.6.200): - BlueCryptor (~> 1.0) - BlueECC (~> 1.1) @@ -193,12 +193,12 @@ EXTERNAL SOURCES: CHECKOUT OPTIONS: AnalyticsEvents: - :commit: b275ccb194a219a61b3100159d51cadbf7c9020c + :commit: 53ad46ba1ea1ee8f21139dda3c351890846a202f :git: https://github.com/matrix-org/matrix-analytics-events.git SPEC CHECKSUMS: AFNetworking: 7864c38297c79aaca1500c33288e429c3451fdce - AnalyticsEvents: 333bf47d67dc628fadd29ce887b7ac93d8bd6e05 + AnalyticsEvents: 0cc8cf52da2fd464a2f39b788a295988151116ce BlueCryptor: b0aee3d9b8f367b49b30de11cda90e1735571c24 BlueECC: 0d18e93347d3ec6d41416de21c1ffa4d4cd3c2cc BlueRSA: dfeef51db96bcc4edec654956c1581adbda4e6a3 @@ -223,7 +223,7 @@ SPEC CHECKSUMS: Logging: beeb016c9c80cf77042d62e83495816847ef108b MatrixSDK: 9ed379b45f6809fc573db53a30a4d09f960e5886 MatrixSDKCrypto: 4b9146d5ef484550341be056a164c6930038028e - OLMKit: 9fb4799c4a044dd2c06bda31ec31a12191ad30b5 + OLMKit: da115f16582e47626616874e20f7bb92222c7a51 PostHog: 4b6321b521569092d4ef3a02238d9435dbaeb99f ReadMoreTextView: 19147adf93abce6d7271e14031a00303fe28720d Realm: 9ca328bd7e700cc19703799785e37f77d1a130f2 @@ -231,7 +231,7 @@ SPEC CHECKSUMS: Sentry: 63ca44f5e0c8cea0ee5a07686b02e56104f41ef7 SideMenu: f583187d21c5b1dd04c72002be544b555a2627a2 SwiftBase32: 9399c25a80666dc66b51e10076bf591e3bbb8f17 - SwiftGen: a6d22010845f08fe18fbdf3a07a8e380fd22e0ea + SwiftGen: 1366a7f71aeef49954ca5a63ba4bef6b0f24138c SwiftJWT: 88c412708f58c169d431d344c87bc79a87c830ae SwiftLint: e96c0a8c770c7ebbc4d36c55baf9096bb65c4584 SwiftyBeaver: 84069991dd5dca07d7069100985badaca7f0ce82 @@ -243,4 +243,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 044b4d9f0d9485e1407019fb3c7b267458120a89 -COCOAPODS: 1.11.2 +COCOAPODS: 1.11.3 From 6ccd8325c2ab8de64fa2e1d26fab3652429e203f Mon Sep 17 00:00:00 2001 From: Gil Eluard Date: Wed, 24 Aug 2022 11:23:59 +0200 Subject: [PATCH 5/5] App Layout: Add usage measures - Update after review --- Riot/Modules/Home/AllChats/AllChatsFilterOptions.swift | 1 + .../Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Riot/Modules/Home/AllChats/AllChatsFilterOptions.swift b/Riot/Modules/Home/AllChats/AllChatsFilterOptions.swift index 4191c1dc6b..14c63b79f9 100644 --- a/Riot/Modules/Home/AllChats/AllChatsFilterOptions.swift +++ b/Riot/Modules/Home/AllChats/AllChatsFilterOptions.swift @@ -37,6 +37,7 @@ class AllChatsFilterOptions: NSObject { filterOptionListView.selectedOptionType = AllChatsLayoutSettingsManager.shared.activeFilters filterOptionListView.selectionChanged = { filter in guard filter != .all else { + Analytics.shared.trackInteraction(.allChatsFilterAll) AllChatsLayoutSettingsManager.shared.activeFilters = [] return } diff --git a/Riot/Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift b/Riot/Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift index ee2a35997c..065c54cb32 100644 --- a/Riot/Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift +++ b/Riot/Modules/Home/AllChats/AllChatsLayoutSettingsManager.swift @@ -114,6 +114,8 @@ final class AllChatsLayoutSettingsManager: NSObject { } switch activeFilters { + case [], .all: + Analytics.shared.updateUserProperties(allChatsActiveFilter: .all) case .unreads: Analytics.shared.updateUserProperties(allChatsActiveFilter: .unreads) case .favourites: @@ -121,7 +123,7 @@ final class AllChatsLayoutSettingsManager: NSObject { case .people: Analytics.shared.updateUserProperties(allChatsActiveFilter: .people) default: - Analytics.shared.updateUserProperties(allChatsActiveFilter: .all) + Analytics.shared.updateUserProperties(allChatsActiveFilter: nil) } } }