• 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.migration;
18 
19 import static java.util.Objects.requireNonNull;
20 
21 import android.annotation.NonNull;
22 import android.annotation.Nullable;
23 import android.annotation.SystemApi;
24 import android.health.connect.datatypes.Record;
25 import android.health.connect.internal.datatypes.RecordInternal;
26 import android.health.connect.internal.datatypes.utils.InternalExternalRecordConverter;
27 import android.os.Parcel;
28 import android.os.Parcelable;
29 
30 /**
31  * Holds record migration data payload along with any migration-specific overrides.
32  *
33  * @hide
34  */
35 @SystemApi
36 public final class RecordMigrationPayload extends MigrationPayload implements Parcelable {
37 
38     @NonNull
39     public static final Creator<RecordMigrationPayload> CREATOR =
40             new Creator<>() {
41                 @Override
42                 public RecordMigrationPayload createFromParcel(Parcel in) {
43                     in.readInt(); // Skip the type
44                     return new RecordMigrationPayload(in);
45                 }
46 
47                 @Override
48                 public RecordMigrationPayload[] newArray(int size) {
49                     return new RecordMigrationPayload[size];
50                 }
51             };
52 
53     private final RecordInternal<?> mRecordInternal;
54     @Nullable private Record mRecord;
55 
RecordMigrationPayload( @onNull String originPackageName, @NonNull String originAppName, @NonNull Record record)56     private RecordMigrationPayload(
57             @NonNull String originPackageName,
58             @NonNull String originAppName,
59             @NonNull Record record) {
60         mRecordInternal = record.toRecordInternal();
61         mRecordInternal.setPackageName(originPackageName);
62         mRecordInternal.setAppName(originAppName);
63 
64         mRecord = record;
65     }
66 
RecordMigrationPayload(@onNull Parcel in)67     RecordMigrationPayload(@NonNull Parcel in) {
68         mRecordInternal =
69                 InternalExternalRecordConverter.getInstance().newInternalRecord(in.readInt());
70         mRecordInternal.populateUsing(in);
71     }
72 
73     @Override
writeToParcel(@onNull Parcel dest, int flags)74     public void writeToParcel(@NonNull Parcel dest, int flags) {
75         dest.writeInt(TYPE_RECORD);
76 
77         dest.writeInt(mRecordInternal.getRecordType());
78         mRecordInternal.writeToParcel(dest);
79     }
80 
81     @Override
describeContents()82     public int describeContents() {
83         return 0;
84     }
85 
86     /** Returns origin package name associated with this payload. */
87     @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
88     @NonNull
getOriginPackageName()89     public String getOriginPackageName() {
90         return mRecordInternal.getPackageName();
91     }
92 
93     /** Returns origin application name associated with this payload. */
94     @SuppressWarnings("NullAway") // TODO(b/317029272): fix this suppression
95     @NonNull
getOriginAppName()96     public String getOriginAppName() {
97         return mRecordInternal.getAppName();
98     }
99 
100     /** Returns {@link Record} associated with this payload. */
101     @NonNull
getRecord()102     public Record getRecord() {
103         if (mRecord == null) {
104             mRecord = mRecordInternal.toExternalRecord();
105         }
106 
107         return mRecord;
108     }
109 
110     /** @hide */
getRecordInternal()111     public RecordInternal<?> getRecordInternal() {
112         return mRecordInternal;
113     }
114 
115     /** Builder for {@link RecordMigrationPayload}. */
116     public static final class Builder {
117         private String mOriginPackageName;
118         private String mOriginAppName;
119         private Record mRecord;
120 
121         /**
122          * @param originPackageName package name of the application authored the record.
123          * @param originAppName name of the application authored the record.
124          * @param record a record to migrate.
125          */
Builder( @onNull String originPackageName, @NonNull String originAppName, @NonNull Record record)126         public Builder(
127                 @NonNull String originPackageName,
128                 @NonNull String originAppName,
129                 @NonNull Record record) {
130             requireNonNull(originPackageName);
131             requireNonNull(originAppName);
132             requireNonNull(record);
133 
134             mOriginPackageName = originPackageName;
135             mOriginAppName = originAppName;
136             mRecord = record;
137         }
138 
139         /** Sets the value for {@link RecordMigrationPayload#getOriginPackageName()}. */
140         @NonNull
setOriginPackageName(@onNull String originPackageName)141         public Builder setOriginPackageName(@NonNull String originPackageName) {
142             requireNonNull(originPackageName);
143             mOriginPackageName = originPackageName;
144             return this;
145         }
146 
147         /** Sets the value for {@link RecordMigrationPayload#getOriginAppName()} ()}. */
148         @NonNull
setOriginAppName(@onNull String originAppName)149         public Builder setOriginAppName(@NonNull String originAppName) {
150             requireNonNull(originAppName);
151             mOriginAppName = originAppName;
152             return this;
153         }
154 
155         /** Sets the value for {@link RecordMigrationPayload#getRecord()} ()}. */
156         @NonNull
setRecord(@onNull Record record)157         public Builder setRecord(@NonNull Record record) {
158             requireNonNull(record);
159             mRecord = record;
160             return this;
161         }
162 
163         /**
164          * Creates a new instance of {@link RecordMigrationPayload} with the specified arguments.
165          */
166         @NonNull
build()167         public RecordMigrationPayload build() {
168             return new RecordMigrationPayload(mOriginPackageName, mOriginAppName, mRecord);
169         }
170     }
171 }
172