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