Skip to content

Commit f9c01c0

Browse files
committed
Fix user action blocking behaviour when data collection disabled (#6218)
Make doBackgroundInitializationAsync submit a callable instead of submit task Submit task results in a blocking behaviour when `SettingsTask` cannot be resolved during initialization Remove un-necessary task return
1 parent 73ddb67 commit f9c01c0

File tree

7 files changed

+22
-30
lines changed

7 files changed

+22
-30
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
version=19.1.1
2-
latestReleasedVersion=19.1.0
2+
latestReleasedVersion=19.1.0
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
version=19.1.1
2-
latestReleasedVersion=19.1.0
2+
latestReleasedVersion=19.1.0

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/common/CrashlyticsControllerTest.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -410,9 +410,9 @@ public void testUploadWithNoReports() throws Exception {
410410

411411
final CrashlyticsController controller = createController();
412412

413-
Task<Void> task = controller.submitAllReports(testSettingsProvider.getSettingsAsync());
413+
controller.submitAllReports(testSettingsProvider.getSettingsAsync());
414414

415-
await(task);
415+
crashlyticsWorkers.common.await();
416416

417417
verify(mockSessionReportingCoordinator).hasReportsToSend();
418418
verifyNoMoreInteractions(mockSessionReportingCoordinator);
@@ -426,9 +426,9 @@ public void testUploadWithDataCollectionAlwaysEnabled() throws Exception {
426426

427427
final CrashlyticsController controller = createController();
428428

429-
final Task<Void> task = controller.submitAllReports(testSettingsProvider.getSettingsAsync());
429+
controller.submitAllReports(testSettingsProvider.getSettingsAsync());
430430

431-
await(task);
431+
crashlyticsWorkers.common.await();
432432

433433
verify(mockSessionReportingCoordinator).hasReportsToSend();
434434
verify(mockDataCollectionArbiter).isAutomaticDataCollectionEnabled();
@@ -452,15 +452,13 @@ public void testUploadDisabledThenOptIn() throws Exception {
452452
final ControllerBuilder builder = builder();
453453
builder.setDataCollectionArbiter(arbiter);
454454
final CrashlyticsController controller = builder.build();
455-
456-
final Task<Void> task = controller.submitAllReports(testSettingsProvider.getSettingsAsync());
457-
455+
controller.submitAllReports(testSettingsProvider.getSettingsAsync());
458456
verify(arbiter).isAutomaticDataCollectionEnabled();
459457
verify(mockSessionReportingCoordinator).hasReportsToSend();
460458
verify(mockSessionReportingCoordinator, never()).sendReports(any(Executor.class));
461459

462460
await(controller.sendUnsentReports());
463-
await(task);
461+
crashlyticsWorkers.common.await();
464462

465463
verify(mockSessionReportingCoordinator).sendReports(any(Executor.class));
466464
verifyNoMoreInteractions(mockSessionReportingCoordinator);
@@ -481,14 +479,14 @@ public void testUploadDisabledThenOptOut() throws Exception {
481479
builder.setDataCollectionArbiter(arbiter);
482480
final CrashlyticsController controller = builder.build();
483481

484-
final Task<Void> task = controller.submitAllReports(testSettingsProvider.getSettingsAsync());
482+
controller.submitAllReports(testSettingsProvider.getSettingsAsync());
485483

486484
verify(arbiter).isAutomaticDataCollectionEnabled();
487485
verify(mockSessionReportingCoordinator).hasReportsToSend();
488486
verify(mockSessionReportingCoordinator, never()).removeAllReports();
489487

490488
await(controller.deleteUnsentReports());
491-
await(task);
489+
crashlyticsWorkers.common.await();
492490

493491
crashlyticsWorkers.diskWrite.await();
494492

@@ -525,7 +523,7 @@ public void testUploadDisabledThenEnabled() throws Exception {
525523
builder.setDataCollectionArbiter(arbiter);
526524
final CrashlyticsController controller = builder.build();
527525

528-
final Task<Void> task = controller.submitAllReports(testSettingsProvider.getSettingsAsync());
526+
controller.submitAllReports(testSettingsProvider.getSettingsAsync());
529527

530528
verify(mockSessionReportingCoordinator).hasReportsToSend();
531529
verify(mockSessionReportingCoordinator, never()).sendReports(any(Executor.class));
@@ -547,7 +545,7 @@ public void testUploadDisabledThenEnabled() throws Exception {
547545
when(app.isDataCollectionDefaultEnabled()).thenReturn(false);
548546
assertFalse(arbiter.isAutomaticDataCollectionEnabled());
549547

550-
await(task);
548+
crashlyticsWorkers.common.await();
551549

552550
verify(mockSessionReportingCoordinator).sendReports(any(Executor.class));
553551
verifyNoMoreInteractions(mockSessionReportingCoordinator);

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -339,16 +339,16 @@ Task<Void> deleteUnsentReports() {
339339
return unsentReportsHandled.getTask();
340340
}
341341

342-
Task<Void> submitAllReports(Task<Settings> settingsDataTask) {
342+
void submitAllReports(Task<Settings> settingsDataTask) {
343343
if (!reportingCoordinator.hasReportsToSend()) {
344344
// Just notify the user that there are no reports and stop.
345345
Logger.getLogger().v("No crash reports are available to be sent.");
346346
unsentReportsAvailable.trySetResult(false);
347-
return Tasks.forResult(null);
347+
return;
348348
}
349349
Logger.getLogger().v("Crash reports are available to be sent.");
350350

351-
return waitForReportAction()
351+
waitForReportAction()
352352
.onSuccessTask(
353353
crashlyticsWorkers.common,
354354
new SuccessContinuation<Boolean, Void>() {
@@ -360,6 +360,7 @@ public Task<Void> then(@Nullable Boolean send) throws Exception {
360360
deleteFiles(listAppExceptionMarkerFiles());
361361
reportingCoordinator.removeAllReports();
362362
unsentReportsHandled.trySetResult(null);
363+
363364
return Tasks.forResult(null);
364365
}
365366

@@ -371,7 +372,6 @@ public Task<Void> then(@Nullable Boolean send) throws Exception {
371372
// Signal to the settings fetch and onboarding that we have explicit
372373
// permission.
373374
dataCollectionArbiter.grantDataCollectionPermission(dataCollectionToken);
374-
375375
return settingsDataTask.onSuccessTask(
376376
crashlyticsWorkers.common,
377377
new SuccessContinuation<Settings, Void>() {

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsCore.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import androidx.annotation.Nullable;
2222
import androidx.annotation.VisibleForTesting;
2323
import com.google.android.gms.tasks.Task;
24-
import com.google.android.gms.tasks.Tasks;
2524
import com.google.errorprone.annotations.CanIgnoreReturnValue;
2625
import com.google.firebase.FirebaseApp;
2726
import com.google.firebase.crashlytics.BuildConfig;
@@ -224,13 +223,12 @@ public boolean onPreExecute(AppData appData, SettingsProvider settingsProvider)
224223

225224
/** Performs background initialization asynchronously on the common worker. */
226225
@CanIgnoreReturnValue
227-
public Task<Settings> doBackgroundInitializationAsync(SettingsProvider settingsProvider) {
228-
return crashlyticsWorkers.common.submitTask(() -> doBackgroundInitialization(settingsProvider));
226+
public Task<Void> doBackgroundInitializationAsync(SettingsProvider settingsProvider) {
227+
return crashlyticsWorkers.common.submit(() -> doBackgroundInitialization(settingsProvider));
229228
}
230229

231230
/** Performs background initialization synchronously on the calling thread. */
232-
@CanIgnoreReturnValue
233-
private Task<Settings> doBackgroundInitialization(SettingsProvider settingsProvider) {
231+
private void doBackgroundInitialization(SettingsProvider settingsProvider) {
234232
CrashlyticsWorkers.checkBackgroundThread();
235233
// create the marker for this run
236234
markInitializationStarted();
@@ -246,21 +244,17 @@ private Task<Settings> doBackgroundInitialization(SettingsProvider settingsProvi
246244
Logger.getLogger().d("Collection of crash reports disabled in Crashlytics settings.");
247245
// TODO: This isn't actually an error condition, so figure out the right way to
248246
// handle this case.
249-
return Tasks.forException(
250-
new RuntimeException("Collection of crash reports disabled in Crashlytics settings."));
247+
throw new RuntimeException("Collection of crash reports disabled in Crashlytics settings.");
251248
}
252249

253250
if (!controller.finalizeSessions(settingsProvider)) {
254251
Logger.getLogger().w("Previous sessions could not be finalized.");
255252
}
256253

257-
Task<Settings> settings = settingsProvider.getSettingsAsync();
258-
controller.submitAllReports(settings);
259-
return settings;
254+
controller.submitAllReports(settingsProvider.getSettingsAsync());
260255
} catch (Exception e) {
261256
Logger.getLogger()
262257
.e("Crashlytics encountered a problem during asynchronous initialization.", e);
263-
return Tasks.forException(e);
264258
} finally {
265259
// The only thing that compels us to leave the marker and start synchronously next time
266260
// is not executing all the way through this method. That would indicate that we perhaps

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/SessionReportingCoordinator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ private void persistEvent(
341341
if (!isFatal) {
342342
crashlyticsWorkers.diskWrite.submit(
343343
() -> {
344+
Logger.getLogger().d("disk worker: log non-fatal event to persistence");
344345
reportPersistence.persistEvent(finallizedEvent, sessionId, isHighPriority);
345346
});
346347
return;

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/settings/SettingsController.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ public Task<Void> loadSettingsData(
162162
SettingsCacheBehavior cacheBehavior, CrashlyticsWorkers crashlyticsWorkers) {
163163
// TODO: Refactor this so that it doesn't do the cache lookup twice when settings are
164164
// expired.
165-
166165
// We need to bypass the cache if this is the first time a new build has run so the
167166
// backend will know about it.
168167
if (!buildInstanceIdentifierChanged()) {

0 commit comments

Comments
 (0)