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