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

Commit fcc3b512 authored by Jin Seok Park's avatar Jin Seok Park
Browse files

[Media ML] Add setting custom MediaButtonReceiver

Bug: 156564443
Test: manually
Change-Id: Ibb655256f72d80e5e7ff169cac6dd4cce95ed3d5
parent 94b5bbea
Loading
Loading
Loading
Loading
+19 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.media;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.PendingIntent;
import android.media.session.ISessionManager;
import android.media.session.MediaSession;
import android.os.Binder;
@@ -76,6 +77,9 @@ public abstract class MediaKeyDispatcher {
    /**
     * Implement this to customize the logic for which MediaSession should consume which key event.
     *
     * Note: This session will have greater priority over the {@link PendingIntent} returned from
     * {@link #getCustomMediaButtonReceiver()}.
     *
     * @param keyEvent a non-null KeyEvent whose key code is one of the supported media buttons.
     * @param uid the uid value retrieved by calling {@link Binder#getCallingUid()} from
     *         {@link ISessionManager#dispatchMediaKeyEvent(String, boolean, KeyEvent, boolean)}
@@ -84,11 +88,25 @@ public abstract class MediaKeyDispatcher {
     * @return a {@link MediaSession.Token} instance that should consume the given key event.
     */
    @Nullable
    MediaSession.Token getSessionForKeyEvent(@NonNull KeyEvent keyEvent, int uid,
    MediaSession.Token getCustomMediaSession(@NonNull KeyEvent keyEvent, int uid,
            boolean asSystemService) {
        return null;
    }

    /**
     * Implement this to customize the logic for which MediaButtonReceiver should consume a
     * dispatched key event.
     *
     * Note: This pending intent will have lower priority over the {@link MediaSession.Token}
     * returned from {@link #getCustomMediaButtonReceiver()}.
     *
     * @return a {@link PendingIntent} instance that should receive the dispatched key event.
     */
    @Nullable
    PendingIntent getCustomMediaButtonReceiver() {
        return null;
    }

    /**
     * Gets the map of key code -> {@link KeyEventType} that have been overridden.
     * <p>
+17 −8
Original line number Diff line number Diff line
@@ -2404,18 +2404,31 @@ public class MediaSessionService extends SystemService implements Monitor {
                return;
            }
            MediaSessionRecord session = null;
            MediaButtonReceiverHolder mediaButtonReceiverHolder = null;

            // Retrieve custom session for key event if it exists.
            if (mCustomMediaKeyDispatcher != null) {
                MediaSession.Token token = mCustomMediaKeyDispatcher.getSessionForKeyEvent(
                MediaSession.Token token = mCustomMediaKeyDispatcher.getCustomMediaSession(
                        keyEvent, uid, asSystemService);
                if (token != null) {
                    session = getMediaSessionRecordLocked(token);
                }
            }

                if (session == null) {
                    PendingIntent pi = mCustomMediaKeyDispatcher.getCustomMediaButtonReceiver();
                    if (pi != null) {
                        mediaButtonReceiverHolder = MediaButtonReceiverHolder.create(mContext,
                                mCurrentFullUserRecord.mFullUserId, pi);
                    }
                }
            }

            if (session == null && mediaButtonReceiverHolder == null) {
                session = (MediaSessionRecord) mCurrentFullUserRecord.getMediaButtonSessionLocked();

                if (session == null) {
                    mediaButtonReceiverHolder =
                            mCurrentFullUserRecord.mLastMediaButtonReceiverHolder;
                }
            }

            if (session != null) {
@@ -2438,16 +2451,12 @@ public class MediaSessionService extends SystemService implements Monitor {
                } catch (RemoteException e) {
                    Log.w(TAG, "Failed to send callback", e);
                }
            } else if (mCurrentFullUserRecord.mLastMediaButtonReceiverHolder != null) {
            } else if (mediaButtonReceiverHolder != null) {
                if (needWakeLock) {
                    mKeyEventReceiver.acquireWakeLockLocked();
                }
                String callingPackageName =
                        (asSystemService) ? mContext.getPackageName() : packageName;

                MediaButtonReceiverHolder mediaButtonReceiverHolder =
                        mCurrentFullUserRecord.mLastMediaButtonReceiverHolder;

                boolean sent = mediaButtonReceiverHolder.send(
                        mContext, keyEvent, callingPackageName,
                        needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1, mKeyEventReceiver,