1 /* 2 * Copyright (C) 2020 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.view.translation; 18 19 import android.annotation.IntDef; 20 import android.annotation.NonNull; 21 import android.os.Parcel; 22 import android.os.Parcelable; 23 import android.util.SparseArray; 24 25 import com.android.internal.util.DataClass; 26 27 import java.lang.annotation.Retention; 28 import java.lang.annotation.RetentionPolicy; 29 import java.util.Objects; 30 31 /** 32 * Response from the translation service, which contains the translated result. 33 */ 34 @DataClass(genBuilder = true, genToString = true, genHiddenConstDefs = true) 35 public final class TranslationResponse implements Parcelable { 36 37 /** 38 * The translation service was successful in translating. 39 */ 40 public static final int TRANSLATION_STATUS_SUCCESS = 0; 41 /** 42 * The translation service returned unknown translation result. 43 */ 44 public static final int TRANSLATION_STATUS_UNKNOWN_ERROR = 1; 45 /** 46 * The languages of the request is not available to be translated. 47 */ 48 public static final int TRANSLATION_STATUS_CONTEXT_UNSUPPORTED = 2; 49 50 /** 51 * The translation result status code. 52 */ 53 private final @TranslationStatus int mTranslationStatus; 54 55 /** 56 * List of translated {@link TranslationResponseValue}s. The key of entries in this list 57 * will be their respective index in {@link TranslationRequest#getTranslationRequestValues()}. 58 */ 59 @NonNull 60 private final SparseArray<TranslationResponseValue> mTranslationResponseValues; 61 62 /** 63 * List of translated {@link ViewTranslationResponse}s. The key of entries in this list 64 * will be their respective index in {@link TranslationRequest#getViewTranslationRequests()}. 65 */ 66 @NonNull 67 private final SparseArray<ViewTranslationResponse> mViewTranslationResponses; 68 69 /** 70 * Whether this response contains complete translated values, or is the final response in a 71 * series of partial responses. 72 * 73 * <p>This is {@code true} by default.</p> 74 */ 75 private final boolean mFinalResponse; 76 77 abstract static class BaseBuilder { 78 79 /** 80 * @removed Use {@link Builder#Builder(int)}. 81 * @hide 82 */ 83 @Deprecated setTranslationStatus(@ranslationStatus int value)84 public abstract Builder setTranslationStatus(@TranslationStatus int value); 85 86 /** 87 * Adds {@link TranslationResponseValue} to be translated. The input 88 * TranslationResponseValue format should match those provided by the 89 * {@link android.view.translation.Translator}'s targetSpec. 90 * 91 * @param value the translated value. 92 * @return this Builder. 93 */ 94 @NonNull 95 @SuppressWarnings("MissingGetterMatchingBuilder") setTranslationResponseValue(int index, @NonNull TranslationResponseValue value)96 public Builder setTranslationResponseValue(int index, 97 @NonNull TranslationResponseValue value) { 98 Objects.requireNonNull(value, "value should not be null"); 99 final Builder builder = (Builder) this; 100 101 if (builder.mTranslationResponseValues == null) { 102 builder.setTranslationResponseValues(new SparseArray<>()); 103 } 104 builder.mTranslationResponseValues.put(index, value); 105 return builder; 106 } 107 108 /** 109 * Sets the list of {@link ViewTranslationResponse} to be translated. The input 110 * ViewTranslationResponse contains {@link TranslationResponseValue}s whose format should 111 * match those provided by the {@link android.view.translation.Translator}'s targetSpec. 112 * 113 * @param response the translated response. 114 * @return this Builder. 115 */ 116 @NonNull 117 @SuppressWarnings("MissingGetterMatchingBuilder") setViewTranslationResponse(int index, @NonNull ViewTranslationResponse response)118 public Builder setViewTranslationResponse(int index, 119 @NonNull ViewTranslationResponse response) { 120 Objects.requireNonNull(response, "value should not be null"); 121 final Builder builder = (Builder) this; 122 123 if (builder.mViewTranslationResponses == null) { 124 builder.setViewTranslationResponses(new SparseArray<>()); 125 } 126 builder.mViewTranslationResponses.put(index, response); 127 return builder; 128 } 129 } 130 defaultTranslationResponseValues()131 private static SparseArray<TranslationResponseValue> defaultTranslationResponseValues() { 132 return new SparseArray<>(); 133 } 134 defaultViewTranslationResponses()135 private static SparseArray<ViewTranslationResponse> defaultViewTranslationResponses() { 136 return new SparseArray<>(); 137 } 138 defaultFinalResponse()139 private static boolean defaultFinalResponse() { 140 return true; 141 } 142 143 144 145 146 // Code below generated by codegen v1.0.23. 147 // 148 // DO NOT MODIFY! 149 // CHECKSTYLE:OFF Generated code 150 // 151 // To regenerate run: 152 // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/view/translation/TranslationResponse.java 153 // 154 // To exclude the generated code from IntelliJ auto-formatting enable (one-time): 155 // Settings > Editor > Code Style > Formatter Control 156 //@formatter:off 157 158 159 /** @hide */ 160 @IntDef(prefix = "TRANSLATION_STATUS_", value = { 161 TRANSLATION_STATUS_SUCCESS, 162 TRANSLATION_STATUS_UNKNOWN_ERROR, 163 TRANSLATION_STATUS_CONTEXT_UNSUPPORTED 164 }) 165 @Retention(RetentionPolicy.SOURCE) 166 @DataClass.Generated.Member 167 public @interface TranslationStatus {} 168 169 /** @hide */ 170 @DataClass.Generated.Member translationStatusToString(@ranslationStatus int value)171 public static String translationStatusToString(@TranslationStatus int value) { 172 switch (value) { 173 case TRANSLATION_STATUS_SUCCESS: 174 return "TRANSLATION_STATUS_SUCCESS"; 175 case TRANSLATION_STATUS_UNKNOWN_ERROR: 176 return "TRANSLATION_STATUS_UNKNOWN_ERROR"; 177 case TRANSLATION_STATUS_CONTEXT_UNSUPPORTED: 178 return "TRANSLATION_STATUS_CONTEXT_UNSUPPORTED"; 179 default: return Integer.toHexString(value); 180 } 181 } 182 183 @DataClass.Generated.Member TranslationResponse( @ranslationStatus int translationStatus, @NonNull SparseArray<TranslationResponseValue> translationResponseValues, @NonNull SparseArray<ViewTranslationResponse> viewTranslationResponses, boolean finalResponse)184 /* package-private */ TranslationResponse( 185 @TranslationStatus int translationStatus, 186 @NonNull SparseArray<TranslationResponseValue> translationResponseValues, 187 @NonNull SparseArray<ViewTranslationResponse> viewTranslationResponses, 188 boolean finalResponse) { 189 this.mTranslationStatus = translationStatus; 190 191 if (!(mTranslationStatus == TRANSLATION_STATUS_SUCCESS) 192 && !(mTranslationStatus == TRANSLATION_STATUS_UNKNOWN_ERROR) 193 && !(mTranslationStatus == TRANSLATION_STATUS_CONTEXT_UNSUPPORTED)) { 194 throw new java.lang.IllegalArgumentException( 195 "translationStatus was " + mTranslationStatus + " but must be one of: " 196 + "TRANSLATION_STATUS_SUCCESS(" + TRANSLATION_STATUS_SUCCESS + "), " 197 + "TRANSLATION_STATUS_UNKNOWN_ERROR(" + TRANSLATION_STATUS_UNKNOWN_ERROR + "), " 198 + "TRANSLATION_STATUS_CONTEXT_UNSUPPORTED(" + TRANSLATION_STATUS_CONTEXT_UNSUPPORTED + ")"); 199 } 200 201 this.mTranslationResponseValues = translationResponseValues; 202 com.android.internal.util.AnnotationValidations.validate( 203 NonNull.class, null, mTranslationResponseValues); 204 this.mViewTranslationResponses = viewTranslationResponses; 205 com.android.internal.util.AnnotationValidations.validate( 206 NonNull.class, null, mViewTranslationResponses); 207 this.mFinalResponse = finalResponse; 208 209 // onConstructed(); // You can define this method to get a callback 210 } 211 212 /** 213 * The translation result status code. 214 */ 215 @DataClass.Generated.Member getTranslationStatus()216 public @TranslationStatus int getTranslationStatus() { 217 return mTranslationStatus; 218 } 219 220 /** 221 * List of translated {@link TranslationResponseValue}s. The key of entries in this list 222 * will be their respective index in {@link TranslationRequest#getTranslationRequestValues()}. 223 */ 224 @DataClass.Generated.Member getTranslationResponseValues()225 public @NonNull SparseArray<TranslationResponseValue> getTranslationResponseValues() { 226 return mTranslationResponseValues; 227 } 228 229 /** 230 * List of translated {@link ViewTranslationResponse}s. The key of entries in this list 231 * will be their respective index in {@link TranslationRequest#getViewTranslationRequests()}. 232 */ 233 @DataClass.Generated.Member getViewTranslationResponses()234 public @NonNull SparseArray<ViewTranslationResponse> getViewTranslationResponses() { 235 return mViewTranslationResponses; 236 } 237 238 /** 239 * Whether this response contains complete translated values, or is the final response in a 240 * series of partial responses. 241 * 242 * <p>This is {@code true} by default.</p> 243 */ 244 @DataClass.Generated.Member isFinalResponse()245 public boolean isFinalResponse() { 246 return mFinalResponse; 247 } 248 249 @Override 250 @DataClass.Generated.Member toString()251 public String toString() { 252 // You can override field toString logic by defining methods like: 253 // String fieldNameToString() { ... } 254 255 return "TranslationResponse { " + 256 "translationStatus = " + translationStatusToString(mTranslationStatus) + ", " + 257 "translationResponseValues = " + mTranslationResponseValues + ", " + 258 "viewTranslationResponses = " + mViewTranslationResponses + ", " + 259 "finalResponse = " + mFinalResponse + 260 " }"; 261 } 262 263 @Override 264 @DataClass.Generated.Member writeToParcel(@onNull Parcel dest, int flags)265 public void writeToParcel(@NonNull Parcel dest, int flags) { 266 // You can override field parcelling by defining methods like: 267 // void parcelFieldName(Parcel dest, int flags) { ... } 268 269 byte flg = 0; 270 if (mFinalResponse) flg |= 0x8; 271 dest.writeByte(flg); 272 dest.writeInt(mTranslationStatus); 273 dest.writeSparseArray(mTranslationResponseValues); 274 dest.writeSparseArray(mViewTranslationResponses); 275 } 276 277 @Override 278 @DataClass.Generated.Member describeContents()279 public int describeContents() { return 0; } 280 281 /** @hide */ 282 @SuppressWarnings({"unchecked", "RedundantCast"}) 283 @DataClass.Generated.Member TranslationResponse(@onNull Parcel in)284 /* package-private */ TranslationResponse(@NonNull Parcel in) { 285 // You can override field unparcelling by defining methods like: 286 // static FieldType unparcelFieldName(Parcel in) { ... } 287 288 byte flg = in.readByte(); 289 boolean finalResponse = (flg & 0x8) != 0; 290 int translationStatus = in.readInt(); 291 SparseArray<TranslationResponseValue> translationResponseValues = (SparseArray) in.readSparseArray(TranslationResponseValue.class.getClassLoader()); 292 SparseArray<ViewTranslationResponse> viewTranslationResponses = (SparseArray) in.readSparseArray(ViewTranslationResponse.class.getClassLoader()); 293 294 this.mTranslationStatus = translationStatus; 295 296 if (!(mTranslationStatus == TRANSLATION_STATUS_SUCCESS) 297 && !(mTranslationStatus == TRANSLATION_STATUS_UNKNOWN_ERROR) 298 && !(mTranslationStatus == TRANSLATION_STATUS_CONTEXT_UNSUPPORTED)) { 299 throw new java.lang.IllegalArgumentException( 300 "translationStatus was " + mTranslationStatus + " but must be one of: " 301 + "TRANSLATION_STATUS_SUCCESS(" + TRANSLATION_STATUS_SUCCESS + "), " 302 + "TRANSLATION_STATUS_UNKNOWN_ERROR(" + TRANSLATION_STATUS_UNKNOWN_ERROR + "), " 303 + "TRANSLATION_STATUS_CONTEXT_UNSUPPORTED(" + TRANSLATION_STATUS_CONTEXT_UNSUPPORTED + ")"); 304 } 305 306 this.mTranslationResponseValues = translationResponseValues; 307 com.android.internal.util.AnnotationValidations.validate( 308 NonNull.class, null, mTranslationResponseValues); 309 this.mViewTranslationResponses = viewTranslationResponses; 310 com.android.internal.util.AnnotationValidations.validate( 311 NonNull.class, null, mViewTranslationResponses); 312 this.mFinalResponse = finalResponse; 313 314 // onConstructed(); // You can define this method to get a callback 315 } 316 317 @DataClass.Generated.Member 318 public static final @NonNull Parcelable.Creator<TranslationResponse> CREATOR 319 = new Parcelable.Creator<TranslationResponse>() { 320 @Override 321 public TranslationResponse[] newArray(int size) { 322 return new TranslationResponse[size]; 323 } 324 325 @Override 326 public TranslationResponse createFromParcel(@NonNull Parcel in) { 327 return new TranslationResponse(in); 328 } 329 }; 330 331 /** 332 * A builder for {@link TranslationResponse} 333 */ 334 @SuppressWarnings("WeakerAccess") 335 @DataClass.Generated.Member 336 public static final class Builder extends BaseBuilder { 337 338 private @TranslationStatus int mTranslationStatus; 339 private @NonNull SparseArray<TranslationResponseValue> mTranslationResponseValues; 340 private @NonNull SparseArray<ViewTranslationResponse> mViewTranslationResponses; 341 private boolean mFinalResponse; 342 343 private long mBuilderFieldsSet = 0L; 344 345 /** 346 * Creates a new Builder. 347 * 348 * @param translationStatus 349 * The translation result status code. 350 */ Builder( @ranslationStatus int translationStatus)351 public Builder( 352 @TranslationStatus int translationStatus) { 353 mTranslationStatus = translationStatus; 354 355 if (!(mTranslationStatus == TRANSLATION_STATUS_SUCCESS) 356 && !(mTranslationStatus == TRANSLATION_STATUS_UNKNOWN_ERROR) 357 && !(mTranslationStatus == TRANSLATION_STATUS_CONTEXT_UNSUPPORTED)) { 358 throw new java.lang.IllegalArgumentException( 359 "translationStatus was " + mTranslationStatus + " but must be one of: " 360 + "TRANSLATION_STATUS_SUCCESS(" + TRANSLATION_STATUS_SUCCESS + "), " 361 + "TRANSLATION_STATUS_UNKNOWN_ERROR(" + TRANSLATION_STATUS_UNKNOWN_ERROR + "), " 362 + "TRANSLATION_STATUS_CONTEXT_UNSUPPORTED(" + TRANSLATION_STATUS_CONTEXT_UNSUPPORTED + ")"); 363 } 364 365 } 366 367 /** 368 * The translation result status code. 369 * @removed 370 */ 371 @DataClass.Generated.Member 372 @Override 373 @Deprecated setTranslationStatus(@ranslationStatus int value)374 public @NonNull Builder setTranslationStatus(@TranslationStatus int value) { 375 checkNotUsed(); 376 mBuilderFieldsSet |= 0x1; 377 mTranslationStatus = value; 378 return this; 379 } 380 381 /** 382 * List of translated {@link TranslationResponseValue}s. The key of entries in this list 383 * will be their respective index in {@link TranslationRequest#getTranslationRequestValues()}. 384 */ 385 @DataClass.Generated.Member setTranslationResponseValues(@onNull SparseArray<TranslationResponseValue> value)386 public @NonNull Builder setTranslationResponseValues(@NonNull SparseArray<TranslationResponseValue> value) { 387 checkNotUsed(); 388 mBuilderFieldsSet |= 0x2; 389 mTranslationResponseValues = value; 390 return this; 391 } 392 393 /** 394 * List of translated {@link ViewTranslationResponse}s. The key of entries in this list 395 * will be their respective index in {@link TranslationRequest#getViewTranslationRequests()}. 396 */ 397 @DataClass.Generated.Member setViewTranslationResponses(@onNull SparseArray<ViewTranslationResponse> value)398 public @NonNull Builder setViewTranslationResponses(@NonNull SparseArray<ViewTranslationResponse> value) { 399 checkNotUsed(); 400 mBuilderFieldsSet |= 0x4; 401 mViewTranslationResponses = value; 402 return this; 403 } 404 405 /** 406 * Whether this response contains complete translated values, or is the final response in a 407 * series of partial responses. 408 * 409 * <p>This is {@code true} by default.</p> 410 */ 411 @DataClass.Generated.Member setFinalResponse(boolean value)412 public @NonNull Builder setFinalResponse(boolean value) { 413 checkNotUsed(); 414 mBuilderFieldsSet |= 0x8; 415 mFinalResponse = value; 416 return this; 417 } 418 419 /** Builds the instance. This builder should not be touched after calling this! */ build()420 public @NonNull TranslationResponse build() { 421 checkNotUsed(); 422 mBuilderFieldsSet |= 0x10; // Mark builder used 423 424 if ((mBuilderFieldsSet & 0x2) == 0) { 425 mTranslationResponseValues = defaultTranslationResponseValues(); 426 } 427 if ((mBuilderFieldsSet & 0x4) == 0) { 428 mViewTranslationResponses = defaultViewTranslationResponses(); 429 } 430 if ((mBuilderFieldsSet & 0x8) == 0) { 431 mFinalResponse = defaultFinalResponse(); 432 } 433 TranslationResponse o = new TranslationResponse( 434 mTranslationStatus, 435 mTranslationResponseValues, 436 mViewTranslationResponses, 437 mFinalResponse); 438 return o; 439 } 440 checkNotUsed()441 private void checkNotUsed() { 442 if ((mBuilderFieldsSet & 0x10) != 0) { 443 throw new IllegalStateException( 444 "This Builder should not be reused. Use a new Builder instance instead"); 445 } 446 } 447 } 448 449 @DataClass.Generated( 450 time = 1621972659130L, 451 codegenVersion = "1.0.23", 452 sourceFile = "frameworks/base/core/java/android/view/translation/TranslationResponse.java", 453 inputSignatures = "public static final int TRANSLATION_STATUS_SUCCESS\npublic static final int TRANSLATION_STATUS_UNKNOWN_ERROR\npublic static final int TRANSLATION_STATUS_CONTEXT_UNSUPPORTED\nprivate final @android.view.translation.TranslationResponse.TranslationStatus int mTranslationStatus\nprivate final @android.annotation.NonNull android.util.SparseArray<android.view.translation.TranslationResponseValue> mTranslationResponseValues\nprivate final @android.annotation.NonNull android.util.SparseArray<android.view.translation.ViewTranslationResponse> mViewTranslationResponses\nprivate final boolean mFinalResponse\nprivate static android.util.SparseArray<android.view.translation.TranslationResponseValue> defaultTranslationResponseValues()\nprivate static android.util.SparseArray<android.view.translation.ViewTranslationResponse> defaultViewTranslationResponses()\nprivate static boolean defaultFinalResponse()\nclass TranslationResponse extends java.lang.Object implements [android.os.Parcelable]\npublic abstract @java.lang.Deprecated android.view.translation.TranslationResponse.Builder setTranslationStatus(int)\npublic @android.annotation.NonNull @java.lang.SuppressWarnings android.view.translation.TranslationResponse.Builder setTranslationResponseValue(int,android.view.translation.TranslationResponseValue)\npublic @android.annotation.NonNull @java.lang.SuppressWarnings android.view.translation.TranslationResponse.Builder setViewTranslationResponse(int,android.view.translation.ViewTranslationResponse)\nclass BaseBuilder extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genBuilder=true, genToString=true, genHiddenConstDefs=true)\npublic abstract @java.lang.Deprecated android.view.translation.TranslationResponse.Builder setTranslationStatus(int)\npublic @android.annotation.NonNull @java.lang.SuppressWarnings android.view.translation.TranslationResponse.Builder setTranslationResponseValue(int,android.view.translation.TranslationResponseValue)\npublic @android.annotation.NonNull @java.lang.SuppressWarnings android.view.translation.TranslationResponse.Builder setViewTranslationResponse(int,android.view.translation.ViewTranslationResponse)\nclass BaseBuilder extends java.lang.Object implements []") 454 @Deprecated __metadata()455 private void __metadata() {} 456 457 458 //@formatter:on 459 // End of generated code 460 461 } 462