summaryrefslogtreecommitdiff
path: root/apk/src/com/android/healthconnect/controller/data/entries/api/LoadSleepDataUseCase.kt
blob: d8f865cfc16711d70211f998f8c11a7f161c7144 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.android.healthconnect.controller.data.entries.api

import android.health.connect.datatypes.Record
import com.android.healthconnect.controller.service.IoDispatcher
import com.android.healthconnect.controller.shared.HealthPermissionToDatatypeMapper
import com.android.healthconnect.controller.shared.usecase.BaseUseCase
import com.android.healthconnect.controller.shared.usecase.UseCaseResults
import javax.inject.Inject
import javax.inject.Singleton
import kotlinx.coroutines.CoroutineDispatcher

@Singleton
class LoadSleepDataUseCase
@Inject
constructor(
    @IoDispatcher private val dispatcher: CoroutineDispatcher,
    private val loadEntriesHelper: LoadEntriesHelper
) : BaseUseCase<LoadDataEntriesInput, List<Record>>(dispatcher), ILoadSleepDataUseCase {

    /**
     * Used to load the sleep session records. For aggregating sleep we need to know both the start
     * and end times of each session.
     */
    override suspend fun execute(input: LoadDataEntriesInput): List<Record> {
        val timeFilterRange =
            loadEntriesHelper.getTimeFilter(
                input.displayedStartTime, input.period, endTimeExclusive = true)
        val dataTypes = HealthPermissionToDatatypeMapper.getDataTypes(input.permissionType)

        return dataTypes
            .map { dataType ->
                loadEntriesHelper.readDataType(dataType, timeFilterRange, input.packageName)
            }
            .flatten()
    }
}

interface ILoadSleepDataUseCase {
    suspend fun invoke(input: LoadDataEntriesInput): UseCaseResults<List<Record>>

    suspend fun execute(input: LoadDataEntriesInput): List<Record>
}