Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8cd0a42 authored by Ahaan Ugale's avatar Ahaan Ugale Committed by Joanne Chung
Browse files

Trusted Hotword: Disable periodic restarts.

Mitigates quality risk that may arise due to mismanaged state around the
restarts (either on the platform or application side).

Restarts will be flag-controlled and ramped back up later.

Bug: 224618257
Test: manual
Change-Id: I3b17b47fab4120b42d75443b213be3c1ef5491aa
parent d5cdea48
Loading
Loading
Loading
Loading
+24 −12
Original line number Diff line number Diff line
@@ -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
@@ -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;
@@ -150,7 +156,6 @@ final class HotwordDetectionConnection {
    private IMicrophoneHotwordDetectionVoiceInteractionCallback mSoftwareCallback;
    private Instant mLastRestartInstant;

    private ScheduledFuture<?> mCancellationTaskFuture;
    private ScheduledFuture<?> mCancellationKeyPhraseDetectionFuture;
    private ScheduledFuture<?> mDebugHotwordLoggingTimeoutFuture = null;

@@ -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(() -> {
@@ -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() {
@@ -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);
        }
@@ -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);