diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PollHistoryStatusEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PollHistoryStatusEntity.kt index 4eb4d1a92a..0f28d51ffb 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PollHistoryStatusEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PollHistoryStatusEntity.kt @@ -39,21 +39,11 @@ internal open class PollHistoryStatusEntity( */ var lastTimestampTargetBackwardMs: Long? = null, - /** - * Indicate whether all polls in a room have been synced for the current timestamp target in backward direction. - */ - var currentTimestampTargetBackwardReached: Boolean = false, - /** * Indicate whether all polls in a room have been synced in backward direction. */ var isEndOfPollsBackward: Boolean = false, - /** - * Indicate whether at least one poll sync has been fully completed backward for the given room. - */ - var hasCompletedASyncBackward: Boolean = false, - /** * Token of the end of the last synced chunk in backward direction. */ @@ -66,4 +56,23 @@ internal open class PollHistoryStatusEntity( ) : RealmObject() { companion object + + /** + * Indicate whether at least one poll sync has been fully completed backward for the given room. + */ + val hasCompletedASyncBackward: Boolean + get() = lastTimestampTargetBackwardMs != null + + /** + * Indicate whether all polls in a room have been synced for the current timestamp target in backward direction. + */ + val currentTimestampTargetBackwardReached: Boolean + get() = checkIfCurrentTimestampTargetBackwardIsReached() + + private fun checkIfCurrentTimestampTargetBackwardIsReached(): Boolean { + val currentTarget = currentTimestampTargetBackwardMs + val lastTarget = lastTimestampTargetBackwardMs + // last timestamp target should be older or equal to the current target + return currentTarget != null && lastTarget != null && lastTarget <= currentTarget + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PollResponseAggregatedSummaryEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PollResponseAggregatedSummaryEntity.kt index 906e329f6f..e74f8e2ce9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PollResponseAggregatedSummaryEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PollResponseAggregatedSummaryEntity.kt @@ -36,7 +36,4 @@ internal open class PollResponseAggregatedSummaryEntity( var sourceLocalEchoEvents: RealmList = RealmList(), // list of related event ids which are encrypted due to decryption failure var encryptedRelatedEventIds: RealmList = RealmList(), -) : RealmObject() { - - companion object -} +) : RealmObject() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/poll/LoadMorePollsTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/poll/LoadMorePollsTask.kt index 53841ae3f5..c29983bff3 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/poll/LoadMorePollsTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/poll/LoadMorePollsTask.kt @@ -43,6 +43,10 @@ internal class DefaultLoadMorePollsTask @Inject constructor( override suspend fun execute(params: LoadMorePollsTask.Params): LoadedPollsStatus { updatePollHistoryStatus(params) + // TODO fetch events in a loop using current poll history status + // decrypt events and filter in only polls to store them in local + // parse the response to update poll history status + // unmock and check how it behaves when cancelling the process: it should resume where it was stopped return LoadedPollsStatus( canLoadMore = true, nbLoadedDays = 10, @@ -52,15 +56,15 @@ internal class DefaultLoadMorePollsTask @Inject constructor( private suspend fun updatePollHistoryStatus(params: LoadMorePollsTask.Params) { monarchy.awaitTransaction { realm -> val status = PollHistoryStatusEntity.getOrCreate(realm, params.roomId) - val currentTargetTimestamp = status.currentTimestampTargetBackwardMs - val loadingPeriodMs = MILLISECONDS_PER_DAY * params.loadingPeriodInDays - if (currentTargetTimestamp == null) { + val currentTargetTimestampMs = status.currentTimestampTargetBackwardMs + val lastTargetTimestampMs = status.lastTimestampTargetBackwardMs + val loadingPeriodMs: Long = MILLISECONDS_PER_DAY * params.loadingPeriodInDays.toLong() + if (currentTargetTimestampMs == null) { // first load, compute the target timestamp status.currentTimestampTargetBackwardMs = params.currentTimestampMs - loadingPeriodMs - } else if (status.currentTimestampTargetBackwardReached) { + } else if (lastTargetTimestampMs != null && status.currentTimestampTargetBackwardReached) { // previous load has finished, update the target timestamp - status.currentTimestampTargetBackwardMs = currentTargetTimestamp - loadingPeriodMs - status.currentTimestampTargetBackwardReached = false + status.currentTimestampTargetBackwardMs = lastTargetTimestampMs - loadingPeriodMs } } }