From 5d32d78baf607b81091ffa2b112d3aabec22c920 Mon Sep 17 00:00:00 2001 From: Matt Willis Date: Fri, 17 Apr 2020 12:59:23 -0400 Subject: [PATCH] Wait for DataTransport callback task at crash time Improves reliability of sending crash reports at crash time in the case that the process would exit before Crashlytics has received the asynchronous callback from DataTransport. --- .../internal/common/CrashlyticsController.java | 7 ++++--- .../common/SessionReportingCoordinator.java | 14 +++++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java index 0edbb23f0ff..e3042ca9702 100644 --- a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java +++ b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/CrashlyticsController.java @@ -435,9 +435,10 @@ public Task then(@Nullable AppSettingsData appSettingsData) // Data collection is enabled, so it's safe to send the report. boolean dataCollectionToken = true; sendSessionReports(appSettingsData, dataCollectionToken); - reportingCoordinator.sendReports( - executor, DataTransportState.getState(appSettingsData)); - return recordFatalFirebaseEventTask; + return Tasks.whenAll( + reportingCoordinator.sendReports( + executor, DataTransportState.getState(appSettingsData)), + recordFatalFirebaseEventTask); } }); } diff --git a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/SessionReportingCoordinator.java b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/SessionReportingCoordinator.java index 3ac433929c2..baeaae7c8a7 100644 --- a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/SessionReportingCoordinator.java +++ b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/SessionReportingCoordinator.java @@ -18,6 +18,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.android.gms.tasks.Task; +import com.google.android.gms.tasks.Tasks; import com.google.firebase.crashlytics.internal.Logger; import com.google.firebase.crashlytics.internal.log.LogFileManager; import com.google.firebase.crashlytics.internal.model.CrashlyticsReport; @@ -170,16 +171,17 @@ public void removeAllReports() { * sent. * @param dataTransportState used to determine whether to send the report before cleaning it up. */ - public void sendReports( + Task sendReports( @NonNull Executor reportSendCompleteExecutor, @NonNull DataTransportState dataTransportState) { if (dataTransportState == DataTransportState.NONE) { Logger.getLogger().d("Send via DataTransport disabled. Removing DataTransport reports."); reportPersistence.deleteAllReports(); - return; + return Tasks.forResult(null); } final List reportsToSend = reportPersistence.loadFinalizedReports(); + final List> sendTasks = new ArrayList<>(); for (CrashlyticsReportWithSessionId reportToSend : reportsToSend) { if (reportToSend.getReport().getType() == CrashlyticsReport.Type.NATIVE && dataTransportState != DataTransportState.ALL) { @@ -189,10 +191,12 @@ public void sendReports( continue; } - reportsSender - .sendReport(reportToSend) - .continueWith(reportSendCompleteExecutor, this::onReportSendComplete); + sendTasks.add( + reportsSender + .sendReport(reportToSend) + .continueWith(reportSendCompleteExecutor, this::onReportSendComplete)); } + return Tasks.whenAll(sendTasks); } private void persistEvent(