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.shared 17 18 import android.health.connect.datatypes.ActiveCaloriesBurnedRecord 19 import android.health.connect.datatypes.BasalBodyTemperatureRecord 20 import android.health.connect.datatypes.BasalMetabolicRateRecord 21 import android.health.connect.datatypes.BloodGlucoseRecord 22 import android.health.connect.datatypes.BloodPressureRecord 23 import android.health.connect.datatypes.BodyFatRecord 24 import android.health.connect.datatypes.BodyTemperatureRecord 25 import android.health.connect.datatypes.BodyWaterMassRecord 26 import android.health.connect.datatypes.BoneMassRecord 27 import android.health.connect.datatypes.CervicalMucusRecord 28 import android.health.connect.datatypes.CyclingPedalingCadenceRecord 29 import android.health.connect.datatypes.DistanceRecord 30 import android.health.connect.datatypes.ElevationGainedRecord 31 import android.health.connect.datatypes.ExerciseSessionRecord 32 import android.health.connect.datatypes.FloorsClimbedRecord 33 import android.health.connect.datatypes.HeartRateRecord 34 import android.health.connect.datatypes.HeartRateVariabilityRmssdRecord 35 import android.health.connect.datatypes.HeightRecord 36 import android.health.connect.datatypes.HydrationRecord 37 import android.health.connect.datatypes.IntermenstrualBleedingRecord 38 import android.health.connect.datatypes.LeanBodyMassRecord 39 import android.health.connect.datatypes.MenstruationFlowRecord 40 import android.health.connect.datatypes.MenstruationPeriodRecord 41 import android.health.connect.datatypes.MindfulnessSessionRecord 42 import android.health.connect.datatypes.NutritionRecord 43 import android.health.connect.datatypes.OvulationTestRecord 44 import android.health.connect.datatypes.OxygenSaturationRecord 45 import android.health.connect.datatypes.PlannedExerciseSessionRecord 46 import android.health.connect.datatypes.PowerRecord 47 import android.health.connect.datatypes.Record 48 import android.health.connect.datatypes.RespiratoryRateRecord 49 import android.health.connect.datatypes.RestingHeartRateRecord 50 import android.health.connect.datatypes.SexualActivityRecord 51 import android.health.connect.datatypes.SkinTemperatureRecord 52 import android.health.connect.datatypes.SleepSessionRecord 53 import android.health.connect.datatypes.SpeedRecord 54 import android.health.connect.datatypes.StepsCadenceRecord 55 import android.health.connect.datatypes.StepsRecord 56 import android.health.connect.datatypes.TotalCaloriesBurnedRecord 57 import android.health.connect.datatypes.Vo2MaxRecord 58 import android.health.connect.datatypes.WeightRecord 59 import android.health.connect.datatypes.WheelchairPushesRecord 60 import android.health.connect.internal.datatypes.utils.HealthConnectMappings 61 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType 62 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.ACTIVE_CALORIES_BURNED 63 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.BASAL_BODY_TEMPERATURE 64 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.BASAL_METABOLIC_RATE 65 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.BLOOD_GLUCOSE 66 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.BLOOD_PRESSURE 67 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.BODY_FAT 68 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.BODY_TEMPERATURE 69 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.BODY_WATER_MASS 70 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.BONE_MASS 71 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.CERVICAL_MUCUS 72 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.DISTANCE 73 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.ELEVATION_GAINED 74 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.EXERCISE 75 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.FLOORS_CLIMBED 76 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.HEART_RATE 77 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.HEART_RATE_VARIABILITY 78 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.HEIGHT 79 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.HYDRATION 80 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.INTERMENSTRUAL_BLEEDING 81 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.LEAN_BODY_MASS 82 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.MENSTRUATION 83 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.MINDFULNESS 84 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.NUTRITION 85 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.OVULATION_TEST 86 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.OXYGEN_SATURATION 87 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.PLANNED_EXERCISE 88 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.POWER 89 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.RESPIRATORY_RATE 90 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.RESTING_HEART_RATE 91 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.SEXUAL_ACTIVITY 92 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.SKIN_TEMPERATURE 93 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.SLEEP 94 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.SPEED 95 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.STEPS 96 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.TOTAL_CALORIES_BURNED 97 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.VO2_MAX 98 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.WEIGHT 99 import com.android.healthconnect.controller.permissions.data.FitnessPermissionType.WHEELCHAIR_PUSHES 100 import com.android.healthconnect.controller.permissions.data.fromHealthPermissionCategory 101 import com.android.healthfitness.flags.Flags 102 103 object HealthPermissionToDatatypeMapper { 104 private val map = 105 if (Flags.healthConnectMappings()) createMap() 106 else 107 mapOf( 108 STEPS to listOf(StepsRecord::class.java, StepsCadenceRecord::class.java), 109 HEART_RATE to listOf(HeartRateRecord::class.java), 110 BASAL_METABOLIC_RATE to listOf(BasalMetabolicRateRecord::class.java), 111 SPEED to listOf(SpeedRecord::class.java), 112 DISTANCE to listOf(DistanceRecord::class.java), 113 POWER to listOf(PowerRecord::class.java), 114 ACTIVE_CALORIES_BURNED to listOf(ActiveCaloriesBurnedRecord::class.java), 115 TOTAL_CALORIES_BURNED to listOf(TotalCaloriesBurnedRecord::class.java), 116 HEIGHT to listOf(HeightRecord::class.java), 117 BODY_FAT to listOf(BodyFatRecord::class.java), 118 OXYGEN_SATURATION to listOf(OxygenSaturationRecord::class.java), 119 BODY_TEMPERATURE to listOf(BodyTemperatureRecord::class.java), 120 BASAL_BODY_TEMPERATURE to listOf(BasalBodyTemperatureRecord::class.java), 121 WHEELCHAIR_PUSHES to listOf(WheelchairPushesRecord::class.java), 122 RESTING_HEART_RATE to listOf(RestingHeartRateRecord::class.java), 123 RESPIRATORY_RATE to listOf(RespiratoryRateRecord::class.java), 124 HYDRATION to listOf(HydrationRecord::class.java), 125 FLOORS_CLIMBED to listOf(FloorsClimbedRecord::class.java), 126 ELEVATION_GAINED to listOf(ElevationGainedRecord::class.java), 127 BONE_MASS to listOf(BoneMassRecord::class.java), 128 LEAN_BODY_MASS to listOf(LeanBodyMassRecord::class.java), 129 WEIGHT to listOf(WeightRecord::class.java), 130 BLOOD_GLUCOSE to listOf(BloodGlucoseRecord::class.java), 131 NUTRITION to listOf(NutritionRecord::class.java), 132 BLOOD_PRESSURE to listOf(BloodPressureRecord::class.java), 133 VO2_MAX to listOf(Vo2MaxRecord::class.java), 134 EXERCISE to 135 listOf( 136 ExerciseSessionRecord::class.java, 137 CyclingPedalingCadenceRecord::class.java, 138 ), 139 CERVICAL_MUCUS to listOf(CervicalMucusRecord::class.java), 140 SEXUAL_ACTIVITY to listOf(SexualActivityRecord::class.java), 141 OVULATION_TEST to listOf(OvulationTestRecord::class.java), 142 MENSTRUATION to 143 listOf( 144 MenstruationFlowRecord::class.java, 145 MenstruationPeriodRecord::class.java, 146 ), 147 SLEEP to listOf(SleepSessionRecord::class.java), 148 BODY_WATER_MASS to listOf(BodyWaterMassRecord::class.java), 149 INTERMENSTRUAL_BLEEDING to listOf(IntermenstrualBleedingRecord::class.java), 150 HEART_RATE_VARIABILITY to listOf(HeartRateVariabilityRmssdRecord::class.java), 151 SKIN_TEMPERATURE to listOf(SkinTemperatureRecord::class.java), 152 PLANNED_EXERCISE to listOf(PlannedExerciseSessionRecord::class.java), 153 MINDFULNESS to listOf(MindfulnessSessionRecord::class.java), 154 ) 155 156 fun getDataTypes(permissionType: FitnessPermissionType): List<Class<out Record>> { 157 return map[permissionType].orEmpty() 158 } 159 160 fun getAllDataTypes(): Map<FitnessPermissionType, List<Class<out Record>>> { 161 return map 162 } 163 164 private fun createMap(): Map<FitnessPermissionType, List<Class<out Record>>> { 165 val healthConnectMappings = HealthConnectMappings.getInstance() 166 167 return healthConnectMappings.allRecordTypeIdentifiers 168 .map { recordTypeId -> 169 fromHealthPermissionCategory( 170 healthConnectMappings.getHealthPermissionCategoryForRecordType(recordTypeId) 171 ) to healthConnectMappings.recordIdToExternalRecordClassMap[recordTypeId]!! 172 } 173 .groupBy({ it.first as FitnessPermissionType }, { it.second }) 174 } 175 } 176