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