Loading media/java/android/media/IAudioService.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -746,6 +746,9 @@ interface IAudioService { @EnforcePermission("MODIFY_AUDIO_ROUTING") List<AudioFocusInfo> getFocusStack(); @EnforcePermission("QUERY_AUDIO_STATE") boolean hasAudioFocus(String packageName); @EnforcePermission("MODIFY_AUDIO_ROUTING") oneway void sendFocusLossAndUpdate(in AudioFocusInfo focusLoser, in IAudioPolicyCallback apcb); Loading services/core/java/com/android/server/audio/AudioService.java +15 −0 Original line number Diff line number Diff line Loading @@ -14579,6 +14579,21 @@ public class AudioService extends IAudioService.Stub return mMediaFocusControl.getFocusStack(); } /** * Checks if a given package currently holds any type of audio focus. * <p>This method considers all forms of audio focus, including traditional exclusive/transient * focus from the main focus stack and concurrent focus when multi-audio focus is enabled. * * @param packageName The package name to check for audio focus. * @return {@code true} if the package holds any audio focus, {@code false} otherwise. */ @android.annotation.EnforcePermission(QUERY_AUDIO_STATE) public boolean hasAudioFocus(String packageName) { super.hasAudioFocus_enforcePermission(); return mMediaFocusControl.hasAudioFocus(packageName); } /** * @param focusLoser non-null entry that may be in the stack * @see AudioPolicy#sendFocusLossAndUpdate(AudioFocusInfo) services/core/java/com/android/server/audio/MediaFocusControl.java +23 −1 Original line number Diff line number Diff line Loading @@ -251,9 +251,31 @@ public class MediaFocusControl implements PlayerFocusEnforcer { } } /*package*/ boolean hasAudioFocus(String packageName) { synchronized (mAudioFocusLock) { Iterator<FocusRequester> stackIterator = mFocusStack.iterator(); while (stackIterator.hasNext()) { if (stackIterator.next().hasSamePackage(packageName)) { return true; } } if (mMultiAudioFocusEnabled) { Iterator<FocusRequester> listIterator = mMultiAudioFocusList.iterator(); while (listIterator.hasNext()) { if (listIterator.next().hasSamePackage(packageName)) { return true; } } } } return false; } /*package*/ boolean hasAudioFocusUsers() { synchronized (mAudioFocusLock) { return !mFocusStack.empty(); return !mFocusStack.empty() || (mMultiAudioFocusEnabled && !mMultiAudioFocusList.isEmpty()); } } Loading services/core/java/com/android/server/pm/AppStateHelper.java +1 −4 Original line number Diff line number Diff line Loading @@ -77,10 +77,7 @@ public class AppStateHelper { var audioService = IAudioService.Stub.asInterface( ServiceManager.getService(Context.AUDIO_SERVICE)); try { var focusInfos = audioService.getFocusStack(); int size = focusInfos.size(); var audioFocusPackage = (size > 0) ? focusInfos.get(size - 1).getPackageName() : null; return TextUtils.equals(packageName, audioFocusPackage); return audioService.hasAudioFocus(packageName); } catch (Exception ignore) { } return false; Loading Loading
media/java/android/media/IAudioService.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -746,6 +746,9 @@ interface IAudioService { @EnforcePermission("MODIFY_AUDIO_ROUTING") List<AudioFocusInfo> getFocusStack(); @EnforcePermission("QUERY_AUDIO_STATE") boolean hasAudioFocus(String packageName); @EnforcePermission("MODIFY_AUDIO_ROUTING") oneway void sendFocusLossAndUpdate(in AudioFocusInfo focusLoser, in IAudioPolicyCallback apcb); Loading
services/core/java/com/android/server/audio/AudioService.java +15 −0 Original line number Diff line number Diff line Loading @@ -14579,6 +14579,21 @@ public class AudioService extends IAudioService.Stub return mMediaFocusControl.getFocusStack(); } /** * Checks if a given package currently holds any type of audio focus. * <p>This method considers all forms of audio focus, including traditional exclusive/transient * focus from the main focus stack and concurrent focus when multi-audio focus is enabled. * * @param packageName The package name to check for audio focus. * @return {@code true} if the package holds any audio focus, {@code false} otherwise. */ @android.annotation.EnforcePermission(QUERY_AUDIO_STATE) public boolean hasAudioFocus(String packageName) { super.hasAudioFocus_enforcePermission(); return mMediaFocusControl.hasAudioFocus(packageName); } /** * @param focusLoser non-null entry that may be in the stack * @see AudioPolicy#sendFocusLossAndUpdate(AudioFocusInfo)
services/core/java/com/android/server/audio/MediaFocusControl.java +23 −1 Original line number Diff line number Diff line Loading @@ -251,9 +251,31 @@ public class MediaFocusControl implements PlayerFocusEnforcer { } } /*package*/ boolean hasAudioFocus(String packageName) { synchronized (mAudioFocusLock) { Iterator<FocusRequester> stackIterator = mFocusStack.iterator(); while (stackIterator.hasNext()) { if (stackIterator.next().hasSamePackage(packageName)) { return true; } } if (mMultiAudioFocusEnabled) { Iterator<FocusRequester> listIterator = mMultiAudioFocusList.iterator(); while (listIterator.hasNext()) { if (listIterator.next().hasSamePackage(packageName)) { return true; } } } } return false; } /*package*/ boolean hasAudioFocusUsers() { synchronized (mAudioFocusLock) { return !mFocusStack.empty(); return !mFocusStack.empty() || (mMultiAudioFocusEnabled && !mMultiAudioFocusList.isEmpty()); } } Loading
services/core/java/com/android/server/pm/AppStateHelper.java +1 −4 Original line number Diff line number Diff line Loading @@ -77,10 +77,7 @@ public class AppStateHelper { var audioService = IAudioService.Stub.asInterface( ServiceManager.getService(Context.AUDIO_SERVICE)); try { var focusInfos = audioService.getFocusStack(); int size = focusInfos.size(); var audioFocusPackage = (size > 0) ? focusInfos.get(size - 1).getPackageName() : null; return TextUtils.equals(packageName, audioFocusPackage); return audioService.hasAudioFocus(packageName); } catch (Exception ignore) { } return false; Loading