• 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.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