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.datatypes; 18 19 import static android.health.connect.datatypes.validation.ValidationUtils.validateIntDefValue; 20 21 import android.annotation.IntDef; 22 import android.annotation.NonNull; 23 import android.health.connect.HealthConnectManager; 24 25 import java.lang.annotation.Retention; 26 import java.lang.annotation.RetentionPolicy; 27 import java.util.Collections; 28 import java.util.List; 29 import java.util.Objects; 30 import java.util.Set; 31 32 /** 33 * Class to represent aggregation types in {@link Record} classes. 34 * 35 * <p>New objects of this class cannot be created. 36 * 37 * <p>Pre-created (defined in health {@link Record} types) objects of this class can be used to 38 * query and fetch aggregate results using aggregate APIs in {@link HealthConnectManager} 39 * 40 * @see HealthConnectManager#aggregate 41 */ 42 public final class AggregationType<T> { 43 /** @hide */ 44 public static final int MAX = 0; 45 /** @hide */ 46 public static final int MIN = 1; 47 /** @hide */ 48 public static final int AVG = 2; 49 /** @hide */ 50 public static final int SUM = 3; 51 /** @hide */ 52 public static final int COUNT = 4; 53 54 @AggregationTypeIdentifier.Id private final int mId; 55 @AggregateOperationType private final int mType; 56 private final List<Integer> mApplicableRecordTypes; 57 private final Class<T> mClass; 58 /** @hide */ AggregationType( @ggregationTypeIdentifier.Id int id, @AggregateOperationType int type, @NonNull List<Integer> applicableRecordTypes, Class<T> templateClass)59 AggregationType( 60 @AggregationTypeIdentifier.Id int id, 61 @AggregateOperationType int type, 62 @NonNull List<Integer> applicableRecordTypes, 63 Class<T> templateClass) { 64 Objects.requireNonNull(applicableRecordTypes); 65 66 mId = id; 67 mType = type; 68 mApplicableRecordTypes = applicableRecordTypes; 69 mClass = templateClass; 70 } 71 72 /** @hide */ AggregationType( @ggregationTypeIdentifier.Id int id, @AggregateOperationType int type, @NonNull @RecordTypeIdentifier.RecordType int applicableRecordType, Class<T> templateClass)73 AggregationType( 74 @AggregationTypeIdentifier.Id int id, 75 @AggregateOperationType int type, 76 @NonNull @RecordTypeIdentifier.RecordType int applicableRecordType, 77 Class<T> templateClass) { 78 validateIntDefValue( 79 id, 80 AggregationTypeIdentifier.IDENTIFIER_VALID_TYPES, 81 AggregationTypeIdentifier.class.getSimpleName()); 82 validateIntDefValue( 83 type, OPERATION_VALID_TYPES, AggregateOperationType.class.getSimpleName()); 84 85 mId = id; 86 mType = type; 87 mApplicableRecordTypes = Collections.singletonList(applicableRecordType); 88 mClass = templateClass; 89 } 90 91 /** @hide */ 92 @AggregationTypeIdentifier.Id getAggregationTypeIdentifier()93 public int getAggregationTypeIdentifier() { 94 return mId; 95 } 96 97 /** @hide */ 98 @NonNull getApplicableRecordTypeIds()99 public List<Integer> getApplicableRecordTypeIds() { 100 return mApplicableRecordTypes; 101 } 102 103 /** @hide */ 104 @AggregateOperationType getAggregateOperationType()105 public int getAggregateOperationType() { 106 return mType; 107 } 108 109 /** @hide */ getAggregateResultClass()110 public Class<T> getAggregateResultClass() { 111 return mClass; 112 } 113 114 /** 115 * Identifier for each aggregate type, as returned by {@link 116 * AggregationType#getAggregationTypeIdentifier()}. This is used at various places to determine 117 * operations to perform on aggregate type. 118 * 119 * @hide 120 */ 121 public @interface AggregationTypeIdentifier { 122 int HEART_RATE_RECORD_BPM_MAX = 0; 123 int HEART_RATE_RECORD_BPM_MIN = 1; 124 int STEPS_RECORD_COUNT_TOTAL = 2; 125 int ACTIVE_CALORIES_BURNED_RECORD_ACTIVE_CALORIES_TOTAL = 3; 126 int BMR_RECORD_BASAL_CALORIES_TOTAL = 4; 127 int DISTANCE_RECORD_DISTANCE_TOTAL = 5; 128 int ELEVATION_RECORD_ELEVATION_GAINED_TOTAL = 6; 129 int HEART_RATE_RECORD_BPM_AVG = 7; 130 int POWER_RECORD_POWER_MIN = 8; 131 int POWER_RECORD_POWER_MAX = 9; 132 int POWER_RECORD_POWER_AVG = 10; 133 int HYDRATION_RECORD_VOLUME_TOTAL = 11; 134 int FLOORS_CLIMBED_RECORD_FLOORS_CLIMBED_TOTAL = 12; 135 int NUTRITION_RECORD_BIOTIN_TOTAL = 13; 136 int NUTRITION_RECORD_CAFFEINE_TOTAL = 14; 137 int NUTRITION_RECORD_CALCIUM_TOTAL = 15; 138 int NUTRITION_RECORD_CHLORIDE_TOTAL = 16; 139 int NUTRITION_RECORD_CHOLESTEROL_TOTAL = 17; 140 int NUTRITION_RECORD_CHROMIUM_TOTAL = 18; 141 int NUTRITION_RECORD_COPPER_TOTAL = 19; 142 int NUTRITION_RECORD_DIETARY_FIBER_TOTAL = 20; 143 int NUTRITION_RECORD_ENERGY_TOTAL = 21; 144 int NUTRITION_RECORD_ENERGY_FROM_FAT_TOTAL = 22; 145 int NUTRITION_RECORD_FOLATE_TOTAL = 23; 146 int NUTRITION_RECORD_FOLIC_ACID_TOTAL = 24; 147 int NUTRITION_RECORD_IODINE_TOTAL = 25; 148 int NUTRITION_RECORD_IRON_TOTAL = 26; 149 int NUTRITION_RECORD_MAGNESIUM_TOTAL = 27; 150 int NUTRITION_RECORD_MANGANESE_TOTAL = 28; 151 int NUTRITION_RECORD_MOLYBDENUM_TOTAL = 29; 152 int NUTRITION_RECORD_MONOUNSATURATED_FAT_TOTAL = 30; 153 int NUTRITION_RECORD_NIACIN_TOTAL = 31; 154 int NUTRITION_RECORD_PANTOTHENIC_ACID_TOTAL = 32; 155 int NUTRITION_RECORD_PHOSPHORUS_TOTAL = 33; 156 int NUTRITION_RECORD_POLYUNSATURATED_FAT_TOTAL = 34; 157 int NUTRITION_RECORD_POTASSIUM_TOTAL = 35; 158 int NUTRITION_RECORD_PROTEIN_TOTAL = 36; 159 int NUTRITION_RECORD_RIBOFLAVIN_TOTAL = 37; 160 int NUTRITION_RECORD_SATURATED_FAT_TOTAL = 38; 161 int NUTRITION_RECORD_SELENIUM_TOTAL = 39; 162 int NUTRITION_RECORD_SODIUM_TOTAL = 40; 163 int NUTRITION_RECORD_SUGAR_TOTAL = 41; 164 int NUTRITION_RECORD_THIAMIN_TOTAL = 42; 165 int NUTRITION_RECORD_TOTAL_CARBOHYDRATE_TOTAL = 43; 166 int NUTRITION_RECORD_TOTAL_FAT_TOTAL = 44; 167 int NUTRITION_RECORD_UNSATURATED_FAT_TOTAL = 45; 168 int NUTRITION_RECORD_VITAMIN_A_TOTAL = 46; 169 int NUTRITION_RECORD_VITAMIN_B12_TOTAL = 47; 170 int NUTRITION_RECORD_VITAMIN_B6_TOTAL = 48; 171 int NUTRITION_RECORD_VITAMIN_C_TOTAL = 49; 172 int NUTRITION_RECORD_VITAMIN_D_TOTAL = 50; 173 int NUTRITION_RECORD_VITAMIN_E_TOTAL = 51; 174 int NUTRITION_RECORD_VITAMIN_K_TOTAL = 52; 175 int NUTRITION_RECORD_ZINC_TOTAL = 53; 176 int HEIGHT_RECORD_HEIGHT_AVG = 54; 177 int HEIGHT_RECORD_HEIGHT_MAX = 55; 178 int HEIGHT_RECORD_HEIGHT_MIN = 56; 179 int RESTING_HEART_RATE_RECORD_BPM_MAX = 57; 180 int RESTING_HEART_RATE_RECORD_BPM_MIN = 58; 181 int TOTAL_CALORIES_BURNED_RECORD_ENERGY_TOTAL = 59; 182 int WEIGHT_RECORD_WEIGHT_AVG = 60; 183 int WEIGHT_RECORD_WEIGHT_MAX = 61; 184 int WEIGHT_RECORD_WEIGHT_MIN = 62; 185 int WHEEL_CHAIR_PUSHES_RECORD_COUNT_TOTAL = 63; 186 int HEART_RATE_RECORD_MEASUREMENTS_COUNT = 64; 187 int RESTING_HEART_RATE_RECORD_BPM_AVG = 65; 188 int SLEEP_SESSION_DURATION_TOTAL = 66; 189 int EXERCISE_SESSION_DURATION_TOTAL = 67; 190 191 /** 192 * Valid set of values for this IntDef. Update this set when add new type or deprecate 193 * existing type. 194 * 195 * @hide 196 */ 197 Set<Integer> IDENTIFIER_VALID_TYPES = 198 Set.of( 199 HEART_RATE_RECORD_BPM_MAX, 200 HEART_RATE_RECORD_BPM_MIN, 201 STEPS_RECORD_COUNT_TOTAL, 202 ACTIVE_CALORIES_BURNED_RECORD_ACTIVE_CALORIES_TOTAL, 203 BMR_RECORD_BASAL_CALORIES_TOTAL, 204 DISTANCE_RECORD_DISTANCE_TOTAL, 205 ELEVATION_RECORD_ELEVATION_GAINED_TOTAL, 206 HEART_RATE_RECORD_BPM_AVG, 207 POWER_RECORD_POWER_MIN, 208 POWER_RECORD_POWER_MAX, 209 POWER_RECORD_POWER_AVG, 210 HYDRATION_RECORD_VOLUME_TOTAL, 211 FLOORS_CLIMBED_RECORD_FLOORS_CLIMBED_TOTAL, 212 NUTRITION_RECORD_BIOTIN_TOTAL, 213 NUTRITION_RECORD_CAFFEINE_TOTAL, 214 NUTRITION_RECORD_CALCIUM_TOTAL, 215 NUTRITION_RECORD_CHLORIDE_TOTAL, 216 NUTRITION_RECORD_CHOLESTEROL_TOTAL, 217 NUTRITION_RECORD_CHROMIUM_TOTAL, 218 NUTRITION_RECORD_COPPER_TOTAL, 219 NUTRITION_RECORD_DIETARY_FIBER_TOTAL, 220 NUTRITION_RECORD_ENERGY_TOTAL, 221 NUTRITION_RECORD_ENERGY_FROM_FAT_TOTAL, 222 NUTRITION_RECORD_FOLATE_TOTAL, 223 NUTRITION_RECORD_FOLIC_ACID_TOTAL, 224 NUTRITION_RECORD_IODINE_TOTAL, 225 NUTRITION_RECORD_IRON_TOTAL, 226 NUTRITION_RECORD_MAGNESIUM_TOTAL, 227 NUTRITION_RECORD_MANGANESE_TOTAL, 228 NUTRITION_RECORD_MOLYBDENUM_TOTAL, 229 NUTRITION_RECORD_MONOUNSATURATED_FAT_TOTAL, 230 NUTRITION_RECORD_NIACIN_TOTAL, 231 NUTRITION_RECORD_PANTOTHENIC_ACID_TOTAL, 232 NUTRITION_RECORD_PHOSPHORUS_TOTAL, 233 NUTRITION_RECORD_POLYUNSATURATED_FAT_TOTAL, 234 NUTRITION_RECORD_POTASSIUM_TOTAL, 235 NUTRITION_RECORD_PROTEIN_TOTAL, 236 NUTRITION_RECORD_RIBOFLAVIN_TOTAL, 237 NUTRITION_RECORD_SATURATED_FAT_TOTAL, 238 NUTRITION_RECORD_SELENIUM_TOTAL, 239 NUTRITION_RECORD_SODIUM_TOTAL, 240 NUTRITION_RECORD_SUGAR_TOTAL, 241 NUTRITION_RECORD_THIAMIN_TOTAL, 242 NUTRITION_RECORD_TOTAL_CARBOHYDRATE_TOTAL, 243 NUTRITION_RECORD_TOTAL_FAT_TOTAL, 244 NUTRITION_RECORD_UNSATURATED_FAT_TOTAL, 245 NUTRITION_RECORD_VITAMIN_A_TOTAL, 246 NUTRITION_RECORD_VITAMIN_B12_TOTAL, 247 NUTRITION_RECORD_VITAMIN_B6_TOTAL, 248 NUTRITION_RECORD_VITAMIN_C_TOTAL, 249 NUTRITION_RECORD_VITAMIN_D_TOTAL, 250 NUTRITION_RECORD_VITAMIN_E_TOTAL, 251 NUTRITION_RECORD_VITAMIN_K_TOTAL, 252 NUTRITION_RECORD_ZINC_TOTAL, 253 HEIGHT_RECORD_HEIGHT_AVG, 254 HEIGHT_RECORD_HEIGHT_MAX, 255 HEIGHT_RECORD_HEIGHT_MIN, 256 RESTING_HEART_RATE_RECORD_BPM_MAX, 257 RESTING_HEART_RATE_RECORD_BPM_MIN, 258 TOTAL_CALORIES_BURNED_RECORD_ENERGY_TOTAL, 259 WEIGHT_RECORD_WEIGHT_AVG, 260 WEIGHT_RECORD_WEIGHT_MAX, 261 WEIGHT_RECORD_WEIGHT_MIN, 262 WHEEL_CHAIR_PUSHES_RECORD_COUNT_TOTAL, 263 HEART_RATE_RECORD_MEASUREMENTS_COUNT, 264 RESTING_HEART_RATE_RECORD_BPM_AVG, 265 SLEEP_SESSION_DURATION_TOTAL, 266 EXERCISE_SESSION_DURATION_TOTAL); 267 268 /** @hide */ 269 @IntDef({ 270 HEART_RATE_RECORD_BPM_MAX, 271 HEART_RATE_RECORD_BPM_MIN, 272 STEPS_RECORD_COUNT_TOTAL, 273 ACTIVE_CALORIES_BURNED_RECORD_ACTIVE_CALORIES_TOTAL, 274 BMR_RECORD_BASAL_CALORIES_TOTAL, 275 DISTANCE_RECORD_DISTANCE_TOTAL, 276 ELEVATION_RECORD_ELEVATION_GAINED_TOTAL, 277 HEART_RATE_RECORD_BPM_AVG, 278 POWER_RECORD_POWER_MIN, 279 POWER_RECORD_POWER_MAX, 280 POWER_RECORD_POWER_AVG, 281 HYDRATION_RECORD_VOLUME_TOTAL, 282 FLOORS_CLIMBED_RECORD_FLOORS_CLIMBED_TOTAL, 283 NUTRITION_RECORD_BIOTIN_TOTAL, 284 NUTRITION_RECORD_CAFFEINE_TOTAL, 285 NUTRITION_RECORD_CALCIUM_TOTAL, 286 NUTRITION_RECORD_CHLORIDE_TOTAL, 287 NUTRITION_RECORD_CHOLESTEROL_TOTAL, 288 NUTRITION_RECORD_CHROMIUM_TOTAL, 289 NUTRITION_RECORD_COPPER_TOTAL, 290 NUTRITION_RECORD_DIETARY_FIBER_TOTAL, 291 NUTRITION_RECORD_ENERGY_TOTAL, 292 NUTRITION_RECORD_ENERGY_FROM_FAT_TOTAL, 293 NUTRITION_RECORD_FOLATE_TOTAL, 294 NUTRITION_RECORD_FOLIC_ACID_TOTAL, 295 NUTRITION_RECORD_IODINE_TOTAL, 296 NUTRITION_RECORD_IRON_TOTAL, 297 NUTRITION_RECORD_MAGNESIUM_TOTAL, 298 NUTRITION_RECORD_MANGANESE_TOTAL, 299 NUTRITION_RECORD_MOLYBDENUM_TOTAL, 300 NUTRITION_RECORD_MONOUNSATURATED_FAT_TOTAL, 301 NUTRITION_RECORD_NIACIN_TOTAL, 302 NUTRITION_RECORD_PANTOTHENIC_ACID_TOTAL, 303 NUTRITION_RECORD_PHOSPHORUS_TOTAL, 304 NUTRITION_RECORD_POLYUNSATURATED_FAT_TOTAL, 305 NUTRITION_RECORD_POTASSIUM_TOTAL, 306 NUTRITION_RECORD_PROTEIN_TOTAL, 307 NUTRITION_RECORD_RIBOFLAVIN_TOTAL, 308 NUTRITION_RECORD_SATURATED_FAT_TOTAL, 309 NUTRITION_RECORD_SELENIUM_TOTAL, 310 NUTRITION_RECORD_SODIUM_TOTAL, 311 NUTRITION_RECORD_SUGAR_TOTAL, 312 NUTRITION_RECORD_THIAMIN_TOTAL, 313 NUTRITION_RECORD_TOTAL_CARBOHYDRATE_TOTAL, 314 NUTRITION_RECORD_TOTAL_FAT_TOTAL, 315 NUTRITION_RECORD_UNSATURATED_FAT_TOTAL, 316 NUTRITION_RECORD_VITAMIN_A_TOTAL, 317 NUTRITION_RECORD_VITAMIN_B12_TOTAL, 318 NUTRITION_RECORD_VITAMIN_B6_TOTAL, 319 NUTRITION_RECORD_VITAMIN_C_TOTAL, 320 NUTRITION_RECORD_VITAMIN_D_TOTAL, 321 NUTRITION_RECORD_VITAMIN_E_TOTAL, 322 NUTRITION_RECORD_VITAMIN_K_TOTAL, 323 NUTRITION_RECORD_ZINC_TOTAL, 324 HEIGHT_RECORD_HEIGHT_AVG, 325 HEIGHT_RECORD_HEIGHT_MAX, 326 HEIGHT_RECORD_HEIGHT_MIN, 327 RESTING_HEART_RATE_RECORD_BPM_MAX, 328 RESTING_HEART_RATE_RECORD_BPM_MIN, 329 TOTAL_CALORIES_BURNED_RECORD_ENERGY_TOTAL, 330 WEIGHT_RECORD_WEIGHT_AVG, 331 WEIGHT_RECORD_WEIGHT_MAX, 332 WEIGHT_RECORD_WEIGHT_MIN, 333 WHEEL_CHAIR_PUSHES_RECORD_COUNT_TOTAL, 334 HEART_RATE_RECORD_MEASUREMENTS_COUNT, 335 RESTING_HEART_RATE_RECORD_BPM_AVG, 336 SLEEP_SESSION_DURATION_TOTAL, 337 EXERCISE_SESSION_DURATION_TOTAL 338 }) 339 @Retention(RetentionPolicy.SOURCE) 340 @interface Id {} 341 } 342 343 /** 344 * Valid set of values for this IntDef. Update this set when add new type or deprecate existing 345 * type. 346 * 347 * @hide 348 */ 349 public static final Set<Integer> OPERATION_VALID_TYPES = Set.of(MAX, MIN, AVG, SUM, COUNT); 350 351 /** @hide */ 352 @IntDef({MAX, MIN, AVG, SUM, COUNT}) 353 @Retention(RetentionPolicy.SOURCE) 354 public @interface AggregateOperationType {} 355 } 356