summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Nicholas Ambur <nambur@google.com> 2023-03-23 20:11:57 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2023-03-23 20:11:57 +0000
commitf5428fadb4b6c5dff0e744fba15aede2ed12af52 (patch)
tree14dfa2fceed5085cc85c45c86efad1969da14bae
parent3adc574ee373128ac534d20ab9142660ee50be62 (diff)
parent2076ef71eed22c9590028036b4db17f217d29d5b (diff)
Merge changes from topic "latencytracker-vi-fix" into tm-qpr-dev am: 2076ef71ee
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22192239 Change-Id: I26bd7acde29426045e3dabfff312cccd2bd38b61 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordMetricsLogger.java43
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java24
2 files changed, 64 insertions, 3 deletions
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordMetricsLogger.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordMetricsLogger.java
index c35d90f4a495..f7b66a26ff68 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordMetricsLogger.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordMetricsLogger.java
@@ -34,10 +34,13 @@ import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENT
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__DETECTOR_TYPE__NORMAL_DETECTOR;
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__DETECTOR_TYPE__TRUSTED_DETECTOR_DSP;
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__DETECTOR_TYPE__TRUSTED_DETECTOR_SOFTWARE;
+import static com.android.internal.util.LatencyTracker.ACTION_SHOW_VOICE_INTERACTION;
+import android.content.Context;
import android.service.voice.HotwordDetector;
import com.android.internal.util.FrameworkStatsLog;
+import com.android.internal.util.LatencyTracker;
/**
* A utility class for logging hotword statistics event.
@@ -116,6 +119,46 @@ public final class HotwordMetricsLogger {
metricsDetectorType, event, uid, streamSizeBytes, bundleSizeBytes, streamCount);
}
+ /**
+ * Starts a {@link LatencyTracker} log for the time it takes to show the
+ * {@link android.service.voice.VoiceInteractionSession} system UI after a voice trigger.
+ *
+ * @see LatencyTracker
+ *
+ * @param tag Extra tag to separate different sessions from each other.
+ */
+ public static void startHotwordTriggerToUiLatencySession(Context context, String tag) {
+ LatencyTracker.getInstance(context).onActionStart(ACTION_SHOW_VOICE_INTERACTION, tag);
+ }
+
+ /**
+ * Completes a {@link LatencyTracker} log for the time it takes to show the
+ * {@link android.service.voice.VoiceInteractionSession} system UI after a voice trigger.
+ *
+ * <p>Completing this session will result in logging metric data.</p>
+ *
+ * @see LatencyTracker
+ */
+ public static void stopHotwordTriggerToUiLatencySession(Context context) {
+ LatencyTracker.getInstance(context).onActionEnd(ACTION_SHOW_VOICE_INTERACTION);
+ }
+
+ /**
+ * Cancels a {@link LatencyTracker} log for the time it takes to show the
+ * {@link android.service.voice.VoiceInteractionSession} system UI after a voice trigger.
+ *
+ * <p>Cancels typically occur when the VoiceInteraction session UI is shown for reasons outside
+ * of a {@link android.hardware.soundtrigger.SoundTrigger.RecognitionEvent} such as an
+ * invocation from an external source or service.</p>
+ *
+ * <p>Canceling this session will not result in logging metric data.
+ *
+ * @see LatencyTracker
+ */
+ public static void cancelHotwordTriggerToUiLatencySession(Context context) {
+ LatencyTracker.getInstance(context).onActionCancel(ACTION_SHOW_VOICE_INTERACTION);
+ }
+
private static int getCreateMetricsDetectorType(int detectorType) {
switch (detectorType) {
case HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_SOFTWARE:
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index bc5c9ec7a29c..56351202564c 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -95,7 +95,6 @@ import com.android.internal.app.IVoiceInteractor;
import com.android.internal.content.PackageMonitor;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.DumpUtils;
-import com.android.internal.util.LatencyTracker;
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemService;
@@ -404,6 +403,10 @@ public class VoiceInteractionManagerService extends SystemService {
final int callingUid = Binder.getCallingUid();
final long caller = Binder.clearCallingIdentity();
try {
+ // HotwordDetector trigger uses VoiceInteractionService#showSession
+ // We need to cancel here because UI is not being shown due to a SoundTrigger
+ // HAL event.
+ HotwordMetricsLogger.cancelHotwordTriggerToUiLatencySession(mContext);
mImpl.showSessionLocked(options,
VoiceInteractionSession.SHOW_SOURCE_ACTIVITY,
new IVoiceInteractionSessionShowCallback.Stub() {
@@ -954,6 +957,13 @@ public class VoiceInteractionManagerService extends SystemService {
Slog.w(TAG, "showSessionFromSession without running voice interaction service");
return false;
}
+ // If the token is null, then the request to show the session is not coming from
+ // the active VoiceInteractionService session.
+ // We need to cancel here because UI is not being shown due to a SoundTrigger
+ // HAL event.
+ if (token == null) {
+ HotwordMetricsLogger.cancelHotwordTriggerToUiLatencySession(mContext);
+ }
final long caller = Binder.clearCallingIdentity();
try {
return mImpl.showSessionLocked(sessionArgs, flags, null, null);
@@ -1718,6 +1728,11 @@ public class VoiceInteractionManagerService extends SystemService {
final long caller = Binder.clearCallingIdentity();
try {
+ // HotwordDetector trigger uses VoiceInteractionService#showSession
+ // We need to cancel here because UI is not being shown due to a SoundTrigger
+ // HAL event.
+ HotwordMetricsLogger.cancelHotwordTriggerToUiLatencySession(mContext);
+
return mImpl.showSessionLocked(args,
sourceFlags
| VoiceInteractionSession.SHOW_WITH_ASSIST
@@ -2361,8 +2376,11 @@ public class VoiceInteractionManagerService extends SystemService {
public void onVoiceSessionWindowVisibilityChanged(boolean visible)
throws RemoteException {
if (visible) {
- LatencyTracker.getInstance(mContext)
- .onActionEnd(LatencyTracker.ACTION_SHOW_VOICE_INTERACTION);
+ // The AlwaysOnHotwordDetector trigger latency is always completed here even
+ // if the reason the window was shown was not due to a SoundTrigger HAL
+ // event. It is expected that the latency will be canceled if shown for
+ // other invocation reasons, and this call becomes a noop.
+ HotwordMetricsLogger.stopHotwordTriggerToUiLatencySession(mContext);
}
}