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

Commit cac94950 authored by Chris Thornton's avatar Chris Thornton Committed by Android (Google) Code Review
Browse files

Merge "VIMS should only stop the keyphrases it started." into nyc-dev

parents 00f8ee28 f967da90
Loading
Loading
Loading
Loading
+0 −28
Original line number Original line Diff line number Diff line
@@ -482,34 +482,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
        return status;
        return status;
    }
    }


    /**
     * Stops all recognitions active currently and clears the internal state.
     */
    void stopAllRecognitions() {
        synchronized (mLock) {
            MetricsLogger.count(mContext, "sth_stop_all_recognitions", 1);
            if (mModuleProperties == null || mModule == null) {
                return;
            }

            // Stop all recognition models.
            for (ModelData model : mModelDataMap.values()) {
                if (model.isModelStarted()) {
                    int status = stopRecognitionLocked(model,
                            false /* do not notify for synchronous calls */);
                    if (status != STATUS_OK) {
                        Slog.w(TAG, "Error stopping model: " + model.getHandle());
                    }
                    model.setStopped();
                    model.setRequested(false);
                    model.clearCallback();
                    model.setRecognitionConfig(null);
                }
            }
            internalClearGlobalStateLocked();
        }
    }

    public ModuleProperties getModuleProperties() {
    public ModuleProperties getModuleProperties() {
        return mModuleProperties;
        return mModuleProperties;
    }
    }
