1 /* 2 * Copyright (C) 2021 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.NonNull; 20 import android.annotation.Nullable; 21 import android.annotation.SystemApi; 22 import android.app.assist.ActivityId; 23 import android.os.Parcel; 24 import android.os.Parcelable; 25 26 import com.android.internal.util.DataClass; 27 28 import java.util.concurrent.Executor; 29 import java.util.function.Consumer; 30 31 /** 32 * Info class holding information for {@link Translator}s and used by 33 * {@link TranslationManager#createOnDeviceTranslator(TranslationContext, Executor, Consumer)}. 34 */ 35 @DataClass(genHiddenConstDefs = true, genToString = true, genBuilder = true) 36 public final class TranslationContext implements Parcelable { 37 38 /** 39 * This context will perform translations in low latency mode. 40 */ 41 public static final @TranslationFlag int FLAG_LOW_LATENCY = 0x1; 42 /** 43 * This context will enable the {@link Translator} to return transliteration results. 44 */ 45 public static final @TranslationFlag int FLAG_TRANSLITERATION = 0x2; 46 /** 47 * This context will enable the {@link Translator} to return dictionary definitions. 48 */ 49 public static final @TranslationFlag int FLAG_DEFINITIONS = 0x4; 50 51 /** 52 * {@link TranslationSpec} describing the source data to be translated. 53 */ 54 @NonNull 55 private final TranslationSpec mSourceSpec; 56 57 /** 58 * {@link TranslationSpec} describing the target translated data. 59 */ 60 @NonNull 61 private final TranslationSpec mTargetSpec; 62 63 /** 64 * Translation flags to be used by the {@link Translator} 65 */ 66 private final @TranslationFlag int mTranslationFlags; 67 defaultTranslationFlags()68 private static int defaultTranslationFlags() { 69 return 0; 70 } 71 72 /** 73 * The identifier for the Activity which needs UI translation. 74 * 75 * @hide 76 */ 77 @Nullable 78 private final ActivityId mActivityId; 79 defaultActivityId()80 private static ActivityId defaultActivityId() { 81 return null; 82 } 83 parcelActivityId(@onNull Parcel dest, int flags)84 private void parcelActivityId(@NonNull Parcel dest, int flags) { 85 dest.writeBoolean(mActivityId != null); 86 if (mActivityId != null) { 87 mActivityId.writeToParcel(dest, flags); 88 } 89 } 90 91 @Nullable unparcelActivityId(@onNull Parcel in)92 private ActivityId unparcelActivityId(@NonNull Parcel in) { 93 final boolean hasActivityId = in.readBoolean(); 94 return hasActivityId ? new ActivityId(in) : null; 95 } 96 97 /** 98 * Returns the identifier for the Activity which needs UI translation or {@code null} 99 * if it is a non-UI translation request. 100 * 101 * NOTE: If the application receiving this ActivityId also provides a ContentCaptureService, it 102 * can be used to associate a TranslationRequest with a particular ContentCaptureSession. 103 * 104 * @hide 105 */ 106 @SystemApi 107 @Nullable getActivityId()108 public ActivityId getActivityId() { 109 return mActivityId; 110 } 111 112 @DataClass.Suppress({"setSourceSpec", "setTargetSpec"}) 113 abstract static class BaseBuilder { 114 115 } 116 117 118 119 // Code below generated by codegen v1.0.23. 120 // 121 // DO NOT MODIFY! 122 // CHECKSTYLE:OFF Generated code 123 // 124 // To regenerate run: 125 // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/view/translation/TranslationContext.java 126 // 127 // To exclude the generated code from IntelliJ auto-formatting enable (one-time): 128 // Settings > Editor > Code Style > Formatter Control 129 //@formatter:off 130 131 132 /** @hide */ 133 @android.annotation.IntDef(flag = true, prefix = "FLAG_", value = { 134 FLAG_LOW_LATENCY, 135 FLAG_TRANSLITERATION, 136 FLAG_DEFINITIONS 137 }) 138 @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) 139 @DataClass.Generated.Member 140 public @interface TranslationFlag {} 141 142 /** @hide */ 143 @DataClass.Generated.Member translationFlagToString(@ranslationFlag int value)144 public static String translationFlagToString(@TranslationFlag int value) { 145 return com.android.internal.util.BitUtils.flagsToString( 146 value, TranslationContext::singleTranslationFlagToString); 147 } 148 149 @DataClass.Generated.Member singleTranslationFlagToString(@ranslationFlag int value)150 static String singleTranslationFlagToString(@TranslationFlag int value) { 151 switch (value) { 152 case FLAG_LOW_LATENCY: 153 return "FLAG_LOW_LATENCY"; 154 case FLAG_TRANSLITERATION: 155 return "FLAG_TRANSLITERATION"; 156 case FLAG_DEFINITIONS: 157 return "FLAG_DEFINITIONS"; 158 default: return Integer.toHexString(value); 159 } 160 } 161 162 @DataClass.Generated.Member TranslationContext( @onNull TranslationSpec sourceSpec, @NonNull TranslationSpec targetSpec, @TranslationFlag int translationFlags, @Nullable ActivityId activityId)163 /* package-private */ TranslationContext( 164 @NonNull TranslationSpec sourceSpec, 165 @NonNull TranslationSpec targetSpec, 166 @TranslationFlag int translationFlags, 167 @Nullable ActivityId activityId) { 168 this.mSourceSpec = sourceSpec; 169 com.android.internal.util.AnnotationValidations.validate( 170 NonNull.class, null, mSourceSpec); 171 this.mTargetSpec = targetSpec; 172 com.android.internal.util.AnnotationValidations.validate( 173 NonNull.class, null, mTargetSpec); 174 this.mTranslationFlags = translationFlags; 175 176 com.android.internal.util.Preconditions.checkFlagsArgument( 177 mTranslationFlags, 178 FLAG_LOW_LATENCY 179 | FLAG_TRANSLITERATION 180 | FLAG_DEFINITIONS); 181 this.mActivityId = activityId; 182 183 // onConstructed(); // You can define this method to get a callback 184 } 185 186 /** 187 * {@link TranslationSpec} describing the source data to be translated. 188 */ 189 @DataClass.Generated.Member getSourceSpec()190 public @NonNull TranslationSpec getSourceSpec() { 191 return mSourceSpec; 192 } 193 194 /** 195 * {@link TranslationSpec} describing the target translated data. 196 */ 197 @DataClass.Generated.Member getTargetSpec()198 public @NonNull TranslationSpec getTargetSpec() { 199 return mTargetSpec; 200 } 201 202 /** 203 * Translation flags to be used by the {@link Translator} 204 */ 205 @DataClass.Generated.Member getTranslationFlags()206 public @TranslationFlag int getTranslationFlags() { 207 return mTranslationFlags; 208 } 209 210 @Override 211 @DataClass.Generated.Member toString()212 public String toString() { 213 // You can override field toString logic by defining methods like: 214 // String fieldNameToString() { ... } 215 216 return "TranslationContext { " + 217 "sourceSpec = " + mSourceSpec + ", " + 218 "targetSpec = " + mTargetSpec + ", " + 219 "translationFlags = " + translationFlagToString(mTranslationFlags) + ", " + 220 "activityId = " + mActivityId + 221 " }"; 222 } 223 224 @Override 225 @DataClass.Generated.Member writeToParcel(@onNull Parcel dest, int flags)226 public void writeToParcel(@NonNull Parcel dest, int flags) { 227 // You can override field parcelling by defining methods like: 228 // void parcelFieldName(Parcel dest, int flags) { ... } 229 230 byte flg = 0; 231 if (mActivityId != null) flg |= 0x8; 232 dest.writeByte(flg); 233 dest.writeTypedObject(mSourceSpec, flags); 234 dest.writeTypedObject(mTargetSpec, flags); 235 dest.writeInt(mTranslationFlags); 236 parcelActivityId(dest, flags); 237 } 238 239 @Override 240 @DataClass.Generated.Member describeContents()241 public int describeContents() { return 0; } 242 243 /** @hide */ 244 @SuppressWarnings({"unchecked", "RedundantCast"}) 245 @DataClass.Generated.Member TranslationContext(@onNull Parcel in)246 /* package-private */ TranslationContext(@NonNull Parcel in) { 247 // You can override field unparcelling by defining methods like: 248 // static FieldType unparcelFieldName(Parcel in) { ... } 249 250 byte flg = in.readByte(); 251 TranslationSpec sourceSpec = (TranslationSpec) in.readTypedObject(TranslationSpec.CREATOR); 252 TranslationSpec targetSpec = (TranslationSpec) in.readTypedObject(TranslationSpec.CREATOR); 253 int translationFlags = in.readInt(); 254 ActivityId activityId = unparcelActivityId(in); 255 256 this.mSourceSpec = sourceSpec; 257 com.android.internal.util.AnnotationValidations.validate( 258 NonNull.class, null, mSourceSpec); 259 this.mTargetSpec = targetSpec; 260 com.android.internal.util.AnnotationValidations.validate( 261 NonNull.class, null, mTargetSpec); 262 this.mTranslationFlags = translationFlags; 263 264 com.android.internal.util.Preconditions.checkFlagsArgument( 265 mTranslationFlags, 266 FLAG_LOW_LATENCY 267 | FLAG_TRANSLITERATION 268 | FLAG_DEFINITIONS); 269 this.mActivityId = activityId; 270 271 // onConstructed(); // You can define this method to get a callback 272 } 273 274 @DataClass.Generated.Member 275 public static final @NonNull Parcelable.Creator<TranslationContext> CREATOR 276 = new Parcelable.Creator<TranslationContext>() { 277 @Override 278 public TranslationContext[] newArray(int size) { 279 return new TranslationContext[size]; 280 } 281 282 @Override 283 public TranslationContext createFromParcel(@NonNull Parcel in) { 284 return new TranslationContext(in); 285 } 286 }; 287 288 /** 289 * A builder for {@link TranslationContext} 290 */ 291 @SuppressWarnings("WeakerAccess") 292 @DataClass.Generated.Member 293 public static final class Builder extends BaseBuilder { 294 295 private @NonNull TranslationSpec mSourceSpec; 296 private @NonNull TranslationSpec mTargetSpec; 297 private @TranslationFlag int mTranslationFlags; 298 private @Nullable ActivityId mActivityId; 299 300 private long mBuilderFieldsSet = 0L; 301 302 /** 303 * Creates a new Builder. 304 * 305 * @param sourceSpec 306 * {@link TranslationSpec} describing the source data to be translated. 307 * @param targetSpec 308 * {@link TranslationSpec} describing the target translated data. 309 */ Builder( @onNull TranslationSpec sourceSpec, @NonNull TranslationSpec targetSpec)310 public Builder( 311 @NonNull TranslationSpec sourceSpec, 312 @NonNull TranslationSpec targetSpec) { 313 mSourceSpec = sourceSpec; 314 com.android.internal.util.AnnotationValidations.validate( 315 NonNull.class, null, mSourceSpec); 316 mTargetSpec = targetSpec; 317 com.android.internal.util.AnnotationValidations.validate( 318 NonNull.class, null, mTargetSpec); 319 } 320 321 /** 322 * Translation flags to be used by the {@link Translator} 323 */ 324 @DataClass.Generated.Member setTranslationFlags(@ranslationFlag int value)325 public @NonNull Builder setTranslationFlags(@TranslationFlag int value) { 326 checkNotUsed(); 327 mBuilderFieldsSet |= 0x4; 328 mTranslationFlags = value; 329 return this; 330 } 331 332 /** 333 * The identifier for the Activity which needs UI translation. 334 * 335 * @hide 336 */ 337 @DataClass.Generated.Member setActivityId(@onNull ActivityId value)338 public @NonNull Builder setActivityId(@NonNull ActivityId value) { 339 checkNotUsed(); 340 mBuilderFieldsSet |= 0x8; 341 mActivityId = value; 342 return this; 343 } 344 345 /** Builds the instance. This builder should not be touched after calling this! */ build()346 public @NonNull TranslationContext build() { 347 checkNotUsed(); 348 mBuilderFieldsSet |= 0x10; // Mark builder used 349 350 if ((mBuilderFieldsSet & 0x4) == 0) { 351 mTranslationFlags = defaultTranslationFlags(); 352 } 353 if ((mBuilderFieldsSet & 0x8) == 0) { 354 mActivityId = defaultActivityId(); 355 } 356 TranslationContext o = new TranslationContext( 357 mSourceSpec, 358 mTargetSpec, 359 mTranslationFlags, 360 mActivityId); 361 return o; 362 } 363 checkNotUsed()364 private void checkNotUsed() { 365 if ((mBuilderFieldsSet & 0x10) != 0) { 366 throw new IllegalStateException( 367 "This Builder should not be reused. Use a new Builder instance instead"); 368 } 369 } 370 } 371 372 @DataClass.Generated( 373 time = 1638348645427L, 374 codegenVersion = "1.0.23", 375 sourceFile = "frameworks/base/core/java/android/view/translation/TranslationContext.java", 376 inputSignatures = "public static final @android.view.translation.TranslationContext.TranslationFlag int FLAG_LOW_LATENCY\npublic static final @android.view.translation.TranslationContext.TranslationFlag int FLAG_TRANSLITERATION\npublic static final @android.view.translation.TranslationContext.TranslationFlag int FLAG_DEFINITIONS\nprivate final @android.annotation.NonNull android.view.translation.TranslationSpec mSourceSpec\nprivate final @android.annotation.NonNull android.view.translation.TranslationSpec mTargetSpec\nprivate final @android.view.translation.TranslationContext.TranslationFlag int mTranslationFlags\nprivate final @android.annotation.Nullable android.app.assist.ActivityId mActivityId\nprivate static int defaultTranslationFlags()\nprivate static android.app.assist.ActivityId defaultActivityId()\nprivate void parcelActivityId(android.os.Parcel,int)\nprivate @android.annotation.Nullable android.app.assist.ActivityId unparcelActivityId(android.os.Parcel)\npublic @android.annotation.SystemApi @android.annotation.Nullable android.app.assist.ActivityId getActivityId()\nclass TranslationContext extends java.lang.Object implements [android.os.Parcelable]\nclass BaseBuilder extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genHiddenConstDefs=true, genToString=true, genBuilder=true)\nclass BaseBuilder extends java.lang.Object implements []") 377 @Deprecated __metadata()378 private void __metadata() {} 379 380 381 //@formatter:on 382 // End of generated code 383 384 } 385