1 /*
2  * Copyright (C) 2024 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.healthconnect.cts.lib;
18 
19 import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_MODERATE;
20 import static android.health.connect.datatypes.ActivityIntensityRecord.ACTIVITY_INTENSITY_TYPE_VIGOROUS;
21 import static android.healthconnect.cts.lib.BundleHelper.PREFIX;
22 
23 import android.health.connect.datatypes.ActivityIntensityRecord;
24 import android.health.connect.datatypes.Metadata;
25 import android.os.Bundle;
26 
27 import androidx.annotation.Nullable;
28 
29 import java.time.Instant;
30 import java.time.ZoneOffset;
31 
32 public final class ActivityIntensityRecordFactory extends RecordFactory<ActivityIntensityRecord> {
33 
34     private static final String KEY_TYPE = PREFIX + "TYPE";
35 
36     @Override
newFullRecord( Metadata metadata, Instant startTime, Instant endTime)37     public ActivityIntensityRecord newFullRecord(
38             Metadata metadata, Instant startTime, Instant endTime) {
39         return new ActivityIntensityRecord.Builder(
40                         metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_VIGOROUS)
41                 .setStartZoneOffset(ZoneOffset.ofHours(3))
42                 .setEndZoneOffset(ZoneOffset.ofHours(-2))
43                 .build();
44     }
45 
46     @Override
anotherFullRecord( Metadata metadata, Instant startTime, Instant endTime)47     public ActivityIntensityRecord anotherFullRecord(
48             Metadata metadata, Instant startTime, Instant endTime) {
49         return new ActivityIntensityRecord.Builder(
50                         metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_MODERATE)
51                 .setStartZoneOffset(ZoneOffset.ofHours(-1))
52                 .setEndZoneOffset(ZoneOffset.ofHours(2))
53                 .build();
54     }
55 
56     @Override
newEmptyRecord( Metadata metadata, Instant startTime, Instant endTime)57     public ActivityIntensityRecord newEmptyRecord(
58             Metadata metadata, Instant startTime, Instant endTime) {
59         return new ActivityIntensityRecord.Builder(
60                         metadata, startTime, endTime, ACTIVITY_INTENSITY_TYPE_MODERATE)
61                 .build();
62     }
63 
64     @Override
recordWithMetadata( ActivityIntensityRecord record, Metadata metadata)65     protected ActivityIntensityRecord recordWithMetadata(
66             ActivityIntensityRecord record, Metadata metadata) {
67         return new ActivityIntensityRecord.Builder(
68                         metadata,
69                         record.getStartTime(),
70                         record.getEndTime(),
71                         record.getActivityIntensityType())
72                 .setStartZoneOffset(record.getStartZoneOffset())
73                 .setEndZoneOffset(record.getEndZoneOffset())
74                 .build();
75     }
76 
77     @Override
getValuesBundleForRecord(ActivityIntensityRecord record)78     protected Bundle getValuesBundleForRecord(ActivityIntensityRecord record) {
79         Bundle values = new Bundle();
80         values.putInt(KEY_TYPE, record.getActivityIntensityType());
81         return values;
82     }
83 
84     @Override
newRecordFromValuesBundle( Metadata metadata, Instant startTime, Instant endTime, ZoneOffset startZoneOffset, ZoneOffset endZoneOffset, Bundle bundle)85     public ActivityIntensityRecord newRecordFromValuesBundle(
86             Metadata metadata,
87             Instant startTime,
88             Instant endTime,
89             ZoneOffset startZoneOffset,
90             ZoneOffset endZoneOffset,
91             Bundle bundle) {
92         int type = bundle.getInt(KEY_TYPE);
93         return new ActivityIntensityRecord.Builder(metadata, startTime, endTime, type)
94                 .setStartZoneOffset(startZoneOffset)
95                 .setEndZoneOffset(endZoneOffset)
96                 .build();
97     }
98 
99     /** Creates a new {@link ActivityIntensityRecord} with empty metadata. */
newRecord(Instant startTime, Instant endTime, int type)100     public ActivityIntensityRecord newRecord(Instant startTime, Instant endTime, int type) {
101         return newRecord(startTime, endTime, type, null, null);
102     }
103 
104     /** Creates a new {@link ActivityIntensityRecord} with empty metadata. */
newRecord( Instant startTime, Instant endTime, int type, @Nullable ZoneOffset startZoneOffset, @Nullable ZoneOffset endZoneOffset)105     public ActivityIntensityRecord newRecord(
106             Instant startTime,
107             Instant endTime,
108             int type,
109             @Nullable ZoneOffset startZoneOffset,
110             @Nullable ZoneOffset endZoneOffset) {
111         var builder =
112                 new ActivityIntensityRecord.Builder(newEmptyMetadata(), startTime, endTime, type);
113 
114         if (startZoneOffset != null) {
115             builder.setStartZoneOffset(startZoneOffset);
116         }
117 
118         if (endZoneOffset != null) {
119             builder.setEndZoneOffset(endZoneOffset);
120         }
121 
122         return builder.build();
123     }
124 }
125