+3 −5
Original line number Original line Diff line number Diff line
@@ -68,13 +68,11 @@ public abstract class SoundTriggerInternal {
     */
     */
    public abstract int stopRecognition(int keyphraseId, IRecognitionStatusCallback listener);
    public abstract int stopRecognition(int keyphraseId, IRecognitionStatusCallback listener);


    /**
     * Stops all recognitions active currently and clears the internal state.
     */
    public abstract void stopAllRecognitions();

    public abstract ModuleProperties getModuleProperties();
    public abstract ModuleProperties getModuleProperties();


    /**
     * Unloads (and stops if running) the given keyphraseId
     */
    public abstract int unloadKeyphraseModel(int keyphaseId);
    public abstract int unloadKeyphraseModel(int keyphaseId);


    public abstract void dump(FileDescriptor fd, PrintWriter pw, String[] args);
    public abstract void dump(FileDescriptor fd, PrintWriter pw, String[] args);
+0 −6
Original line number Original line Diff line number Diff line
@@ -205,12 +205,6 @@ public class SoundTriggerService extends SystemService {
            return mSoundTriggerHelper.stopKeyphraseRecognition(keyphraseId, listener);
            return mSoundTriggerHelper.stopKeyphraseRecognition(keyphraseId, listener);
        }
        }


        @Override
        public void stopAllRecognitions() {
            if (!isInitialized()) return;
            mSoundTriggerHelper.stopAllRecognitions();
        }

        @Override
        @Override
        public ModuleProperties getModuleProperties() {
        public ModuleProperties getModuleProperties() {
            if (!isInitialized()) return null;
            if (!isInitialized()) return null;
+26 −2
Original line number Original line Diff line number Diff line
@@ -69,6 +69,7 @@ import com.android.server.UiThread;
import java.io.FileDescriptor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.List;
import java.util.List;
import java.util.TreeSet;


/**
/**
 * SystemService that publishes an IVoiceInteractionManagerService.
 * SystemService that publishes an IVoiceInteractionManagerService.
@@ -81,6 +82,7 @@ public class VoiceInteractionManagerService extends SystemService {
    final ContentResolver mResolver;
    final ContentResolver mResolver;
    final DatabaseHelper mDbHelper;
    final DatabaseHelper mDbHelper;
    final ActivityManagerInternal mAmInternal;
    final ActivityManagerInternal mAmInternal;
    final TreeSet<Integer> mLoadedKeyphraseIds;
    SoundTriggerInternal mSoundTriggerInternal;
    SoundTriggerInternal mSoundTriggerInternal;


    public VoiceInteractionManagerService(Context context) {
    public VoiceInteractionManagerService(Context context) {
@@ -90,6 +92,7 @@ public class VoiceInteractionManagerService extends SystemService {
        mDbHelper = new DatabaseHelper(context);
        mDbHelper = new DatabaseHelper(context);
        mServiceStub = new VoiceInteractionManagerServiceStub();
        mServiceStub = new VoiceInteractionManagerServiceStub();
        mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
        mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
        mLoadedKeyphraseIds = new TreeSet<Integer>();


        PackageManagerInternal packageManagerInternal = LocalServices.getService(
        PackageManagerInternal packageManagerInternal = LocalServices.getService(
                PackageManagerInternal.class);
                PackageManagerInternal.class);
@@ -394,7 +397,7 @@ public class VoiceInteractionManagerService extends SystemService {


                if (force || mImpl == null || mImpl.mUser != mCurUser
                if (force || mImpl == null || mImpl.mUser != mCurUser
                        || !mImpl.mComponent.equals(serviceComponent)) {
                        || !mImpl.mComponent.equals(serviceComponent)) {
                    mSoundTriggerInternal.stopAllRecognitions();
                    unloadAllKeyphraseModels();
                    if (mImpl != null) {
                    if (mImpl != null) {
                        mImpl.shutdownLocked();
                        mImpl.shutdownLocked();
                    }
                    }
@@ -785,6 +788,7 @@ public class VoiceInteractionManagerService extends SystemService {
                        if (mImpl != null && mImpl.mService != null) {
                        if (mImpl != null && mImpl.mService != null) {
                            mImpl.notifySoundModelsChangedLocked();
                            mImpl.notifySoundModelsChangedLocked();
                        }
                        }
                        mLoadedKeyphraseIds.remove(keyphraseId);
                    }
                    }
                }
                }
                Binder.restoreCallingIdentity(caller);
                Binder.restoreCallingIdentity(caller);
@@ -865,6 +869,11 @@ public class VoiceInteractionManagerService extends SystemService {
                    Slog.w(TAG, "No matching sound model found in startRecognition");
                    Slog.w(TAG, "No matching sound model found in startRecognition");
                    return SoundTriggerInternal.STATUS_ERROR;
                    return SoundTriggerInternal.STATUS_ERROR;
                } else {
                } else {
                    // Regardless of the status of the start recognition, we need to make sure
                    // that we unload this model if needed later.
                    synchronized (this) {
                        mLoadedKeyphraseIds.add(keyphraseId);
                    }
                    return mSoundTriggerInternal.startRecognition(
                    return mSoundTriggerInternal.startRecognition(
                            keyphraseId, soundModel, callback, recognitionConfig);
                            keyphraseId, soundModel, callback, recognitionConfig);
                }
                }
@@ -893,6 +902,21 @@ public class VoiceInteractionManagerService extends SystemService {
            }
            }
        }
        }


        private synchronized void unloadAllKeyphraseModels() {
            for (int keyphraseId : mLoadedKeyphraseIds) {
                final long caller = Binder.clearCallingIdentity();
                try {
                    int status = mSoundTriggerInternal.unloadKeyphraseModel(keyphraseId);
                    if (status != SoundTriggerInternal.STATUS_OK) {
                        Slog.w(TAG, "Failed to unload keyphrase " + keyphraseId + ":" + status);
                    }
                } finally {
                    Binder.restoreCallingIdentity(caller);
                }
            }
            mLoadedKeyphraseIds.clear();
        }

        @Override
        @Override
        public ComponentName getActiveServiceComponentName() {
        public ComponentName getActiveServiceComponentName() {
            enforceCallingPermission(Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE);
            enforceCallingPermission(Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE);
@@ -1078,7 +1102,7 @@ public class VoiceInteractionManagerService extends SystemService {
                    // The user is force stopping our current interactor/recognizer.
                    // The user is force stopping our current interactor/recognizer.
                    // Clear the current settings and restore default state.
                    // Clear the current settings and restore default state.
                    synchronized (VoiceInteractionManagerService.this) {
                    synchronized (VoiceInteractionManagerService.this) {
                        mSoundTriggerInternal.stopAllRecognitions();
                        unloadAllKeyphraseModels();
                        if (mImpl != null) {
                        if (mImpl != null) {
                            mImpl.shutdownLocked();
                            mImpl.shutdownLocked();
                            mImpl = null;
                            mImpl = null;