1 /** <lambda>null2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * ``` 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * ``` 10 * 11 * Unless required by applicable law or agreed to in writing, software distributed under the License 12 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 13 * or implied. See the License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 package com.android.healthconnect.controller.permissions.connectedapps 17 18 import com.android.healthconnect.controller.permissions.api.GetGrantedHealthPermissionsUseCase 19 import com.android.healthconnect.controller.permissions.shared.QueryRecentAccessLogsUseCase 20 import com.android.healthconnect.controller.service.IoDispatcher 21 import com.android.healthconnect.controller.shared.HealthPermissionReader 22 import com.android.healthconnect.controller.shared.app.AppInfoReader 23 import com.android.healthconnect.controller.shared.app.ConnectedAppMetadata 24 import com.android.healthconnect.controller.shared.app.ConnectedAppStatus 25 import com.android.healthconnect.controller.shared.app.GetContributorAppInfoUseCase 26 import javax.inject.Inject 27 import javax.inject.Singleton 28 import kotlinx.coroutines.CoroutineDispatcher 29 import kotlinx.coroutines.withContext 30 31 @Singleton 32 class LoadHealthPermissionApps 33 @Inject 34 constructor( 35 private val healthPermissionReader: HealthPermissionReader, 36 private val loadGrantedHealthPermissionsUseCase: GetGrantedHealthPermissionsUseCase, 37 private val getContributorAppInfoUseCase: GetContributorAppInfoUseCase, 38 private val queryRecentAccessLogsUseCase: QueryRecentAccessLogsUseCase, 39 private val appInfoReader: AppInfoReader, 40 @IoDispatcher private val dispatcher: CoroutineDispatcher, 41 ) : ILoadHealthPermissionApps { 42 43 /** Returns a list of ConnectedAppMetadata. */ 44 override suspend operator fun invoke(): List<ConnectedAppMetadata> = 45 withContext(dispatcher) { 46 val appsWithHealthPermissions = healthPermissionReader.getAppsWithHealthPermissions() 47 val appsWithData = getContributorAppInfoUseCase.invoke() 48 val connectedApps = mutableListOf<ConnectedAppMetadata>() 49 val recentAccess = queryRecentAccessLogsUseCase.invoke() 50 51 connectedApps.addAll( 52 appsWithHealthPermissions.map { packageName -> 53 val metadata = appInfoReader.getAppMetadata(packageName) 54 val grantedPermissions = loadGrantedHealthPermissionsUseCase(packageName) 55 val isConnected = 56 if (grantedPermissions.isNotEmpty()) { 57 ConnectedAppStatus.ALLOWED 58 } else { 59 ConnectedAppStatus.DENIED 60 } 61 ConnectedAppMetadata(metadata, isConnected, recentAccess[metadata.packageName]) 62 }) 63 64 val inactiveApps = 65 appsWithData.values 66 .filter { !appsWithHealthPermissions.contains(it.packageName) } 67 .map { ConnectedAppMetadata(it, ConnectedAppStatus.INACTIVE) } 68 69 connectedApps.addAll(inactiveApps) 70 connectedApps 71 } 72 } 73 74 interface ILoadHealthPermissionApps { invokenull75 suspend fun invoke(): List<ConnectedAppMetadata> 76 } 77