Loading services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +63 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.PermissionChecker; import android.content.pm.PackageManager; import android.media.AudioManager; import android.media.IMediaRouter2; import android.media.IMediaRouter2Manager; import android.media.MediaRoute2Info; Loading Loading @@ -102,6 +103,7 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** Loading Loading @@ -129,6 +131,9 @@ class MediaRouter2ServiceImpl { Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN }; private static final AtomicReference<MediaRouter2ServiceImpl> sInstance = new AtomicReference<>(); private final Context mContext; private final Looper mLooper; private final UserManagerInternal mUserManagerInternal; Loading Loading @@ -241,6 +246,41 @@ class MediaRouter2ServiceImpl { } } /** * Conditionally handles a volume key press, and returns true if handled. * * <p>A volume key press will only be handled if a routing session subject to volume key presses * exists. * * @param callerLogTag A tag to include in the log line indicating that the event is handled. * @param direction One of {@link AudioManager#ADJUST_LOWER}, {@link AudioManager#ADJUST_RAISE}, * or {@link AudioManager#ADJUST_SAME}. If the direction is not one of these, the key press * will not be handled. * @param suggestedStream The suggested stream to adjust. If the stream is not {@link * AudioManager#USE_DEFAULT_STREAM_TYPE} or {@link AudioManager#STREAM_MUSIC}, the key press * will not be handled. * @return Whether the key press was handled. * @see SystemMediaRoute2Provider2#maybeHandleVolumeKeyEventForSystemMediaSession */ /* package */ static boolean maybeHandleVolumeKeyEvent( String callerLogTag, int direction, int suggestedStream) { var service = Flags.enableMirroringInMediaRouter2() ? sInstance.get() : null; var isRelevantStream = suggestedStream == AudioManager.USE_DEFAULT_STREAM_TYPE || suggestedStream == AudioManager.STREAM_MUSIC; if (service == null || !isRelevantStream) { return false; } var handled = service.maybeHandleVolumeKeyEventInternal(direction); if (handled) { Log.i( TAG, "Volume key press handled by the routing framework. Caller: " + callerLogTag); } return handled; } // Start of methods that implement MediaRouter2 operations. @NonNull Loading Loading @@ -1095,6 +1135,24 @@ class MediaRouter2ServiceImpl { } } private boolean maybeHandleVolumeKeyEventInternal(int direction) { synchronized (mLock) { // TODO: b/396399175 - Replace this for-loop with a singleton system provider when // multi-user support is properly implemented. for (int i = 0; i < mUserRecords.size(); i++) { var userRecord = mUserRecords.valueAt(i); var systemProvider = userRecord.mHandler.getSystemProvider(); var handled = systemProvider.maybeHandleVolumeKeyEventForSystemMediaSession( DUMMY_REQUEST_ID, direction); if (handled) { return true; } } return false; } } /* package */ void updateRunningUserAndProfiles(int newActiveUserId) { synchronized (mLock) { if (mCurrentActiveUserId != newActiveUserId) { Loading Loading @@ -2264,6 +2322,11 @@ class MediaRouter2ServiceImpl { } } /** Invoked when {@link MediaRouterService#systemRunning()} is invoked. */ /* package */ void systemRunning() { sInstance.set(this); } final class UserRecord { public final int mUserId; //TODO: make records private for thread-safety Loading services/core/java/com/android/server/media/MediaRouterService.java +1 −0 Original line number Diff line number Diff line Loading @@ -199,6 +199,7 @@ public final class MediaRouterService extends IMediaRouterService.Stub }, TAG); updateRunningUserAndProfiles(ActivityManager.getCurrentUser()); mService2.systemRunning(); } @Override Loading services/core/java/com/android/server/media/MediaSessionRecord.java +5 −0 Original line number Diff line number Diff line Loading @@ -782,6 +782,11 @@ public class MediaSessionRecord extends MediaSessionRecordImpl implements IBinde String opPackageName, int uid, int pid) { if (MediaRouter2ServiceImpl.maybeHandleVolumeKeyEvent(TAG, direction, stream)) { return; } try { if (useSuggested) { if (AudioSystem.isStreamActive(stream, 0)) { Loading services/core/java/com/android/server/media/MediaSessionService.java +5 −0 Original line number Diff line number Diff line Loading @@ -2574,6 +2574,11 @@ public class MediaSessionService extends SystemService implements Monitor { return; } if (MediaRouter2ServiceImpl.maybeHandleVolumeKeyEvent( TAG, direction, suggestedStream)) { return; } // Execute mAudioService.adjustSuggestedStreamVolume() on // handler thread of MediaSessionService. // This will release the MediaSessionService.mLock sooner and avoid Loading services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +17 −0 Original line number Diff line number Diff line Loading @@ -318,6 +318,23 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { // Do nothing since the system session persists. } /** * Adjusts the volume of {@link MediaRoute2ProviderService service-provided} system media * routing sessions. * * <p>This method does not affect the volume of the system, which is managed by {@link * AudioManager}. * * @param requestId The id of the request, or {@link MediaRoute2ProviderService#REQUEST_ID_NONE} * if there's no associated id. * @param direction One of {@link AudioManager#ADJUST_LOWER}, {@link AudioManager#ADJUST_RAISE}, * or {@link AudioManager#ADJUST_SAME}. * @return Whether the volume key pressed was handled. */ public boolean maybeHandleVolumeKeyEventForSystemMediaSession(long requestId, int direction) { return false; } public MediaRoute2Info getDefaultRoute() { return mDefaultRoute; } Loading Loading
services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +63 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.PermissionChecker; import android.content.pm.PackageManager; import android.media.AudioManager; import android.media.IMediaRouter2; import android.media.IMediaRouter2Manager; import android.media.MediaRoute2Info; Loading Loading @@ -102,6 +103,7 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** Loading Loading @@ -129,6 +131,9 @@ class MediaRouter2ServiceImpl { Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN }; private static final AtomicReference<MediaRouter2ServiceImpl> sInstance = new AtomicReference<>(); private final Context mContext; private final Looper mLooper; private final UserManagerInternal mUserManagerInternal; Loading Loading @@ -241,6 +246,41 @@ class MediaRouter2ServiceImpl { } } /** * Conditionally handles a volume key press, and returns true if handled. * * <p>A volume key press will only be handled if a routing session subject to volume key presses * exists. * * @param callerLogTag A tag to include in the log line indicating that the event is handled. * @param direction One of {@link AudioManager#ADJUST_LOWER}, {@link AudioManager#ADJUST_RAISE}, * or {@link AudioManager#ADJUST_SAME}. If the direction is not one of these, the key press * will not be handled. * @param suggestedStream The suggested stream to adjust. If the stream is not {@link * AudioManager#USE_DEFAULT_STREAM_TYPE} or {@link AudioManager#STREAM_MUSIC}, the key press * will not be handled. * @return Whether the key press was handled. * @see SystemMediaRoute2Provider2#maybeHandleVolumeKeyEventForSystemMediaSession */ /* package */ static boolean maybeHandleVolumeKeyEvent( String callerLogTag, int direction, int suggestedStream) { var service = Flags.enableMirroringInMediaRouter2() ? sInstance.get() : null; var isRelevantStream = suggestedStream == AudioManager.USE_DEFAULT_STREAM_TYPE || suggestedStream == AudioManager.STREAM_MUSIC; if (service == null || !isRelevantStream) { return false; } var handled = service.maybeHandleVolumeKeyEventInternal(direction); if (handled) { Log.i( TAG, "Volume key press handled by the routing framework. Caller: " + callerLogTag); } return handled; } // Start of methods that implement MediaRouter2 operations. @NonNull Loading Loading @@ -1095,6 +1135,24 @@ class MediaRouter2ServiceImpl { } } private boolean maybeHandleVolumeKeyEventInternal(int direction) { synchronized (mLock) { // TODO: b/396399175 - Replace this for-loop with a singleton system provider when // multi-user support is properly implemented. for (int i = 0; i < mUserRecords.size(); i++) { var userRecord = mUserRecords.valueAt(i); var systemProvider = userRecord.mHandler.getSystemProvider(); var handled = systemProvider.maybeHandleVolumeKeyEventForSystemMediaSession( DUMMY_REQUEST_ID, direction); if (handled) { return true; } } return false; } } /* package */ void updateRunningUserAndProfiles(int newActiveUserId) { synchronized (mLock) { if (mCurrentActiveUserId != newActiveUserId) { Loading Loading @@ -2264,6 +2322,11 @@ class MediaRouter2ServiceImpl { } } /** Invoked when {@link MediaRouterService#systemRunning()} is invoked. */ /* package */ void systemRunning() { sInstance.set(this); } final class UserRecord { public final int mUserId; //TODO: make records private for thread-safety Loading
services/core/java/com/android/server/media/MediaRouterService.java +1 −0 Original line number Diff line number Diff line Loading @@ -199,6 +199,7 @@ public final class MediaRouterService extends IMediaRouterService.Stub }, TAG); updateRunningUserAndProfiles(ActivityManager.getCurrentUser()); mService2.systemRunning(); } @Override Loading
services/core/java/com/android/server/media/MediaSessionRecord.java +5 −0 Original line number Diff line number Diff line Loading @@ -782,6 +782,11 @@ public class MediaSessionRecord extends MediaSessionRecordImpl implements IBinde String opPackageName, int uid, int pid) { if (MediaRouter2ServiceImpl.maybeHandleVolumeKeyEvent(TAG, direction, stream)) { return; } try { if (useSuggested) { if (AudioSystem.isStreamActive(stream, 0)) { Loading
services/core/java/com/android/server/media/MediaSessionService.java +5 −0 Original line number Diff line number Diff line Loading @@ -2574,6 +2574,11 @@ public class MediaSessionService extends SystemService implements Monitor { return; } if (MediaRouter2ServiceImpl.maybeHandleVolumeKeyEvent( TAG, direction, suggestedStream)) { return; } // Execute mAudioService.adjustSuggestedStreamVolume() on // handler thread of MediaSessionService. // This will release the MediaSessionService.mLock sooner and avoid Loading
services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +17 −0 Original line number Diff line number Diff line Loading @@ -318,6 +318,23 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { // Do nothing since the system session persists. } /** * Adjusts the volume of {@link MediaRoute2ProviderService service-provided} system media * routing sessions. * * <p>This method does not affect the volume of the system, which is managed by {@link * AudioManager}. * * @param requestId The id of the request, or {@link MediaRoute2ProviderService#REQUEST_ID_NONE} * if there's no associated id. * @param direction One of {@link AudioManager#ADJUST_LOWER}, {@link AudioManager#ADJUST_RAISE}, * or {@link AudioManager#ADJUST_SAME}. * @return Whether the volume key pressed was handled. */ public boolean maybeHandleVolumeKeyEventForSystemMediaSession(long requestId, int direction) { return false; } public MediaRoute2Info getDefaultRoute() { return mDefaultRoute; } Loading