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 package android.health.connect; 17 18 import static android.health.connect.Constants.DEFAULT_PAGE_SIZE; 19 import static android.health.connect.Constants.MAXIMUM_PAGE_SIZE; 20 import static android.health.connect.Constants.MINIMUM_PAGE_SIZE; 21 import static android.health.connect.datatypes.validation.ValidationUtils.requireInRange; 22 23 import static com.android.healthfitness.flags.Flags.FLAG_PERSONAL_HEALTH_RECORD; 24 25 import static java.util.Objects.hash; 26 import static java.util.Objects.requireNonNull; 27 28 import android.annotation.FlaggedApi; 29 import android.annotation.IntRange; 30 import android.annotation.NonNull; 31 import android.health.connect.aidl.ReadMedicalResourcesRequestParcel; 32 33 /** 34 * A page read request with specified {@code pageToken} for {@link 35 * HealthConnectManager#readMedicalResources}. 36 * 37 * <p>When making a new initial request with new filters, use {@link 38 * ReadMedicalResourcesInitialRequest}. 39 * 40 * <p>Example usage: 41 * 42 * <pre>{@code 43 * ReadMedicalResourcesInitialRequest initialRequest 44 * = new ReadMedicalResourcesInitialRequest.Builder(...).build(); 45 * ReadMedicalResourcesResponse response = makeRequest(initialRequest); 46 * String pageToken = response.getNextPageToken(); 47 * 48 * while (pageToken != null) { 49 * ReadMedicalResourcesPageRequest pageRequest = new ReadMedicalResourcesPageRequest(pageToken); 50 * response = makeRequest(pageRequest); 51 * pageToken = response.getNextPageToken(); 52 * } 53 * }</pre> 54 */ 55 @FlaggedApi(FLAG_PERSONAL_HEALTH_RECORD) 56 public final class ReadMedicalResourcesPageRequest extends ReadMedicalResourcesRequest { 57 @NonNull private final String mPageToken; 58 59 /** 60 * Creates a new instance of {@link ReadMedicalResourcesPageRequest}. Please see {@link 61 * ReadMedicalResourcesPageRequest.Builder} for more detailed parameters information. 62 */ ReadMedicalResourcesPageRequest( @onNull String pageToken, @IntRange(from = MINIMUM_PAGE_SIZE, to = MAXIMUM_PAGE_SIZE) int pageSize)63 private ReadMedicalResourcesPageRequest( 64 @NonNull String pageToken, 65 @IntRange(from = MINIMUM_PAGE_SIZE, to = MAXIMUM_PAGE_SIZE) int pageSize) { 66 super(pageSize); 67 requireNonNull(pageToken); 68 mPageToken = pageToken; 69 } 70 71 /** Returns the page token to read the requested page. */ 72 @NonNull getPageToken()73 public String getPageToken() { 74 return mPageToken; 75 } 76 77 @Override equals(Object o)78 public boolean equals(Object o) { 79 if (this == o) return true; 80 if (!(o instanceof ReadMedicalResourcesPageRequest that)) return false; 81 return getPageToken().equals(that.getPageToken()) && getPageSize() == that.getPageSize(); 82 } 83 84 @Override hashCode()85 public int hashCode() { 86 return hash(getPageToken(), getPageSize()); 87 } 88 89 @Override toString()90 public String toString() { 91 return this.getClass().getSimpleName() 92 + "{" 93 + "pageToken=" 94 + getPageToken() 95 + ",pageSize=" 96 + getPageSize() 97 + "}"; 98 } 99 100 /** 101 * Returns an instance of {@link ReadMedicalResourcesRequestParcel} to carry the request. 102 * 103 * @hide 104 */ toParcel()105 public ReadMedicalResourcesRequestParcel toParcel() { 106 return new ReadMedicalResourcesRequestParcel(this); 107 } 108 109 /** Builder class for {@link ReadMedicalResourcesPageRequest}. */ 110 public static final class Builder { 111 @NonNull private String mPageToken; 112 private int mPageSize = DEFAULT_PAGE_SIZE; 113 114 /** 115 * Constructs a new {@link ReadMedicalResourcesPageRequest} instance. 116 * 117 * @param pageToken The page token to read the requested page of the result, from the 118 * previous {@link ReadMedicalResourcesResponse#getNextPageToken()}. 119 */ Builder(@onNull String pageToken)120 public Builder(@NonNull String pageToken) { 121 requireNonNull(pageToken); 122 mPageToken = pageToken; 123 } 124 125 /** Constructs a clone of the other {@link ReadMedicalResourcesPageRequest.Builder}. */ Builder(@onNull Builder other)126 public Builder(@NonNull Builder other) { 127 mPageToken = other.mPageToken; 128 mPageSize = other.mPageSize; 129 } 130 131 /** Constructs a clone of the other {@link ReadMedicalResourcesPageRequest} instance. */ Builder(@onNull ReadMedicalResourcesPageRequest other)132 public Builder(@NonNull ReadMedicalResourcesPageRequest other) { 133 mPageToken = other.getPageToken(); 134 mPageSize = other.getPageSize(); 135 } 136 137 /** 138 * Sets page token to read the requested page of the result, from the previous {@link 139 * ReadMedicalResourcesResponse#getNextPageToken()}. 140 */ 141 @NonNull setPageToken(@onNull String pageToken)142 public Builder setPageToken(@NonNull String pageToken) { 143 requireNonNull(pageToken); 144 mPageToken = pageToken; 145 return this; 146 } 147 148 /** 149 * Sets the maximum number of {@code MedicalResource}s to be returned by the read operation. 150 * 151 * <p>If not set, default to 1000. 152 * 153 * @throws IllegalArgumentException if the provided {@code pageSize} is less than 1 or more 154 * than 5000. 155 */ 156 @NonNull setPageSize( @ntRangefrom = MINIMUM_PAGE_SIZE, to = MAXIMUM_PAGE_SIZE) int pageSize)157 public Builder setPageSize( 158 @IntRange(from = MINIMUM_PAGE_SIZE, to = MAXIMUM_PAGE_SIZE) int pageSize) { 159 requireInRange(pageSize, MINIMUM_PAGE_SIZE, MAXIMUM_PAGE_SIZE, "pageSize"); 160 mPageSize = pageSize; 161 return this; 162 } 163 164 /** 165 * Returns a new instance of {@link ReadMedicalResourcesPageRequest} with the specified 166 * parameters. 167 */ 168 @NonNull build()169 public ReadMedicalResourcesPageRequest build() { 170 return new ReadMedicalResourcesPageRequest(mPageToken, mPageSize); 171 } 172 } 173 } 174