From d446b40140f4c6f4b0745c9b63a9d1ec2437f63b Mon Sep 17 00:00:00 2001 From: Jin Seok Park Date: Tue, 17 Nov 2020 22:58:43 +0900 Subject: [PATCH] [Media ML] Replace AudioSystem.isActiveStream AudioSystem.isActiveStream is a hidden API. Replace it with getting all audio playback configurations using AudioManager.getActivePlaybackConfigurations and checking if the given stream exists among them. Bug: 169386435 Test: Manually checked that volume key works properly while alarm/music audio is active Change-Id: I096b28a741353b7a3a93f7e6a73177d29b6d2748 --- .../server/media/MediaServerUtils.java | 19 ++++++++++++++++++- .../server/media/MediaSessionRecord.java | 3 +-- .../server/media/MediaSessionService.java | 6 +++--- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/media/MediaServerUtils.java b/services/core/java/com/android/server/media/MediaServerUtils.java index 5fa2b1ceaae92..a4f11b2470f12 100644 --- a/services/core/java/com/android/server/media/MediaServerUtils.java +++ b/services/core/java/com/android/server/media/MediaServerUtils.java @@ -18,6 +18,9 @@ package com.android.server.media; import android.content.Context; import android.content.pm.PackageManager; +import android.media.AudioAttributes; +import android.media.AudioManager; +import android.media.AudioPlaybackConfiguration; import android.os.Binder; import java.io.PrintWriter; @@ -29,7 +32,7 @@ class MediaServerUtils { /** * Verify that caller holds {@link android.Manifest.permission#DUMP}. */ - public static boolean checkDumpPermission(Context context, String tag, PrintWriter pw) { + static boolean checkDumpPermission(Context context, String tag, PrintWriter pw) { if (context.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) { pw.println("Permission Denial: can't dump " + tag + " from from pid=" @@ -40,4 +43,18 @@ class MediaServerUtils { return true; } } + + /** + * Whether the given stream is currently active or not. + */ + static boolean isStreamActive(AudioManager audioManager, int stream) { + for (AudioPlaybackConfiguration configuration + : audioManager.getActivePlaybackConfigurations()) { + AudioAttributes attributes = configuration.getAudioAttributes(); + if (attributes != null && attributes.getVolumeControlStream() == stream) { + return configuration.isActive(); + } + } + return false; + } } diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index f9973529a120f..ea6e7d7d0bf60 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -23,7 +23,6 @@ import android.content.Intent; import android.content.pm.ParceledListSlice; import android.media.AudioAttributes; import android.media.AudioManager; -import android.media.AudioSystem; import android.media.MediaMetadata; import android.media.Rating; import android.media.VolumeProvider; @@ -513,7 +512,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR public void run() { try { if (useSuggested) { - if (AudioSystem.isStreamActive(stream, 0)) { + if (MediaServerUtils.isStreamActive(mAudioManager, stream)) { mAudioManager.adjustSuggestedStreamVolumeForUid(stream, direction, flags, opPackageName, uid, pid, mContext.getApplicationInfo().targetSdkVersion); diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index c23bfc442bd94..9296496d5b3a3 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -43,7 +43,6 @@ import android.content.pm.ParceledListSlice; import android.content.pm.UserInfo; import android.media.AudioManager; import android.media.AudioPlaybackConfiguration; -import android.media.AudioSystem; import android.media.IRemoteVolumeControllerCallback; import android.media.Session2Token; import android.media.session.IActiveSessionsListener; @@ -2019,7 +2018,7 @@ public class MediaSessionService extends SystemService implements Monitor { boolean preferSuggestedStream = false; if (isValidLocalStreamType(suggestedStream) - && AudioSystem.isStreamActive(suggestedStream, 0)) { + && MediaServerUtils.isStreamActive(mAudioManager, suggestedStream)) { preferSuggestedStream = true; } if (session == null || preferSuggestedStream) { @@ -2028,7 +2027,8 @@ public class MediaSessionService extends SystemService implements Monitor { + ". flags=" + flags + ", preferSuggestedStream=" + preferSuggestedStream + ", session=" + session); } - if (musicOnly && !AudioSystem.isStreamActive(AudioManager.STREAM_MUSIC, 0)) { + if (musicOnly && !MediaServerUtils.isStreamActive(mAudioManager, + AudioManager.STREAM_MUSIC)) { if (DEBUG_KEY_EVENT) { Log.d(TAG, "Nothing is playing on the music stream. Skipping volume event," + " flags=" + flags);