<lambda>null1package 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