Skip to content

Commit eca2499

Browse files
committed
fix(startup): allow the SessionTracker startup to complete later without blocking
1 parent de50a39 commit eca2499

File tree

4 files changed

+22
-18
lines changed

4 files changed

+22
-18
lines changed

bugsnag-android-core/src/main/java/com/bugsnag/android/SessionTracker.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.bugsnag.android.internal.ForegroundDetector;
66
import com.bugsnag.android.internal.ImmutableConfig;
77
import com.bugsnag.android.internal.TaskType;
8+
import com.bugsnag.android.internal.dag.Provider;
89

910
import android.app.Activity;
1011

@@ -32,7 +33,7 @@ class SessionTracker extends BaseObservable implements ForegroundDetector.OnActi
3233
private final ImmutableConfig configuration;
3334
private final CallbackState callbackState;
3435
private final Client client;
35-
final SessionStore sessionStore;
36+
final Provider<SessionStore> sessionStore;
3637
private volatile Session currentSession = null;
3738
final BackgroundTaskService backgroundTaskService;
3839
final Logger logger;
@@ -41,7 +42,7 @@ class SessionTracker extends BaseObservable implements ForegroundDetector.OnActi
4142
SessionTracker(ImmutableConfig configuration,
4243
CallbackState callbackState,
4344
Client client,
44-
SessionStore sessionStore,
45+
Provider<SessionStore> sessionStore,
4546
Logger logger,
4647
BackgroundTaskService backgroundTaskService) {
4748
this(configuration, callbackState, client, DEFAULT_TIMEOUT_MS,
@@ -52,7 +53,7 @@ class SessionTracker extends BaseObservable implements ForegroundDetector.OnActi
5253
CallbackState callbackState,
5354
Client client,
5455
long timeoutMs,
55-
SessionStore sessionStore,
56+
Provider<SessionStore> sessionStore,
5657
Logger logger,
5758
BackgroundTaskService backgroundTaskService) {
5859
this.configuration = configuration;
@@ -263,7 +264,7 @@ public void run() {
263264
* Attempts to flush session payloads stored on disk
264265
*/
265266
void flushStoredSessions() {
266-
List<File> storedFiles = sessionStore.findStoredFiles();
267+
List<File> storedFiles = sessionStore.get().findStoredFiles();
267268

268269
for (File storedFile : storedFiles) {
269270
flushStoredSession(storedFile);
@@ -282,27 +283,28 @@ void flushStoredSession(File storedFile) {
282283
}
283284

284285
DeliveryStatus deliveryStatus = deliverSessionPayload(payload);
286+
SessionStore store = sessionStore.get();
285287

286288
switch (deliveryStatus) {
287289
case DELIVERED:
288-
sessionStore.deleteStoredFiles(Collections.singletonList(storedFile));
290+
store.deleteStoredFiles(Collections.singletonList(storedFile));
289291
logger.d("Sent 1 new session to Bugsnag");
290292
break;
291293
case UNDELIVERED:
292-
if (sessionStore.isTooOld(storedFile)) {
294+
if (store.isTooOld(storedFile)) {
293295
logger.w("Discarding historical session (from {"
294-
+ sessionStore.getCreationDate(storedFile)
296+
+ store.getCreationDate(storedFile)
295297
+ "}) after failed delivery");
296-
sessionStore.deleteStoredFiles(Collections.singletonList(storedFile));
298+
store.deleteStoredFiles(Collections.singletonList(storedFile));
297299
} else {
298-
sessionStore.cancelQueuedFiles(Collections.singletonList(storedFile));
300+
store.cancelQueuedFiles(Collections.singletonList(storedFile));
299301
logger.w("Leaving session payload for future delivery");
300302
}
301303
break;
302304
case FAILURE:
303305
// drop bad data
304306
logger.w("Deleting invalid session tracking payload");
305-
sessionStore.deleteStoredFiles(Collections.singletonList(storedFile));
307+
store.deleteStoredFiles(Collections.singletonList(storedFile));
306308
break;
307309
default:
308310
break;
@@ -319,7 +321,7 @@ public void run() {
319321
});
320322
} catch (RejectedExecutionException exception) {
321323
// This is on the current thread but there isn't much else we can do
322-
sessionStore.write(session);
324+
sessionStore.get().write(session);
323325
}
324326
}
325327

@@ -331,7 +333,7 @@ void deliverInMemorySession(Session session) {
331333
switch (deliveryStatus) {
332334
case UNDELIVERED:
333335
logger.w("Storing session payload for future delivery");
334-
sessionStore.write(session);
336+
sessionStore.get().write(session);
335337
break;
336338
case FAILURE:
337339
logger.w("Dropping invalid session tracking payload");

bugsnag-android-core/src/main/java/com/bugsnag/android/TrackerModule.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ internal class TrackerModule(
2626
config,
2727
callbackState,
2828
client,
29-
storageModule.sessionStore.get(),
29+
storageModule.sessionStore,
3030
config.logger,
3131
bgTaskService
3232
)

bugsnag-android-core/src/test/java/com/bugsnag/android/SessionTrackerPauseResumeTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.bugsnag.android.BugsnagTestUtils.generateConfiguration
55
import com.bugsnag.android.BugsnagTestUtils.generateDevice
66
import com.bugsnag.android.internal.BackgroundTaskService
77
import com.bugsnag.android.internal.ImmutableConfig
8+
import com.bugsnag.android.internal.dag.ValueProvider
89
import org.junit.Assert.assertEquals
910
import org.junit.Assert.assertFalse
1011
import org.junit.Assert.assertNotEquals
@@ -60,7 +61,7 @@ internal class SessionTrackerPauseResumeTest {
6061
BugsnagTestUtils.generateImmutableConfig(),
6162
configuration.impl.callbackState,
6263
client,
63-
sessionStore,
64+
ValueProvider(sessionStore),
6465
NoopLogger,
6566
BackgroundTaskService()
6667
)

bugsnag-android-core/src/test/java/com/bugsnag/android/SessionTrackerTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.bugsnag.android.internal.BackgroundTaskService;
1111
import com.bugsnag.android.internal.ForegroundDetector;
1212
import com.bugsnag.android.internal.ImmutableConfig;
13+
import com.bugsnag.android.internal.dag.ValueProvider;
1314

1415
import androidx.annotation.NonNull;
1516

@@ -71,8 +72,8 @@ public void setUp() {
7172
configuration.setDelivery(BugsnagTestUtils.generateDelivery());
7273
immutableConfig = BugsnagTestUtils.generateImmutableConfig();
7374
sessionTracker = new SessionTracker(immutableConfig,
74-
configuration.impl.callbackState, client, sessionStore, NoopLogger.INSTANCE,
75-
bgTaskService);
75+
configuration.impl.callbackState, client, new ValueProvider<>(sessionStore),
76+
NoopLogger.INSTANCE, bgTaskService);
7677
configuration.setAutoTrackSessions(true);
7778
user = new User(null, null, null);
7879

@@ -179,7 +180,7 @@ public void testBasicInForeground() {
179180
public void testZeroSessionTimeout() {
180181
CallbackState callbackState = configuration.impl.callbackState;
181182
sessionTracker = new SessionTracker(immutableConfig, callbackState, client,
182-
0, sessionStore, NoopLogger.INSTANCE, bgTaskService);
183+
0, new ValueProvider<>(sessionStore), NoopLogger.INSTANCE, bgTaskService);
183184

184185
long now = System.currentTimeMillis();
185186
sessionTracker.onForegroundStatus(true, now);
@@ -199,7 +200,7 @@ public void testZeroSessionTimeout() {
199200
public void testSessionTimeout() {
200201
CallbackState callbackState = configuration.impl.callbackState;
201202
sessionTracker = new SessionTracker(immutableConfig, callbackState, client,
202-
100, sessionStore, NoopLogger.INSTANCE, bgTaskService);
203+
100, new ValueProvider<>(sessionStore), NoopLogger.INSTANCE, bgTaskService);
203204

204205
long now = System.currentTimeMillis();
205206
sessionTracker.onForegroundStatus(true, now);

0 commit comments

Comments
 (0)