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.ActivityIntensityRecord 23 import android.health.connect.datatypes.BasalBodyTemperatureRecord 24 import android.health.connect.datatypes.BasalMetabolicRateRecord 25 import android.health.connect.datatypes.BloodGlucoseRecord 26 import android.health.connect.datatypes.BloodPressureRecord 27 import android.health.connect.datatypes.BodyFatRecord 28 import android.health.connect.datatypes.BodyTemperatureRecord 29 import android.health.connect.datatypes.BodyWaterMassRecord 30 import android.health.connect.datatypes.BoneMassRecord 31 import android.health.connect.datatypes.CervicalMucusRecord 32 import android.health.connect.datatypes.CyclingPedalingCadenceRecord 33 import android.health.connect.datatypes.DistanceRecord 34 import android.health.connect.datatypes.ElevationGainedRecord 35 import android.health.connect.datatypes.ExerciseSessionRecord 36 import android.health.connect.datatypes.FloorsClimbedRecord 37 import android.health.connect.datatypes.HeartRateRecord 38 import android.health.connect.datatypes.HeartRateVariabilityRmssdRecord 39 import android.health.connect.datatypes.HeightRecord 40 import android.health.connect.datatypes.HydrationRecord 41 import android.health.connect.datatypes.IntermenstrualBleedingRecord 42 import android.health.connect.datatypes.LeanBodyMassRecord 43 import android.health.connect.datatypes.MenstruationFlowRecord 44 import android.health.connect.datatypes.MindfulnessSessionRecord 45 import android.health.connect.datatypes.NutritionRecord 46 import android.health.connect.datatypes.OvulationTestRecord 47 import android.health.connect.datatypes.OxygenSaturationRecord 48 import android.health.connect.datatypes.PlannedExerciseSessionRecord 49 import android.health.connect.datatypes.PowerRecord 50 import android.health.connect.datatypes.Record 51 import android.health.connect.datatypes.RespiratoryRateRecord 52 import android.health.connect.datatypes.RestingHeartRateRecord 53 import android.health.connect.datatypes.SexualActivityRecord 54 import android.health.connect.datatypes.SkinTemperatureRecord 55 import android.health.connect.datatypes.SleepSessionRecord 56 import android.health.connect.datatypes.SpeedRecord 57 import android.health.connect.datatypes.StepsCadenceRecord 58 import android.health.connect.datatypes.StepsRecord 59 import android.health.connect.datatypes.TotalCaloriesBurnedRecord 60 import android.health.connect.datatypes.Vo2MaxRecord 61 import android.health.connect.datatypes.WeightRecord 62 import android.health.connect.datatypes.WheelchairPushesRecord 63 import com.android.healthconnect.controller.data.entries.FormattedEntry 64 import com.android.healthconnect.controller.dataentries.formatters.ActiveCaloriesBurnedFormatter 65 import com.android.healthconnect.controller.dataentries.formatters.ActivityIntensityFormatter 66 import com.android.healthconnect.controller.dataentries.formatters.BasalBodyTemperatureFormatter 67 import com.android.healthconnect.controller.dataentries.formatters.BasalMetabolicRateFormatter 68 import com.android.healthconnect.controller.dataentries.formatters.BloodGlucoseFormatter 69 import com.android.healthconnect.controller.dataentries.formatters.BloodPressureFormatter 70 import com.android.healthconnect.controller.dataentries.formatters.BodyFatFormatter 71 import com.android.healthconnect.controller.dataentries.formatters.BodyTemperatureFormatter 72 import com.android.healthconnect.controller.dataentries.formatters.BodyWaterMassFormatter 73 import com.android.healthconnect.controller.dataentries.formatters.BoneMassFormatter 74 import com.android.healthconnect.controller.dataentries.formatters.CervicalMucusFormatter 75 import com.android.healthconnect.controller.dataentries.formatters.CyclingPedalingCadenceFormatter 76 import com.android.healthconnect.controller.dataentries.formatters.DistanceFormatter 77 import com.android.healthconnect.controller.dataentries.formatters.ElevationGainedFormatter 78 import com.android.healthconnect.controller.dataentries.formatters.ExerciseSessionFormatter 79 import com.android.healthconnect.controller.dataentries.formatters.FloorsFormatter 80 import com.android.healthconnect.controller.dataentries.formatters.HeartRateFormatter 81 import com.android.healthconnect.controller.dataentries.formatters.HeartRateVariabilityRmssdFormatter 82 import com.android.healthconnect.controller.dataentries.formatters.HeightFormatter 83 import com.android.healthconnect.controller.dataentries.formatters.HydrationFormatter 84 import com.android.healthconnect.controller.dataentries.formatters.IntermenstrualBleedingFormatter 85 import com.android.healthconnect.controller.dataentries.formatters.LeanBodyMassFormatter 86 import com.android.healthconnect.controller.dataentries.formatters.MenstruationFlowFormatter 87 import com.android.healthconnect.controller.dataentries.formatters.MindfulnessSessionFormatter 88 import com.android.healthconnect.controller.dataentries.formatters.NutritionFormatter 89 import com.android.healthconnect.controller.dataentries.formatters.OvulationTestFormatter 90 import com.android.healthconnect.controller.dataentries.formatters.OxygenSaturationFormatter 91 import com.android.healthconnect.controller.dataentries.formatters.PlannedExerciseSessionRecordFormatter 92 import com.android.healthconnect.controller.dataentries.formatters.PowerFormatter 93 import com.android.healthconnect.controller.dataentries.formatters.RespiratoryRateFormatter 94 import com.android.healthconnect.controller.dataentries.formatters.RestingHeartRateFormatter 95 import com.android.healthconnect.controller.dataentries.formatters.SexualActivityFormatter 96 import com.android.healthconnect.controller.dataentries.formatters.SkinTemperatureFormatter 97 import com.android.healthconnect.controller.dataentries.formatters.SleepSessionFormatter 98 import com.android.healthconnect.controller.dataentries.formatters.SpeedFormatter 99 import com.android.healthconnect.controller.dataentries.formatters.StepsCadenceFormatter 100 import com.android.healthconnect.controller.dataentries.formatters.StepsFormatter 101 import com.android.healthconnect.controller.dataentries.formatters.TotalCaloriesBurnedFormatter 102 import com.android.healthconnect.controller.dataentries.formatters.Vo2MaxFormatter 103 import com.android.healthconnect.controller.dataentries.formatters.WeightFormatter 104 import com.android.healthconnect.controller.dataentries.formatters.WheelchairPushesFormatter 105 import com.android.healthconnect.controller.shared.app.AppInfoReader 106 import javax.inject.Inject 107 import javax.inject.Singleton 108 109 @Singleton 110 class HealthDataEntryFormatter 111 @Inject 112 constructor( 113 private val appInfoReader: AppInfoReader, 114 private val heartRateFormatter: HeartRateFormatter, 115 private val stepsFormatter: StepsFormatter, 116 private val stepsCadenceFormatter: StepsCadenceFormatter, 117 private val basalMetabolicRateFormatter: BasalMetabolicRateFormatter, 118 private val speedFormatter: SpeedFormatter, 119 private val distanceFormatter: DistanceFormatter, 120 private val powerFormatter: PowerFormatter, 121 private val activeCaloriesBurnedFormatter: ActiveCaloriesBurnedFormatter, 122 private val totalCaloriesBurnedFormatter: TotalCaloriesBurnedFormatter, 123 private val heightFormatter: HeightFormatter, 124 private val bodyFatFormatter: BodyFatFormatter, 125 private val oxygenSaturationFormatter: OxygenSaturationFormatter, 126 private val basalBodyTemperatureFormatter: BasalBodyTemperatureFormatter, 127 private val bodyTemperatureFormatter: BodyTemperatureFormatter, 128 private val wheelchairPushesFormatter: WheelchairPushesFormatter, 129 private val restingHeartRateFormatter: RestingHeartRateFormatter, 130 private val respiratoryRateFormatter: RespiratoryRateFormatter, 131 private val hydrationFormatter: HydrationFormatter, 132 private val floorsFormatter: FloorsFormatter, 133 private val elevationGainedFormatter: ElevationGainedFormatter, 134 private val weightFormatter: WeightFormatter, 135 private val leanBodyMassFormatter: LeanBodyMassFormatter, 136 private val boneMassFormatter: BoneMassFormatter, 137 private val bloodGlucoseFormatter: BloodGlucoseFormatter, 138 private val nutritionFormatter: NutritionFormatter, 139 private val bloodPressureFormatter: BloodPressureFormatter, 140 private val cyclingPedalingCadenceFormatter: CyclingPedalingCadenceFormatter, 141 private val vo2MaxFormatter: Vo2MaxFormatter, 142 private val cervicalMucusFormatter: CervicalMucusFormatter, 143 private val menstruationFlowFormatter: MenstruationFlowFormatter, 144 private val ovulationTestFormatter: OvulationTestFormatter, 145 private val sexualActivityFormatter: SexualActivityFormatter, 146 private val sleepSessionFormatter: SleepSessionFormatter, 147 private val exerciseSessionFormatter: ExerciseSessionFormatter, 148 private val bodyWaterMassFormatter: BodyWaterMassFormatter, 149 private val intermenstrualBleedingFormatter: IntermenstrualBleedingFormatter, 150 private val heartRateVariabilityRmssdFormatter: HeartRateVariabilityRmssdFormatter, 151 private val skinTemperatureFormatter: SkinTemperatureFormatter, 152 private val plannedExerciseSessionRecordFormatter: PlannedExerciseSessionRecordFormatter, 153 private val mindfulnessSessionFormatter: MindfulnessSessionFormatter, 154 private val activityIntensityFormatter: ActivityIntensityFormatter, 155 ) { 156 formatnull157 suspend fun format(record: Record, showDataOrigin: Boolean = true): FormattedEntry { 158 val appName: String = if (showDataOrigin) getAppName(record) else "" 159 return when (record) { 160 is HeartRateRecord -> heartRateFormatter.format(record, appName) 161 is StepsRecord -> stepsFormatter.format(record, appName) 162 is StepsCadenceRecord -> stepsCadenceFormatter.format(record, appName) 163 is BasalMetabolicRateRecord -> basalMetabolicRateFormatter.format(record, appName) 164 is SpeedRecord -> speedFormatter.format(record, appName) 165 is DistanceRecord -> distanceFormatter.format(record, appName) 166 is PowerRecord -> powerFormatter.format(record, appName) 167 is ActiveCaloriesBurnedRecord -> activeCaloriesBurnedFormatter.format(record, appName) 168 is TotalCaloriesBurnedRecord -> totalCaloriesBurnedFormatter.format(record, appName) 169 is HeightRecord -> heightFormatter.format(record, appName) 170 is BodyFatRecord -> bodyFatFormatter.format(record, appName) 171 is OxygenSaturationRecord -> oxygenSaturationFormatter.format(record, appName) 172 is BodyTemperatureRecord -> bodyTemperatureFormatter.format(record, appName) 173 is BasalBodyTemperatureRecord -> basalBodyTemperatureFormatter.format(record, appName) 174 is WheelchairPushesRecord -> wheelchairPushesFormatter.format(record, appName) 175 is RestingHeartRateRecord -> restingHeartRateFormatter.format(record, appName) 176 is RespiratoryRateRecord -> respiratoryRateFormatter.format(record, appName) 177 is HydrationRecord -> hydrationFormatter.format(record, appName) 178 is FloorsClimbedRecord -> floorsFormatter.format(record, appName) 179 is ElevationGainedRecord -> elevationGainedFormatter.format(record, appName) 180 is WeightRecord -> weightFormatter.format(record, appName) 181 is LeanBodyMassRecord -> leanBodyMassFormatter.format(record, appName) 182 is BoneMassRecord -> boneMassFormatter.format(record, appName) 183 is BloodGlucoseRecord -> bloodGlucoseFormatter.format(record, appName) 184 is NutritionRecord -> nutritionFormatter.format(record, appName) 185 is BloodPressureRecord -> bloodPressureFormatter.format(record, appName) 186 is CyclingPedalingCadenceRecord -> 187 cyclingPedalingCadenceFormatter.format(record, appName) 188 is Vo2MaxRecord -> vo2MaxFormatter.format(record, appName) 189 is CervicalMucusRecord -> cervicalMucusFormatter.format(record, appName) 190 is SexualActivityRecord -> sexualActivityFormatter.format(record, appName) 191 is OvulationTestRecord -> ovulationTestFormatter.format(record, appName) 192 is MenstruationFlowRecord -> menstruationFlowFormatter.format(record, appName) 193 is SleepSessionRecord -> sleepSessionFormatter.format(record, appName) 194 is ExerciseSessionRecord -> exerciseSessionFormatter.format(record, appName) 195 is BodyWaterMassRecord -> bodyWaterMassFormatter.format(record, appName) 196 is IntermenstrualBleedingRecord -> 197 intermenstrualBleedingFormatter.format(record, appName) 198 is HeartRateVariabilityRmssdRecord -> 199 heartRateVariabilityRmssdFormatter.format(record, appName) 200 is SkinTemperatureRecord -> skinTemperatureFormatter.format(record, appName) 201 is PlannedExerciseSessionRecord -> 202 plannedExerciseSessionRecordFormatter.format(record, appName) 203 is MindfulnessSessionRecord -> mindfulnessSessionFormatter.format(record, appName) 204 is ActivityIntensityRecord -> activityIntensityFormatter.format(record, appName) 205 else -> throw IllegalArgumentException("${record::class.java} Not supported!") 206 } 207 } 208 getAppNamenull209 private suspend fun getAppName(record: Record): String { 210 return appInfoReader.getAppMetadata(record.metadata.dataOrigin.packageName).appName 211 } 212 } 213