Merge "Validate the HotwordDetectedResult" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
7712f3bc0a
@@ -20,11 +20,18 @@ import android.annotation.IntDef;
|
|||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.annotation.SystemApi;
|
import android.annotation.SystemApi;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.media.AudioRecord;
|
||||||
import android.media.MediaSyncEvent;
|
import android.media.MediaSyncEvent;
|
||||||
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.os.PersistableBundle;
|
import android.os.PersistableBundle;
|
||||||
|
|
||||||
|
import com.android.internal.R;
|
||||||
import com.android.internal.util.DataClass;
|
import com.android.internal.util.DataClass;
|
||||||
|
import com.android.internal.util.Preconditions;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a result supporting the hotword detection.
|
* Represents a result supporting the hotword detection.
|
||||||
@@ -187,16 +194,20 @@ public final class HotwordDetectedResult implements Parcelable {
|
|||||||
return new PersistableBundle();
|
return new PersistableBundle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int sMaxBundleSize = -1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the maximum byte size of the information contained in the bundle.
|
* Returns the maximum byte size of the information contained in the bundle.
|
||||||
*
|
*
|
||||||
* <p>The total size will be calculated as a sum of byte sizes over all bundle keys.
|
* <p>The total size will be calculated by how much bundle data should be written into the
|
||||||
*
|
* Parcel.
|
||||||
* <p>For example, for a bundle containing a single key: {@code "example_key" -> 42.0f}, the
|
|
||||||
* bundle size will be {@code 11 + Float.BYTES = 15} bytes.
|
|
||||||
*/
|
*/
|
||||||
public static int getMaxBundleSize() {
|
public static int getMaxBundleSize() {
|
||||||
return 50;
|
if (sMaxBundleSize < 0) {
|
||||||
|
sMaxBundleSize = Resources.getSystem().getInteger(
|
||||||
|
R.integer.config_hotwordDetectedResultMaxBundleSize);
|
||||||
|
}
|
||||||
|
return sMaxBundleSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -212,6 +223,34 @@ public final class HotwordDetectedResult implements Parcelable {
|
|||||||
return mMediaSyncEvent;
|
return mMediaSyncEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns how many bytes should be written into the Parcel
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static int getParcelableSize(@NonNull Parcelable parcelable) {
|
||||||
|
final Parcel p = Parcel.obtain();
|
||||||
|
parcelable.writeToParcel(p, 0);
|
||||||
|
p.setDataPosition(0);
|
||||||
|
final int size = p.dataSize();
|
||||||
|
p.recycle();
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onConstructed() {
|
||||||
|
Preconditions.checkArgumentInRange(mScore, 0, getMaxScore(), "score");
|
||||||
|
Preconditions.checkArgumentInRange(mPersonalizedScore, 0, getMaxScore(),
|
||||||
|
"personalizedScore");
|
||||||
|
Preconditions.checkArgumentInRange(mHotwordPhraseId, 0, getMaxHotwordPhraseId(),
|
||||||
|
"hotwordPhraseId");
|
||||||
|
Preconditions.checkArgumentInRange((long) mHotwordDurationMillis, 0,
|
||||||
|
AudioRecord.getMaxSharedAudioHistoryMillis(), "hotwordDurationMillis");
|
||||||
|
if (!mExtras.isEmpty()) {
|
||||||
|
Preconditions.checkArgumentInRange(getParcelableSize(mExtras), 0, getMaxBundleSize(),
|
||||||
|
"extras");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Code below generated by codegen v1.0.23.
|
// Code below generated by codegen v1.0.23.
|
||||||
@@ -290,7 +329,7 @@ public final class HotwordDetectedResult implements Parcelable {
|
|||||||
com.android.internal.util.AnnotationValidations.validate(
|
com.android.internal.util.AnnotationValidations.validate(
|
||||||
NonNull.class, null, mExtras);
|
NonNull.class, null, mExtras);
|
||||||
|
|
||||||
// onConstructed(); // You can define this method to get a callback
|
onConstructed();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -422,7 +461,7 @@ public final class HotwordDetectedResult implements Parcelable {
|
|||||||
//noinspection PointlessBooleanExpression
|
//noinspection PointlessBooleanExpression
|
||||||
return true
|
return true
|
||||||
&& mConfidenceLevel == that.mConfidenceLevel
|
&& mConfidenceLevel == that.mConfidenceLevel
|
||||||
&& java.util.Objects.equals(mMediaSyncEvent, that.mMediaSyncEvent)
|
&& Objects.equals(mMediaSyncEvent, that.mMediaSyncEvent)
|
||||||
&& mHotwordOffsetMillis == that.mHotwordOffsetMillis
|
&& mHotwordOffsetMillis == that.mHotwordOffsetMillis
|
||||||
&& mHotwordDurationMillis == that.mHotwordDurationMillis
|
&& mHotwordDurationMillis == that.mHotwordDurationMillis
|
||||||
&& mAudioChannel == that.mAudioChannel
|
&& mAudioChannel == that.mAudioChannel
|
||||||
@@ -430,7 +469,7 @@ public final class HotwordDetectedResult implements Parcelable {
|
|||||||
&& mScore == that.mScore
|
&& mScore == that.mScore
|
||||||
&& mPersonalizedScore == that.mPersonalizedScore
|
&& mPersonalizedScore == that.mPersonalizedScore
|
||||||
&& mHotwordPhraseId == that.mHotwordPhraseId
|
&& mHotwordPhraseId == that.mHotwordPhraseId
|
||||||
&& java.util.Objects.equals(mExtras, that.mExtras);
|
&& Objects.equals(mExtras, that.mExtras);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -441,7 +480,7 @@ public final class HotwordDetectedResult implements Parcelable {
|
|||||||
|
|
||||||
int _hash = 1;
|
int _hash = 1;
|
||||||
_hash = 31 * _hash + mConfidenceLevel;
|
_hash = 31 * _hash + mConfidenceLevel;
|
||||||
_hash = 31 * _hash + java.util.Objects.hashCode(mMediaSyncEvent);
|
_hash = 31 * _hash + Objects.hashCode(mMediaSyncEvent);
|
||||||
_hash = 31 * _hash + mHotwordOffsetMillis;
|
_hash = 31 * _hash + mHotwordOffsetMillis;
|
||||||
_hash = 31 * _hash + mHotwordDurationMillis;
|
_hash = 31 * _hash + mHotwordDurationMillis;
|
||||||
_hash = 31 * _hash + mAudioChannel;
|
_hash = 31 * _hash + mAudioChannel;
|
||||||
@@ -449,13 +488,13 @@ public final class HotwordDetectedResult implements Parcelable {
|
|||||||
_hash = 31 * _hash + mScore;
|
_hash = 31 * _hash + mScore;
|
||||||
_hash = 31 * _hash + mPersonalizedScore;
|
_hash = 31 * _hash + mPersonalizedScore;
|
||||||
_hash = 31 * _hash + mHotwordPhraseId;
|
_hash = 31 * _hash + mHotwordPhraseId;
|
||||||
_hash = 31 * _hash + java.util.Objects.hashCode(mExtras);
|
_hash = 31 * _hash + Objects.hashCode(mExtras);
|
||||||
return _hash;
|
return _hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@DataClass.Generated.Member
|
@DataClass.Generated.Member
|
||||||
public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
|
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
||||||
// You can override field parcelling by defining methods like:
|
// You can override field parcelling by defining methods like:
|
||||||
// void parcelFieldName(Parcel dest, int flags) { ... }
|
// void parcelFieldName(Parcel dest, int flags) { ... }
|
||||||
|
|
||||||
@@ -481,7 +520,7 @@ public final class HotwordDetectedResult implements Parcelable {
|
|||||||
/** @hide */
|
/** @hide */
|
||||||
@SuppressWarnings({"unchecked", "RedundantCast"})
|
@SuppressWarnings({"unchecked", "RedundantCast"})
|
||||||
@DataClass.Generated.Member
|
@DataClass.Generated.Member
|
||||||
/* package-private */ HotwordDetectedResult(@NonNull android.os.Parcel in) {
|
/* package-private */ HotwordDetectedResult(@NonNull Parcel in) {
|
||||||
// You can override field unparcelling by defining methods like:
|
// You can override field unparcelling by defining methods like:
|
||||||
// static FieldType unparcelFieldName(Parcel in) { ... }
|
// static FieldType unparcelFieldName(Parcel in) { ... }
|
||||||
|
|
||||||
@@ -512,7 +551,7 @@ public final class HotwordDetectedResult implements Parcelable {
|
|||||||
com.android.internal.util.AnnotationValidations.validate(
|
com.android.internal.util.AnnotationValidations.validate(
|
||||||
NonNull.class, null, mExtras);
|
NonNull.class, null, mExtras);
|
||||||
|
|
||||||
// onConstructed(); // You can define this method to get a callback
|
onConstructed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@DataClass.Generated.Member
|
@DataClass.Generated.Member
|
||||||
@@ -524,7 +563,7 @@ public final class HotwordDetectedResult implements Parcelable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HotwordDetectedResult createFromParcel(@NonNull android.os.Parcel in) {
|
public HotwordDetectedResult createFromParcel(@NonNull Parcel in) {
|
||||||
return new HotwordDetectedResult(in);
|
return new HotwordDetectedResult(in);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -745,10 +784,10 @@ public final class HotwordDetectedResult implements Parcelable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@DataClass.Generated(
|
@DataClass.Generated(
|
||||||
time = 1621943150502L,
|
time = 1624361647985L,
|
||||||
codegenVersion = "1.0.23",
|
codegenVersion = "1.0.23",
|
||||||
sourceFile = "frameworks/base/core/java/android/service/voice/HotwordDetectedResult.java",
|
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 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 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()\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 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)\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)")
|
||||||
@Deprecated
|
@Deprecated
|
||||||
private void __metadata() {}
|
private void __metadata() {}
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ public abstract class HotwordDetectionService extends Service {
|
|||||||
private static final boolean DBG = true;
|
private static final boolean DBG = true;
|
||||||
|
|
||||||
private static final long UPDATE_TIMEOUT_MILLIS = 5000;
|
private static final long UPDATE_TIMEOUT_MILLIS = 5000;
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
public static final String KEY_INITIALIZATION_STATUS = "initialization_status";
|
public static final String KEY_INITIALIZATION_STATUS = "initialization_status";
|
||||||
|
|
||||||
@@ -388,6 +389,14 @@ public abstract class HotwordDetectionService extends Service {
|
|||||||
*/
|
*/
|
||||||
public void onDetected(@NonNull HotwordDetectedResult result) {
|
public void onDetected(@NonNull HotwordDetectedResult result) {
|
||||||
requireNonNull(result);
|
requireNonNull(result);
|
||||||
|
final PersistableBundle persistableBundle = result.getExtras();
|
||||||
|
if (!persistableBundle.isEmpty() && HotwordDetectedResult.getParcelableSize(
|
||||||
|
persistableBundle) > HotwordDetectedResult.getMaxBundleSize()) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"The bundle size of result is larger than max bundle size ("
|
||||||
|
+ HotwordDetectedResult.getMaxBundleSize()
|
||||||
|
+ ") of HotwordDetectedResult");
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
mRemoteCallback.onDetected(result);
|
mRemoteCallback.onDetected(result);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
|
|||||||
@@ -5007,6 +5007,10 @@
|
|||||||
<!-- Default value for Settings.ASSIST_TOUCH_GESTURE_ENABLED -->
|
<!-- Default value for Settings.ASSIST_TOUCH_GESTURE_ENABLED -->
|
||||||
<bool name="config_assistTouchGestureEnabledDefault">true</bool>
|
<bool name="config_assistTouchGestureEnabledDefault">true</bool>
|
||||||
|
|
||||||
|
<!-- The maximum byte size of the information contained in the bundle of
|
||||||
|
HotwordDetectedResult. -->
|
||||||
|
<integer translatable="false" name="config_hotwordDetectedResultMaxBundleSize">0</integer>
|
||||||
|
|
||||||
<!-- The amount of dimming to apply to wallpapers with mid range luminance. 0 displays
|
<!-- The amount of dimming to apply to wallpapers with mid range luminance. 0 displays
|
||||||
the wallpaper at full brightness. 1 displays the wallpaper as fully black. -->
|
the wallpaper at full brightness. 1 displays the wallpaper as fully black. -->
|
||||||
<item name="config_wallpaperDimAmount" format="float" type="dimen">0.05</item>
|
<item name="config_wallpaperDimAmount" format="float" type="dimen">0.05</item>
|
||||||
|
|||||||
@@ -4404,5 +4404,7 @@
|
|||||||
<java-symbol type="bool" name="config_assistLongPressHomeEnabledDefault" />
|
<java-symbol type="bool" name="config_assistLongPressHomeEnabledDefault" />
|
||||||
<java-symbol type="bool" name="config_assistTouchGestureEnabledDefault" />
|
<java-symbol type="bool" name="config_assistTouchGestureEnabledDefault" />
|
||||||
|
|
||||||
|
<java-symbol type="integer" name="config_hotwordDetectedResultMaxBundleSize" />
|
||||||
|
|
||||||
<java-symbol type="dimen" name="config_wallpaperDimAmount" />
|
<java-symbol type="dimen" name="config_wallpaperDimAmount" />
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user