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

Commit 645623e7 authored by lpeter's avatar lpeter
Browse files

Implement a callback to report HotwordDetectionService status

When the application uses VoiceInteractionService to create a
SoftwareHotwordDetector, we need to report the HotwordDetectionService
status to the application, but we pass null callback into the
updateStateLocked function, it means that we will not receive the
HotwordDetectionService status.

In this change, we implement IHotwordRecognitionStatusCallback and
pass the callback into updateStateLocked function. When we receive
the HotwordDetectionService status, we will pass the status to the
application.

Bug: 183239093
Test: atest CtsVoiceInteractionTestCases
Test: atest CtsVoiceInteractionTestCases --instant
Change-Id: I1a1b8abe5c7e82eddaa2f0a83f54110df74d1efb
parent ba76d446
Loading
Loading
Loading
Loading
+56 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static com.android.internal.util.function.pooled.PooledLambda.obtainMessa

import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.hardware.soundtrigger.SoundTrigger;
import android.media.AudioFormat;
import android.os.Handler;
import android.os.Looper;
@@ -31,6 +32,7 @@ import android.os.RemoteException;
import android.os.SharedMemory;
import android.util.Slog;

import com.android.internal.app.IHotwordRecognitionStatusCallback;
import com.android.internal.app.IVoiceInteractionManagerService;

import java.io.PrintWriter;
@@ -64,7 +66,8 @@ class SoftwareHotwordDetector extends AbstractHotwordDetector {
        mAudioFormat = audioFormat;
        mCallback = callback;
        mHandler = new Handler(Looper.getMainLooper());
        updateStateLocked(options, sharedMemory, null /* callback */);
        updateStateLocked(options, sharedMemory,
                new InitializationStateListener(mHandler, mCallback));
    }

    @RequiresPermission(RECORD_AUDIO)
@@ -133,6 +136,58 @@ class SoftwareHotwordDetector extends AbstractHotwordDetector {
        }
    }

    private static class InitializationStateListener
            extends IHotwordRecognitionStatusCallback.Stub {
        private final Handler mHandler;
        private final HotwordDetector.Callback mCallback;

        InitializationStateListener(Handler handler, HotwordDetector.Callback callback) {
            this.mHandler = handler;
            this.mCallback = callback;
        }

        @Override
        public void onKeyphraseDetected(SoundTrigger.KeyphraseRecognitionEvent recognitionEvent)
                throws RemoteException {

        }

        @Override
        public void onGenericSoundTriggerDetected(
                SoundTrigger.GenericRecognitionEvent recognitionEvent) throws RemoteException {

        }

        @Override
        public void onRejected(HotwordRejectedResult result) throws RemoteException {

        }

        @Override
        public void onError(int status) throws RemoteException {

        }

        @Override
        public void onRecognitionPaused() throws RemoteException {

        }

        @Override
        public void onRecognitionResumed() throws RemoteException {

        }

        @Override
        public void onStatusReported(int status) {
            Slog.v(TAG, "onStatusReported" + (DEBUG ? "(" + status + ")" : ""));
            mHandler.sendMessage(obtainMessage(
                    HotwordDetector.Callback::onHotwordDetectionServiceInitialized,
                    mCallback,
                    status));
        }
    }

    /** @hide */
    public void dump(String prefix, PrintWriter pw) {
        // TODO: implement this