Posthog: report SessionSecurityState (#2795)

* Posthog: report SessionSecurityState

* Review quick change

---------

Co-authored-by: Mauro <34335419+Velin92@users.noreply.github.com>
This commit is contained in:
Valere
2024-05-07 16:31:12 +02:00
committed by GitHub
parent e829a3ded6
commit bd4fae6086
10 changed files with 157 additions and 9 deletions
@@ -203,6 +203,45 @@ class AnalyticsClientMock: AnalyticsClientProtocol {
screenReceivedInvocations.append(event)
screenClosure?(event)
}
//MARK: - updateUserProperties
var updateUserPropertiesUnderlyingCallsCount = 0
var updateUserPropertiesCallsCount: Int {
get {
if Thread.isMainThread {
return updateUserPropertiesUnderlyingCallsCount
} else {
var returnValue: Int? = nil
DispatchQueue.main.sync {
returnValue = updateUserPropertiesUnderlyingCallsCount
}
return returnValue!
}
}
set {
if Thread.isMainThread {
updateUserPropertiesUnderlyingCallsCount = newValue
} else {
DispatchQueue.main.sync {
updateUserPropertiesUnderlyingCallsCount = newValue
}
}
}
}
var updateUserPropertiesCalled: Bool {
return updateUserPropertiesCallsCount > 0
}
var updateUserPropertiesReceivedEvent: AnalyticsEvent.UserProperties?
var updateUserPropertiesReceivedInvocations: [AnalyticsEvent.UserProperties] = []
var updateUserPropertiesClosure: ((AnalyticsEvent.UserProperties) -> Void)?
func updateUserProperties(_ event: AnalyticsEvent.UserProperties) {
updateUserPropertiesCallsCount += 1
updateUserPropertiesReceivedEvent = event
updateUserPropertiesReceivedInvocations.append(event)
updateUserPropertiesClosure?(event)
}
}
class AppLockServiceMock: AppLockServiceProtocol {
var isMandatory: Bool {
@@ -14,6 +14,7 @@
// limitations under the License.
//
import AnalyticsEvents
import Combine
import SwiftUI
@@ -86,6 +87,21 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol
}
.store(in: &cancellables)
userSession.sessionSecurityStatePublisher
.receive(on: DispatchQueue.main)
.filter { state in
state.verificationState != .unknown
&& state.recoveryState != .settingUp
&& state.recoveryState != .unknown
}
.sink { [weak self] state in
guard let self else { return }
self.analyticsService.updateUserProperties(AnalyticsEvent.newVerificationStateUserProperty(verificationState: state.verificationState, recoveryState: state.recoveryState))
self.analyticsService.trackSessionSecurityState(state)
}
.store(in: &cancellables)
selectedRoomPublisher
.weakAssign(to: \.state.selectedRoomID, on: self)
.store(in: &cancellables)
@@ -38,6 +38,10 @@ protocol AnalyticsClientProtocol {
/// Capture the supplied analytics screen event.
/// - Parameter event: The screen event to capture.
func screen(_ event: AnalyticsScreenProtocol)
/// Updates the user properties
/// - Parameter userProperties: The properties event to capture.
func updateUserProperties(_ event: AnalyticsEvent.UserProperties)
}
// sourcery: AutoMockable
@@ -223,4 +223,39 @@ extension AnalyticsService {
let role = role.map(AnalyticsEvent.RoomModeration.Role.init)
capture(event: AnalyticsEvent.RoomModeration(action: action, role: role))
}
func trackSessionSecurityState(_ state: SessionSecurityState) {
let analyticsVerificationState: AnalyticsEvent.CryptoSessionStateChange.VerificationState
switch state.verificationState {
case .unknown:
return
case .verified:
analyticsVerificationState = .Verified
case .unverified:
analyticsVerificationState = .NotVerified
}
let analyticsRecoveryState: AnalyticsEvent.CryptoSessionStateChange.RecoveryState
switch state.recoveryState {
case .enabled:
analyticsRecoveryState = .Enabled
case .disabled:
analyticsRecoveryState = .Disabled
case .incomplete:
analyticsRecoveryState = .Incomplete
case .unknown:
return
case .settingUp:
return
}
let event = AnalyticsEvent.CryptoSessionStateChange(recoveryState: analyticsRecoveryState, verificationState: analyticsVerificationState)
client.capture(event)
}
func updateUserProperties(_ userProperties: AnalyticsEvent.UserProperties) {
client.updateUserProperties(userProperties)
}
}
@@ -88,7 +88,9 @@ class PostHogAnalyticsClient: AnalyticsClientProtocol {
self.pendingUserProperties = AnalyticsEvent.UserProperties(allChatsActiveFilter: userProperties.allChatsActiveFilter ?? pendingUserProperties.allChatsActiveFilter,
ftueUseCaseSelection: userProperties.ftueUseCaseSelection ?? pendingUserProperties.ftueUseCaseSelection,
numFavouriteRooms: userProperties.numFavouriteRooms ?? pendingUserProperties.numFavouriteRooms,
numSpaces: userProperties.numSpaces ?? pendingUserProperties.numSpaces)
numSpaces: userProperties.numSpaces ?? pendingUserProperties.numSpaces,
recoveryState: userProperties.recoveryState ?? pendingUserProperties.recoveryState,
verificationState: userProperties.verificationState ?? pendingUserProperties.verificationState)
}
func updateSuperProperties(_ updatedProperties: AnalyticsEvent.SuperProperties) {
@@ -0,0 +1,46 @@
//
// Copyright 2024 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 AnalyticsEvents
import Foundation
extension AnalyticsEvent {
static func newVerificationStateUserProperty(verificationState: SessionVerificationState, recoveryState: SecureBackupRecoveryState) -> UserProperties {
let analyticsVerificationState: AnalyticsEvent.UserProperties.VerificationState? = switch verificationState {
case .unknown:
nil
case .verified:
.Verified
case .unverified:
.NotVerified
}
let analyticsRecoveryState: AnalyticsEvent.UserProperties.RecoveryState? = switch recoveryState {
case .enabled:
.Enabled
case .disabled:
.Disabled
case .incomplete:
.Incomplete
case .unknown:
nil
case .settingUp:
nil
}
return UserProperties(allChatsActiveFilter: nil, ftueUseCaseSelection: nil, numFavouriteRooms: nil, numSpaces: nil, recoveryState: analyticsRecoveryState, verificationState: analyticsVerificationState)
}
}