1 /** 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * ``` 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * ``` 10 * 11 * Unless required by applicable law or agreed to in writing, software distributed under the License 12 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 13 * or implied. See the License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 package com.android.healthconnect.testapps.toolbox 17 18 import android.health.connect.datatypes.ActiveCaloriesBurnedRecord 19 import android.health.connect.datatypes.BasalBodyTemperatureRecord 20 import android.health.connect.datatypes.BasalMetabolicRateRecord 21 import android.health.connect.datatypes.BloodGlucoseRecord 22 import android.health.connect.datatypes.BloodPressureRecord 23 import android.health.connect.datatypes.BodyFatRecord 24 import android.health.connect.datatypes.BodyTemperatureRecord 25 import android.health.connect.datatypes.BodyWaterMassRecord 26 import android.health.connect.datatypes.BoneMassRecord 27 import android.health.connect.datatypes.CervicalMucusRecord 28 import android.health.connect.datatypes.CyclingPedalingCadenceRecord 29 import android.health.connect.datatypes.DistanceRecord 30 import android.health.connect.datatypes.ElevationGainedRecord 31 import android.health.connect.datatypes.ExerciseSessionRecord 32 import android.health.connect.datatypes.FloorsClimbedRecord 33 import android.health.connect.datatypes.HeartRateRecord 34 import android.health.connect.datatypes.HeartRateVariabilityRmssdRecord 35 import android.health.connect.datatypes.HeightRecord 36 import android.health.connect.datatypes.HydrationRecord 37 import android.health.connect.datatypes.IntermenstrualBleedingRecord 38 import android.health.connect.datatypes.LeanBodyMassRecord 39 import android.health.connect.datatypes.MenstruationFlowRecord 40 import android.health.connect.datatypes.MenstruationPeriodRecord 41 import android.health.connect.datatypes.NutritionRecord 42 import android.health.connect.datatypes.OvulationTestRecord 43 import android.health.connect.datatypes.OxygenSaturationRecord 44 import android.health.connect.datatypes.PowerRecord 45 import android.health.connect.datatypes.Record 46 import android.health.connect.datatypes.RespiratoryRateRecord 47 import android.health.connect.datatypes.RestingHeartRateRecord 48 import android.health.connect.datatypes.SexualActivityRecord 49 import android.health.connect.datatypes.SleepSessionRecord 50 import android.health.connect.datatypes.SpeedRecord 51 import android.health.connect.datatypes.StepsCadenceRecord 52 import android.health.connect.datatypes.StepsRecord 53 import android.health.connect.datatypes.TotalCaloriesBurnedRecord 54 import android.health.connect.datatypes.Vo2MaxRecord 55 import android.health.connect.datatypes.WeightRecord 56 import android.health.connect.datatypes.WheelchairPushesRecord 57 import android.text.InputType 58 import androidx.annotation.DrawableRes 59 import androidx.annotation.StringRes 60 import kotlin.reflect.KClass 61 62 /** Constant variables used across the app. */ 63 object Constants { 64 65 const val INPUT_TYPE_DOUBLE = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL 66 const val INPUT_TYPE_LONG = InputType.TYPE_CLASS_NUMBER 67 const val INPUT_TYPE_INT = InputType.TYPE_CLASS_NUMBER 68 const val INPUT_TYPE_TEXT = InputType.TYPE_CLASS_TEXT 69 70 val ALL_PERMISSIONS = 71 arrayOf( 72 "android.permission.health.READ_ACTIVE_CALORIES_BURNED", 73 "android.permission.health.READ_BASAL_BODY_TEMPERATURE", 74 "android.permission.health.READ_BASAL_METABOLIC_RATE", 75 "android.permission.health.READ_BLOOD_GLUCOSE", 76 "android.permission.health.READ_BLOOD_PRESSURE", 77 "android.permission.health.READ_BODY_FAT", 78 "android.permission.health.READ_BODY_TEMPERATURE", 79 "android.permission.health.READ_BODY_WATER_MASS", 80 "android.permission.health.READ_BONE_MASS", 81 "android.permission.health.READ_CERVICAL_MUCUS", 82 "android.permission.health.READ_DISTANCE", 83 "android.permission.health.READ_ELEVATION_GAINED", 84 "android.permission.health.READ_EXERCISE", 85 "android.permission.health.READ_FLOORS_CLIMBED", 86 "android.permission.health.READ_HEART_RATE", 87 "android.permission.health.READ_HEART_RATE_VARIABILITY", 88 "android.permission.health.READ_HEIGHT", 89 "android.permission.health.READ_HYDRATION", 90 "android.permission.health.READ_LEAN_BODY_MASS", 91 "android.permission.health.READ_MENSTRUATION", 92 "android.permission.health.READ_NUTRITION", 93 "android.permission.health.READ_OVULATION_TEST", 94 "android.permission.health.READ_OXYGEN_SATURATION", 95 "android.permission.health.READ_POWER", 96 "android.permission.health.READ_RESPIRATORY_RATE", 97 "android.permission.health.READ_RESTING_HEART_RATE", 98 "android.permission.health.READ_SEXUAL_ACTIVITY", 99 "android.permission.health.READ_SLEEP", 100 "android.permission.health.READ_SPEED", 101 "android.permission.health.READ_STEPS", 102 "android.permission.health.READ_TOTAL_CALORIES_BURNED", 103 "android.permission.health.READ_VO2_MAX", 104 "android.permission.health.READ_WEIGHT", 105 "android.permission.health.READ_INTERMENSTRUAL_BLEEDING", 106 "android.permission.health.READ_WHEELCHAIR_PUSHES", 107 "android.permission.health.WRITE_ACTIVE_CALORIES_BURNED", 108 "android.permission.health.WRITE_BASAL_BODY_TEMPERATURE", 109 "android.permission.health.WRITE_BASAL_METABOLIC_RATE", 110 "android.permission.health.WRITE_BLOOD_GLUCOSE", 111 "android.permission.health.WRITE_BLOOD_PRESSURE", 112 "android.permission.health.WRITE_BODY_FAT", 113 "android.permission.health.WRITE_BODY_TEMPERATURE", 114 "android.permission.health.WRITE_BODY_WATER_MASS", 115 "android.permission.health.WRITE_BONE_MASS", 116 "android.permission.health.WRITE_CERVICAL_MUCUS", 117 "android.permission.health.WRITE_DISTANCE", 118 "android.permission.health.WRITE_ELEVATION_GAINED", 119 "android.permission.health.WRITE_EXERCISE", 120 "android.permission.health.WRITE_FLOORS_CLIMBED", 121 "android.permission.health.WRITE_HEART_RATE", 122 "android.permission.health.WRITE_HEART_RATE_VARIABILITY", 123 "android.permission.health.WRITE_HEIGHT", 124 "android.permission.health.WRITE_HYDRATION", 125 "android.permission.health.WRITE_LEAN_BODY_MASS", 126 "android.permission.health.WRITE_MENSTRUATION", 127 "android.permission.health.WRITE_NUTRITION", 128 "android.permission.health.WRITE_OVULATION_TEST", 129 "android.permission.health.WRITE_OXYGEN_SATURATION", 130 "android.permission.health.WRITE_POWER", 131 "android.permission.health.WRITE_RESPIRATORY_RATE", 132 "android.permission.health.WRITE_RESTING_HEART_RATE", 133 "android.permission.health.WRITE_SEXUAL_ACTIVITY", 134 "android.permission.health.WRITE_SLEEP", 135 "android.permission.health.WRITE_SPEED", 136 "android.permission.health.WRITE_STEPS", 137 "android.permission.health.WRITE_TOTAL_CALORIES_BURNED", 138 "android.permission.health.WRITE_VO2_MAX", 139 "android.permission.health.WRITE_WEIGHT", 140 "android.permission.health.WRITE_WHEELCHAIR_PUSHES", 141 "android.permission.health.WRITE_INTERMENSTRUAL_BLEEDING", 142 "android.permission.health.WRITE_EXERCISE_ROUTE") 143 144 /** Represents Category group for HealthConnect data. */ 145 enum class HealthDataCategory( 146 val healthPermissionTypes: List<HealthPermissionType>, 147 @StringRes val title: Int, 148 @DrawableRes val icon: Int, 149 ) { 150 ACTIVITY( 151 CategoriesMappers.ACTIVITY_PERMISSION_GROUPS, 152 R.string.activity_category, 153 R.drawable.quantum_gm_ic_directions_run_vd_theme_24), 154 BODY_MEASUREMENTS( 155 CategoriesMappers.BODY_MEASUREMENTS_PERMISSION_GROUPS, 156 R.string.body_measurements_category, 157 R.drawable.quantum_gm_ic_straighten_vd_theme_24), 158 SLEEP( 159 CategoriesMappers.SLEEP_PERMISSION_GROUPS, 160 R.string.sleep_category, 161 R.drawable.ic_sleep), 162 VITALS( 163 CategoriesMappers.VITALS_PERMISSION_GROUPS, 164 R.string.vitals_category, 165 R.drawable.ic_vitals), 166 CYCLE_TRACKING( 167 CategoriesMappers.CYCLE_TRACKING_PERMISSION_GROUPS, 168 R.string.cycle_tracking_category, 169 R.drawable.ic_cycle_tracking), 170 NUTRITION( 171 CategoriesMappers.NUTRITION_PERMISSION_GROUPS, 172 R.string.nutrition_category, 173 R.drawable.quantum_gm_ic_grocery_vd_theme_24), 174 } 175 176 /** Permission groups for each {@link HealthDataCategory}. */ 177 object CategoriesMappers { 178 val ACTIVITY_PERMISSION_GROUPS = 179 listOf( 180 HealthPermissionType.ACTIVE_CALORIES_BURNED, 181 HealthPermissionType.DISTANCE, 182 HealthPermissionType.ELEVATION_GAINED, 183 HealthPermissionType.FLOORS_CLIMBED, 184 HealthPermissionType.POWER, 185 HealthPermissionType.SPEED, 186 HealthPermissionType.STEPS, 187 HealthPermissionType.STEPS_CADENCE, 188 HealthPermissionType.TOTAL_CALORIES_BURNED, 189 HealthPermissionType.VO2_MAX, 190 HealthPermissionType.CYCLING_PEDALING_CADENCE, 191 HealthPermissionType.WHEELCHAIR_PUSHES, 192 HealthPermissionType.EXERCISE_SESSION) 193 194 val BODY_MEASUREMENTS_PERMISSION_GROUPS = 195 listOf( 196 HealthPermissionType.BASAL_METABOLIC_RATE, 197 HealthPermissionType.BODY_FAT, 198 HealthPermissionType.BODY_WATER_MASS, 199 HealthPermissionType.BONE_MASS, 200 HealthPermissionType.HEIGHT, 201 HealthPermissionType.LEAN_BODY_MASS, 202 HealthPermissionType.WEIGHT) 203 204 val CYCLE_TRACKING_PERMISSION_GROUPS = 205 listOf( 206 HealthPermissionType.CERVICAL_MUCUS, 207 HealthPermissionType.MENSTRUATION_FLOW, 208 HealthPermissionType.MENSTRUATION_PERIOD, 209 HealthPermissionType.OVULATION_TEST, 210 HealthPermissionType.INTERMENSTRUAL_BLEEDING, 211 HealthPermissionType.SEXUAL_ACTIVITY) 212 213 val NUTRITION_PERMISSION_GROUPS = 214 listOf(HealthPermissionType.HYDRATION, HealthPermissionType.NUTRITION) 215 216 val SLEEP_PERMISSION_GROUPS = listOf(HealthPermissionType.SLEEP) 217 218 val VITALS_PERMISSION_GROUPS = 219 listOf( 220 HealthPermissionType.BASAL_BODY_TEMPERATURE, 221 HealthPermissionType.BLOOD_GLUCOSE, 222 HealthPermissionType.BLOOD_PRESSURE, 223 HealthPermissionType.BODY_TEMPERATURE, 224 HealthPermissionType.HEART_RATE, 225 HealthPermissionType.HEART_RATE_VARIABILITY, 226 HealthPermissionType.OXYGEN_SATURATION, 227 HealthPermissionType.RESPIRATORY_RATE, 228 HealthPermissionType.RESTING_HEART_RATE) 229 } 230 231 enum class HealthPermissionType( 232 val recordClass: KClass<out Record>?, 233 @StringRes val title: Int, 234 ) { 235 // ACTIVITY 236 ACTIVE_CALORIES_BURNED( 237 ActiveCaloriesBurnedRecord::class, R.string.active_calories_burned_label), 238 DISTANCE(DistanceRecord::class, R.string.distance_label), 239 ELEVATION_GAINED(ElevationGainedRecord::class, R.string.elevation_gained_label), 240 FLOORS_CLIMBED(FloorsClimbedRecord::class, R.string.floors_climbed_label), 241 STEPS(StepsRecord::class, R.string.steps_label), 242 STEPS_CADENCE(StepsCadenceRecord::class, R.string.steps_cadence_label), 243 TOTAL_CALORIES_BURNED( 244 TotalCaloriesBurnedRecord::class, R.string.total_calories_burned_label), 245 VO2_MAX(Vo2MaxRecord::class, R.string.vo2_max_label), 246 WHEELCHAIR_PUSHES(WheelchairPushesRecord::class, R.string.wheelchair_pushes_label), 247 POWER(PowerRecord::class, R.string.power_label), 248 SPEED(SpeedRecord::class, R.string.speed_label), 249 CYCLING_PEDALING_CADENCE( 250 CyclingPedalingCadenceRecord::class, R.string.cycling_pedaling_cadence), 251 EXERCISE_SESSION(ExerciseSessionRecord::class, R.string.exercise_session), 252 253 // BODY_MEASUREMENTS 254 BASAL_METABOLIC_RATE(BasalMetabolicRateRecord::class, R.string.basal_metabolic_rate_label), 255 BODY_FAT(BodyFatRecord::class, R.string.body_fat_label), 256 BODY_WATER_MASS(BodyWaterMassRecord::class, R.string.body_water_mass_label), 257 BONE_MASS(BoneMassRecord::class, R.string.bone_mass_label), 258 HEIGHT(HeightRecord::class, R.string.height_label), 259 LEAN_BODY_MASS(LeanBodyMassRecord::class, R.string.lean_body_mass_label), 260 WEIGHT(WeightRecord::class, R.string.weight_label), 261 262 // CYCLE_TRACKING 263 CERVICAL_MUCUS(CervicalMucusRecord::class, R.string.cervical_mucus_label), 264 MENSTRUATION_FLOW(MenstruationFlowRecord::class, R.string.menstruation_flow), 265 MENSTRUATION_PERIOD(MenstruationPeriodRecord::class, R.string.menstruation_period), 266 OVULATION_TEST(OvulationTestRecord::class, R.string.ovulation_test_label), 267 SEXUAL_ACTIVITY(SexualActivityRecord::class, R.string.sexual_activity_label), 268 INTERMENSTRUAL_BLEEDING( 269 IntermenstrualBleedingRecord::class, R.string.inter_menstrual_bleeding), 270 271 // NUTRITION 272 HYDRATION(HydrationRecord::class, R.string.hydration_label), 273 NUTRITION(NutritionRecord::class, R.string.nutrition_label), 274 275 // SLEEP 276 SLEEP(SleepSessionRecord::class, R.string.sleep_label), 277 278 // VITALS 279 BASAL_BODY_TEMPERATURE( 280 BasalBodyTemperatureRecord::class, R.string.basal_body_temperature_label), 281 BLOOD_GLUCOSE(BloodGlucoseRecord::class, R.string.blood_glucose_label), 282 BLOOD_PRESSURE(BloodPressureRecord::class, R.string.blood_pressure_label), 283 BODY_TEMPERATURE(BodyTemperatureRecord::class, R.string.body_temperature_label), 284 HEART_RATE(HeartRateRecord::class, R.string.heart_rate_label), 285 HEART_RATE_VARIABILITY( 286 HeartRateVariabilityRmssdRecord::class, R.string.heart_rate_variability_label), 287 OXYGEN_SATURATION(OxygenSaturationRecord::class, R.string.oxygen_saturation_label), 288 RESPIRATORY_RATE(RespiratoryRateRecord::class, R.string.respiratory_rate_label), 289 RESTING_HEART_RATE(RestingHeartRateRecord::class, R.string.resting_heart_rate_label), 290 } 291 } 292