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

Commit b91a5e74 authored by Annie Chin's avatar Annie Chin Committed by Android (Google) Code Review
Browse files

Merge "Move voice interaction callback list to VoiceInteractionManagerService" into nyc-mr1-dev

parents 5e6dd44b d953ab6f
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();
    }
}