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

Commit b4f4f69e authored by RoboErik's avatar RoboErik Committed by Android (Google) Code Review
Browse files

Merge "Move media key processing to sessions"

parents d069cd51 8a2cfc30
Loading
Loading
Loading
Loading
+16 −13
Original line number Diff line number Diff line
@@ -428,7 +428,6 @@ public class AudioManager {
    public static final int USE_DEFAULT_STREAM_TYPE = Integer.MIN_VALUE;

    private static IAudioService sService;
    private MediaSessionLegacyHelper mSessionHelper;

    /**
     * @hide
@@ -439,9 +438,6 @@ public class AudioManager {
                com.android.internal.R.bool.config_useMasterVolume);
        mUseVolumeKeySounds = mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_useVolumeKeySounds);
        if (USE_SESSIONS) {
            mSessionHelper = MediaSessionLegacyHelper.getHelper(context);
        }
    }

    private static IAudioService getService()
@@ -478,6 +474,10 @@ public class AudioManager {
     *     or {@link KeyEvent#KEYCODE_MEDIA_AUDIO_TRACK}.
     */
    public void dispatchMediaKeyEvent(KeyEvent keyEvent) {
        if (USE_SESSIONS) {
            MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(mContext);
            helper.sendMediaButtonEvent(keyEvent, false);
        } else {
            IAudioService service = getService();
            try {
                service.dispatchMediaKeyEvent(keyEvent);
@@ -485,6 +485,7 @@ public class AudioManager {
                Log.e(TAG, "dispatchMediaKeyEvent threw exception ", e);
            }
        }
    }

    /**
     * @hide
@@ -2178,7 +2179,8 @@ public class AudioManager {
            Log.e(TAG, "Dead object in registerMediaButtonIntent"+e);
        }
        if (USE_SESSIONS) {
            mSessionHelper.addMediaButtonListener(pi, mContext);
            MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(mContext);
            helper.addMediaButtonListener(pi, mContext);
        }
    }

@@ -2254,7 +2256,8 @@ public class AudioManager {
            Log.e(TAG, "Dead object in unregisterMediaButtonIntent"+e);
        }
        if (USE_SESSIONS) {
            mSessionHelper.removeMediaButtonListener(pi);
            MediaSessionLegacyHelper helper = MediaSessionLegacyHelper.getHelper(mContext);
            helper.removeMediaButtonListener(pi);
        }
    }

@@ -2281,7 +2284,7 @@ public class AudioManager {
            Log.e(TAG, "Dead object in registerRemoteControlClient"+e);
        }
        if (USE_SESSIONS) {
            rcClient.registerWithSession(mSessionHelper);
            rcClient.registerWithSession(MediaSessionLegacyHelper.getHelper(mContext));
        }
    }

@@ -2303,7 +2306,7 @@ public class AudioManager {
            Log.e(TAG, "Dead object in unregisterRemoteControlClient"+e);
        }
        if (USE_SESSIONS) {
            rcClient.unregisterWithSession(mSessionHelper);
            rcClient.unregisterWithSession(MediaSessionLegacyHelper.getHelper(mContext));
        }
    }

+25 −4
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import android.database.ContentObserver;
import android.hardware.usb.UsbManager;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.session.MediaSessionLegacyHelper;
import android.os.Binder;
import android.os.Build;
import android.os.Environment;
@@ -108,6 +109,10 @@ public class AudioService extends IAudioService.Stub {
    /** Debug volumes */
    protected static final boolean DEBUG_VOL = false;

    /** Reroute calls to media session apis */
    private static final boolean USE_SESSIONS = true;
    private static final boolean DEBUG_SESSIONS = true;

    /** How long to delay before persisting a change in volume/ringer mode. */
    private static final int PERSIST_DELAY = 500;

@@ -3472,7 +3477,7 @@ public class AudioService extends IAudioService.Stub {
                if (volume < 0) {
                    volFloat = (float)Math.pow(10, (float)sSoundEffectVolumeDb/20);
                } else {
                    volFloat = (float) volume / 1000.0f;
                    volFloat = volume / 1000.0f;
                }

                if (SOUND_EFFECT_FILES_MAP[effectType][1] > 0) {
@@ -3554,7 +3559,7 @@ public class AudioService extends IAudioService.Stub {
                    }
                    Settings.System.putFloatForUser(mContentResolver,
                                                    Settings.System.VOLUME_MASTER,
                                                    (float)msg.arg1 / (float)1000.0,
                                                    msg.arg1 / (float)1000.0,
                                                    UserHandle.USER_CURRENT);
                    break;

@@ -4325,12 +4330,28 @@ public class AudioService extends IAudioService.Stub {
    }

    public void dispatchMediaKeyEvent(KeyEvent keyEvent) {
        if (USE_SESSIONS) {
            if (DEBUG_SESSIONS) {
                int pid = getCallingPid();
                Log.w(TAG, "Call to dispatchMediaKeyEvent from " + pid);
            }
            MediaSessionLegacyHelper.getHelper(mContext).sendMediaButtonEvent(keyEvent, false);
        } else {
            mMediaFocusControl.dispatchMediaKeyEvent(keyEvent);
        }
    }

    public void dispatchMediaKeyEventUnderWakelock(KeyEvent keyEvent) {
        if (USE_SESSIONS) {
            if (DEBUG_SESSIONS) {
                int pid = getCallingPid();
                Log.w(TAG, "Call to dispatchMediaKeyEventUnderWakelock from " + pid);
            }
            MediaSessionLegacyHelper.getHelper(mContext).sendMediaButtonEvent(keyEvent, true);
        } else {
            mMediaFocusControl.dispatchMediaKeyEventUnderWakelock(keyEvent);
        }
    }

    //==========================================================================================
    // Audio Focus
+1 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ import android.os.ResultReceiver;
 */
oneway interface ISessionCallback {
    void onCommand(String command, in Bundle extras, in ResultReceiver cb);
    void onMediaButton(in Intent mediaButtonIntent);
    void onMediaButton(in Intent mediaButtonIntent, in ResultReceiver cb);
    void onRequestRouteChange(in RouteInfo route);
    void onRouteConnected(in RouteInfo route, in RouteOptions options);
    void onRouteDisconnected(in RouteInfo route, int reason);
+2 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import android.content.ComponentName;
import android.media.session.ISession;
import android.media.session.ISessionCallback;
import android.os.Bundle;
import android.view.KeyEvent;

/**
 * Interface to the MediaSessionManagerService
@@ -27,4 +28,5 @@ import android.os.Bundle;
interface ISessionManager {
    ISession createSession(String packageName, in ISessionCallback cb, String tag, int userId);
    List<IBinder> getSessions(in ComponentName compName, int userId);
    void dispatchMediaKeyEvent(in KeyEvent keyEvent, boolean needWakeLock);
}
 No newline at end of file
+83 −18
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import android.view.KeyEvent;
 */
public class MediaSessionLegacyHelper {
    private static final String TAG = "MediaSessionHelper";
    private static final boolean DEBUG = true;

    private static final Object sLock = new Object();
    private static MediaSessionLegacyHelper sInstance;
@@ -52,6 +53,9 @@ public class MediaSessionLegacyHelper {
    }

    public static MediaSessionLegacyHelper getHelper(Context context) {
        if (DEBUG) {
            Log.d(TAG, "Attempting to get helper with context " + context);
        }
        synchronized (sLock) {
            if (sInstance == null) {
                sInstance = new MediaSessionLegacyHelper(context);
@@ -65,12 +69,25 @@ public class MediaSessionLegacyHelper {
        return holder == null ? null : holder.mSession;
    }

    public void addRccListener(PendingIntent pi, TransportPerformer.Listener listener) {
    public void sendMediaButtonEvent(KeyEvent keyEvent, boolean needWakeLock) {
        mSessionManager.dispatchMediaKeyEvent(keyEvent, needWakeLock);
        if (DEBUG) {
            Log.d(TAG, "dispatched media key " + keyEvent);
        }
    }

    public void addRccListener(PendingIntent pi, TransportPerformer.Listener listener) {
        if (pi == null) {
            Log.w(TAG, "Pending intent was null, can't add rcc listener.");
            return;
        }
        SessionHolder holder = getHolder(pi, true);
        TransportPerformer performer = holder.mSession.getTransportPerformer();
        if (holder.mRccListener != null) {
            if (holder.mRccListener == listener) {
                if (DEBUG) {
                    Log.d(TAG, "addRccListener listener already added.");
                }
                // This is already the registered listener, ignore
                return;
            }
@@ -82,9 +99,15 @@ public class MediaSessionLegacyHelper {
        holder.mFlags |= Session.FLAG_HANDLES_TRANSPORT_CONTROLS;
        holder.mSession.setFlags(holder.mFlags);
        holder.update();
        if (DEBUG) {
            Log.d(TAG, "Added rcc listener for " + pi + ".");
        }
    }

    public void removeRccListener(PendingIntent pi) {
        if (pi == null) {
            return;
        }
        SessionHolder holder = getHolder(pi, false);
        if (holder != null && holder.mRccListener != null) {
            holder.mSession.getTransportPerformer().removeListener(holder.mRccListener);
@@ -92,30 +115,56 @@ public class MediaSessionLegacyHelper {
            holder.mFlags &= ~Session.FLAG_HANDLES_TRANSPORT_CONTROLS;
            holder.mSession.setFlags(holder.mFlags);
            holder.update();
            if (DEBUG) {
                Log.d(TAG, "Removed rcc listener for " + pi + ".");
            }
        }
    }

    public void addMediaButtonListener(PendingIntent pi,
            Context context) {
        if (pi == null) {
            Log.w(TAG, "Pending intent was null, can't addMediaButtonListener.");
            return;
        }
        SessionHolder holder = getHolder(pi, true);
        if (holder.mMediaButtonListener != null) {
            // Already have this listener registered
            // Already have this listener registered, but update it anyway as
            // the extras may have changed.
            if (DEBUG) {
                Log.d(TAG, "addMediaButtonListener already added " + pi);
            }
            return;
        }
        holder.mMediaButtonListener = new MediaButtonListener(pi, context);
        holder.mFlags |= Session.FLAG_HANDLES_MEDIA_BUTTONS;
        holder.mSession.setFlags(holder.mFlags);
        holder.mSession.getTransportPerformer().addListener(holder.mMediaButtonListener, mHandler);

        holder.mMediaButtonReceiver = new MediaButtonReceiver(pi, context);
        holder.mSession.addCallback(holder.mMediaButtonReceiver, mHandler);
        if (DEBUG) {
            Log.d(TAG, "addMediaButtonListener added " + pi);
        }
    }

    public void removeMediaButtonListener(PendingIntent pi) {
        if (pi == null) {
            return;
        }
        SessionHolder holder = getHolder(pi, false);
        if (holder != null && holder.mMediaButtonListener != null) {
            holder.mSession.getTransportPerformer().removeListener(holder.mMediaButtonListener);
            holder.mFlags &= ~Session.FLAG_HANDLES_MEDIA_BUTTONS;
            holder.mSession.setFlags(holder.mFlags);
            holder.mMediaButtonListener = null;

            holder.mSession.removeCallback(holder.mMediaButtonReceiver);
            holder.mMediaButtonReceiver = null;
            holder.update();
            if (DEBUG) {
                Log.d(TAG, "removeMediaButtonListener removed " + pi);
            }
        }
    }

@@ -130,7 +179,32 @@ public class MediaSessionLegacyHelper {
        return holder;
    }

    public static class MediaButtonListener extends TransportPerformer.Listener {
    private static void sendKeyEvent(PendingIntent pi, Context context, Intent intent) {
        try {
            pi.send(context, 0, intent);
        } catch (CanceledException e) {
            Log.e(TAG, "Error sending media key down event:", e);
            // Don't bother sending up if down failed
            return;
        }
    }

    private static final class MediaButtonReceiver extends Session.Callback {
        private final PendingIntent mPendingIntent;
        private final Context mContext;

        public MediaButtonReceiver(PendingIntent pi, Context context) {
            mPendingIntent = pi;
            mContext = context;
        }

        @Override
        public void onMediaButton(Intent mediaButtonIntent) {
            MediaSessionLegacyHelper.sendKeyEvent(mPendingIntent, mContext, mediaButtonIntent);
        }
    }

    private static final class MediaButtonListener extends TransportPerformer.Listener {
        private final PendingIntent mPendingIntent;
        private final Context mContext;

@@ -179,20 +253,14 @@ public class MediaSessionLegacyHelper {
            Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);

            intent.putExtra(Intent.EXTRA_KEY_EVENT, ke);
            try {
                mPendingIntent.send(mContext, 0, intent);
            } catch (CanceledException e) {
                Log.e(TAG, "Error sending media key down event:", e);
                // Don't bother sending up if down failed
                return;
            }
            MediaSessionLegacyHelper.sendKeyEvent(mPendingIntent, mContext, intent);

            ke = new KeyEvent(KeyEvent.ACTION_UP, keyCode);
            intent.putExtra(Intent.EXTRA_KEY_EVENT, ke);
            try {
                mPendingIntent.send(mContext, 0, intent);
            } catch (CanceledException e) {
                Log.e(TAG, "Error sending media key up event:", e);
            MediaSessionLegacyHelper.sendKeyEvent(mPendingIntent, mContext, intent);

            if (DEBUG) {
                Log.d(TAG, "Sent " + keyCode + " to pending intent " + mPendingIntent);
            }
        }
    }
@@ -201,6 +269,7 @@ public class MediaSessionLegacyHelper {
        public final Session mSession;
        public final PendingIntent mPi;
        public MediaButtonListener mMediaButtonListener;
        public MediaButtonReceiver mMediaButtonReceiver;
        public TransportPerformer.Listener mRccListener;
        public int mFlags;

@@ -213,10 +282,6 @@ public class MediaSessionLegacyHelper {
            if (mMediaButtonListener == null && mRccListener == null) {
                mSession.release();
                mSessions.remove(mPi);
            } else if (mMediaButtonListener != null && mRccListener != null) {
                // TODO set session to active
            } else {
                // TODO set session to inactive
            }
        }
    }
Loading