• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 package android.health.connect.internal.datatypes.utils;
18 
19 import android.annotation.NonNull;
20 import android.health.connect.datatypes.ActiveCaloriesBurnedRecord;
21 import android.health.connect.datatypes.BasalBodyTemperatureRecord;
22 import android.health.connect.datatypes.BasalMetabolicRateRecord;
23 import android.health.connect.datatypes.BloodGlucoseRecord;
24 import android.health.connect.datatypes.BloodPressureRecord;
25 import android.health.connect.datatypes.BodyFatRecord;
26 import android.health.connect.datatypes.BodyTemperatureRecord;
27 import android.health.connect.datatypes.BodyWaterMassRecord;
28 import android.health.connect.datatypes.BoneMassRecord;
29 import android.health.connect.datatypes.CervicalMucusRecord;
30 import android.health.connect.datatypes.CyclingPedalingCadenceRecord;
31 import android.health.connect.datatypes.DistanceRecord;
32 import android.health.connect.datatypes.ElevationGainedRecord;
33 import android.health.connect.datatypes.ExerciseSessionRecord;
34 import android.health.connect.datatypes.FloorsClimbedRecord;
35 import android.health.connect.datatypes.HeartRateRecord;
36 import android.health.connect.datatypes.HeartRateVariabilityRmssdRecord;
37 import android.health.connect.datatypes.HeightRecord;
38 import android.health.connect.datatypes.HydrationRecord;
39 import android.health.connect.datatypes.IntermenstrualBleedingRecord;
40 import android.health.connect.datatypes.LeanBodyMassRecord;
41 import android.health.connect.datatypes.MenstruationFlowRecord;
42 import android.health.connect.datatypes.MenstruationPeriodRecord;
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.PowerRecord;
47 import android.health.connect.datatypes.Record;
48 import android.health.connect.datatypes.RecordTypeIdentifier;
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.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.ActiveCaloriesBurnedRecordInternal;
61 import android.health.connect.internal.datatypes.BasalBodyTemperatureRecordInternal;
62 import android.health.connect.internal.datatypes.BasalMetabolicRateRecordInternal;
63 import android.health.connect.internal.datatypes.BloodGlucoseRecordInternal;
64 import android.health.connect.internal.datatypes.BloodPressureRecordInternal;
65 import android.health.connect.internal.datatypes.BodyFatRecordInternal;
66 import android.health.connect.internal.datatypes.BodyTemperatureRecordInternal;
67 import android.health.connect.internal.datatypes.BodyWaterMassRecordInternal;
68 import android.health.connect.internal.datatypes.BoneMassRecordInternal;
69 import android.health.connect.internal.datatypes.CervicalMucusRecordInternal;
70 import android.health.connect.internal.datatypes.CyclingPedalingCadenceRecordInternal;
71 import android.health.connect.internal.datatypes.DistanceRecordInternal;
72 import android.health.connect.internal.datatypes.ElevationGainedRecordInternal;
73 import android.health.connect.internal.datatypes.ExerciseSessionRecordInternal;
74 import android.health.connect.internal.datatypes.FloorsClimbedRecordInternal;
75 import android.health.connect.internal.datatypes.HeartRateRecordInternal;
76 import android.health.connect.internal.datatypes.HeartRateVariabilityRmssdRecordInternal;
77 import android.health.connect.internal.datatypes.HeightRecordInternal;
78 import android.health.connect.internal.datatypes.HydrationRecordInternal;
79 import android.health.connect.internal.datatypes.IntermenstrualBleedingRecordInternal;
80 import android.health.connect.internal.datatypes.LeanBodyMassRecordInternal;
81 import android.health.connect.internal.datatypes.MenstruationFlowRecordInternal;
82 import android.health.connect.internal.datatypes.MenstruationPeriodRecordInternal;
83 import android.health.connect.internal.datatypes.NutritionRecordInternal;
84 import android.health.connect.internal.datatypes.OvulationTestRecordInternal;
85 import android.health.connect.internal.datatypes.OxygenSaturationRecordInternal;
86 import android.health.connect.internal.datatypes.PowerRecordInternal;
87 import android.health.connect.internal.datatypes.RecordInternal;
88 import android.health.connect.internal.datatypes.RespiratoryRateRecordInternal;
89 import android.health.connect.internal.datatypes.RestingHeartRateRecordInternal;
90 import android.health.connect.internal.datatypes.SexualActivityRecordInternal;
91 import android.health.connect.internal.datatypes.SleepSessionRecordInternal;
92 import android.health.connect.internal.datatypes.SpeedRecordInternal;
93 import android.health.connect.internal.datatypes.StepsCadenceRecordInternal;
94 import android.health.connect.internal.datatypes.StepsRecordInternal;
95 import android.health.connect.internal.datatypes.TotalCaloriesBurnedRecordInternal;
96 import android.health.connect.internal.datatypes.Vo2MaxRecordInternal;
97 import android.health.connect.internal.datatypes.WeightRecordInternal;
98 import android.health.connect.internal.datatypes.WheelchairPushesRecordInternal;
99 import android.util.ArrayMap;
100 
101 import java.util.Map;
102 
103 /** @hide */
104 public final class RecordMapper {
105     private static final int NUM_ENTRIES = 35;
106     private static volatile RecordMapper sRecordMapper;
107     private final Map<Integer, Class<? extends RecordInternal<?>>>
108             mRecordIdToInternalRecordClassMap;
109     private final Map<Integer, Class<? extends Record>> mRecordIdToExternalRecordClassMap;
110     private final Map<Class<? extends Record>, Integer> mExternalRecordClassToRecordIdMap;
111 
RecordMapper()112     private RecordMapper() {
113         mRecordIdToInternalRecordClassMap = new ArrayMap<>(NUM_ENTRIES);
114         mRecordIdToInternalRecordClassMap.put(
115                 RecordTypeIdentifier.RECORD_TYPE_STEPS, StepsRecordInternal.class);
116         mRecordIdToInternalRecordClassMap.put(
117                 RecordTypeIdentifier.RECORD_TYPE_HEART_RATE, HeartRateRecordInternal.class);
118         mRecordIdToInternalRecordClassMap.put(
119                 RecordTypeIdentifier.RECORD_TYPE_FLOORS_CLIMBED, FloorsClimbedRecordInternal.class);
120         mRecordIdToInternalRecordClassMap.put(
121                 RecordTypeIdentifier.RECORD_TYPE_HYDRATION, HydrationRecordInternal.class);
122         mRecordIdToInternalRecordClassMap.put(
123                 RecordTypeIdentifier.RECORD_TYPE_ACTIVE_CALORIES_BURNED,
124                 ActiveCaloriesBurnedRecordInternal.class);
125         mRecordIdToInternalRecordClassMap.put(
126                 RecordTypeIdentifier.RECORD_TYPE_ELEVATION_GAINED,
127                 ElevationGainedRecordInternal.class);
128 
129         mRecordIdToInternalRecordClassMap.put(
130                 RecordTypeIdentifier.RECORD_TYPE_WHEELCHAIR_PUSHES,
131                 WheelchairPushesRecordInternal.class);
132 
133         mRecordIdToInternalRecordClassMap.put(
134                 RecordTypeIdentifier.RECORD_TYPE_TOTAL_CALORIES_BURNED,
135                 TotalCaloriesBurnedRecordInternal.class);
136 
137         mRecordIdToInternalRecordClassMap.put(
138                 RecordTypeIdentifier.RECORD_TYPE_DISTANCE, DistanceRecordInternal.class);
139         mRecordIdToInternalRecordClassMap.put(
140                 RecordTypeIdentifier.RECORD_TYPE_BASAL_METABOLIC_RATE,
141                 BasalMetabolicRateRecordInternal.class);
142         mRecordIdToInternalRecordClassMap.put(
143                 RecordTypeIdentifier.RECORD_TYPE_CYCLING_PEDALING_CADENCE,
144                 CyclingPedalingCadenceRecordInternal.class);
145         mRecordIdToInternalRecordClassMap.put(
146                 RecordTypeIdentifier.RECORD_TYPE_POWER, PowerRecordInternal.class);
147         mRecordIdToInternalRecordClassMap.put(
148                 RecordTypeIdentifier.RECORD_TYPE_NUTRITION, NutritionRecordInternal.class);
149         mRecordIdToInternalRecordClassMap.put(
150                 RecordTypeIdentifier.RECORD_TYPE_SPEED, SpeedRecordInternal.class);
151         mRecordIdToInternalRecordClassMap.put(
152                 RecordTypeIdentifier.RECORD_TYPE_STEPS_CADENCE, StepsCadenceRecordInternal.class);
153         mRecordIdToInternalRecordClassMap.put(
154                 RecordTypeIdentifier.RECORD_TYPE_BODY_WATER_MASS,
155                 BodyWaterMassRecordInternal.class);
156         mRecordIdToInternalRecordClassMap.put(
157                 RecordTypeIdentifier.RECORD_TYPE_HEART_RATE_VARIABILITY_RMSSD,
158                 HeartRateVariabilityRmssdRecordInternal.class);
159         mRecordIdToInternalRecordClassMap.put(
160                 RecordTypeIdentifier.RECORD_TYPE_MENSTRUATION_PERIOD,
161                 MenstruationPeriodRecordInternal.class);
162         mRecordIdToInternalRecordClassMap.put(
163                 RecordTypeIdentifier.RECORD_TYPE_INTERMENSTRUAL_BLEEDING,
164                 IntermenstrualBleedingRecordInternal.class);
165 
166         mRecordIdToInternalRecordClassMap.put(
167                 RecordTypeIdentifier.RECORD_TYPE_VO2_MAX, Vo2MaxRecordInternal.class);
168         mRecordIdToInternalRecordClassMap.put(
169                 RecordTypeIdentifier.RECORD_TYPE_SEXUAL_ACTIVITY,
170                 SexualActivityRecordInternal.class);
171         mRecordIdToInternalRecordClassMap.put(
172                 RecordTypeIdentifier.RECORD_TYPE_RESTING_HEART_RATE,
173                 RestingHeartRateRecordInternal.class);
174         mRecordIdToInternalRecordClassMap.put(
175                 RecordTypeIdentifier.RECORD_TYPE_WEIGHT, WeightRecordInternal.class);
176         mRecordIdToInternalRecordClassMap.put(
177                 RecordTypeIdentifier.RECORD_TYPE_OXYGEN_SATURATION,
178                 OxygenSaturationRecordInternal.class);
179         mRecordIdToInternalRecordClassMap.put(
180                 RecordTypeIdentifier.RECORD_TYPE_RESPIRATORY_RATE,
181                 RespiratoryRateRecordInternal.class);
182         mRecordIdToInternalRecordClassMap.put(
183                 RecordTypeIdentifier.RECORD_TYPE_BODY_TEMPERATURE,
184                 BodyTemperatureRecordInternal.class);
185         mRecordIdToInternalRecordClassMap.put(
186                 RecordTypeIdentifier.RECORD_TYPE_BONE_MASS, BoneMassRecordInternal.class);
187         mRecordIdToInternalRecordClassMap.put(
188                 RecordTypeIdentifier.RECORD_TYPE_BLOOD_PRESSURE, BloodPressureRecordInternal.class);
189         mRecordIdToInternalRecordClassMap.put(
190                 RecordTypeIdentifier.RECORD_TYPE_BODY_FAT, BodyFatRecordInternal.class);
191         mRecordIdToInternalRecordClassMap.put(
192                 RecordTypeIdentifier.RECORD_TYPE_BLOOD_GLUCOSE, BloodGlucoseRecordInternal.class);
193         mRecordIdToInternalRecordClassMap.put(
194                 RecordTypeIdentifier.RECORD_TYPE_BASAL_BODY_TEMPERATURE,
195                 BasalBodyTemperatureRecordInternal.class);
196         mRecordIdToInternalRecordClassMap.put(
197                 RecordTypeIdentifier.RECORD_TYPE_OVULATION_TEST, OvulationTestRecordInternal.class);
198         mRecordIdToInternalRecordClassMap.put(
199                 RecordTypeIdentifier.RECORD_TYPE_MENSTRUATION_FLOW,
200                 MenstruationFlowRecordInternal.class);
201         mRecordIdToInternalRecordClassMap.put(
202                 RecordTypeIdentifier.RECORD_TYPE_CERVICAL_MUCUS, CervicalMucusRecordInternal.class);
203         mRecordIdToInternalRecordClassMap.put(
204                 RecordTypeIdentifier.RECORD_TYPE_HEIGHT, HeightRecordInternal.class);
205         mRecordIdToInternalRecordClassMap.put(
206                 RecordTypeIdentifier.RECORD_TYPE_LEAN_BODY_MASS, LeanBodyMassRecordInternal.class);
207         mRecordIdToInternalRecordClassMap.put(
208                 RecordTypeIdentifier.RECORD_TYPE_EXERCISE_SESSION,
209                 ExerciseSessionRecordInternal.class);
210         mRecordIdToInternalRecordClassMap.put(
211                 RecordTypeIdentifier.RECORD_TYPE_SLEEP_SESSION, SleepSessionRecordInternal.class);
212 
213         mRecordIdToExternalRecordClassMap = new ArrayMap<>(NUM_ENTRIES);
214         mRecordIdToExternalRecordClassMap.put(
215                 RecordTypeIdentifier.RECORD_TYPE_STEPS, StepsRecord.class);
216         mRecordIdToExternalRecordClassMap.put(
217                 RecordTypeIdentifier.RECORD_TYPE_HEART_RATE, HeartRateRecord.class);
218 
219         mRecordIdToExternalRecordClassMap.put(
220                 RecordTypeIdentifier.RECORD_TYPE_HYDRATION, HydrationRecord.class);
221         mRecordIdToExternalRecordClassMap.put(
222                 RecordTypeIdentifier.RECORD_TYPE_ACTIVE_CALORIES_BURNED,
223                 ActiveCaloriesBurnedRecord.class);
224         mRecordIdToExternalRecordClassMap.put(
225                 RecordTypeIdentifier.RECORD_TYPE_ELEVATION_GAINED, ElevationGainedRecord.class);
226         mRecordIdToExternalRecordClassMap.put(
227                 RecordTypeIdentifier.RECORD_TYPE_DISTANCE, DistanceRecord.class);
228         mRecordIdToExternalRecordClassMap.put(
229                 RecordTypeIdentifier.RECORD_TYPE_NUTRITION, NutritionRecord.class);
230         mRecordIdToExternalRecordClassMap.put(
231                 RecordTypeIdentifier.RECORD_TYPE_FLOORS_CLIMBED, FloorsClimbedRecord.class);
232         mRecordIdToExternalRecordClassMap.put(
233                 RecordTypeIdentifier.RECORD_TYPE_WHEELCHAIR_PUSHES, WheelchairPushesRecord.class);
234         mRecordIdToExternalRecordClassMap.put(
235                 RecordTypeIdentifier.RECORD_TYPE_TOTAL_CALORIES_BURNED,
236                 TotalCaloriesBurnedRecord.class);
237 
238         mRecordIdToExternalRecordClassMap.put(
239                 RecordTypeIdentifier.RECORD_TYPE_BASAL_METABOLIC_RATE,
240                 BasalMetabolicRateRecord.class);
241         mRecordIdToExternalRecordClassMap.put(
242                 RecordTypeIdentifier.RECORD_TYPE_CYCLING_PEDALING_CADENCE,
243                 CyclingPedalingCadenceRecord.class);
244         mRecordIdToExternalRecordClassMap.put(
245                 RecordTypeIdentifier.RECORD_TYPE_POWER, PowerRecord.class);
246         mRecordIdToExternalRecordClassMap.put(
247                 RecordTypeIdentifier.RECORD_TYPE_SPEED, SpeedRecord.class);
248         mRecordIdToExternalRecordClassMap.put(
249                 RecordTypeIdentifier.RECORD_TYPE_STEPS_CADENCE, StepsCadenceRecord.class);
250 
251         mRecordIdToExternalRecordClassMap.put(
252                 RecordTypeIdentifier.RECORD_TYPE_BODY_TEMPERATURE, BodyTemperatureRecord.class);
253         mRecordIdToExternalRecordClassMap.put(
254                 RecordTypeIdentifier.RECORD_TYPE_BONE_MASS, BoneMassRecord.class);
255         mRecordIdToExternalRecordClassMap.put(
256                 RecordTypeIdentifier.RECORD_TYPE_BLOOD_PRESSURE, BloodPressureRecord.class);
257         mRecordIdToExternalRecordClassMap.put(
258                 RecordTypeIdentifier.RECORD_TYPE_BODY_FAT, BodyFatRecord.class);
259         mRecordIdToExternalRecordClassMap.put(
260                 RecordTypeIdentifier.RECORD_TYPE_BLOOD_GLUCOSE, BloodGlucoseRecord.class);
261         mRecordIdToExternalRecordClassMap.put(
262                 RecordTypeIdentifier.RECORD_TYPE_BASAL_BODY_TEMPERATURE,
263                 BasalBodyTemperatureRecord.class);
264         mRecordIdToExternalRecordClassMap.put(
265                 RecordTypeIdentifier.RECORD_TYPE_CERVICAL_MUCUS, CervicalMucusRecord.class);
266         mRecordIdToExternalRecordClassMap.put(
267                 RecordTypeIdentifier.RECORD_TYPE_LEAN_BODY_MASS, LeanBodyMassRecord.class);
268         mRecordIdToExternalRecordClassMap.put(
269                 RecordTypeIdentifier.RECORD_TYPE_MENSTRUATION_FLOW, MenstruationFlowRecord.class);
270         mRecordIdToExternalRecordClassMap.put(
271                 RecordTypeIdentifier.RECORD_TYPE_HEIGHT, HeightRecord.class);
272         mRecordIdToExternalRecordClassMap.put(
273                 RecordTypeIdentifier.RECORD_TYPE_OVULATION_TEST, OvulationTestRecord.class);
274         mRecordIdToExternalRecordClassMap.put(
275                 RecordTypeIdentifier.RECORD_TYPE_VO2_MAX, Vo2MaxRecord.class);
276         mRecordIdToExternalRecordClassMap.put(
277                 RecordTypeIdentifier.RECORD_TYPE_SEXUAL_ACTIVITY, SexualActivityRecord.class);
278         mRecordIdToExternalRecordClassMap.put(
279                 RecordTypeIdentifier.RECORD_TYPE_SLEEP_SESSION, SleepSessionRecord.class);
280 
281         mRecordIdToExternalRecordClassMap.put(
282                 RecordTypeIdentifier.RECORD_TYPE_RESPIRATORY_RATE, RespiratoryRateRecord.class);
283         mRecordIdToExternalRecordClassMap.put(
284                 RecordTypeIdentifier.RECORD_TYPE_OXYGEN_SATURATION, OxygenSaturationRecord.class);
285         mRecordIdToExternalRecordClassMap.put(
286                 RecordTypeIdentifier.RECORD_TYPE_RESTING_HEART_RATE, RestingHeartRateRecord.class);
287         mRecordIdToExternalRecordClassMap.put(
288                 RecordTypeIdentifier.RECORD_TYPE_WEIGHT, WeightRecord.class);
289         mRecordIdToExternalRecordClassMap.put(
290                 RecordTypeIdentifier.RECORD_TYPE_BODY_WATER_MASS, BodyWaterMassRecord.class);
291         mRecordIdToExternalRecordClassMap.put(
292                 RecordTypeIdentifier.RECORD_TYPE_HEART_RATE_VARIABILITY_RMSSD,
293                 HeartRateVariabilityRmssdRecord.class);
294         mRecordIdToExternalRecordClassMap.put(
295                 RecordTypeIdentifier.RECORD_TYPE_MENSTRUATION_PERIOD,
296                 MenstruationPeriodRecord.class);
297         mRecordIdToExternalRecordClassMap.put(
298                 RecordTypeIdentifier.RECORD_TYPE_INTERMENSTRUAL_BLEEDING,
299                 IntermenstrualBleedingRecord.class);
300         mRecordIdToExternalRecordClassMap.put(
301                 RecordTypeIdentifier.RECORD_TYPE_EXERCISE_SESSION, ExerciseSessionRecord.class);
302 
303         mExternalRecordClassToRecordIdMap =
304                 new ArrayMap<>(mRecordIdToExternalRecordClassMap.size());
305         mRecordIdToExternalRecordClassMap.forEach(
306                 (id, recordClass) -> mExternalRecordClassToRecordIdMap.put(recordClass, id));
307     }
308 
309     @NonNull
getInstance()310     public static synchronized RecordMapper getInstance() {
311         if (sRecordMapper == null) {
312             sRecordMapper = new RecordMapper();
313         }
314 
315         return sRecordMapper;
316     }
317 
318     @NonNull
getRecordIdToInternalRecordClassMap()319     public Map<Integer, Class<? extends RecordInternal<?>>> getRecordIdToInternalRecordClassMap() {
320         return mRecordIdToInternalRecordClassMap;
321     }
322 
323     @NonNull
getRecordIdToExternalRecordClassMap()324     public Map<Integer, Class<? extends Record>> getRecordIdToExternalRecordClassMap() {
325         return mRecordIdToExternalRecordClassMap;
326     }
327 
328     @RecordTypeIdentifier.RecordType
getRecordType(Class<? extends Record> recordClass)329     public int getRecordType(Class<? extends Record> recordClass) {
330         return mExternalRecordClassToRecordIdMap.get(recordClass);
331     }
332 }
333