diff options
| -rw-r--r-- | core/api/system-current.txt | 21 | ||||
| -rw-r--r-- | core/java/android/service/voice/HotwordAudioStream.aidl | 19 | ||||
| -rw-r--r-- | core/java/android/service/voice/HotwordAudioStream.java | 447 | ||||
| -rw-r--r-- | core/java/android/service/voice/HotwordDetectedResult.java | 65 |
4 files changed, 546 insertions, 6 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 134b71a49272..87960d70fa25 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -11982,9 +11982,29 @@ package android.service.voice { method public int getStart(); } + public final class HotwordAudioStream implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public android.media.AudioFormat getAudioFormat(); + method @NonNull public android.os.ParcelFileDescriptor getAudioStream(); + method @NonNull public android.os.PersistableBundle getMetadata(); + method @Nullable public android.media.AudioTimestamp getTimestamp(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.service.voice.HotwordAudioStream> CREATOR; + } + + public static final class HotwordAudioStream.Builder { + ctor public HotwordAudioStream.Builder(@NonNull android.media.AudioFormat, @NonNull android.os.ParcelFileDescriptor); + method @NonNull public android.service.voice.HotwordAudioStream build(); + method @NonNull public android.service.voice.HotwordAudioStream.Builder setAudioFormat(@NonNull android.media.AudioFormat); + method @NonNull public android.service.voice.HotwordAudioStream.Builder setAudioStream(@NonNull android.os.ParcelFileDescriptor); + method @NonNull public android.service.voice.HotwordAudioStream.Builder setMetadata(@NonNull android.os.PersistableBundle); + method @NonNull public android.service.voice.HotwordAudioStream.Builder setTimestamp(@NonNull android.media.AudioTimestamp); + } + public final class HotwordDetectedResult implements android.os.Parcelable { method public int describeContents(); method public int getAudioChannel(); + method @NonNull public java.util.List<android.service.voice.HotwordAudioStream> getAudioStreams(); method public int getConfidenceLevel(); method @NonNull public android.os.PersistableBundle getExtras(); method public int getHotwordDurationMillis(); @@ -12014,6 +12034,7 @@ package android.service.voice { ctor public HotwordDetectedResult.Builder(); method @NonNull public android.service.voice.HotwordDetectedResult build(); method @NonNull public android.service.voice.HotwordDetectedResult.Builder setAudioChannel(int); + method @NonNull public android.service.voice.HotwordDetectedResult.Builder setAudioStreams(@NonNull java.util.List<android.service.voice.HotwordAudioStream>); method @NonNull public android.service.voice.HotwordDetectedResult.Builder setConfidenceLevel(int); method @NonNull public android.service.voice.HotwordDetectedResult.Builder setExtras(@NonNull android.os.PersistableBundle); method @NonNull public android.service.voice.HotwordDetectedResult.Builder setHotwordDetectionPersonalized(boolean); diff --git a/core/java/android/service/voice/HotwordAudioStream.aidl b/core/java/android/service/voice/HotwordAudioStream.aidl new file mode 100644 index 000000000000..9550c830aecc --- /dev/null +++ b/core/java/android/service/voice/HotwordAudioStream.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.voice; + +parcelable HotwordAudioStream; diff --git a/core/java/android/service/voice/HotwordAudioStream.java b/core/java/android/service/voice/HotwordAudioStream.java new file mode 100644 index 000000000000..18375add95a7 --- /dev/null +++ b/core/java/android/service/voice/HotwordAudioStream.java @@ -0,0 +1,447 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.voice; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SystemApi; +import android.media.AudioFormat; +import android.media.AudioRecord; +import android.media.AudioTimestamp; +import android.os.Parcel; +import android.os.ParcelFileDescriptor; +import android.os.Parcelable; +import android.os.PersistableBundle; + +import com.android.internal.util.DataClass; + +import java.util.Objects; + +/** + * Represents an audio stream supporting the hotword detection. + * + * @hide + */ +@DataClass( + genConstructor = false, + genBuilder = true, + genEqualsHashCode = true, + genParcelable = true, + genToString = true +) +@SystemApi +public final class HotwordAudioStream implements Parcelable { + + /** + * The {@link AudioFormat} of the audio stream. + */ + @NonNull + private final AudioFormat mAudioFormat; + + /** + * This stream starts with the audio bytes used for hotword detection, but continues streaming + * the audio until the stream is shutdown by the {@link HotwordDetectionService}. + */ + @NonNull + private final ParcelFileDescriptor mAudioStream; + + /** + * The timestamp when the {@link #getAudioStream()} was captured by the Audio platform. + * + * <p> + * The {@link HotwordDetectionService} egressing the audio is the owner of the underlying + * AudioRecord. The {@link HotwordDetectionService} is expected to optionally populate this + * field by {@link AudioRecord#getTimestamp}. + * </p> + * + * <p> + * This timestamp can be used in conjunction with the + * {@link HotwordDetectedResult#getHotwordOffsetMillis()} and + * {@link HotwordDetectedResult#getHotwordDurationMillis()} to translate these durations to + * timestamps. + * </p> + */ + @Nullable + private final AudioTimestamp mTimestamp; + private static AudioTimestamp defaultTimestamp() { + return null; + } + + /** + * The metadata associated with the audio stream. + */ + @NonNull + private final PersistableBundle mMetadata; + private static PersistableBundle defaultMetadata() { + return new PersistableBundle(); + } + + private String timestampToString() { + if (mTimestamp == null) { + return ""; + } + return "TimeStamp:" + + " framePos=" + mTimestamp.framePosition + + " nanoTime=" + mTimestamp.nanoTime; + } + + private void parcelTimestamp(Parcel dest, int flags) { + if (mTimestamp != null) { + // mTimestamp is not null, we write it to the parcel, set true. + dest.writeBoolean(true); + dest.writeLong(mTimestamp.framePosition); + dest.writeLong(mTimestamp.nanoTime); + } else { + // mTimestamp is null, we don't write any value out, set false. + dest.writeBoolean(false); + } + } + + @Nullable + private static AudioTimestamp unparcelTimestamp(Parcel in) { + // If it is true, it means we wrote the value to the parcel before, parse it. + // Otherwise, return null. + if (in.readBoolean()) { + final AudioTimestamp timeStamp = new AudioTimestamp(); + timeStamp.framePosition = in.readLong(); + timeStamp.nanoTime = in.readLong(); + return timeStamp; + } else { + return null; + } + } + + + + // Code below generated by codegen v1.0.23. + // + // DO NOT MODIFY! + // CHECKSTYLE:OFF Generated code + // + // To regenerate run: + // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/service/voice/HotwordAudioStream.java + // + // To exclude the generated code from IntelliJ auto-formatting enable (one-time): + // Settings > Editor > Code Style > Formatter Control + //@formatter:off + + + @DataClass.Generated.Member + /* package-private */ HotwordAudioStream( + @NonNull AudioFormat audioFormat, + @NonNull ParcelFileDescriptor audioStream, + @Nullable AudioTimestamp timestamp, + @NonNull PersistableBundle metadata) { + this.mAudioFormat = audioFormat; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mAudioFormat); + this.mAudioStream = audioStream; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mAudioStream); + this.mTimestamp = timestamp; + this.mMetadata = metadata; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mMetadata); + + // onConstructed(); // You can define this method to get a callback + } + + /** + * The {@link AudioFormat} of the audio stream. + */ + @DataClass.Generated.Member + public @NonNull AudioFormat getAudioFormat() { + return mAudioFormat; + } + + /** + * This stream starts with the audio bytes used for hotword detection, but continues streaming + * the audio until the stream is shutdown by the {@link HotwordDetectionService}. + */ + @DataClass.Generated.Member + public @NonNull ParcelFileDescriptor getAudioStream() { + return mAudioStream; + } + + /** + * The timestamp when the {@link #getAudioStream()} was captured by the Audio platform. + * + * <p> + * The {@link HotwordDetectionService} egressing the audio is the owner of the underlying + * AudioRecord. The {@link HotwordDetectionService} is expected to optionally populate this + * field by {@link AudioRecord#getTimestamp}. + * </p> + * + * <p> + * This timestamp can be used in conjunction with the + * {@link HotwordDetectedResult#getHotwordOffsetMillis()} and + * {@link HotwordDetectedResult#getHotwordDurationMillis()} to translate these durations to + * timestamps. + * </p> + */ + @DataClass.Generated.Member + public @Nullable AudioTimestamp getTimestamp() { + return mTimestamp; + } + + /** + * The metadata associated with the audio stream. + */ + @DataClass.Generated.Member + public @NonNull PersistableBundle getMetadata() { + return mMetadata; + } + + @Override + @DataClass.Generated.Member + public String toString() { + // You can override field toString logic by defining methods like: + // String fieldNameToString() { ... } + + return "HotwordAudioStream { " + + "audioFormat = " + mAudioFormat + ", " + + "audioStream = " + mAudioStream + ", " + + "timestamp = " + timestampToString() + ", " + + "metadata = " + mMetadata + + " }"; + } + + @Override + @DataClass.Generated.Member + public boolean equals(@Nullable Object o) { + // You can override field equality logic by defining either of the methods like: + // boolean fieldNameEquals(HotwordAudioStream other) { ... } + // boolean fieldNameEquals(FieldType otherValue) { ... } + + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + @SuppressWarnings("unchecked") + HotwordAudioStream that = (HotwordAudioStream) o; + //noinspection PointlessBooleanExpression + return true + && Objects.equals(mAudioFormat, that.mAudioFormat) + && Objects.equals(mAudioStream, that.mAudioStream) + && Objects.equals(mTimestamp, that.mTimestamp) + && Objects.equals(mMetadata, that.mMetadata); + } + + @Override + @DataClass.Generated.Member + public int hashCode() { + // You can override field hashCode logic by defining methods like: + // int fieldNameHashCode() { ... } + + int _hash = 1; + _hash = 31 * _hash + Objects.hashCode(mAudioFormat); + _hash = 31 * _hash + Objects.hashCode(mAudioStream); + _hash = 31 * _hash + Objects.hashCode(mTimestamp); + _hash = 31 * _hash + Objects.hashCode(mMetadata); + return _hash; + } + + @Override + @DataClass.Generated.Member + public void writeToParcel(@NonNull Parcel dest, int flags) { + // You can override field parcelling by defining methods like: + // void parcelFieldName(Parcel dest, int flags) { ... } + + byte flg = 0; + if (mTimestamp != null) flg |= 0x4; + dest.writeByte(flg); + dest.writeTypedObject(mAudioFormat, flags); + dest.writeTypedObject(mAudioStream, flags); + parcelTimestamp(dest, flags); + dest.writeTypedObject(mMetadata, flags); + } + + @Override + @DataClass.Generated.Member + public int describeContents() { return 0; } + + /** @hide */ + @SuppressWarnings({"unchecked", "RedundantCast"}) + @DataClass.Generated.Member + /* package-private */ HotwordAudioStream(@NonNull Parcel in) { + // You can override field unparcelling by defining methods like: + // static FieldType unparcelFieldName(Parcel in) { ... } + + byte flg = in.readByte(); + AudioFormat audioFormat = (AudioFormat) in.readTypedObject(AudioFormat.CREATOR); + ParcelFileDescriptor audioStream = (ParcelFileDescriptor) in.readTypedObject(ParcelFileDescriptor.CREATOR); + AudioTimestamp timestamp = unparcelTimestamp(in); + PersistableBundle metadata = (PersistableBundle) in.readTypedObject(PersistableBundle.CREATOR); + + this.mAudioFormat = audioFormat; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mAudioFormat); + this.mAudioStream = audioStream; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mAudioStream); + this.mTimestamp = timestamp; + this.mMetadata = metadata; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mMetadata); + + // onConstructed(); // You can define this method to get a callback + } + + @DataClass.Generated.Member + public static final @NonNull Parcelable.Creator<HotwordAudioStream> CREATOR + = new Parcelable.Creator<HotwordAudioStream>() { + @Override + public HotwordAudioStream[] newArray(int size) { + return new HotwordAudioStream[size]; + } + + @Override + public HotwordAudioStream createFromParcel(@NonNull Parcel in) { + return new HotwordAudioStream(in); + } + }; + + /** + * A builder for {@link HotwordAudioStream} + */ + @SuppressWarnings("WeakerAccess") + @DataClass.Generated.Member + public static final class Builder { + + private @NonNull AudioFormat mAudioFormat; + private @NonNull ParcelFileDescriptor mAudioStream; + private @Nullable AudioTimestamp mTimestamp; + private @NonNull PersistableBundle mMetadata; + + private long mBuilderFieldsSet = 0L; + + /** + * Creates a new Builder. + * + * @param audioFormat + * The {@link AudioFormat} of the audio stream. + * @param audioStream + * This stream starts with the audio bytes used for hotword detection, but continues streaming + * the audio until the stream is shutdown by the {@link HotwordDetectionService}. + */ + public Builder( + @NonNull AudioFormat audioFormat, + @NonNull ParcelFileDescriptor audioStream) { + mAudioFormat = audioFormat; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mAudioFormat); + mAudioStream = audioStream; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mAudioStream); + } + + /** + * The {@link AudioFormat} of the audio stream. + */ + @DataClass.Generated.Member + public @NonNull Builder setAudioFormat(@NonNull AudioFormat value) { + checkNotUsed(); + mBuilderFieldsSet |= 0x1; + mAudioFormat = value; + return this; + } + + /** + * This stream starts with the audio bytes used for hotword detection, but continues streaming + * the audio until the stream is shutdown by the {@link HotwordDetectionService}. + */ + @DataClass.Generated.Member + public @NonNull Builder setAudioStream(@NonNull ParcelFileDescriptor value) { + checkNotUsed(); + mBuilderFieldsSet |= 0x2; + mAudioStream = value; + return this; + } + + /** + * The timestamp when the {@link #getAudioStream()} was captured by the Audio platform. + * + * <p> + * The {@link HotwordDetectionService} egressing the audio is the owner of the underlying + * AudioRecord. The {@link HotwordDetectionService} is expected to optionally populate this + * field by {@link AudioRecord#getTimestamp}. + * </p> + * + * <p> + * This timestamp can be used in conjunction with the + * {@link HotwordDetectedResult#getHotwordOffsetMillis()} and + * {@link HotwordDetectedResult#getHotwordDurationMillis()} to translate these durations to + * timestamps. + * </p> + */ + @DataClass.Generated.Member + public @NonNull Builder setTimestamp(@NonNull AudioTimestamp value) { + checkNotUsed(); + mBuilderFieldsSet |= 0x4; + mTimestamp = value; + return this; + } + + /** + * The metadata associated with the audio stream. + */ + @DataClass.Generated.Member + public @NonNull Builder setMetadata(@NonNull PersistableBundle value) { + checkNotUsed(); + mBuilderFieldsSet |= 0x8; + mMetadata = value; + return this; + } + + /** Builds the instance. This builder should not be touched after calling this! */ + public @NonNull HotwordAudioStream build() { + checkNotUsed(); + mBuilderFieldsSet |= 0x10; // Mark builder used + + if ((mBuilderFieldsSet & 0x4) == 0) { + mTimestamp = defaultTimestamp(); + } + if ((mBuilderFieldsSet & 0x8) == 0) { + mMetadata = defaultMetadata(); + } + HotwordAudioStream o = new HotwordAudioStream( + mAudioFormat, + mAudioStream, + mTimestamp, + mMetadata); + return o; + } + + private void checkNotUsed() { + if ((mBuilderFieldsSet & 0x10) != 0) { + throw new IllegalStateException( + "This Builder should not be reused. Use a new Builder instance instead"); + } + } + } + + @DataClass.Generated( + time = 1665463434564L, + codegenVersion = "1.0.23", + sourceFile = "frameworks/base/core/java/android/service/voice/HotwordAudioStream.java", + inputSignatures = "private final @android.annotation.NonNull android.media.AudioFormat mAudioFormat\nprivate final @android.annotation.NonNull android.os.ParcelFileDescriptor mAudioStream\nprivate final @android.annotation.Nullable android.media.AudioTimestamp mTimestamp\nprivate final @android.annotation.NonNull android.os.PersistableBundle mMetadata\nprivate static android.media.AudioTimestamp defaultTimestamp()\nprivate static android.os.PersistableBundle defaultMetadata()\nprivate java.lang.String timestampToString()\nprivate void parcelTimestamp(android.os.Parcel,int)\nprivate static @android.annotation.Nullable android.media.AudioTimestamp unparcelTimestamp(android.os.Parcel)\nclass HotwordAudioStream extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=true, genEqualsHashCode=true, genParcelable=true, genToString=true)") + @Deprecated + private void __metadata() {} + + + //@formatter:on + // End of generated code + +} diff --git a/core/java/android/service/voice/HotwordDetectedResult.java b/core/java/android/service/voice/HotwordDetectedResult.java index ab71459ed51e..6255d0060e3c 100644 --- a/core/java/android/service/voice/HotwordDetectedResult.java +++ b/core/java/android/service/voice/HotwordDetectedResult.java @@ -31,6 +31,8 @@ import com.android.internal.R; import com.android.internal.util.DataClass; import com.android.internal.util.Preconditions; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; /** @@ -196,6 +198,15 @@ public final class HotwordDetectedResult implements Parcelable { } /** + * The list of the audio streams containing audio bytes that were used for hotword detection. + */ + @NonNull + private final List<HotwordAudioStream> mAudioStreams; + private static List<HotwordAudioStream> defaultAudioStreams() { + return new ArrayList<>(); + } + + /** * App-specific extras to support trigger. * * <p>The size of this bundle will be limited to {@link #getMaxBundleSize}. Results will larger @@ -353,6 +364,11 @@ public final class HotwordDetectedResult implements Parcelable { } } + @DataClass.Suppress("addAudioStreams") + abstract static class BaseBuilder { + + } + // Code below generated by codegen v1.0.23. @@ -436,6 +452,7 @@ public final class HotwordDetectedResult implements Parcelable { int score, int personalizedScore, int hotwordPhraseId, + @NonNull List<HotwordAudioStream> audioStreams, @NonNull PersistableBundle extras) { this.mConfidenceLevel = confidenceLevel; com.android.internal.util.AnnotationValidations.validate( @@ -448,6 +465,9 @@ public final class HotwordDetectedResult implements Parcelable { this.mScore = score; this.mPersonalizedScore = personalizedScore; this.mHotwordPhraseId = hotwordPhraseId; + this.mAudioStreams = audioStreams; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mAudioStreams); this.mExtras = extras; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mExtras); @@ -535,6 +555,14 @@ public final class HotwordDetectedResult implements Parcelable { } /** + * The list of the audio streams containing audio bytes that were used for hotword detection. + */ + @DataClass.Generated.Member + public @NonNull List<HotwordAudioStream> getAudioStreams() { + return mAudioStreams; + } + + /** * App-specific extras to support trigger. * * <p>The size of this bundle will be limited to {@link #getMaxBundleSize}. Results will larger @@ -578,6 +606,7 @@ public final class HotwordDetectedResult implements Parcelable { "score = " + mScore + ", " + "personalizedScore = " + mPersonalizedScore + ", " + "hotwordPhraseId = " + mHotwordPhraseId + ", " + + "audioStreams = " + mAudioStreams + ", " + "extras = " + mExtras + " }"; } @@ -604,6 +633,7 @@ public final class HotwordDetectedResult implements Parcelable { && mScore == that.mScore && mPersonalizedScore == that.mPersonalizedScore && mHotwordPhraseId == that.mHotwordPhraseId + && Objects.equals(mAudioStreams, that.mAudioStreams) && Objects.equals(mExtras, that.mExtras); } @@ -623,6 +653,7 @@ public final class HotwordDetectedResult implements Parcelable { _hash = 31 * _hash + mScore; _hash = 31 * _hash + mPersonalizedScore; _hash = 31 * _hash + mHotwordPhraseId; + _hash = 31 * _hash + Objects.hashCode(mAudioStreams); _hash = 31 * _hash + Objects.hashCode(mExtras); return _hash; } @@ -645,6 +676,7 @@ public final class HotwordDetectedResult implements Parcelable { dest.writeInt(mScore); dest.writeInt(mPersonalizedScore); dest.writeInt(mHotwordPhraseId); + dest.writeParcelableList(mAudioStreams, flags); dest.writeTypedObject(mExtras, flags); } @@ -669,6 +701,8 @@ public final class HotwordDetectedResult implements Parcelable { int score = in.readInt(); int personalizedScore = in.readInt(); int hotwordPhraseId = in.readInt(); + List<HotwordAudioStream> audioStreams = new ArrayList<>(); + in.readParcelableList(audioStreams, HotwordAudioStream.class.getClassLoader()); PersistableBundle extras = (PersistableBundle) in.readTypedObject(PersistableBundle.CREATOR); this.mConfidenceLevel = confidenceLevel; @@ -682,6 +716,9 @@ public final class HotwordDetectedResult implements Parcelable { this.mScore = score; this.mPersonalizedScore = personalizedScore; this.mHotwordPhraseId = hotwordPhraseId; + this.mAudioStreams = audioStreams; + com.android.internal.util.AnnotationValidations.validate( + NonNull.class, null, mAudioStreams); this.mExtras = extras; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mExtras); @@ -708,7 +745,7 @@ public final class HotwordDetectedResult implements Parcelable { */ @SuppressWarnings("WeakerAccess") @DataClass.Generated.Member - public static final class Builder { + public static final class Builder extends BaseBuilder { private @HotwordConfidenceLevelValue int mConfidenceLevel; private @Nullable MediaSyncEvent mMediaSyncEvent; @@ -719,6 +756,7 @@ public final class HotwordDetectedResult implements Parcelable { private int mScore; private int mPersonalizedScore; private int mHotwordPhraseId; + private @NonNull List<HotwordAudioStream> mAudioStreams; private @NonNull PersistableBundle mExtras; private long mBuilderFieldsSet = 0L; @@ -843,6 +881,17 @@ public final class HotwordDetectedResult implements Parcelable { } /** + * The list of the audio streams containing audio bytes that were used for hotword detection. + */ + @DataClass.Generated.Member + public @NonNull Builder setAudioStreams(@NonNull List<HotwordAudioStream> value) { + checkNotUsed(); + mBuilderFieldsSet |= 0x200; + mAudioStreams = value; + return this; + } + + /** * App-specific extras to support trigger. * * <p>The size of this bundle will be limited to {@link #getMaxBundleSize}. Results will larger @@ -868,7 +917,7 @@ public final class HotwordDetectedResult implements Parcelable { @DataClass.Generated.Member public @NonNull Builder setExtras(@NonNull PersistableBundle value) { checkNotUsed(); - mBuilderFieldsSet |= 0x200; + mBuilderFieldsSet |= 0x400; mExtras = value; return this; } @@ -876,7 +925,7 @@ public final class HotwordDetectedResult implements Parcelable { /** Builds the instance. This builder should not be touched after calling this! */ public @NonNull HotwordDetectedResult build() { checkNotUsed(); - mBuilderFieldsSet |= 0x400; // Mark builder used + mBuilderFieldsSet |= 0x800; // Mark builder used if ((mBuilderFieldsSet & 0x1) == 0) { mConfidenceLevel = defaultConfidenceLevel(); @@ -906,6 +955,9 @@ public final class HotwordDetectedResult implements Parcelable { mHotwordPhraseId = defaultHotwordPhraseId(); } if ((mBuilderFieldsSet & 0x200) == 0) { + mAudioStreams = defaultAudioStreams(); + } + if ((mBuilderFieldsSet & 0x400) == 0) { mExtras = defaultExtras(); } HotwordDetectedResult o = new HotwordDetectedResult( @@ -918,12 +970,13 @@ public final class HotwordDetectedResult implements Parcelable { mScore, mPersonalizedScore, mHotwordPhraseId, + mAudioStreams, mExtras); return o; } private void checkNotUsed() { - if ((mBuilderFieldsSet & 0x400) != 0) { + if ((mBuilderFieldsSet & 0x800) != 0) { throw new IllegalStateException( "This Builder should not be reused. Use a new Builder instance instead"); } @@ -931,10 +984,10 @@ public final class HotwordDetectedResult implements Parcelable { } @DataClass.Generated( - time = 1658357814396L, + time = 1664876310951L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/service/voice/HotwordDetectedResult.java", - inputSignatures = "public static final int CONFIDENCE_LEVEL_NONE\npublic static final int CONFIDENCE_LEVEL_LOW\npublic static final int CONFIDENCE_LEVEL_LOW_MEDIUM\npublic static final int CONFIDENCE_LEVEL_MEDIUM\npublic static final int CONFIDENCE_LEVEL_MEDIUM_HIGH\npublic static final int CONFIDENCE_LEVEL_HIGH\npublic static final int CONFIDENCE_LEVEL_VERY_HIGH\npublic static final int HOTWORD_OFFSET_UNSET\npublic static final int AUDIO_CHANNEL_UNSET\nprivate static final int LIMIT_HOTWORD_OFFSET_MAX_VALUE\nprivate static final int LIMIT_AUDIO_CHANNEL_MAX_VALUE\npublic static final java.lang.String EXTRA_PROXIMITY_METERS\nprivate final @android.service.voice.HotwordDetectedResult.HotwordConfidenceLevelValue int mConfidenceLevel\nprivate @android.annotation.Nullable android.media.MediaSyncEvent mMediaSyncEvent\nprivate int mHotwordOffsetMillis\nprivate int mHotwordDurationMillis\nprivate int mAudioChannel\nprivate boolean mHotwordDetectionPersonalized\nprivate final int mScore\nprivate final int mPersonalizedScore\nprivate final int mHotwordPhraseId\nprivate final @android.annotation.NonNull android.os.PersistableBundle mExtras\nprivate static int sMaxBundleSize\nprivate static int defaultConfidenceLevel()\nprivate static int defaultScore()\nprivate static int defaultPersonalizedScore()\npublic static int getMaxScore()\nprivate static int defaultHotwordPhraseId()\npublic static int getMaxHotwordPhraseId()\nprivate static android.os.PersistableBundle defaultExtras()\npublic static int getMaxBundleSize()\npublic @android.annotation.Nullable android.media.MediaSyncEvent getMediaSyncEvent()\npublic static int getParcelableSize(android.os.Parcelable)\npublic static int getUsageSize(android.service.voice.HotwordDetectedResult)\nprivate static int bitCount(long)\nprivate void onConstructed()\nclass HotwordDetectedResult extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)") + inputSignatures = "public static final int CONFIDENCE_LEVEL_NONE\npublic static final int CONFIDENCE_LEVEL_LOW\npublic static final int CONFIDENCE_LEVEL_LOW_MEDIUM\npublic static final int CONFIDENCE_LEVEL_MEDIUM\npublic static final int CONFIDENCE_LEVEL_MEDIUM_HIGH\npublic static final int CONFIDENCE_LEVEL_HIGH\npublic static final int CONFIDENCE_LEVEL_VERY_HIGH\npublic static final int HOTWORD_OFFSET_UNSET\npublic static final int AUDIO_CHANNEL_UNSET\nprivate static final int LIMIT_HOTWORD_OFFSET_MAX_VALUE\nprivate static final int LIMIT_AUDIO_CHANNEL_MAX_VALUE\npublic static final java.lang.String EXTRA_PROXIMITY_METERS\nprivate final @android.service.voice.HotwordDetectedResult.HotwordConfidenceLevelValue int mConfidenceLevel\nprivate @android.annotation.Nullable android.media.MediaSyncEvent mMediaSyncEvent\nprivate int mHotwordOffsetMillis\nprivate int mHotwordDurationMillis\nprivate int mAudioChannel\nprivate boolean mHotwordDetectionPersonalized\nprivate final int mScore\nprivate final int mPersonalizedScore\nprivate final int mHotwordPhraseId\nprivate final @android.annotation.NonNull java.util.List<android.service.voice.HotwordAudioStream> mAudioStreams\nprivate final @android.annotation.NonNull android.os.PersistableBundle mExtras\nprivate static int sMaxBundleSize\nprivate static int defaultConfidenceLevel()\nprivate static int defaultScore()\nprivate static int defaultPersonalizedScore()\npublic static int getMaxScore()\nprivate static int defaultHotwordPhraseId()\npublic static int getMaxHotwordPhraseId()\nprivate static java.util.List<android.service.voice.HotwordAudioStream> defaultAudioStreams()\nprivate static android.os.PersistableBundle defaultExtras()\npublic static int getMaxBundleSize()\npublic @android.annotation.Nullable android.media.MediaSyncEvent getMediaSyncEvent()\npublic static int getParcelableSize(android.os.Parcelable)\npublic static int getUsageSize(android.service.voice.HotwordDetectedResult)\nprivate static int bitCount(long)\nprivate void onConstructed()\nclass HotwordDetectedResult extends java.lang.Object implements [android.os.Parcelable]\nclass BaseBuilder extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=true, genEqualsHashCode=true, genHiddenConstDefs=true, genParcelable=true, genToString=true)\nclass BaseBuilder extends java.lang.Object implements []") @Deprecated private void __metadata() {} |