1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 * 16 * 17 */ 18 19 package com.android.healthconnect.controller.dataentries.formatters.shared 20 21 import android.health.connect.datatypes.ActiveCaloriesBurnedRecord 22 import android.health.connect.datatypes.BasalBodyTemperatureRecord 23 import android.health.connect.datatypes.BasalMetabolicRateRecord 24 import android.health.connect.datatypes.BloodGlucoseRecord 25 import android.health.connect.datatypes.BloodPressureRecord 26 import android.health.connect.datatypes.BodyFatRecord 27 import android.health.connect.datatypes.BodyTemperatureRecord 28 import android.health.connect.datatypes.BodyWaterMassRecord 29 import android.health.connect.datatypes.BoneMassRecord 30 import android.health.connect.datatypes.CervicalMucusRecord 31 import android.health.connect.datatypes.CyclingPedalingCadenceRecord 32 import android.health.connect.datatypes.DistanceRecord 33 import android.health.connect.datatypes.ElevationGainedRecord 34 import android.health.connect.datatypes.ExerciseSessionRecord 35 import android.health.connect.datatypes.FloorsClimbedRecord 36 import android.health.connect.datatypes.HeartRateRecord 37 import android.health.connect.datatypes.HeartRateVariabilityRmssdRecord 38 import android.health.connect.datatypes.HeightRecord 39 import android.health.connect.datatypes.HydrationRecord 40 import android.health.connect.datatypes.IntermenstrualBleedingRecord 41 import android.health.connect.datatypes.LeanBodyMassRecord 42 import android.health.connect.datatypes.MenstruationFlowRecord 43 import android.health.connect.datatypes.NutritionRecord 44 import android.health.connect.datatypes.OvulationTestRecord 45 import android.health.connect.datatypes.OxygenSaturationRecord 46 import android.health.connect.datatypes.PlannedExerciseSessionRecord 47 import android.health.connect.datatypes.PowerRecord 48 import android.health.connect.datatypes.Record 49 import android.health.connect.datatypes.RespiratoryRateRecord 50 import android.health.connect.datatypes.RestingHeartRateRecord 51 import android.health.connect.datatypes.SexualActivityRecord 52 import android.health.connect.datatypes.SkinTemperatureRecord 53 import android.health.connect.datatypes.SleepSessionRecord 54 import android.health.connect.datatypes.SpeedRecord 55 import android.health.connect.datatypes.StepsCadenceRecord 56 import android.health.connect.datatypes.StepsRecord 57 import android.health.connect.datatypes.TotalCaloriesBurnedRecord 58 import android.health.connect.datatypes.Vo2MaxRecord 59 import android.health.connect.datatypes.WeightRecord 60 import android.health.connect.datatypes.WheelchairPushesRecord 61 import com.android.healthconnect.controller.data.entries.FormattedEntry 62 import com.android.healthconnect.controller.dataentries.formatters.ActiveCaloriesBurnedFormatter 63 import com.android.healthconnect.controller.dataentries.formatters.BasalBodyTemperatureFormatter 64 import com.android.healthconnect.controller.dataentries.formatters.BasalMetabolicRateFormatter 65 import com.android.healthconnect.controller.dataentries.formatters.BloodGlucoseFormatter 66 import com.android.healthconnect.controller.dataentries.formatters.BloodPressureFormatter 67 import com.android.healthconnect.controller.dataentries.formatters.BodyFatFormatter 68 import com.android.healthconnect.controller.dataentries.formatters.BodyTemperatureFormatter 69 import com.android.healthconnect.controller.dataentries.formatters.BodyWaterMassFormatter 70 import com.android.healthconnect.controller.dataentries.formatters.BoneMassFormatter 71 import com.android.healthconnect.controller.dataentries.formatters.CervicalMucusFormatter 72 import com.android.healthconnect.controller.dataentries.formatters.CyclingPedalingCadenceFormatter 73 import com.android.healthconnect.controller.dataentries.formatters.DistanceFormatter 74 import com.android.healthconnect.controller.dataentries.formatters.ElevationGainedFormatter 75 import com.android.healthconnect.controller.dataentries.formatters.ExerciseSessionFormatter 76 import com.android.healthconnect.controller.dataentries.formatters.FloorsFormatter 77 import com.android.healthconnect.controller.dataentries.formatters.HeartRateFormatter 78 import com.android.healthconnect.controller.dataentries.formatters.HeartRateVariabilityRmssdFormatter 79 import com.android.healthconnect.controller.dataentries.formatters.HeightFormatter 80 import com.android.healthconnect.controller.dataentries.formatters.HydrationFormatter 81 import com.android.healthconnect.controller.dataentries.formatters.IntermenstrualBleedingFormatter 82 import com.android.healthconnect.controller.dataentries.formatters.LeanBodyMassFormatter 83 import com.android.healthconnect.controller.dataentries.formatters.MenstruationFlowFormatter 84 import com.android.healthconnect.controller.dataentries.formatters.NutritionFormatter 85 import com.android.healthconnect.controller.dataentries.formatters.OvulationTestFormatter 86 import com.android.healthconnect.controller.dataentries.formatters.OxygenSaturationFormatter 87 import com.android.healthconnect.controller.dataentries.formatters.PlannedExerciseSessionRecordFormatter 88 import com.android.healthconnect.controller.dataentries.formatters.PowerFormatter 89 import com.android.healthconnect.controller.dataentries.formatters.RespiratoryRateFormatter 90 import com.android.healthconnect.controller.dataentries.formatters.RestingHeartRateFormatter 91 import com.android.healthconnect.controller.dataentries.formatters.SexualActivityFormatter 92 import com.android.healthconnect.controller.dataentries.formatters.SkinTemperatureFormatter 93 import com.android.healthconnect.controller.dataentries.formatters.SleepSessionFormatter 94 import com.android.healthconnect.controller.dataentries.formatters.SpeedFormatter 95 import com.android.healthconnect.controller.dataentries.formatters.StepsCadenceFormatter 96 import com.android.healthconnect.controller.dataentries.formatters.StepsFormatter 97 import com.android.healthconnect.controller.dataentries.formatters.TotalCaloriesBurnedFormatter 98 import com.android.healthconnect.controller.dataentries.formatters.Vo2MaxFormatter 99 import com.android.healthconnect.controller.dataentries.formatters.WeightFormatter 100 import com.android.healthconnect.controller.dataentries.formatters.WheelchairPushesFormatter 101 import com.android.healthconnect.controller.shared.app.AppInfoReader 102 import javax.inject.Inject 103 import javax.inject.Singleton 104 105 @Singleton 106 class HealthDataEntryFormatter 107 @Inject 108 constructor( 109 private val appInfoReader: AppInfoReader, 110 private val heartRateFormatter: HeartRateFormatter, 111 private val stepsFormatter: StepsFormatter, 112 private val stepsCadenceFormatter: StepsCadenceFormatter, 113 private val basalMetabolicRateFormatter: BasalMetabolicRateFormatter, 114 private val speedFormatter: SpeedFormatter, 115 private val distanceFormatter: DistanceFormatter, 116 private val powerFormatter: PowerFormatter, 117 private val activeCaloriesBurnedFormatter: ActiveCaloriesBurnedFormatter, 118 private val totalCaloriesBurnedFormatter: TotalCaloriesBurnedFormatter, 119 private val heightFormatter: HeightFormatter, 120 private val bodyFatFormatter: BodyFatFormatter, 121 private val oxygenSaturationFormatter: OxygenSaturationFormatter, 122 private val basalBodyTemperatureFormatter: BasalBodyTemperatureFormatter, 123 private val bodyTemperatureFormatter: BodyTemperatureFormatter, 124 private val wheelchairPushesFormatter: WheelchairPushesFormatter, 125 private val restingHeartRateFormatter: RestingHeartRateFormatter, 126 private val respiratoryRateFormatter: RespiratoryRateFormatter, 127 private val hydrationFormatter: HydrationFormatter, 128 private val floorsFormatter: FloorsFormatter, 129 private val elevationGainedFormatter: ElevationGainedFormatter, 130 private val weightFormatter: WeightFormatter, 131 private val leanBodyMassFormatter: LeanBodyMassFormatter, 132 private val boneMassFormatter: BoneMassFormatter, 133 private val bloodGlucoseFormatter: BloodGlucoseFormatter, 134 private val nutritionFormatter: NutritionFormatter, 135 private val bloodPressureFormatter: BloodPressureFormatter, 136 private val cyclingPedalingCadenceFormatter: CyclingPedalingCadenceFormatter, 137 private val vo2MaxFormatter: Vo2MaxFormatter, 138 private val cervicalMucusFormatter: CervicalMucusFormatter, 139 private val menstruationFlowFormatter: MenstruationFlowFormatter, 140 private val ovulationTestFormatter: OvulationTestFormatter, 141 private val sexualActivityFormatter: SexualActivityFormatter, 142 private val sleepSessionFormatter: SleepSessionFormatter, 143 private val exerciseSessionFormatter: ExerciseSessionFormatter, 144 private val bodyWaterMassFormatter: BodyWaterMassFormatter, 145 private val intermenstrualBleedingFormatter: IntermenstrualBleedingFormatter, 146 private val heartRateVariabilityRmssdFormatter: HeartRateVariabilityRmssdFormatter, 147 private val skinTemperatureFormatter: SkinTemperatureFormatter, 148 private val plannedExerciseSessionRecordFormatter: PlannedExerciseSessionRecordFormatter 149 ) { 150 formatnull151 suspend fun format(record: Record, showDataOrigin: Boolean = true): FormattedEntry { 152 val appName: String = if (showDataOrigin) getAppName(record) else "" 153 return when (record) { 154 is HeartRateRecord -> heartRateFormatter.format(record, appName) 155 is StepsRecord -> stepsFormatter.format(record, appName) 156 is StepsCadenceRecord -> stepsCadenceFormatter.format(record, appName) 157 is BasalMetabolicRateRecord -> basalMetabolicRateFormatter.format(record, appName) 158 is SpeedRecord -> speedFormatter.format(record, appName) 159 is DistanceRecord -> distanceFormatter.format(record, appName) 160 is PowerRecord -> powerFormatter.format(record, appName) 161 is ActiveCaloriesBurnedRecord -> activeCaloriesBurnedFormatter.format(record, appName) 162 is TotalCaloriesBurnedRecord -> totalCaloriesBurnedFormatter.format(record, appName) 163 is HeightRecord -> heightFormatter.format(record, appName) 164 is BodyFatRecord -> bodyFatFormatter.format(record, appName) 165 is OxygenSaturationRecord -> oxygenSaturationFormatter.format(record, appName) 166 is BodyTemperatureRecord -> bodyTemperatureFormatter.format(record, appName) 167 is BasalBodyTemperatureRecord -> basalBodyTemperatureFormatter.format(record, appName) 168 is WheelchairPushesRecord -> wheelchairPushesFormatter.format(record, appName) 169 is RestingHeartRateRecord -> restingHeartRateFormatter.format(record, appName) 170 is RespiratoryRateRecord -> respiratoryRateFormatter.format(record, appName) 171 is HydrationRecord -> hydrationFormatter.format(record, appName) 172 is FloorsClimbedRecord -> floorsFormatter.format(record, appName) 173 is ElevationGainedRecord -> elevationGainedFormatter.format(record, appName) 174 is WeightRecord -> weightFormatter.format(record, appName) 175 is LeanBodyMassRecord -> leanBodyMassFormatter.format(record, appName) 176 is BoneMassRecord -> boneMassFormatter.format(record, appName) 177 is BloodGlucoseRecord -> bloodGlucoseFormatter.format(record, appName) 178 is NutritionRecord -> nutritionFormatter.format(record, appName) 179 is BloodPressureRecord -> bloodPressureFormatter.format(record, appName) 180 is CyclingPedalingCadenceRecord -> 181 cyclingPedalingCadenceFormatter.format(record, appName) 182 is Vo2MaxRecord -> vo2MaxFormatter.format(record, appName) 183 is CervicalMucusRecord -> cervicalMucusFormatter.format(record, appName) 184 is SexualActivityRecord -> sexualActivityFormatter.format(record, appName) 185 is OvulationTestRecord -> ovulationTestFormatter.format(record, appName) 186 is MenstruationFlowRecord -> menstruationFlowFormatter.format(record, appName) 187 is SleepSessionRecord -> sleepSessionFormatter.format(record, appName) 188 is ExerciseSessionRecord -> exerciseSessionFormatter.format(record, appName) 189 is BodyWaterMassRecord -> bodyWaterMassFormatter.format(record, appName) 190 is IntermenstrualBleedingRecord -> 191 intermenstrualBleedingFormatter.format(record, appName) 192 is HeartRateVariabilityRmssdRecord -> 193 heartRateVariabilityRmssdFormatter.format(record, appName) 194 is SkinTemperatureRecord -> skinTemperatureFormatter.format(record, appName) 195 is PlannedExerciseSessionRecord -> 196 plannedExerciseSessionRecordFormatter.format(record, appName) 197 else -> throw IllegalArgumentException("${record::class.java} Not supported!") 198 } 199 } 200 getAppNamenull201 private suspend fun getAppName(record: Record): String { 202 return appInfoReader.getAppMetadata(record.metadata.dataOrigin.packageName).appName 203 } 204 } 205