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