mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
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:
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user