<lambda>null1 package com.android.healthconnect.controller.datasources.api
2 
3 import android.health.connect.datatypes.Record
4 import com.android.healthconnect.controller.data.entries.api.LoadDataEntriesInput
5 import com.android.healthconnect.controller.data.entries.api.LoadEntriesHelper
6 import com.android.healthconnect.controller.data.entries.datenavigation.DateNavigationPeriod
7 import com.android.healthconnect.controller.permissions.data.HealthPermissionType
8 import com.android.healthconnect.controller.permissiontypes.api.ILoadPriorityListUseCase
9 import com.android.healthconnect.controller.service.IoDispatcher
10 import com.android.healthconnect.controller.shared.HealthDataCategoryExtensions
11 import com.android.healthconnect.controller.shared.usecase.UseCaseResults
12 import com.android.healthconnect.controller.utils.toInstantAtStartOfDay
13 import java.time.LocalDate
14 import javax.inject.Inject
15 import javax.inject.Singleton
16 import kotlinx.coroutines.CoroutineDispatcher
17 import kotlinx.coroutines.withContext
18 
19 @Singleton
20 class LoadPriorityEntriesUseCase
21 @Inject
22 constructor(
23     private val loadEntriesHelper: LoadEntriesHelper,
24     private val loadPriorityListUseCase: ILoadPriorityListUseCase,
25     @IoDispatcher private val dispatcher: CoroutineDispatcher
26 ) : ILoadPriorityEntriesUseCase {
27 
28     /**
29      * Returns a list of records from the specified date originating from any of the apps on the
30      * priority list for this healthPermissionType.
31      */
32     override suspend fun invoke(
33         healthPermissionType: HealthPermissionType,
34         localDate: LocalDate
35     ): UseCaseResults<List<Record>> =
36         withContext(dispatcher) {
37             try {
38                 val localDateInstant = localDate.toInstantAtStartOfDay()
39                 val records = mutableListOf<Record>()
40 
41                 when (val priorityAppsResult =
42                     loadPriorityListUseCase.invoke(
43                         HealthDataCategoryExtensions.fromHealthPermissionType(
44                             healthPermissionType))) {
45                     is UseCaseResults.Success -> {
46                         val priorityApps = priorityAppsResult.data
47 
48                         priorityApps.forEach { priorityApp ->
49                             val input =
50                                 LoadDataEntriesInput(
51                                     HealthPermissionType.SLEEP,
52                                     packageName = priorityApp.packageName,
53                                     displayedStartTime = localDateInstant,
54                                     period = DateNavigationPeriod.PERIOD_DAY,
55                                     showDataOrigin = false)
56                             val entryRecords = loadEntriesHelper.readRecords(input)
57 
58                             records.addAll(entryRecords)
59                         }
60                     }
61                     is UseCaseResults.Failed -> {
62                         throw priorityAppsResult.exception
63                     }
64                 }
65 
66                 // Sorted for testing
67                 UseCaseResults.Success(
68                     records.sortedByDescending { loadEntriesHelper.getStartTime(it) })
69             } catch (e: Exception) {
70                 UseCaseResults.Failed(e)
71             }
72         }
73 }
74 
75 interface ILoadPriorityEntriesUseCase {
invokenull76     suspend fun invoke(
77         healthPermissionType: HealthPermissionType,
78         localDate: LocalDate
79     ): UseCaseResults<List<Record>>
80 }
81