Merge "Add metrics for software and external source detections." into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
52f51d89f1
@@ -31,11 +31,18 @@ import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTION_SERV
|
|||||||
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTION_SERVICE_INIT_RESULT_REPORTED__RESULT__CALLBACK_INIT_STATE_UNKNOWN_TIMEOUT;
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTION_SERVICE_INIT_RESULT_REPORTED__RESULT__CALLBACK_INIT_STATE_UNKNOWN_TIMEOUT;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTION_SERVICE_RESTARTED__REASON__AUDIO_SERVICE_DIED;
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTION_SERVICE_RESTARTED__REASON__AUDIO_SERVICE_DIED;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTION_SERVICE_RESTARTED__REASON__SCHEDULE;
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTION_SERVICE_RESTARTED__REASON__SCHEDULE;
|
||||||
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__APP_REQUEST_UPDATE_STATE;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__CALLBACK_UPDATE_STATE_AFTER_TIMEOUT;
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__CALLBACK_UPDATE_STATE_AFTER_TIMEOUT;
|
||||||
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__EXTERNAL_SOURCE_DETECTED;
|
||||||
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__EXTERNAL_SOURCE_DETECT_SECURITY_EXCEPTION;
|
||||||
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__EXTERNAL_SOURCE_REJECTED;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__ON_CONNECTED;
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__ON_CONNECTED;
|
||||||
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__ON_DISCONNECTED;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__REQUEST_BIND_SERVICE;
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__REQUEST_BIND_SERVICE;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__REQUEST_BIND_SERVICE_FAIL;
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__REQUEST_BIND_SERVICE_FAIL;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__REQUEST_UPDATE_STATE;
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__REQUEST_UPDATE_STATE;
|
||||||
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__START_EXTERNAL_SOURCE_DETECTION;
|
||||||
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_EVENTS__EVENT__START_SOFTWARE_DETECTION;
|
||||||
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__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_DSP;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__DETECTED;
|
import static com.android.internal.util.FrameworkStatsLog.HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__DETECTED;
|
||||||
@@ -146,6 +153,13 @@ final class HotwordDetectionConnection {
|
|||||||
private static final int METRICS_KEYPHRASE_TRIGGERED_REJECT_UNEXPECTED_CALLBACK =
|
private static final int METRICS_KEYPHRASE_TRIGGERED_REJECT_UNEXPECTED_CALLBACK =
|
||||||
HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECT_UNEXPECTED_CALLBACK;
|
HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECT_UNEXPECTED_CALLBACK;
|
||||||
|
|
||||||
|
private static final int METRICS_EXTERNAL_SOURCE_DETECTED =
|
||||||
|
HOTWORD_DETECTOR_EVENTS__EVENT__EXTERNAL_SOURCE_DETECTED;
|
||||||
|
private static final int METRICS_EXTERNAL_SOURCE_REJECTED =
|
||||||
|
HOTWORD_DETECTOR_EVENTS__EVENT__EXTERNAL_SOURCE_REJECTED;
|
||||||
|
private static final int METRICS_EXTERNAL_SOURCE_DETECT_SECURITY_EXCEPTION =
|
||||||
|
HOTWORD_DETECTOR_EVENTS__EVENT__EXTERNAL_SOURCE_DETECT_SECURITY_EXCEPTION;
|
||||||
|
|
||||||
private final Executor mAudioCopyExecutor = Executors.newCachedThreadPool();
|
private final Executor mAudioCopyExecutor = Executors.newCachedThreadPool();
|
||||||
// TODO: This may need to be a Handler(looper)
|
// TODO: This may need to be a Handler(looper)
|
||||||
private final ScheduledExecutorService mScheduledExecutorService =
|
private final ScheduledExecutorService mScheduledExecutorService =
|
||||||
@@ -382,6 +396,10 @@ final class HotwordDetectionConnection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void updateStateLocked(PersistableBundle options, SharedMemory sharedMemory) {
|
void updateStateLocked(PersistableBundle options, SharedMemory sharedMemory) {
|
||||||
|
HotwordMetricsLogger.writeDetectorEvent(mDetectorType,
|
||||||
|
HOTWORD_DETECTOR_EVENTS__EVENT__APP_REQUEST_UPDATE_STATE,
|
||||||
|
mVoiceInteractionServiceUid);
|
||||||
|
|
||||||
// Prevent doing the init late, so restart is handled equally to a clean process start.
|
// Prevent doing the init late, so restart is handled equally to a clean process start.
|
||||||
// TODO(b/191742511): this logic needs a test
|
// TODO(b/191742511): this logic needs a test
|
||||||
if (!mUpdateStateAfterStartFinished.get()
|
if (!mUpdateStateAfterStartFinished.get()
|
||||||
@@ -422,14 +440,23 @@ final class HotwordDetectionConnection {
|
|||||||
Slog.d(TAG, "onDetected");
|
Slog.d(TAG, "onDetected");
|
||||||
}
|
}
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
|
HotwordMetricsLogger.writeKeyphraseTriggerEvent(
|
||||||
|
mDetectorType,
|
||||||
|
HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__DETECTED);
|
||||||
if (!mPerformingSoftwareHotwordDetection) {
|
if (!mPerformingSoftwareHotwordDetection) {
|
||||||
Slog.i(TAG, "Hotword detection has already completed");
|
Slog.i(TAG, "Hotword detection has already completed");
|
||||||
|
HotwordMetricsLogger.writeKeyphraseTriggerEvent(
|
||||||
|
mDetectorType,
|
||||||
|
METRICS_KEYPHRASE_TRIGGERED_DETECT_UNEXPECTED_CALLBACK);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mPerformingSoftwareHotwordDetection = false;
|
mPerformingSoftwareHotwordDetection = false;
|
||||||
try {
|
try {
|
||||||
enforcePermissionsForDataDelivery();
|
enforcePermissionsForDataDelivery();
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
|
HotwordMetricsLogger.writeKeyphraseTriggerEvent(
|
||||||
|
mDetectorType,
|
||||||
|
METRICS_KEYPHRASE_TRIGGERED_DETECT_SECURITY_EXCEPTION);
|
||||||
mSoftwareCallback.onError();
|
mSoftwareCallback.onError();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -449,6 +476,9 @@ final class HotwordDetectionConnection {
|
|||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Slog.wtf(TAG, "onRejected");
|
Slog.wtf(TAG, "onRejected");
|
||||||
}
|
}
|
||||||
|
HotwordMetricsLogger.writeKeyphraseTriggerEvent(
|
||||||
|
mDetectorType,
|
||||||
|
HOTWORD_DETECTOR_KEYPHRASE_TRIGGERED__RESULT__REJECTED);
|
||||||
// onRejected isn't allowed here, and we are not expecting it.
|
// onRejected isn't allowed here, and we are not expecting it.
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -460,6 +490,9 @@ final class HotwordDetectionConnection {
|
|||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
internalCallback));
|
internalCallback));
|
||||||
|
HotwordMetricsLogger.writeDetectorEvent(mDetectorType,
|
||||||
|
HOTWORD_DETECTOR_EVENTS__EVENT__START_SOFTWARE_DETECTION,
|
||||||
|
mVoiceInteractionServiceUid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startListeningFromExternalSource(
|
public void startListeningFromExternalSource(
|
||||||
@@ -891,6 +924,9 @@ final class HotwordDetectionConnection {
|
|||||||
@Override
|
@Override
|
||||||
public void onRejected(HotwordRejectedResult result)
|
public void onRejected(HotwordRejectedResult result)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
|
HotwordMetricsLogger.writeDetectorEvent(mDetectorType,
|
||||||
|
METRICS_EXTERNAL_SOURCE_REJECTED,
|
||||||
|
mVoiceInteractionServiceUid);
|
||||||
mScheduledExecutorService.schedule(
|
mScheduledExecutorService.schedule(
|
||||||
() -> {
|
() -> {
|
||||||
bestEffortClose(serviceAudioSink, audioSource);
|
bestEffortClose(serviceAudioSink, audioSource);
|
||||||
@@ -912,6 +948,9 @@ final class HotwordDetectionConnection {
|
|||||||
@Override
|
@Override
|
||||||
public void onDetected(HotwordDetectedResult triggerResult)
|
public void onDetected(HotwordDetectedResult triggerResult)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
|
HotwordMetricsLogger.writeDetectorEvent(mDetectorType,
|
||||||
|
METRICS_EXTERNAL_SOURCE_DETECTED,
|
||||||
|
mVoiceInteractionServiceUid);
|
||||||
mScheduledExecutorService.schedule(
|
mScheduledExecutorService.schedule(
|
||||||
() -> {
|
() -> {
|
||||||
bestEffortClose(serviceAudioSink, audioSource);
|
bestEffortClose(serviceAudioSink, audioSource);
|
||||||
@@ -922,6 +961,9 @@ final class HotwordDetectionConnection {
|
|||||||
try {
|
try {
|
||||||
enforcePermissionsForDataDelivery();
|
enforcePermissionsForDataDelivery();
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
|
HotwordMetricsLogger.writeDetectorEvent(mDetectorType,
|
||||||
|
METRICS_EXTERNAL_SOURCE_DETECT_SECURITY_EXCEPTION,
|
||||||
|
mVoiceInteractionServiceUid);
|
||||||
callback.onError();
|
callback.onError();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -942,6 +984,9 @@ final class HotwordDetectionConnection {
|
|||||||
// A copy of this has been created and passed to the hotword validator
|
// A copy of this has been created and passed to the hotword validator
|
||||||
bestEffortClose(serviceAudioSource);
|
bestEffortClose(serviceAudioSource);
|
||||||
});
|
});
|
||||||
|
HotwordMetricsLogger.writeDetectorEvent(mDetectorType,
|
||||||
|
HOTWORD_DETECTOR_EVENTS__EVENT__START_EXTERNAL_SOURCE_DETECTION,
|
||||||
|
mVoiceInteractionServiceUid);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ServiceConnectionFactory {
|
private class ServiceConnectionFactory {
|
||||||
@@ -1002,7 +1047,12 @@ final class HotwordDetectionConnection {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mIsBound = connected;
|
mIsBound = connected;
|
||||||
if (connected && !mIsLoggedFirstConnect) {
|
|
||||||
|
if (!connected) {
|
||||||
|
HotwordMetricsLogger.writeDetectorEvent(mDetectorType,
|
||||||
|
HOTWORD_DETECTOR_EVENTS__EVENT__ON_DISCONNECTED,
|
||||||
|
mVoiceInteractionServiceUid);
|
||||||
|
} else if (!mIsLoggedFirstConnect) {
|
||||||
mIsLoggedFirstConnect = true;
|
mIsLoggedFirstConnect = true;
|
||||||
HotwordMetricsLogger.writeDetectorEvent(mDetectorType,
|
HotwordMetricsLogger.writeDetectorEvent(mDetectorType,
|
||||||
HOTWORD_DETECTOR_EVENTS__EVENT__ON_CONNECTED,
|
HOTWORD_DETECTOR_EVENTS__EVENT__ON_CONNECTED,
|
||||||
|
|||||||
Reference in New Issue
Block a user