diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/outcomes/impl/OutcomeEventsRepository.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/outcomes/impl/OutcomeEventsRepository.kt index c769f7d0ba..310824167b 100644 --- a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/outcomes/impl/OutcomeEventsRepository.kt +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/outcomes/impl/OutcomeEventsRepository.kt @@ -8,6 +8,7 @@ import com.onesignal.session.internal.influence.Influence import com.onesignal.session.internal.influence.InfluenceChannel import com.onesignal.session.internal.influence.InfluenceType import com.onesignal.session.internal.influence.InfluenceType.Companion.fromString +import com.onesignal.session.internal.outcomes.migrations.RemoveZeroSessionTimeRecords import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.json.JSONArray @@ -101,6 +102,7 @@ internal class OutcomeEventsRepository( override suspend fun getAllEventsToSend(): List { val events: MutableList = ArrayList() withContext(Dispatchers.IO) { + RemoveZeroSessionTimeRecords.run(_databaseProvider) _databaseProvider.os.query(OutcomeEventsTable.TABLE_NAME) { cursor -> if (cursor.moveToFirst()) { do { diff --git a/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/outcomes/migrations/RemoveZeroSessionTimeRecords.kt b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/outcomes/migrations/RemoveZeroSessionTimeRecords.kt new file mode 100644 index 0000000000..93bab4d4a3 --- /dev/null +++ b/OneSignalSDK/onesignal/core/src/main/java/com/onesignal/session/internal/outcomes/migrations/RemoveZeroSessionTimeRecords.kt @@ -0,0 +1,24 @@ +package com.onesignal.session.internal.outcomes.migrations + +import com.onesignal.core.internal.database.IDatabaseProvider +import com.onesignal.session.internal.outcomes.impl.OutcomeEventsTable + +/** + * Purpose: Clean up invalid cached os__session_duration outcome records + * with zero session_time produced in SDK versions 5.1.15 to 5.1.20 so we stop + * sending these requests to the backend. + * + * Issue: SessionService.backgroundRun() didn't account for it being run more + * than one time in the background, when this happened it would create a + * outcome record with zero time which is invalid. + */ +object RemoveZeroSessionTimeRecords { + fun run(databaseProvider: IDatabaseProvider) { + databaseProvider.os.delete( + OutcomeEventsTable.TABLE_NAME, + OutcomeEventsTable.COLUMN_NAME_NAME + " = \"os__session_duration\"" + + " AND " + OutcomeEventsTable.COLUMN_NAME_SESSION_TIME + " = 0", + null, + ) + } +}