Loading services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java +24 −12 Original line number Diff line number Diff line Loading @@ -116,6 +116,11 @@ final class HotwordDetectionConnection { private static final Duration MAX_UPDATE_TIMEOUT_DURATION = Duration.ofMillis(MAX_UPDATE_TIMEOUT_MILLIS); private static final long RESET_DEBUG_HOTWORD_LOGGING_TIMEOUT_MILLIS = 60 * 60 * 1000; // 1 hour /** * Time after which each HotwordDetectionService process is stopped and replaced by a new one. * 0 indicates no restarts. */ private static final int RESTART_PERIOD_SECONDS = 0; private static final int MAX_ISOLATED_PROCESS_NUMBER = 10; // Hotword metrics Loading @@ -134,6 +139,7 @@ final class HotwordDetectionConnection { // TODO: This may need to be a Handler(looper) private final ScheduledExecutorService mScheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); @Nullable private final ScheduledFuture<?> mCancellationTaskFuture; private final AtomicBoolean mUpdateStateAfterStartFinished = new AtomicBoolean(false); private final IBinder.DeathRecipient mAudioServerDeathRecipient = this::audioServerDied; private final @NonNull ServiceConnectionFactory mServiceConnectionFactory; Loading @@ -150,7 +156,6 @@ final class HotwordDetectionConnection { private IMicrophoneHotwordDetectionVoiceInteractionCallback mSoftwareCallback; private Instant mLastRestartInstant; private ScheduledFuture<?> mCancellationTaskFuture; private ScheduledFuture<?> mCancellationKeyPhraseDetectionFuture; private ScheduledFuture<?> mDebugHotwordLoggingTimeoutFuture = null; Loading Loading @@ -196,6 +201,9 @@ final class HotwordDetectionConnection { mLastRestartInstant = Instant.now(); updateStateAfterProcessStart(options, sharedMemory); if (RESTART_PERIOD_SECONDS <= 0) { mCancellationTaskFuture = null; } else { // TODO(volnov): we need to be smarter here, e.g. schedule it a bit more often, but wait // until the current session is closed. mCancellationTaskFuture = mScheduledExecutorService.scheduleAtFixedRate(() -> { Loading @@ -205,7 +213,8 @@ final class HotwordDetectionConnection { HotwordMetricsLogger.writeServiceRestartEvent(mDetectorType, HOTWORD_DETECTION_SERVICE_RESTARTED__REASON__SCHEDULE); } }, 30, 30, TimeUnit.MINUTES); }, RESTART_PERIOD_SECONDS, RESTART_PERIOD_SECONDS, TimeUnit.SECONDS); } } private void initAudioFlingerLocked() { Loading Loading @@ -346,7 +355,9 @@ final class HotwordDetectionConnection { removeServiceUidForAudioPolicy(mIdentity.getIsolatedUid()); } mIdentity = null; if (mCancellationTaskFuture != null) { mCancellationTaskFuture.cancel(/* may interrupt */ true); } if (mAudioFlinger != null) { mAudioFlinger.unlinkToDeath(mAudioServerDeathRecipient, /* flags= */ 0); } Loading Loading @@ -764,6 +775,7 @@ final class HotwordDetectionConnection { } public void dump(String prefix, PrintWriter pw) { pw.print(prefix); pw.print("RESTART_PERIOD_SECONDS="); pw.println(RESTART_PERIOD_SECONDS); pw.print(prefix); pw.print("mBound=" + mRemoteHotwordDetectionService.isBound()); pw.print(", mValidatingDspTrigger=" + mValidatingDspTrigger); Loading Loading
services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java +24 −12 Original line number Diff line number Diff line Loading @@ -116,6 +116,11 @@ final class HotwordDetectionConnection { private static final Duration MAX_UPDATE_TIMEOUT_DURATION = Duration.ofMillis(MAX_UPDATE_TIMEOUT_MILLIS); private static final long RESET_DEBUG_HOTWORD_LOGGING_TIMEOUT_MILLIS = 60 * 60 * 1000; // 1 hour /** * Time after which each HotwordDetectionService process is stopped and replaced by a new one. * 0 indicates no restarts. */ private static final int RESTART_PERIOD_SECONDS = 0; private static final int MAX_ISOLATED_PROCESS_NUMBER = 10; // Hotword metrics Loading @@ -134,6 +139,7 @@ final class HotwordDetectionConnection { // TODO: This may need to be a Handler(looper) private final ScheduledExecutorService mScheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); @Nullable private final ScheduledFuture<?> mCancellationTaskFuture; private final AtomicBoolean mUpdateStateAfterStartFinished = new AtomicBoolean(false); private final IBinder.DeathRecipient mAudioServerDeathRecipient = this::audioServerDied; private final @NonNull ServiceConnectionFactory mServiceConnectionFactory; Loading @@ -150,7 +156,6 @@ final class HotwordDetectionConnection { private IMicrophoneHotwordDetectionVoiceInteractionCallback mSoftwareCallback; private Instant mLastRestartInstant; private ScheduledFuture<?> mCancellationTaskFuture; private ScheduledFuture<?> mCancellationKeyPhraseDetectionFuture; private ScheduledFuture<?> mDebugHotwordLoggingTimeoutFuture = null; Loading Loading @@ -196,6 +201,9 @@ final class HotwordDetectionConnection { mLastRestartInstant = Instant.now(); updateStateAfterProcessStart(options, sharedMemory); if (RESTART_PERIOD_SECONDS <= 0) { mCancellationTaskFuture = null; } else { // TODO(volnov): we need to be smarter here, e.g. schedule it a bit more often, but wait // until the current session is closed. mCancellationTaskFuture = mScheduledExecutorService.scheduleAtFixedRate(() -> { Loading @@ -205,7 +213,8 @@ final class HotwordDetectionConnection { HotwordMetricsLogger.writeServiceRestartEvent(mDetectorType, HOTWORD_DETECTION_SERVICE_RESTARTED__REASON__SCHEDULE); } }, 30, 30, TimeUnit.MINUTES); }, RESTART_PERIOD_SECONDS, RESTART_PERIOD_SECONDS, TimeUnit.SECONDS); } } private void initAudioFlingerLocked() { Loading Loading @@ -346,7 +355,9 @@ final class HotwordDetectionConnection { removeServiceUidForAudioPolicy(mIdentity.getIsolatedUid()); } mIdentity = null; if (mCancellationTaskFuture != null) { mCancellationTaskFuture.cancel(/* may interrupt */ true); } if (mAudioFlinger != null) { mAudioFlinger.unlinkToDeath(mAudioServerDeathRecipient, /* flags= */ 0); } Loading Loading @@ -764,6 +775,7 @@ final class HotwordDetectionConnection { } public void dump(String prefix, PrintWriter pw) { pw.print(prefix); pw.print("RESTART_PERIOD_SECONDS="); pw.println(RESTART_PERIOD_SECONDS); pw.print(prefix); pw.print("mBound=" + mRemoteHotwordDetectionService.isBound()); pw.print(", mValidatingDspTrigger=" + mValidatingDspTrigger); Loading