Skip to content

Commit 62e9e4b

Browse files
authored
Fix behaviour with multiple subscribers (#5031)
* Fix behaviour with multiple subscribers * Fix format
1 parent f79e5c4 commit 62e9e4b

File tree

4 files changed

+48
-19
lines changed

4 files changed

+48
-19
lines changed

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/FirebaseCrashlytics.java

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -180,25 +180,26 @@ public Void call() throws Exception {
180180
});
181181

182182
// TODO(mrober): Replace with a real session implementation.
183-
firebaseSessions.register(new SessionSubscriber() {
184-
@Override
185-
public void onSessionChanged(@NonNull SessionDetails sessionDetails) {
186-
Logger.getLogger().d("onSessionChanged: " + sessionDetails);
187-
// TODO(mrober): Set new field in report and remove this.
188-
core.setInternalKey("sessionId", sessionDetails.getSessionId());
189-
}
190-
191-
@Override
192-
public boolean isDataCollectionEnabled() {
193-
return arbiter.isAutomaticDataCollectionEnabled();
194-
}
195-
196-
@NonNull
197-
@Override
198-
public SessionSubscriber.Name getSessionSubscriberName() {
199-
return SessionSubscriber.Name.CRASHLYTICS;
200-
}
201-
});
183+
firebaseSessions.register(
184+
new SessionSubscriber() {
185+
@Override
186+
public void onSessionChanged(@NonNull SessionDetails sessionDetails) {
187+
Logger.getLogger().d("onSessionChanged: " + sessionDetails);
188+
// TODO(mrober): Set new field in report and remove this.
189+
core.setInternalKey("sessionId", sessionDetails.getSessionId());
190+
}
191+
192+
@Override
193+
public boolean isDataCollectionEnabled() {
194+
return arbiter.isAutomaticDataCollectionEnabled();
195+
}
196+
197+
@NonNull
198+
@Override
199+
public SessionSubscriber.Name getSessionSubscriberName() {
200+
return SessionSubscriber.Name.CRASHLYTICS;
201+
}
202+
});
202203

203204
return new FirebaseCrashlytics(core);
204205
}

firebase-sessions/src/main/kotlin/com/google/firebase/sessions/FirebaseSessions.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ internal constructor(
7878
"Registering Sessions SDK subscriber with name: ${subscriber.sessionSubscriberName}, " +
7979
"data collection enabled: ${subscriber.isDataCollectionEnabled}"
8080
)
81+
82+
// Immediately call the callback if Sessions generated a session before the
83+
// subscriber subscribed, otherwise subscribers might miss the first session.
84+
if (sessionGenerator.hasGenerateSession) {
85+
subscriber.onSessionChanged(
86+
SessionSubscriber.SessionDetails(sessionGenerator.currentSession.sessionId)
87+
)
88+
}
8189
}
8290

8391
private fun initiateSessionStart() {

firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionGenerator.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ internal class SessionGenerator(
4646
lateinit var currentSession: SessionDetails
4747
private set
4848

49+
/** Returns if a session has been generated. */
50+
val hasGenerateSession: Boolean
51+
get() = ::currentSession.isInitialized
52+
4953
/** Generates a new session. The first session's sessionId will match firstSessionId. */
5054
fun generateNewSession(): SessionDetails {
5155
sessionIndex++

firebase-sessions/src/test/kotlin/com/google/firebase/sessions/SessionGeneratorTest.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,22 @@ class SessionGeneratorTest {
4343
sessionGenerator.currentSession
4444
}
4545

46+
@Test
47+
fun hasGenerateSession_beforeGenerate_returnsFalse() {
48+
val sessionGenerator = SessionGenerator(collectEvents = false)
49+
50+
assertThat(sessionGenerator.hasGenerateSession).isFalse()
51+
}
52+
53+
@Test
54+
fun hasGenerateSession_afterGenerate_returnsTrue() {
55+
val sessionGenerator = SessionGenerator(collectEvents = false)
56+
57+
sessionGenerator.generateNewSession()
58+
59+
assertThat(sessionGenerator.hasGenerateSession).isTrue()
60+
}
61+
4662
@Test
4763
fun generateNewSession_generatesValidSessionIds() {
4864
val sessionGenerator = SessionGenerator(collectEvents = true) // defaults to UUID::randomUUID

0 commit comments

Comments
 (0)