diff options
6 files changed, 38 insertions, 12 deletions
diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl index 95c2d611fa27..bb59e5b4be35 100644 --- a/media/java/android/media/session/ISessionManager.aidl +++ b/media/java/android/media/session/ISessionManager.aidl @@ -38,4 +38,7 @@ interface ISessionManager { // This is for the system volume UI only void setRemoteVolumeController(in IRemoteVolumeController rvc); + + // For PhoneWindowManager to precheck media keys + boolean isGlobalPriorityActive(); }
\ No newline at end of file diff --git a/media/java/android/media/session/MediaSessionLegacyHelper.java b/media/java/android/media/session/MediaSessionLegacyHelper.java index 5ce7f9f3f8ed..b37ee6e8031b 100644 --- a/media/java/android/media/session/MediaSessionLegacyHelper.java +++ b/media/java/android/media/session/MediaSessionLegacyHelper.java @@ -232,6 +232,10 @@ public class MediaSessionLegacyHelper { } } + public boolean isGlobalPriorityActive() { + return mSessionManager.isGlobalPriorityActive(); + } + public void addRccListener(PendingIntent pi, MediaSession.Callback listener) { if (pi == null) { Log.w(TAG, "Pending intent was null, can't add rcc listener."); diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java index 185c6d816926..b4fff8f7c22c 100644 --- a/media/java/android/media/session/MediaSessionManager.java +++ b/media/java/android/media/session/MediaSessionManager.java @@ -296,6 +296,21 @@ public final class MediaSessionManager { } /** + * Check if the global priority session is currently active. This can be + * used to decide if media keys should be sent to the session or to the app. + * + * @hide + */ + public boolean isGlobalPriorityActive() { + try { + return mService.isGlobalPriorityActive(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to check if the global priority is active.", e); + } + return false; + } + + /** * Listens for changes to the list of active sessions. This can be added * using {@link #addOnActiveSessionsChangedListener}. */ diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 6ea44974e49b..f7ed364002ac 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -4248,8 +4248,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0 || event.isWakeKey(); if (interactive || (isInjected && !isWakeKey)) { - // When the device is interactive or the key is injected pass the key to the - // application. + // When the device is interactive or the key is injected pass the + // key to the application. result = ACTION_PASS_TO_USER; isWakeKey = false; } else if (!interactive && shouldDispatchInputWhenNonInteractive()) { @@ -4449,16 +4449,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { case KeyEvent.KEYCODE_MEDIA_PLAY: case KeyEvent.KEYCODE_MEDIA_PAUSE: case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: - if (down) { - TelecomManager telecomManager = getTelecommService(); - if (telecomManager != null) { - if (telecomManager.isInCall()) { - // Suppress PLAY/PAUSE toggle when phone is ringing or in-call - // to avoid music playback. - break; - } - } - } case KeyEvent.KEYCODE_HEADSETHOOK: case KeyEvent.KEYCODE_MUTE: case KeyEvent.KEYCODE_MEDIA_STOP: @@ -4468,6 +4458,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { case KeyEvent.KEYCODE_MEDIA_RECORD: case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK: { + if (MediaSessionLegacyHelper.getHelper(mContext).isGlobalPriorityActive()) { + // If the global session is active pass all media keys to it + // instead of the active window. + result &= ~ACTION_PASS_TO_USER; + } if ((result & ACTION_PASS_TO_USER) == 0) { // Only do this if we would otherwise not pass it to the user. In that // case, the PhoneWindow class will do the same thing, except it will diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index aaa29fc3a1cf..02c9fcb517ac 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -743,6 +743,11 @@ public class MediaSessionService extends SystemService implements Monitor { } @Override + public boolean isGlobalPriorityActive() { + return mPriorityStack.isGlobalPriorityActive(); + } + + @Override public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { if (getContext().checkCallingOrSelfPermission(Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) { diff --git a/services/core/java/com/android/server/media/MediaSessionStack.java b/services/core/java/com/android/server/media/MediaSessionStack.java index e464be7c16b2..c48a075fbca0 100644 --- a/services/core/java/com/android/server/media/MediaSessionStack.java +++ b/services/core/java/com/android/server/media/MediaSessionStack.java @@ -217,6 +217,10 @@ public class MediaSessionStack { return null; } + public boolean isGlobalPriorityActive() { + return mGlobalPrioritySession == null ? false : mGlobalPrioritySession.isActive(); + } + public void dump(PrintWriter pw, String prefix) { ArrayList<MediaSessionRecord> sortedSessions = getPriorityListLocked(false, 0, UserHandle.USER_ALL); |