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.speech;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.os.Parcelable;
22 
23 import com.android.internal.util.DataClass;
24 import com.android.internal.util.Preconditions;
25 
26 /**
27  * Info about a single recognition part.
28  *
29  * <p> A recognition part represents a recognized word or character, as well as any potential
30  * adjacent punctuation, that is returned by the {@link SpeechRecognizer}.
31  *
32  * <p> Each recognition part is described with a {@link String} denoting the raw text.
33  * Additionally, if formatting is enabled with {@link RecognizerIntent#EXTRA_ENABLE_FORMATTING},
34  * another {@link String} representation exists denoting the formatted text.
35  *
36  * <p> If the timestamps are requested with {@link RecognizerIntent#EXTRA_REQUEST_WORD_TIMING}, each
37  * recognition part will contain a value representing the offset of the beginning of this part from
38  * the start of the recognition session in milliseconds.
39  *
40  * <p> If the confidence levels are requested with
41  * {@link RecognizerIntent#EXTRA_REQUEST_WORD_CONFIDENCE}, each recognition part will contain
42  * a value describing the level of recognition confidence.
43  */
44 @DataClass(
45         genBuilder = true,
46         genEqualsHashCode = true,
47         genHiddenConstDefs = true,
48         genToString = true)
49 public final class RecognitionPart implements Parcelable {
50 
51     /** Confidence level not requested. */
52     public static final int CONFIDENCE_LEVEL_UNKNOWN = 0;
53 
54     /** Lowest level of confidence out of five levels. */
55     public static final int CONFIDENCE_LEVEL_LOW = 1;
56 
57     /** Second-lowest level of confidence out of five levels. */
58     public static final int CONFIDENCE_LEVEL_MEDIUM_LOW = 2;
59 
60     /** Medium level of confidence out of five levels. */
61     public static final int CONFIDENCE_LEVEL_MEDIUM = 3;
62 
63     /** Second-highest level of confidence out of five levels. */
64     public static final int CONFIDENCE_LEVEL_MEDIUM_HIGH = 4;
65 
66     /** Highest level of confidence out of five levels. */
67     public static final int CONFIDENCE_LEVEL_HIGH = 5;
68 
69     /** The {@code non-null} raw text version of the recognized part of the result. */
70     @NonNull
71     private final String mRawText;
72 
73     /**
74      * The formatted text version of the recognized part of the result. If formatting is enabled
75      * with {@link RecognizerIntent#EXTRA_ENABLE_FORMATTING}, it has a {@code non-null} value.
76      *
77      * <p> Otherwise, it should be {@code null} by default.
78      */
79     @Nullable
80     private final String mFormattedText;
defaultFormattedText()81     private static String defaultFormattedText() {
82         return null;
83     }
84 
85     /**
86      * Non-negative offset of the beginning of this part from
87      * the start of the recognition session in milliseconds
88      * if requested with {@link RecognizerIntent#EXTRA_REQUEST_WORD_TIMING}.
89      *
90      * <p> Otherwise, this should equal 0.
91      */
92     private final long mTimestampMillis;
defaultTimestampMillis()93     private static long defaultTimestampMillis() {
94         return 0;
95     }
96 
97     /**
98      * The level of confidence for this part if requested
99      * with {@link RecognizerIntent#EXTRA_REQUEST_WORD_CONFIDENCE}.
100      *
101      * <p> Otherwise, this should equal {@link #CONFIDENCE_LEVEL_UNKNOWN}.
102      */
103     @ConfidenceLevel
104     private final int mConfidenceLevel;
105     @ConfidenceLevel
defaultConfidenceLevel()106     private static int defaultConfidenceLevel() {
107         return CONFIDENCE_LEVEL_UNKNOWN;
108     }
109 
onConstructed()110     private void onConstructed() {
111         Preconditions.checkArgumentNonnegative(mTimestampMillis,
112                 "The timestamp must be non-negative.");
113     }
114 
115     @DataClass.Suppress("setFormattedText")
116     abstract static class BaseBuilder {
117         /**
118          * The formatted text version of the recognized part of the result. If formatting is enabled
119          * with {@link RecognizerIntent#EXTRA_ENABLE_FORMATTING}, it has a {@code non-null} value.
120          *
121          * <p> Otherwise, it should be {@code null} by default.
122          */
123         @NonNull
setFormattedText(@onNull String value)124         public Builder setFormattedText(@NonNull String value) {
125             // Method explicitly defined, so that the argument can be checked for non-null.
126             com.android.internal.util.AnnotationValidations.validate(NonNull.class, null, value);
127 
128             final Builder builder = (Builder) this;
129             builder.checkNotUsed();
130             builder.mBuilderFieldsSet |= 0x2;
131             builder.mFormattedText = value;
132             return builder;
133         }
134     }
135 
136 
137 
138     // Code below generated by codegen v1.0.23.
139     //
140     // DO NOT MODIFY!
141     // CHECKSTYLE:OFF Generated code
142     //
143     // To regenerate run:
144     // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/speech/RecognitionPart.java
145     //
146     // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
147     //   Settings > Editor > Code Style > Formatter Control
148     //@formatter:off
149 
150 
151     /** @hide */
152     @android.annotation.IntDef(prefix = "CONFIDENCE_LEVEL_", value = {
153         CONFIDENCE_LEVEL_UNKNOWN,
154         CONFIDENCE_LEVEL_LOW,
155         CONFIDENCE_LEVEL_MEDIUM_LOW,
156         CONFIDENCE_LEVEL_MEDIUM,
157         CONFIDENCE_LEVEL_MEDIUM_HIGH,
158         CONFIDENCE_LEVEL_HIGH
159     })
160     @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE)
161     @DataClass.Generated.Member
162     public @interface ConfidenceLevel {}
163 
164     /** @hide */
165     @DataClass.Generated.Member
confidenceLevelToString(@onfidenceLevel int value)166     public static String confidenceLevelToString(@ConfidenceLevel int value) {
167         switch (value) {
168             case CONFIDENCE_LEVEL_UNKNOWN:
169                     return "CONFIDENCE_LEVEL_UNKNOWN";
170             case CONFIDENCE_LEVEL_LOW:
171                     return "CONFIDENCE_LEVEL_LOW";
172             case CONFIDENCE_LEVEL_MEDIUM_LOW:
173                     return "CONFIDENCE_LEVEL_MEDIUM_LOW";
174             case CONFIDENCE_LEVEL_MEDIUM:
175                     return "CONFIDENCE_LEVEL_MEDIUM";
176             case CONFIDENCE_LEVEL_MEDIUM_HIGH:
177                     return "CONFIDENCE_LEVEL_MEDIUM_HIGH";
178             case CONFIDENCE_LEVEL_HIGH:
179                     return "CONFIDENCE_LEVEL_HIGH";
180             default: return Integer.toHexString(value);
181         }
182     }
183 
184     @DataClass.Generated.Member
RecognitionPart( @onNull String rawText, @Nullable String formattedText, long timestampMillis, @ConfidenceLevel int confidenceLevel)185     /* package-private */ RecognitionPart(
186             @NonNull String rawText,
187             @Nullable String formattedText,
188             long timestampMillis,
189             @ConfidenceLevel int confidenceLevel) {
190         this.mRawText = rawText;
191         com.android.internal.util.AnnotationValidations.validate(
192                 NonNull.class, null, mRawText);
193         this.mFormattedText = formattedText;
194         this.mTimestampMillis = timestampMillis;
195         this.mConfidenceLevel = confidenceLevel;
196 
197         if (!(mConfidenceLevel == CONFIDENCE_LEVEL_UNKNOWN)
198                 && !(mConfidenceLevel == CONFIDENCE_LEVEL_LOW)
199                 && !(mConfidenceLevel == CONFIDENCE_LEVEL_MEDIUM_LOW)
200                 && !(mConfidenceLevel == CONFIDENCE_LEVEL_MEDIUM)
201                 && !(mConfidenceLevel == CONFIDENCE_LEVEL_MEDIUM_HIGH)
202                 && !(mConfidenceLevel == CONFIDENCE_LEVEL_HIGH)) {
203             throw new java.lang.IllegalArgumentException(
204                     "confidenceLevel was " + mConfidenceLevel + " but must be one of: "
205                             + "CONFIDENCE_LEVEL_UNKNOWN(" + CONFIDENCE_LEVEL_UNKNOWN + "), "
206                             + "CONFIDENCE_LEVEL_LOW(" + CONFIDENCE_LEVEL_LOW + "), "
207                             + "CONFIDENCE_LEVEL_MEDIUM_LOW(" + CONFIDENCE_LEVEL_MEDIUM_LOW + "), "
208                             + "CONFIDENCE_LEVEL_MEDIUM(" + CONFIDENCE_LEVEL_MEDIUM + "), "
209                             + "CONFIDENCE_LEVEL_MEDIUM_HIGH(" + CONFIDENCE_LEVEL_MEDIUM_HIGH + "), "
210                             + "CONFIDENCE_LEVEL_HIGH(" + CONFIDENCE_LEVEL_HIGH + ")");
211         }
212 
213 
214         onConstructed();
215     }
216 
217     /**
218      * The {@code non-null} raw text version of the recognized part of the result.
219      */
220     @DataClass.Generated.Member
getRawText()221     public @NonNull String getRawText() {
222         return mRawText;
223     }
224 
225     /**
226      * The formatted text version of the recognized part of the result. If formatting is enabled
227      * with {@link RecognizerIntent#EXTRA_ENABLE_FORMATTING}, it has a {@code non-null} value.
228      *
229      * <p> Otherwise, it should be {@code null} by default.
230      */
231     @DataClass.Generated.Member
getFormattedText()232     public @Nullable String getFormattedText() {
233         return mFormattedText;
234     }
235 
236     /**
237      * Non-negative offset of the beginning of this part from
238      * the start of the recognition session in milliseconds
239      * if requested with {@link RecognizerIntent#EXTRA_REQUEST_WORD_TIMING}.
240      *
241      * <p> Otherwise, this should equal 0.
242      */
243     @DataClass.Generated.Member
getTimestampMillis()244     public long getTimestampMillis() {
245         return mTimestampMillis;
246     }
247 
248     /**
249      * The level of confidence for this part if requested
250      * with {@link RecognizerIntent#EXTRA_REQUEST_WORD_CONFIDENCE}.
251      *
252      * <p> Otherwise, this should equal {@link #CONFIDENCE_LEVEL_UNKNOWN}.
253      */
254     @DataClass.Generated.Member
getConfidenceLevel()255     public @ConfidenceLevel int getConfidenceLevel() {
256         return mConfidenceLevel;
257     }
258 
259     @Override
260     @DataClass.Generated.Member
toString()261     public String toString() {
262         // You can override field toString logic by defining methods like:
263         // String fieldNameToString() { ... }
264 
265         return "RecognitionPart { " +
266                 "rawText = " + mRawText + ", " +
267                 "formattedText = " + mFormattedText + ", " +
268                 "timestampMillis = " + mTimestampMillis + ", " +
269                 "confidenceLevel = " + confidenceLevelToString(mConfidenceLevel) +
270         " }";
271     }
272 
273     @Override
274     @DataClass.Generated.Member
equals(@ullable Object o)275     public boolean equals(@Nullable Object o) {
276         // You can override field equality logic by defining either of the methods like:
277         // boolean fieldNameEquals(RecognitionPart other) { ... }
278         // boolean fieldNameEquals(FieldType otherValue) { ... }
279 
280         if (this == o) return true;
281         if (o == null || getClass() != o.getClass()) return false;
282         @SuppressWarnings("unchecked")
283         RecognitionPart that = (RecognitionPart) o;
284         //noinspection PointlessBooleanExpression
285         return true
286                 && java.util.Objects.equals(mRawText, that.mRawText)
287                 && java.util.Objects.equals(mFormattedText, that.mFormattedText)
288                 && mTimestampMillis == that.mTimestampMillis
289                 && mConfidenceLevel == that.mConfidenceLevel;
290     }
291 
292     @Override
293     @DataClass.Generated.Member
hashCode()294     public int hashCode() {
295         // You can override field hashCode logic by defining methods like:
296         // int fieldNameHashCode() { ... }
297 
298         int _hash = 1;
299         _hash = 31 * _hash + java.util.Objects.hashCode(mRawText);
300         _hash = 31 * _hash + java.util.Objects.hashCode(mFormattedText);
301         _hash = 31 * _hash + Long.hashCode(mTimestampMillis);
302         _hash = 31 * _hash + mConfidenceLevel;
303         return _hash;
304     }
305 
306     @Override
307     @DataClass.Generated.Member
writeToParcel(@onNull android.os.Parcel dest, int flags)308     public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
309         // You can override field parcelling by defining methods like:
310         // void parcelFieldName(Parcel dest, int flags) { ... }
311 
312         byte flg = 0;
313         if (mFormattedText != null) flg |= 0x2;
314         dest.writeByte(flg);
315         dest.writeString(mRawText);
316         if (mFormattedText != null) dest.writeString(mFormattedText);
317         dest.writeLong(mTimestampMillis);
318         dest.writeInt(mConfidenceLevel);
319     }
320 
321     @Override
322     @DataClass.Generated.Member
describeContents()323     public int describeContents() { return 0; }
324 
325     /** @hide */
326     @SuppressWarnings({"unchecked", "RedundantCast"})
327     @DataClass.Generated.Member
RecognitionPart(@onNull android.os.Parcel in)328     /* package-private */ RecognitionPart(@NonNull android.os.Parcel in) {
329         // You can override field unparcelling by defining methods like:
330         // static FieldType unparcelFieldName(Parcel in) { ... }
331 
332         byte flg = in.readByte();
333         String rawText = in.readString();
334         String formattedText = (flg & 0x2) == 0 ? null : in.readString();
335         long timestampMillis = in.readLong();
336         int confidenceLevel = in.readInt();
337 
338         this.mRawText = rawText;
339         com.android.internal.util.AnnotationValidations.validate(
340                 NonNull.class, null, mRawText);
341         this.mFormattedText = formattedText;
342         this.mTimestampMillis = timestampMillis;
343         this.mConfidenceLevel = confidenceLevel;
344 
345         if (!(mConfidenceLevel == CONFIDENCE_LEVEL_UNKNOWN)
346                 && !(mConfidenceLevel == CONFIDENCE_LEVEL_LOW)
347                 && !(mConfidenceLevel == CONFIDENCE_LEVEL_MEDIUM_LOW)
348                 && !(mConfidenceLevel == CONFIDENCE_LEVEL_MEDIUM)
349                 && !(mConfidenceLevel == CONFIDENCE_LEVEL_MEDIUM_HIGH)
350                 && !(mConfidenceLevel == CONFIDENCE_LEVEL_HIGH)) {
351             throw new java.lang.IllegalArgumentException(
352                     "confidenceLevel was " + mConfidenceLevel + " but must be one of: "
353                             + "CONFIDENCE_LEVEL_UNKNOWN(" + CONFIDENCE_LEVEL_UNKNOWN + "), "
354                             + "CONFIDENCE_LEVEL_LOW(" + CONFIDENCE_LEVEL_LOW + "), "
355                             + "CONFIDENCE_LEVEL_MEDIUM_LOW(" + CONFIDENCE_LEVEL_MEDIUM_LOW + "), "
356                             + "CONFIDENCE_LEVEL_MEDIUM(" + CONFIDENCE_LEVEL_MEDIUM + "), "
357                             + "CONFIDENCE_LEVEL_MEDIUM_HIGH(" + CONFIDENCE_LEVEL_MEDIUM_HIGH + "), "
358                             + "CONFIDENCE_LEVEL_HIGH(" + CONFIDENCE_LEVEL_HIGH + ")");
359         }
360 
361 
362         onConstructed();
363     }
364 
365     @DataClass.Generated.Member
366     public static final @NonNull Parcelable.Creator<RecognitionPart> CREATOR
367             = new Parcelable.Creator<RecognitionPart>() {
368         @Override
369         public RecognitionPart[] newArray(int size) {
370             return new RecognitionPart[size];
371         }
372 
373         @Override
374         public RecognitionPart createFromParcel(@NonNull android.os.Parcel in) {
375             return new RecognitionPart(in);
376         }
377     };
378 
379     /**
380      * A builder for {@link RecognitionPart}
381      */
382     @SuppressWarnings("WeakerAccess")
383     @DataClass.Generated.Member
384     public static final class Builder extends BaseBuilder {
385 
386         private @NonNull String mRawText;
387         private @Nullable String mFormattedText;
388         private long mTimestampMillis;
389         private @ConfidenceLevel int mConfidenceLevel;
390 
391         private long mBuilderFieldsSet = 0L;
392 
393         /**
394          * Creates a new Builder.
395          *
396          * @param rawText
397          *   The {@code non-null} raw text version of the recognized part of the result.
398          */
Builder( @onNull String rawText)399         public Builder(
400                 @NonNull String rawText) {
401             mRawText = rawText;
402             com.android.internal.util.AnnotationValidations.validate(
403                     NonNull.class, null, mRawText);
404         }
405 
406         /**
407          * The {@code non-null} raw text version of the recognized part of the result.
408          */
409         @DataClass.Generated.Member
setRawText(@onNull String value)410         public @NonNull Builder setRawText(@NonNull String value) {
411             checkNotUsed();
412             mBuilderFieldsSet |= 0x1;
413             mRawText = value;
414             return this;
415         }
416 
417         /**
418          * Non-negative offset of the beginning of this part from
419          * the start of the recognition session in milliseconds
420          * if requested with {@link RecognizerIntent#EXTRA_REQUEST_WORD_TIMING}.
421          *
422          * <p> Otherwise, this should equal 0.
423          */
424         @DataClass.Generated.Member
setTimestampMillis(long value)425         public @NonNull Builder setTimestampMillis(long value) {
426             checkNotUsed();
427             mBuilderFieldsSet |= 0x4;
428             mTimestampMillis = value;
429             return this;
430         }
431 
432         /**
433          * The level of confidence for this part if requested
434          * with {@link RecognizerIntent#EXTRA_REQUEST_WORD_CONFIDENCE}.
435          *
436          * <p> Otherwise, this should equal {@link #CONFIDENCE_LEVEL_UNKNOWN}.
437          */
438         @DataClass.Generated.Member
setConfidenceLevel(@onfidenceLevel int value)439         public @NonNull Builder setConfidenceLevel(@ConfidenceLevel int value) {
440             checkNotUsed();
441             mBuilderFieldsSet |= 0x8;
442             mConfidenceLevel = value;
443             return this;
444         }
445 
446         /** Builds the instance. This builder should not be touched after calling this! */
build()447         public @NonNull RecognitionPart build() {
448             checkNotUsed();
449             mBuilderFieldsSet |= 0x10; // Mark builder used
450 
451             if ((mBuilderFieldsSet & 0x2) == 0) {
452                 mFormattedText = defaultFormattedText();
453             }
454             if ((mBuilderFieldsSet & 0x4) == 0) {
455                 mTimestampMillis = defaultTimestampMillis();
456             }
457             if ((mBuilderFieldsSet & 0x8) == 0) {
458                 mConfidenceLevel = defaultConfidenceLevel();
459             }
460             RecognitionPart o = new RecognitionPart(
461                     mRawText,
462                     mFormattedText,
463                     mTimestampMillis,
464                     mConfidenceLevel);
465             return o;
466         }
467 
checkNotUsed()468         private void checkNotUsed() {
469             if ((mBuilderFieldsSet & 0x10) != 0) {
470                 throw new IllegalStateException(
471                         "This Builder should not be reused. Use a new Builder instance instead");
472             }
473         }
474     }
475 
476     @DataClass.Generated(
477             time = 1677008539189L,
478             codegenVersion = "1.0.23",
479             sourceFile = "frameworks/base/core/java/android/speech/RecognitionPart.java",
480             inputSignatures = "public static final  int CONFIDENCE_LEVEL_UNKNOWN\npublic static final  int CONFIDENCE_LEVEL_LOW\npublic static final  int CONFIDENCE_LEVEL_MEDIUM_LOW\npublic static final  int CONFIDENCE_LEVEL_MEDIUM\npublic static final  int CONFIDENCE_LEVEL_MEDIUM_HIGH\npublic static final  int CONFIDENCE_LEVEL_HIGH\nprivate final @android.annotation.NonNull java.lang.String mRawText\nprivate final @android.annotation.Nullable java.lang.String mFormattedText\nprivate final  long mTimestampMillis\nprivate final @android.speech.RecognitionPart.ConfidenceLevel int mConfidenceLevel\nprivate static  java.lang.String defaultFormattedText()\nprivate static  long defaultTimestampMillis()\nprivate static @android.speech.RecognitionPart.ConfidenceLevel int defaultConfidenceLevel()\nprivate  void onConstructed()\nclass RecognitionPart extends java.lang.Object implements [android.os.Parcelable]\npublic @android.annotation.NonNull android.speech.RecognitionPart.Builder setFormattedText(java.lang.String)\nclass BaseBuilder extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genToString=true)\npublic @android.annotation.NonNull android.speech.RecognitionPart.Builder setFormattedText(java.lang.String)\nclass BaseBuilder extends java.lang.Object implements []")
481     @Deprecated
__metadata()482     private void __metadata() {}
483 
484 
485     //@formatter:on
486     // End of generated code
487 
488 }
489