<lambda>null1package com.android.healthconnect.controller.dataaccess 2 3 import android.health.connect.HealthConnectManager 4 import android.health.connect.RecordTypeInfoResponse 5 import android.health.connect.datatypes.Record 6 import androidx.core.os.asOutcomeReceiver 7 import com.android.healthconnect.controller.permissions.data.HealthPermissionType 8 import com.android.healthconnect.controller.permissions.data.fromHealthPermissionCategory 9 import com.android.healthconnect.controller.service.IoDispatcher 10 import com.android.healthconnect.controller.shared.app.AppInfoReader 11 import com.android.healthconnect.controller.shared.app.AppMetadata 12 import javax.inject.Inject 13 import javax.inject.Singleton 14 import kotlinx.coroutines.CoroutineDispatcher 15 import kotlinx.coroutines.suspendCancellableCoroutine 16 import kotlinx.coroutines.withContext 17 18 @Singleton 19 class LoadPermissionTypeContributorAppsUseCase 20 @Inject 21 constructor( 22 private val appInfoReader: AppInfoReader, 23 private val healthConnectManager: HealthConnectManager, 24 @IoDispatcher private val dispatcher: CoroutineDispatcher 25 ) { 26 suspend operator fun invoke(permissionType: HealthPermissionType): List<AppMetadata> = 27 withContext(dispatcher) { 28 try { 29 val recordTypeInfoMap: Map<Class<out Record>, RecordTypeInfoResponse> = 30 suspendCancellableCoroutine { continuation -> 31 healthConnectManager.queryAllRecordTypesInfo( 32 Runnable::run, continuation.asOutcomeReceiver()) 33 } 34 val packages = 35 recordTypeInfoMap.values 36 .filter { 37 fromHealthPermissionCategory(it.permissionCategory) == permissionType && 38 it.contributingPackages.isNotEmpty() 39 } 40 .map { it.contributingPackages } 41 .flatten() 42 packages 43 .map { appInfoReader.getAppMetadata(it.packageName) } 44 .sortedBy { it.appName } 45 } catch (e: Exception) { 46 emptyList() 47 } 48 } 49 } 50