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