Skip to content

Commit 0786eef

Browse files
zhu-xiaoweixiaoweii
andauthored
feat: add preset attributes screen name and screen unique id (#32)
Co-authored-by: xiaoweii <xiaoweii@amazom.com>
1 parent bccd232 commit 0786eef

File tree

6 files changed

+37
-45
lines changed

6 files changed

+37
-45
lines changed

Sources/Clickstream/Dependency/Clickstream/Analytics/AnalyticsClient.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class AnalyticsClient: AnalyticsClientBehaviour {
3030
private(set) var userAttributes: [String: Any] = [:]
3131
private let clickstream: ClickstreamContext
3232
private(set) var userId: String?
33+
var autoRecordClient: AutoRecordEventClient?
3334

3435
init(clickstream: ClickstreamContext,
3536
eventRecorder: AnalyticsEventRecording,
@@ -40,6 +41,7 @@ class AnalyticsClient: AnalyticsClientBehaviour {
4041
self.sessionProvider = sessionProvider
4142
self.userId = UserDefaultsUtil.getCurrentUserId(storage: clickstream.storage)
4243
self.userAttributes = UserDefaultsUtil.getUserAttributes(storage: clickstream.storage)
44+
self.autoRecordClient = (clickstream.sessionClient as? SessionClient)?.autoRecordClient
4345
}
4446

4547
func addGlobalAttribute(_ attribute: AttributeValue, forKey key: String) {
@@ -125,6 +127,14 @@ class AnalyticsClient: AnalyticsClientBehaviour {
125127
for (key, attribute) in globalAttributes {
126128
event.addGlobalAttribute(attribute, forKey: key)
127129
}
130+
if let autoRecordClient {
131+
if autoRecordClient.lastScreenName != nil, autoRecordClient.lastScreenUniqueId != nil {
132+
event.addGlobalAttribute(autoRecordClient.lastScreenName!,
133+
forKey: Event.ReservedAttribute.SCREEN_NAME)
134+
event.addGlobalAttribute(autoRecordClient.lastScreenUniqueId!,
135+
forKey: Event.ReservedAttribute.SCREEN_UNIQUEID)
136+
}
137+
}
128138
event.setUserAttribute(userAttributes)
129139
let objId = ObjectIdentifier(event)
130140
event.hashCode = objId.hashValue

Sources/Clickstream/Dependency/Clickstream/AutoRecord/AutoRecordEventClient.swift

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ class AutoRecordEventClient {
1616
private var isFirstOpen: Bool
1717
private var isFirstTime = true
1818
private var lastEngageTime: Int64 = 0
19-
private var lastScreenName: String?
19+
private(set) var lastScreenName: String?
2020
private var lastScreenPath: String?
21-
private var lastScreenUniqueId: String?
22-
private var lastScreenStartTimestamp: Int64 = 0
21+
private(set) var lastScreenUniqueId: String?
22+
private(set) var lastScreenStartTimestamp: Int64 = 0
2323

2424
init(clickstream: ClickstreamContext) {
2525
self.clickstream = clickstream
@@ -47,9 +47,7 @@ class AutoRecordEventClient {
4747
}
4848
let event = clickstream.analyticsClient.createEvent(withEventType: Event.PresetEvent.SCREEN_VIEW)
4949
let eventTimestamp = event.timestamp
50-
event.addAttribute(screenName, forKey: Event.ReservedAttribute.SCREEN_NAME)
5150
event.addAttribute(screenPath, forKey: Event.ReservedAttribute.SCREEN_ID)
52-
event.addAttribute(screenUniqueId, forKey: Event.ReservedAttribute.SCREEN_UNIQUEID)
5351
if lastScreenName != nil, lastScreenPath != nil, lastScreenUniqueId != nil {
5452
event.addAttribute(lastScreenName!, forKey: Event.ReservedAttribute.PREVIOUS_SCREEN_NAME)
5553
event.addAttribute(lastScreenPath!, forKey: Event.ReservedAttribute.PREVIOUS_SCREEN_ID)
@@ -79,17 +77,12 @@ class AutoRecordEventClient {
7977
if clickstream.configuration.isTrackUserEngagementEvents, lastEngageTime > Constants.minEngagementTime {
8078
let event = clickstream.analyticsClient.createEvent(withEventType: Event.PresetEvent.USER_ENGAGEMENT)
8179
event.addAttribute(lastEngageTime, forKey: Event.ReservedAttribute.ENGAGEMENT_TIMESTAMP)
82-
if lastScreenName != nil, lastScreenPath != nil, lastScreenUniqueId != nil {
83-
event.addAttribute(lastScreenName!, forKey: Event.ReservedAttribute.SCREEN_NAME)
84-
event.addAttribute(lastScreenPath!, forKey: Event.ReservedAttribute.SCREEN_ID)
85-
event.addAttribute(lastScreenUniqueId!, forKey: Event.ReservedAttribute.SCREEN_UNIQUEID)
86-
}
8780
recordEvent(event)
8881
}
8982
}
9083

91-
func updateLastScreenStartTimestamp() {
92-
lastScreenStartTimestamp = Date().millisecondsSince1970
84+
func updateLastScreenStartTimestamp(_ timestamp: Int64) {
85+
lastScreenStartTimestamp = timestamp
9386
}
9487

9588
func getPreviousScreenViewTimestamp() -> Int64 {
@@ -151,21 +144,12 @@ class AutoRecordEventClient {
151144
}
152145
let event = clickstream.analyticsClient.createEvent(withEventType: Event.PresetEvent.APP_START)
153146
event.addAttribute(isFirstTime, forKey: Event.ReservedAttribute.IS_FIRST_TIME)
154-
if lastScreenName != nil, lastScreenPath != nil {
155-
event.addAttribute(lastScreenName!, forKey: Event.ReservedAttribute.SCREEN_NAME)
156-
event.addAttribute(lastScreenPath!, forKey: Event.ReservedAttribute.SCREEN_ID)
157-
}
158147
recordEvent(event)
159148
isFirstTime = false
160149
}
161150

162151
func recordAppEnd() {
163152
let event = clickstream.analyticsClient.createEvent(withEventType: Event.PresetEvent.APP_END)
164-
if lastScreenName != nil, lastScreenPath != nil, lastScreenUniqueId != nil {
165-
event.addAttribute(lastScreenName!, forKey: Event.ReservedAttribute.SCREEN_NAME)
166-
event.addAttribute(lastScreenPath!, forKey: Event.ReservedAttribute.SCREEN_ID)
167-
event.addAttribute(lastScreenUniqueId!, forKey: Event.ReservedAttribute.SCREEN_UNIQUEID)
168-
}
169153
recordEvent(event)
170154
}
171155

Sources/Clickstream/Dependency/Clickstream/Session/SessionClient.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class SessionClient: SessionClientBehaviour {
2020
private let activityTracker: ActivityTrackerBehaviour
2121
private let sessionClientQueue = DispatchQueue(label: Constants.queue,
2222
attributes: .concurrent)
23-
private let autoRecordClient: AutoRecordEventClient
23+
let autoRecordClient: AutoRecordEventClient
2424

2525
init(activityTracker: ActivityTrackerBehaviour? = nil, clickstream: ClickstreamContext) {
2626
self.clickstream = clickstream
@@ -60,7 +60,7 @@ class SessionClient: SessionClientBehaviour {
6060
private func handleAppEnterForeground() {
6161
log.debug("Application entered the foreground.")
6262
autoRecordClient.handleAppStart()
63-
autoRecordClient.updateLastScreenStartTimestamp()
63+
autoRecordClient.updateLastScreenStartTimestamp(Date().millisecondsSince1970)
6464
initialSession()
6565
}
6666

Tests/ClickstreamTests/Clickstream/AutoRecordEventClientTest.swift

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class AutoRecordEventClientTest: XCTestCase {
3434
)
3535
clickstream.analyticsClient = analyticsClient
3636
autoRecordEventClient = AutoRecordEventClient(clickstream: clickstream)
37+
analyticsClient.autoRecordClient = autoRecordEventClient
3738
}
3839

3940
override func tearDown() {
@@ -136,22 +137,23 @@ class AutoRecordEventClientTest: XCTestCase {
136137
let window = UIWindow(frame: UIScreen.main.bounds)
137138
window.rootViewController = viewControllerA
138139
window.makeKeyAndVisible()
139-
Thread.sleep(forTimeInterval: 1.01)
140+
141+
autoRecordEventClient.updateLastScreenStartTimestamp(Date().millisecondsSince1970 - 1_100)
142+
140143
window.rootViewController = viewControllerB
141144
window.makeKeyAndVisible()
142145
XCTAssertTrue(viewControllerA.viewDidAppearCalled)
143146
XCTAssertTrue(viewControllerB.viewDidAppearCalled)
144147
let event0 = eventRecorder.savedEvents[0]
145-
let event1 = eventRecorder.savedEvents[1]
146-
let event2 = eventRecorder.savedEvents[2]
148+
var engagementEvent = eventRecorder.savedEvents[1]
149+
if engagementEvent.eventType != Event.PresetEvent.USER_ENGAGEMENT {
150+
engagementEvent = eventRecorder.savedEvents[2]
151+
}
147152
XCTAssertEqual(Event.PresetEvent.SCREEN_VIEW, event0.eventType)
148-
XCTAssertEqual(Event.PresetEvent.USER_ENGAGEMENT, event1.eventType)
149-
XCTAssertEqual(Event.PresetEvent.SCREEN_VIEW, event2.eventType)
150153

151-
XCTAssertEqual(event0.attributes[Event.ReservedAttribute.SCREEN_ID] as! String, event1.attributes[Event.ReservedAttribute.SCREEN_ID] as! String)
152-
XCTAssertEqual(event0.attributes[Event.ReservedAttribute.SCREEN_NAME] as! String, event1.attributes[Event.ReservedAttribute.SCREEN_NAME] as! String)
153-
XCTAssertEqual(event0.attributes[Event.ReservedAttribute.SCREEN_UNIQUEID] as! String, event1.attributes[Event.ReservedAttribute.SCREEN_UNIQUEID] as! String)
154-
XCTAssertNotNil(event1.attributes[Event.ReservedAttribute.ENGAGEMENT_TIMESTAMP])
154+
XCTAssertEqual(event0.attributes[Event.ReservedAttribute.SCREEN_NAME] as! String, engagementEvent.attributes[Event.ReservedAttribute.SCREEN_NAME] as! String)
155+
XCTAssertEqual(event0.attributes[Event.ReservedAttribute.SCREEN_UNIQUEID] as! String, engagementEvent.attributes[Event.ReservedAttribute.SCREEN_UNIQUEID] as! String)
156+
XCTAssertNotNil(engagementEvent.attributes[Event.ReservedAttribute.ENGAGEMENT_TIMESTAMP])
155157
}
156158

157159
func testTwoSameScreenView() {
@@ -181,7 +183,7 @@ class AutoRecordEventClientTest: XCTestCase {
181183
let window = UIWindow(frame: UIScreen.main.bounds)
182184
window.rootViewController = viewControllerA
183185
window.makeKeyAndVisible()
184-
Thread.sleep(forTimeInterval: 1.01)
186+
autoRecordEventClient.updateLastScreenStartTimestamp(Date().millisecondsSince1970 - 1_100)
185187
window.rootViewController = viewControllerB
186188
window.makeKeyAndVisible()
187189
XCTAssertNotEqual(Event.PresetEvent.USER_ENGAGEMENT, eventRecorder.savedEvents[1].eventType)

Tests/ClickstreamTests/Clickstream/SessionClientTests.swift

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class SessionClientTests: XCTestCase {
108108
window.rootViewController = viewControllerA
109109
window.makeKeyAndVisible()
110110

111-
Thread.sleep(forTimeInterval: 1)
111+
sessionClient.autoRecordClient.updateLastScreenStartTimestamp(Date().millisecondsSince1970 - 1_100)
112112
activityTracker.callback?(.runningInBackground)
113113

114114
let session = sessionClient.getCurrentSession()!
@@ -125,7 +125,6 @@ class SessionClientTests: XCTestCase {
125125
XCTAssertEqual(Event.PresetEvent.USER_ENGAGEMENT, events[4].eventType)
126126
XCTAssertEqual(Event.PresetEvent.APP_END, events[5].eventType)
127127
XCTAssertNotNil(events[5].attributes[Event.ReservedAttribute.SCREEN_NAME])
128-
XCTAssertNotNil(events[5].attributes[Event.ReservedAttribute.SCREEN_ID])
129128
XCTAssertNotNil(events[5].attributes[Event.ReservedAttribute.SCREEN_UNIQUEID])
130129
}
131130

@@ -184,7 +183,6 @@ class SessionClientTests: XCTestCase {
184183
XCTAssertEqual(Event.PresetEvent.APP_START, events[5].eventType)
185184
let appStartEvent = events[5]
186185
XCTAssertNotNil(appStartEvent.attributes[Event.ReservedAttribute.SCREEN_NAME])
187-
XCTAssertNotNil(appStartEvent.attributes[Event.ReservedAttribute.SCREEN_ID])
188186
XCTAssertFalse(appStartEvent.attributes[Event.ReservedAttribute.IS_FIRST_TIME] as! Bool)
189187
}
190188

@@ -194,15 +192,9 @@ class SessionClientTests: XCTestCase {
194192
let window = UIWindow(frame: UIScreen.main.bounds)
195193
window.rootViewController = viewController
196194
window.makeKeyAndVisible()
197-
Thread.sleep(forTimeInterval: 0.2)
198-
activityTracker.callback?(.runningInForeground)
199-
Thread.sleep(forTimeInterval: 1)
200195
activityTracker.callback?(.runningInBackground)
201-
Thread.sleep(forTimeInterval: 0.1)
202-
let events = eventRecorder.savedEvents
203-
XCTAssertEqual(8, events.count)
204-
let userEngagementEvent = events[6]
205-
XCTAssertEqual(Event.PresetEvent.USER_ENGAGEMENT, userEngagementEvent.eventType)
206-
XCTAssertTrue((userEngagementEvent.attributes[Event.ReservedAttribute.ENGAGEMENT_TIMESTAMP] as! Int64) < 1_200)
196+
sessionClient.autoRecordClient.updateLastScreenStartTimestamp(Date().millisecondsSince1970 - 1_100)
197+
activityTracker.callback?(.runningInForeground)
198+
XCTAssertTrue(Date().millisecondsSince1970 - sessionClient.autoRecordClient.lastScreenStartTimestamp < 200)
207199
}
208200
}

Tests/ClickstreamTests/Mock/MockEventRecorder.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,20 @@
66
//
77

88
@testable import Clickstream
9+
import Foundation
910

1011
class MockEventRecorder: AnalyticsEventRecording {
1112
var saveCount = 0
1213
var lastSavedEvent: ClickstreamEvent?
1314
var savedEvents: [ClickstreamEvent] = []
15+
let semaphore = DispatchSemaphore(value: 1)
1416

1517
func save(_ event: ClickstreamEvent) throws {
18+
semaphore.wait()
1619
saveCount += 1
1720
lastSavedEvent = event
1821
savedEvents.append(event)
22+
semaphore.signal()
1923
}
2024

2125
var submitCount = 0

0 commit comments

Comments
 (0)