• 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.internal.datatypes;
18 
19 import android.annotation.NonNull;
20 import android.health.connect.datatypes.SleepSessionRecord;
21 import android.os.Parcel;
22 
23 import com.android.internal.annotations.VisibleForTesting;
24 
25 import java.time.Instant;
26 import java.util.ArrayList;
27 import java.util.List;
28 import java.util.Objects;
29 
30 /**
31  * Internal {@link SleepSessionRecord.Stage}. Part of {@link SleepSessionRecordInternal}
32  *
33  * @hide
34  */
35 public final class SleepStageInternal {
36     private long mStartTime;
37     private long mEndTime;
38     @SleepSessionRecord.StageType.StageTypes private int mStageType;
39 
40     /** Reads record from parcel. */
41     @VisibleForTesting
readFromParcel(Parcel parcel)42     public static SleepStageInternal readFromParcel(Parcel parcel) {
43         return new SleepStageInternal()
44                 .setStartTime(parcel.readLong())
45                 .setEndTime(parcel.readLong())
46                 .setStageType(parcel.readInt());
47     }
48 
populateStagesFromParcel(Parcel parcel)49     static List<SleepStageInternal> populateStagesFromParcel(Parcel parcel) {
50         int size = parcel.readInt();
51         if (size == 0) {
52             return null;
53         }
54         ArrayList<SleepStageInternal> stages = new ArrayList<>(size);
55         for (int i = 0; i < size; i++) {
56             stages.add(SleepStageInternal.readFromParcel(parcel));
57         }
58         return stages;
59     }
60 
getExternalStages( @onNull List<SleepStageInternal> internalStages)61     static List<SleepSessionRecord.Stage> getExternalStages(
62             @NonNull List<SleepStageInternal> internalStages) {
63         List<SleepSessionRecord.Stage> externalStages = new ArrayList<>(internalStages.size());
64         internalStages.forEach((stage) -> externalStages.add(stage.toExternalRecord()));
65         return externalStages;
66     }
67 
writeStagesToParcel(List<SleepStageInternal> stages, Parcel parcel)68     static void writeStagesToParcel(List<SleepStageInternal> stages, Parcel parcel) {
69         if (stages == null) {
70             parcel.writeInt(0);
71             return;
72         }
73         parcel.writeInt(stages.size());
74         stages.forEach((stage) -> stage.writeToParcel(parcel));
75     }
76 
77     /** Writes record to parcel. */
78     @VisibleForTesting
writeToParcel(Parcel parcel)79     public void writeToParcel(Parcel parcel) {
80         parcel.writeLong(mStartTime);
81         parcel.writeLong(mEndTime);
82         parcel.writeInt(mStageType);
83     }
84 
85     /** Sets stage type. Returns record with type set. */
86     @VisibleForTesting
toExternalRecord()87     public SleepSessionRecord.Stage toExternalRecord() {
88         return new SleepSessionRecord.Stage(
89                 Instant.ofEpochMilli(getStartTime()),
90                 Instant.ofEpochMilli(getEndTime()),
91                 getStageType());
92     }
93 
94     /** Sets stage start time. Returns record with start time set. */
setStartTime(long startTime)95     public SleepStageInternal setStartTime(long startTime) {
96         mStartTime = startTime;
97         return this;
98     }
99 
100     /** Sets stage end time. Returns record with end time set. */
setEndTime(long endTime)101     public SleepStageInternal setEndTime(long endTime) {
102         mEndTime = endTime;
103         return this;
104     }
105 
106     /** Returns stage start time. */
getStartTime()107     public long getStartTime() {
108         return mStartTime;
109     }
110 
111     /** Returns stage end time. */
getEndTime()112     public long getEndTime() {
113         return mEndTime;
114     }
115 
116     /** Returns stage type. */
117     @SleepSessionRecord.StageType.StageTypes
getStageType()118     public int getStageType() {
119         return mStageType;
120     }
121 
122     /** Sets stage type. Returns record with type set. */
setStageType(@leepSessionRecord.StageType.StageTypes int stageType)123     public SleepStageInternal setStageType(@SleepSessionRecord.StageType.StageTypes int stageType) {
124         mStageType = stageType;
125         return this;
126     }
127 
128     @Override
equals(Object o)129     public boolean equals(Object o) {
130         if (this == o) return true;
131         if (!(o instanceof SleepStageInternal)) return false;
132         SleepStageInternal that = (SleepStageInternal) o;
133         return mStartTime == that.mStartTime
134                 && mEndTime == that.mEndTime
135                 && mStageType == that.mStageType;
136     }
137 
138     @Override
hashCode()139     public int hashCode() {
140         return Objects.hash(mStartTime, mEndTime, mStageType);
141     }
142 }
143