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

Commit d953ab6f authored by Annie Chin's avatar Annie Chin
Browse files

Move voice interaction callback list to VoiceInteractionManagerService

Bug: 30005941

Change-Id: I23b3bba8b4525068b0f032d5ca908c0f1d181558
parent 2045bdd9
Loading
Loading
Loading
Loading
+38 −2
Original line number Diff line number Diff line
@@ -86,6 +86,9 @@ public class VoiceInteractionManagerService extends SystemService {
    final TreeSet<Integer> mLoadedKeyphraseIds;
    SoundTriggerInternal mSoundTriggerInternal;

    private final RemoteCallbackList<IVoiceInteractionSessionListener>
            mVoiceInteractionSessionListeners = new RemoteCallbackList<>();

    public VoiceInteractionManagerService(Context context) {
        super(context);
        mContext = context;
@@ -1043,8 +1046,41 @@ public class VoiceInteractionManagerService extends SystemService {
        public void registerVoiceInteractionSessionListener(
                IVoiceInteractionSessionListener listener) {
            enforceCallingPermission(Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE);
            if (mImpl != null) {
                mImpl.registerVoiceInteractionSessionListener(listener);
            synchronized (this) {
                mVoiceInteractionSessionListeners.register(listener);
            }
        }

        public void onSessionShown() {
            synchronized (this) {
                final int size = mVoiceInteractionSessionListeners.beginBroadcast();
                for (int i = 0; i < size; ++i) {
                    final IVoiceInteractionSessionListener listener =
                            mVoiceInteractionSessionListeners.getBroadcastItem(i);
                    try {
                        listener.onVoiceSessionShown();
                    } catch (RemoteException e) {
                        Slog.e(TAG, "Error delivering voice interaction open event.", e);
                    }
                }
                mVoiceInteractionSessionListeners.finishBroadcast();
            }
        }

        public void onSessionHidden() {
            synchronized (this) {
                final int size = mVoiceInteractionSessionListeners.beginBroadcast();
                for (int i = 0; i < size; ++i) {
                    final IVoiceInteractionSessionListener listener =
                            mVoiceInteractionSessionListeners.getBroadcastItem(i);
                    try {
                        listener.onVoiceSessionHidden();

                    } catch (RemoteException e) {
                        Slog.e(TAG, "Error delivering voice interaction closed event.", e);
                    }
                }
                mVoiceInteractionSessionListeners.finishBroadcast();
            }
        }

+12 −46
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
@@ -60,7 +59,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne

    final Context mContext;
    final Handler mHandler;
    final Object mLock;
    final VoiceInteractionManagerService.VoiceInteractionManagerServiceStub mServiceStub;
    final int mUser;
    final ComponentName mComponent;
    final IActivityManager mAm;
@@ -73,16 +72,13 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
    VoiceInteractionSessionConnection mActiveSession;
    int mDisabledShowContext;

    private final RemoteCallbackList<IVoiceInteractionSessionListener>
            mVoiceInteractionSessionListeners = new RemoteCallbackList<>();

    final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
                String reason = intent.getStringExtra("reason");
                if (!CLOSE_REASON_VOICE_INTERACTION.equals(reason) && !"dream".equals(reason)) {
                    synchronized (mLock) {
                    synchronized (mServiceStub) {
                        if (mActiveSession != null && mActiveSession.mSession != null) {
                            try {
                                mActiveSession.mSession.closeSystemDialogs();
@@ -98,7 +94,7 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
    final ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            synchronized (mLock) {
            synchronized (mServiceStub) {
                mService = IVoiceInteractionService.Stub.asInterface(service);
                try {
                    mService.ready();
@@ -113,11 +109,12 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
        }
    };

    VoiceInteractionManagerServiceImpl(Context context, Handler handler, Object lock,
    VoiceInteractionManagerServiceImpl(Context context, Handler handler,
            VoiceInteractionManagerService.VoiceInteractionManagerServiceStub stub,
            int userHandle, ComponentName service) {
        mContext = context;
        mHandler = handler;
        mLock = lock;
        mServiceStub = stub;
        mUser = userHandle;
        mComponent = service;
        mAm = ActivityManagerNative.getDefault();
@@ -153,8 +150,9 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
    public boolean showSessionLocked(Bundle args, int flags,
            IVoiceInteractionSessionShowCallback showCallback, IBinder activityToken) {
        if (mActiveSession == null) {
            mActiveSession = new VoiceInteractionSessionConnection(mLock, mSessionComponentName,
                    mUser, mContext, this, mInfo.getServiceInfo().applicationInfo.uid, mHandler);
            mActiveSession = new VoiceInteractionSessionConnection(mServiceStub,
                    mSessionComponentName, mUser, mContext, this,
                    mInfo.getServiceInfo().applicationInfo.uid, mHandler);
        }
        List<IBinder> activityTokens = null;
        if (activityToken == null) {
@@ -358,52 +356,20 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne
        }
    }

    public void registerVoiceInteractionSessionListener(
            IVoiceInteractionSessionListener listener) {
        synchronized (mLock) {
            mVoiceInteractionSessionListeners.register(listener);
        }
    }

    @Override
    public void sessionConnectionGone(VoiceInteractionSessionConnection connection) {
        synchronized (mLock) {
        synchronized (mServiceStub) {
            finishLocked(connection.mToken, false);
        }
    }

    @Override
    public void onSessionShown(VoiceInteractionSessionConnection connection) {
        synchronized (mLock) {
            final int size = mVoiceInteractionSessionListeners.beginBroadcast();
            for (int i = 0; i < size; ++i) {
                final IVoiceInteractionSessionListener listener =
                        mVoiceInteractionSessionListeners.getBroadcastItem(i);
                try {
                    listener.onVoiceSessionShown();
                } catch (RemoteException e) {
                    Slog.e(TAG, "Error delivering voice interaction open event.", e);
                }
            }
            mVoiceInteractionSessionListeners.finishBroadcast();
        }
        mServiceStub.onSessionShown();
    }

    @Override
    public void onSessionHidden(VoiceInteractionSessionConnection connection) {
        synchronized (mLock) {
            final int size = mVoiceInteractionSessionListeners.beginBroadcast();
            for (int i = 0; i < size; ++i) {
                final IVoiceInteractionSessionListener listener =
                        mVoiceInteractionSessionListeners.getBroadcastItem(i);
                try {
                    listener.onVoiceSessionHidden();

                } catch (RemoteException e) {
                    Slog.e(TAG, "Error delivering voice interaction closed event.", e);
                }
            }
            mVoiceInteractionSessionListeners.finishBroadcast();
        }
        mServiceStub.onSessionHidden();
    }
}