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

Commit 3b61d2df authored by Jean-Michel Trivi's avatar Jean-Michel Trivi
Browse files

AudioManager event dispatcher: make more generic

Async event dispatcher in AudioManager is hardwired for audio focus.
Make more generic so it can be used for other callbacks.

Bug 22876530

Change-Id: I9315230af10c69f65d6845bd944fce13e48c1e91
parent 5724fe9d
Loading
Loading
Loading
Loading
+34 −17
Original line number Diff line number Diff line
@@ -2115,28 +2115,37 @@ public class AudioManager {
    }

    /**
     * Handler for audio focus events coming from the audio service.
     * Handler for events (audio focus change, recording config change) coming from the
     * audio service.
     */
    private final FocusEventHandlerDelegate mAudioFocusEventHandlerDelegate =
            new FocusEventHandlerDelegate();
    private final ServiceEventHandlerDelegate mServiceEventHandlerDelegate =
            new ServiceEventHandlerDelegate();

    /**
     * Helper class to handle the forwarding of audio focus events to the appropriate listener
     * Event types
     */
    private class FocusEventHandlerDelegate {
    private final static int MSSG_FOCUS_CHANGE = 0;
    private final static int MSSG_RECORDING_CONFIG_CHANGE = 1;

    /**
     * Helper class to handle the forwarding of audio service events to the appropriate listener
     */
    private class ServiceEventHandlerDelegate {
        private final Handler mHandler;

        FocusEventHandlerDelegate() {
        ServiceEventHandlerDelegate() {
            Looper looper;
            if ((looper = Looper.myLooper()) == null) {
                looper = Looper.getMainLooper();
            }

            if (looper != null) {
                // implement the event handler delegate to receive audio focus events
                // implement the event handler delegate to receive events from audio service
                mHandler = new Handler(looper) {
                    @Override
                    public void handleMessage(Message msg) {
                        switch (msg.what) {
                            case MSSG_FOCUS_CHANGE:
                                OnAudioFocusChangeListener listener = null;
                                synchronized(mFocusListenerLock) {
                                    listener = findFocusListener((String)msg.obj);
@@ -2144,7 +2153,14 @@ public class AudioManager {
                                if (listener != null) {
                                    Log.d(TAG, "AudioManager dispatching onAudioFocusChange("
                                            + msg.what + ") for " + msg.obj);
                            listener.onAudioFocusChange(msg.what);
                                    listener.onAudioFocusChange(msg.arg1);
                                }
                                break;
                            case MSSG_RECORDING_CONFIG_CHANGE:
                                // cool stuff happening here in a bit, patience
                                break;
                            default:
                                Log.e(TAG, "Unknown event " + msg.what);
                        }
                    }
                };
@@ -2161,8 +2177,9 @@ public class AudioManager {
    private final IAudioFocusDispatcher mAudioFocusDispatcher = new IAudioFocusDispatcher.Stub() {

        public void dispatchAudioFocusChange(int focusChange, String id) {
            Message m = mAudioFocusEventHandlerDelegate.getHandler().obtainMessage(focusChange, id);
            mAudioFocusEventHandlerDelegate.getHandler().sendMessage(m);
            Message m = mServiceEventHandlerDelegate.getHandler().obtainMessage(
                    MSSG_FOCUS_CHANGE/*what*/, focusChange/*arg1*/, 0/*arg2 ignored*/, id/*obj*/);
            mServiceEventHandlerDelegate.getHandler().sendMessage(m);
        }

    };