diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/DspTrustedHotwordDetectorSession.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/DspTrustedHotwordDetectorSession.java index 2812264e989cb..9375b59d91237 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/DspTrustedHotwordDetectorSession.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/DspTrustedHotwordDetectorSession.java @@ -106,12 +106,14 @@ final class DspTrustedHotwordDetectorSession extends HotwordDetectorSession { } HotwordMetricsLogger.writeKeyphraseTriggerEvent( HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_DSP, - HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__DETECTED); + HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__DETECTED, + mVoiceInteractionServiceUid); if (!mValidatingDspTrigger) { Slog.i(TAG, "Ignoring #onDetected due to a process restart"); HotwordMetricsLogger.writeKeyphraseTriggerEvent( HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_DSP, - METRICS_KEYPHRASE_TRIGGERED_DETECT_UNEXPECTED_CALLBACK); + METRICS_KEYPHRASE_TRIGGERED_DETECT_UNEXPECTED_CALLBACK, + mVoiceInteractionServiceUid); return; } mValidatingDspTrigger = false; @@ -122,7 +124,8 @@ final class DspTrustedHotwordDetectorSession extends HotwordDetectorSession { Slog.i(TAG, "Ignoring #onDetected due to a SecurityException", e); HotwordMetricsLogger.writeKeyphraseTriggerEvent( HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_DSP, - METRICS_KEYPHRASE_TRIGGERED_DETECT_SECURITY_EXCEPTION); + METRICS_KEYPHRASE_TRIGGERED_DETECT_SECURITY_EXCEPTION, + mVoiceInteractionServiceUid); externalCallback.onError(CALLBACK_ONDETECTED_GOT_SECURITY_EXCEPTION); return; } @@ -157,12 +160,14 @@ final class DspTrustedHotwordDetectorSession extends HotwordDetectorSession { } HotwordMetricsLogger.writeKeyphraseTriggerEvent( HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_DSP, - HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECTED); + HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECTED, + mVoiceInteractionServiceUid); if (!mValidatingDspTrigger) { Slog.i(TAG, "Ignoring #onRejected due to a process restart"); HotwordMetricsLogger.writeKeyphraseTriggerEvent( HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_DSP, - METRICS_KEYPHRASE_TRIGGERED_REJECT_UNEXPECTED_CALLBACK); + METRICS_KEYPHRASE_TRIGGERED_REJECT_UNEXPECTED_CALLBACK, + mVoiceInteractionServiceUid); return; } mValidatingDspTrigger = false; @@ -187,7 +192,8 @@ final class DspTrustedHotwordDetectorSession extends HotwordDetectorSession { Slog.w(TAG, "Timed out on #detectFromDspSource"); HotwordMetricsLogger.writeKeyphraseTriggerEvent( HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_DSP, - HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__DETECT_TIMEOUT); + HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__DETECT_TIMEOUT, + mVoiceInteractionServiceUid); try { externalCallback.onError(CALLBACK_DETECT_TIMEOUT); } catch (RemoteException e) { @@ -220,7 +226,8 @@ final class DspTrustedHotwordDetectorSession extends HotwordDetectorSession { mCallback.onRejected(new HotwordRejectedResult.Builder().build()); HotwordMetricsLogger.writeKeyphraseTriggerEvent( HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_DSP, - HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECTED_FROM_RESTART); + HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECTED_FROM_RESTART, + mVoiceInteractionServiceUid); } catch (RemoteException e) { Slog.w(TAG, "Failed to call #rejected"); HotwordMetricsLogger.writeDetectorEvent( diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java index 2a4d4a15afdf0..411bad601bf4f 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java @@ -165,7 +165,8 @@ final class HotwordDetectionConnection { synchronized (mLock) { restartProcessLocked(); HotwordMetricsLogger.writeServiceRestartEvent(mDetectorType, - HOTWORD_DETECTION_SERVICE_RESTARTED__REASON__SCHEDULE); + HOTWORD_DETECTION_SERVICE_RESTARTED__REASON__SCHEDULE, + mVoiceInteractionServiceUid); } }, mReStartPeriodSeconds, mReStartPeriodSeconds, TimeUnit.SECONDS); } @@ -200,7 +201,8 @@ final class HotwordDetectionConnection { // conditions with audio reading in the service. restartProcessLocked(); HotwordMetricsLogger.writeServiceRestartEvent(mDetectorType, - HOTWORD_DETECTION_SERVICE_RESTARTED__REASON__AUDIO_SERVICE_DIED); + HOTWORD_DETECTION_SERVICE_RESTARTED__REASON__AUDIO_SERVICE_DIED, + mVoiceInteractionServiceUid); } } @@ -364,11 +366,13 @@ final class HotwordDetectionConnection { static final class SoundTriggerCallback extends IRecognitionStatusCallback.Stub { private final HotwordDetectionConnection mHotwordDetectionConnection; private final IHotwordRecognitionStatusCallback mExternalCallback; + private final int mVoiceInteractionServiceUid; SoundTriggerCallback(IHotwordRecognitionStatusCallback callback, - HotwordDetectionConnection connection) { + HotwordDetectionConnection connection, int uid) { mHotwordDetectionConnection = connection; mExternalCallback = callback; + mVoiceInteractionServiceUid = uid; } @Override @@ -381,13 +385,15 @@ final class HotwordDetectionConnection { if (useHotwordDetectionService) { HotwordMetricsLogger.writeKeyphraseTriggerEvent( HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__DETECTOR_TYPE__TRUSTED_DETECTOR_DSP, - HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__KEYPHRASE_TRIGGER); + HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__KEYPHRASE_TRIGGER, + mVoiceInteractionServiceUid); mHotwordDetectionConnection.detectFromDspSource( recognitionEvent, mExternalCallback); } else { HotwordMetricsLogger.writeKeyphraseTriggerEvent( HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__DETECTOR_TYPE__NORMAL_DETECTOR, - HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__KEYPHRASE_TRIGGER); + HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__KEYPHRASE_TRIGGER, + mVoiceInteractionServiceUid); mExternalCallback.onKeyphraseDetected(recognitionEvent, null); } } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectorSession.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectorSession.java index f9f43c9ba49a9..742c324fa66f4 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectorSession.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectorSession.java @@ -238,7 +238,7 @@ abstract class HotwordDetectorSession { try { mCallback.onStatusReported(status); HotwordMetricsLogger.writeServiceInitResultEvent(getDetectorType(), - initResultMetricsResult); + initResultMetricsResult, mVoiceInteractionServiceUid); } catch (RemoteException e) { Slog.w(TAG, "Failed to report initialization status: " + e); HotwordMetricsLogger.writeDetectorEvent(getDetectorType(), @@ -269,7 +269,7 @@ abstract class HotwordDetectorSession { try { mCallback.onStatusReported(INITIALIZATION_STATUS_UNKNOWN); HotwordMetricsLogger.writeServiceInitResultEvent(getDetectorType(), - METRICS_INIT_UNKNOWN_TIMEOUT); + METRICS_INIT_UNKNOWN_TIMEOUT, mVoiceInteractionServiceUid); } catch (RemoteException e) { Slog.w(TAG, "Failed to report initialization status UNKNOWN", e); HotwordMetricsLogger.writeDetectorEvent(getDetectorType(), diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordMetricsLogger.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordMetricsLogger.java index 940aed34b7fba..61c18be6f1333 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordMetricsLogger.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordMetricsLogger.java @@ -64,28 +64,28 @@ public final class HotwordMetricsLogger { /** * Logs information related to hotword detection service init result. */ - public static void writeServiceInitResultEvent(int detectorType, int result) { + public static void writeServiceInitResultEvent(int detectorType, int result, int uid) { int metricsDetectorType = getInitMetricsDetectorType(detectorType); FrameworkStatsLog.write(FrameworkStatsLog.HOTWORD_DETECTION_SERVICE_INIT_RESULT_REPORTED, - metricsDetectorType, result); + metricsDetectorType, result, uid); } /** * Logs information related to hotword detection service restarting. */ - public static void writeServiceRestartEvent(int detectorType, int reason) { + public static void writeServiceRestartEvent(int detectorType, int reason, int uid) { int metricsDetectorType = getRestartMetricsDetectorType(detectorType); FrameworkStatsLog.write(FrameworkStatsLog.HOTWORD_DETECTION_SERVICE_RESTARTED, - metricsDetectorType, reason); + metricsDetectorType, reason, uid); } /** * Logs information related to keyphrase trigger. */ - public static void writeKeyphraseTriggerEvent(int detectorType, int result) { + public static void writeKeyphraseTriggerEvent(int detectorType, int result, int uid) { int metricsDetectorType = getKeyphraseMetricsDetectorType(detectorType); FrameworkStatsLog.write(FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED, - metricsDetectorType, result); + metricsDetectorType, result, uid); } /** diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoftwareTrustedHotwordDetectorSession.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoftwareTrustedHotwordDetectorSession.java index 6930689585687..00aec71309c85 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoftwareTrustedHotwordDetectorSession.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoftwareTrustedHotwordDetectorSession.java @@ -101,12 +101,14 @@ final class SoftwareTrustedHotwordDetectorSession extends HotwordDetectorSession synchronized (mLock) { HotwordMetricsLogger.writeKeyphraseTriggerEvent( HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_SOFTWARE, - HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__DETECTED); + HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__DETECTED, + mVoiceInteractionServiceUid); if (!mPerformingSoftwareHotwordDetection) { Slog.i(TAG, "Hotword detection has already completed"); HotwordMetricsLogger.writeKeyphraseTriggerEvent( HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_SOFTWARE, - METRICS_KEYPHRASE_TRIGGERED_DETECT_UNEXPECTED_CALLBACK); + METRICS_KEYPHRASE_TRIGGERED_DETECT_UNEXPECTED_CALLBACK, + mVoiceInteractionServiceUid); return; } mPerformingSoftwareHotwordDetection = false; @@ -115,7 +117,8 @@ final class SoftwareTrustedHotwordDetectorSession extends HotwordDetectorSession } catch (SecurityException e) { HotwordMetricsLogger.writeKeyphraseTriggerEvent( HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_SOFTWARE, - METRICS_KEYPHRASE_TRIGGERED_DETECT_SECURITY_EXCEPTION); + METRICS_KEYPHRASE_TRIGGERED_DETECT_SECURITY_EXCEPTION, + mVoiceInteractionServiceUid); mSoftwareCallback.onError(); return; } @@ -144,7 +147,8 @@ final class SoftwareTrustedHotwordDetectorSession extends HotwordDetectorSession } HotwordMetricsLogger.writeKeyphraseTriggerEvent( HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_SOFTWARE, - HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECTED); + HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECTED, + mVoiceInteractionServiceUid); // onRejected isn't allowed here, and we are not expecting it. } }; diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index 0a660b0dd44c5..6674520091c1f 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -730,7 +730,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne Slog.d(TAG, "createSoundTriggerCallbackLocked"); } return new HotwordDetectionConnection.SoundTriggerCallback(callback, - mHotwordDetectionConnection); + mHotwordDetectionConnection, mInfo.getServiceInfo().applicationInfo.uid); } private static ServiceInfo getServiceInfoLocked(@NonNull ComponentName componentName,