• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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