Loading api/current.txt +0 −4 Original line number Original line Diff line number Diff line Loading @@ -24377,10 +24377,8 @@ package android.media { public final class AudioPlaybackCaptureConfiguration { public final class AudioPlaybackCaptureConfiguration { method @NonNull public int[] getExcludeUids(); method @NonNull public int[] getExcludeUids(); method @NonNull public int[] getExcludeUsages(); method @NonNull public int[] getExcludeUsages(); method @NonNull public int[] getExcludeUserIds(); method @NonNull public int[] getMatchingUids(); method @NonNull public int[] getMatchingUids(); method @NonNull public int[] getMatchingUsages(); method @NonNull public int[] getMatchingUsages(); method @NonNull public int[] getMatchingUserIds(); method @NonNull public android.media.projection.MediaProjection getMediaProjection(); method @NonNull public android.media.projection.MediaProjection getMediaProjection(); } } Loading @@ -24388,11 +24386,9 @@ package android.media { ctor public AudioPlaybackCaptureConfiguration.Builder(@NonNull android.media.projection.MediaProjection); ctor public AudioPlaybackCaptureConfiguration.Builder(@NonNull android.media.projection.MediaProjection); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUid(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUid(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUsage(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUsage(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUserId(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration build(); method @NonNull public android.media.AudioPlaybackCaptureConfiguration build(); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUid(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUid(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUsage(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUsage(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUserId(int); } } public final class AudioPlaybackConfiguration implements android.os.Parcelable { public final class AudioPlaybackConfiguration implements android.os.Parcelable { media/java/android/media/AudioPlaybackCaptureConfiguration.java +0 −48 Original line number Original line Diff line number Diff line Loading @@ -102,12 +102,6 @@ public final class AudioPlaybackCaptureConfiguration { criterion -> criterion.getIntProp()); criterion -> criterion.getIntProp()); } } /** @return the userId's passed to {@link Builder#addMatchingUserId(int)}. */ public @NonNull int[] getMatchingUserIds() { return getIntPredicates(AudioMixingRule.RULE_MATCH_USERID, criterion -> criterion.getIntProp()); } /** @return the usages passed to {@link Builder#excludeUsage(int)}. */ /** @return the usages passed to {@link Builder#excludeUsage(int)}. */ @AttributeUsage @AttributeUsage public @NonNull int[] getExcludeUsages() { public @NonNull int[] getExcludeUsages() { Loading @@ -121,12 +115,6 @@ public final class AudioPlaybackCaptureConfiguration { criterion -> criterion.getIntProp()); criterion -> criterion.getIntProp()); } } /** @return the userId's passed to {@link Builder#excludeUserId(int)}. */ public @NonNull int[] getExcludeUserIds() { return getIntPredicates(AudioMixingRule.RULE_EXCLUDE_USERID, criterion -> criterion.getIntProp()); } private int[] getIntPredicates(int rule, private int[] getIntPredicates(int rule, ToIntFunction<AudioMixMatchCriterion> getPredicate) { ToIntFunction<AudioMixMatchCriterion> getPredicate) { return mAudioMixingRule.getCriteria().stream() return mAudioMixingRule.getCriteria().stream() Loading Loading @@ -165,7 +153,6 @@ public final class AudioPlaybackCaptureConfiguration { private final MediaProjection mProjection; private final MediaProjection mProjection; private int mUsageMatchType = MATCH_TYPE_UNSPECIFIED; private int mUsageMatchType = MATCH_TYPE_UNSPECIFIED; private int mUidMatchType = MATCH_TYPE_UNSPECIFIED; private int mUidMatchType = MATCH_TYPE_UNSPECIFIED; private int mUserIdMatchType = MATCH_TYPE_UNSPECIFIED; /** @param projection A MediaProjection that supports audio projection. */ /** @param projection A MediaProjection that supports audio projection. */ public Builder(@NonNull MediaProjection projection) { public Builder(@NonNull MediaProjection projection) { Loading Loading @@ -214,23 +201,6 @@ public final class AudioPlaybackCaptureConfiguration { return this; return this; } } /** * Only capture audio output by app with the matching {@code userId}. * * <p>If called multiple times, will capture audio output by apps whose userId is any of the * given userId's. * * @throws IllegalStateException if called in conjunction with {@link #excludeUserId(int)}. */ public @NonNull Builder addMatchingUserId(int userId) { Preconditions.checkState( mUserIdMatchType != MATCH_TYPE_EXCLUSIVE, ERROR_MESSAGE_MISMATCHED_RULES); mAudioMixingRuleBuilder.addMixRule(AudioMixingRule.RULE_MATCH_USERID, userId); mUserIdMatchType = MATCH_TYPE_INCLUSIVE; return this; } /** /** * Only capture audio output that does not match the given {@link AudioAttributes}. * Only capture audio output that does not match the given {@link AudioAttributes}. * * Loading Loading @@ -267,24 +237,6 @@ public final class AudioPlaybackCaptureConfiguration { return this; return this; } } /** * Only capture audio output by apps that do not have the matching {@code userId}. * * <p>If called multiple times, will capture audio output by apps whose userId is not any of * the given userId's. * * @throws IllegalStateException if called in conjunction with * {@link #addMatchingUserId(int)}. */ public @NonNull Builder excludeUserId(int userId) { Preconditions.checkState( mUserIdMatchType != MATCH_TYPE_INCLUSIVE, ERROR_MESSAGE_MISMATCHED_RULES); mAudioMixingRuleBuilder.excludeMixRule(AudioMixingRule.RULE_MATCH_USERID, userId); mUserIdMatchType = MATCH_TYPE_EXCLUSIVE; return this; } /** /** * Builds the configuration instance. * Builds the configuration instance. * * Loading media/java/android/media/audiopolicy/AudioPolicy.java +8 −4 Original line number Original line Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.TestApi; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManager; import android.content.Context; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.PackageManager; Loading Loading @@ -481,12 +482,13 @@ public class AudioPolicy { * @hide * @hide * Removes audio device affinity previously set by * Removes audio device affinity previously set by * {@link #setUserIdDeviceAffinity(int, java.util.List)}. * {@link #setUserIdDeviceAffinity(int, java.util.List)}. * @param userId userId of the application affected. * @param userId userId of the application affected, as obtained via * {@link UserHandle#getIdentifier}. Not to be confused with application uid. * @return true if the change was successful, false otherwise. * @return true if the change was successful, false otherwise. */ */ @TestApi @TestApi @SystemApi @SystemApi public boolean removeUserIdDeviceAffinity(int userId) { public boolean removeUserIdDeviceAffinity(@UserIdInt int userId) { synchronized (mLock) { synchronized (mLock) { if (mStatus != POLICY_STATUS_REGISTERED) { if (mStatus != POLICY_STATUS_REGISTERED) { throw new IllegalStateException("Cannot use unregistered AudioPolicy"); throw new IllegalStateException("Cannot use unregistered AudioPolicy"); Loading @@ -512,13 +514,15 @@ public class AudioPolicy { * multiple devices in the list doesn't imply the signals will be duplicated on the different * multiple devices in the list doesn't imply the signals will be duplicated on the different * audio devices, final routing will depend on the {@link AudioAttributes} of the sounds being * audio devices, final routing will depend on the {@link AudioAttributes} of the sounds being * played. * played. * @param userId Android user id to affect. * @param userId userId of the application affected, as obtained via * {@link UserHandle#getIdentifier}. Not to be confused with application uid. * @param devices list of devices to which the audio stream of the application may be routed. * @param devices list of devices to which the audio stream of the application may be routed. * @return true if the change was successful, false otherwise. * @return true if the change was successful, false otherwise. */ */ @TestApi @TestApi @SystemApi @SystemApi public boolean setUserIdDeviceAffinity(int userId, @NonNull List<AudioDeviceInfo> devices) { public boolean setUserIdDeviceAffinity(@UserIdInt int userId, @NonNull List<AudioDeviceInfo> devices) { Objects.requireNonNull(devices, "Illegal null list of audio devices"); Objects.requireNonNull(devices, "Illegal null list of audio devices"); synchronized (mLock) { synchronized (mLock) { if (mStatus != POLICY_STATUS_REGISTERED) { if (mStatus != POLICY_STATUS_REGISTERED) { Loading Loading
api/current.txt +0 −4 Original line number Original line Diff line number Diff line Loading @@ -24377,10 +24377,8 @@ package android.media { public final class AudioPlaybackCaptureConfiguration { public final class AudioPlaybackCaptureConfiguration { method @NonNull public int[] getExcludeUids(); method @NonNull public int[] getExcludeUids(); method @NonNull public int[] getExcludeUsages(); method @NonNull public int[] getExcludeUsages(); method @NonNull public int[] getExcludeUserIds(); method @NonNull public int[] getMatchingUids(); method @NonNull public int[] getMatchingUids(); method @NonNull public int[] getMatchingUsages(); method @NonNull public int[] getMatchingUsages(); method @NonNull public int[] getMatchingUserIds(); method @NonNull public android.media.projection.MediaProjection getMediaProjection(); method @NonNull public android.media.projection.MediaProjection getMediaProjection(); } } Loading @@ -24388,11 +24386,9 @@ package android.media { ctor public AudioPlaybackCaptureConfiguration.Builder(@NonNull android.media.projection.MediaProjection); ctor public AudioPlaybackCaptureConfiguration.Builder(@NonNull android.media.projection.MediaProjection); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUid(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUid(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUsage(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUsage(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUserId(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration build(); method @NonNull public android.media.AudioPlaybackCaptureConfiguration build(); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUid(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUid(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUsage(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUsage(int); method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder excludeUserId(int); } } public final class AudioPlaybackConfiguration implements android.os.Parcelable { public final class AudioPlaybackConfiguration implements android.os.Parcelable {
media/java/android/media/AudioPlaybackCaptureConfiguration.java +0 −48 Original line number Original line Diff line number Diff line Loading @@ -102,12 +102,6 @@ public final class AudioPlaybackCaptureConfiguration { criterion -> criterion.getIntProp()); criterion -> criterion.getIntProp()); } } /** @return the userId's passed to {@link Builder#addMatchingUserId(int)}. */ public @NonNull int[] getMatchingUserIds() { return getIntPredicates(AudioMixingRule.RULE_MATCH_USERID, criterion -> criterion.getIntProp()); } /** @return the usages passed to {@link Builder#excludeUsage(int)}. */ /** @return the usages passed to {@link Builder#excludeUsage(int)}. */ @AttributeUsage @AttributeUsage public @NonNull int[] getExcludeUsages() { public @NonNull int[] getExcludeUsages() { Loading @@ -121,12 +115,6 @@ public final class AudioPlaybackCaptureConfiguration { criterion -> criterion.getIntProp()); criterion -> criterion.getIntProp()); } } /** @return the userId's passed to {@link Builder#excludeUserId(int)}. */ public @NonNull int[] getExcludeUserIds() { return getIntPredicates(AudioMixingRule.RULE_EXCLUDE_USERID, criterion -> criterion.getIntProp()); } private int[] getIntPredicates(int rule, private int[] getIntPredicates(int rule, ToIntFunction<AudioMixMatchCriterion> getPredicate) { ToIntFunction<AudioMixMatchCriterion> getPredicate) { return mAudioMixingRule.getCriteria().stream() return mAudioMixingRule.getCriteria().stream() Loading Loading @@ -165,7 +153,6 @@ public final class AudioPlaybackCaptureConfiguration { private final MediaProjection mProjection; private final MediaProjection mProjection; private int mUsageMatchType = MATCH_TYPE_UNSPECIFIED; private int mUsageMatchType = MATCH_TYPE_UNSPECIFIED; private int mUidMatchType = MATCH_TYPE_UNSPECIFIED; private int mUidMatchType = MATCH_TYPE_UNSPECIFIED; private int mUserIdMatchType = MATCH_TYPE_UNSPECIFIED; /** @param projection A MediaProjection that supports audio projection. */ /** @param projection A MediaProjection that supports audio projection. */ public Builder(@NonNull MediaProjection projection) { public Builder(@NonNull MediaProjection projection) { Loading Loading @@ -214,23 +201,6 @@ public final class AudioPlaybackCaptureConfiguration { return this; return this; } } /** * Only capture audio output by app with the matching {@code userId}. * * <p>If called multiple times, will capture audio output by apps whose userId is any of the * given userId's. * * @throws IllegalStateException if called in conjunction with {@link #excludeUserId(int)}. */ public @NonNull Builder addMatchingUserId(int userId) { Preconditions.checkState( mUserIdMatchType != MATCH_TYPE_EXCLUSIVE, ERROR_MESSAGE_MISMATCHED_RULES); mAudioMixingRuleBuilder.addMixRule(AudioMixingRule.RULE_MATCH_USERID, userId); mUserIdMatchType = MATCH_TYPE_INCLUSIVE; return this; } /** /** * Only capture audio output that does not match the given {@link AudioAttributes}. * Only capture audio output that does not match the given {@link AudioAttributes}. * * Loading Loading @@ -267,24 +237,6 @@ public final class AudioPlaybackCaptureConfiguration { return this; return this; } } /** * Only capture audio output by apps that do not have the matching {@code userId}. * * <p>If called multiple times, will capture audio output by apps whose userId is not any of * the given userId's. * * @throws IllegalStateException if called in conjunction with * {@link #addMatchingUserId(int)}. */ public @NonNull Builder excludeUserId(int userId) { Preconditions.checkState( mUserIdMatchType != MATCH_TYPE_INCLUSIVE, ERROR_MESSAGE_MISMATCHED_RULES); mAudioMixingRuleBuilder.excludeMixRule(AudioMixingRule.RULE_MATCH_USERID, userId); mUserIdMatchType = MATCH_TYPE_EXCLUSIVE; return this; } /** /** * Builds the configuration instance. * Builds the configuration instance. * * Loading
media/java/android/media/audiopolicy/AudioPolicy.java +8 −4 Original line number Original line Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.TestApi; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManager; import android.content.Context; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.PackageManager; Loading Loading @@ -481,12 +482,13 @@ public class AudioPolicy { * @hide * @hide * Removes audio device affinity previously set by * Removes audio device affinity previously set by * {@link #setUserIdDeviceAffinity(int, java.util.List)}. * {@link #setUserIdDeviceAffinity(int, java.util.List)}. * @param userId userId of the application affected. * @param userId userId of the application affected, as obtained via * {@link UserHandle#getIdentifier}. Not to be confused with application uid. * @return true if the change was successful, false otherwise. * @return true if the change was successful, false otherwise. */ */ @TestApi @TestApi @SystemApi @SystemApi public boolean removeUserIdDeviceAffinity(int userId) { public boolean removeUserIdDeviceAffinity(@UserIdInt int userId) { synchronized (mLock) { synchronized (mLock) { if (mStatus != POLICY_STATUS_REGISTERED) { if (mStatus != POLICY_STATUS_REGISTERED) { throw new IllegalStateException("Cannot use unregistered AudioPolicy"); throw new IllegalStateException("Cannot use unregistered AudioPolicy"); Loading @@ -512,13 +514,15 @@ public class AudioPolicy { * multiple devices in the list doesn't imply the signals will be duplicated on the different * multiple devices in the list doesn't imply the signals will be duplicated on the different * audio devices, final routing will depend on the {@link AudioAttributes} of the sounds being * audio devices, final routing will depend on the {@link AudioAttributes} of the sounds being * played. * played. * @param userId Android user id to affect. * @param userId userId of the application affected, as obtained via * {@link UserHandle#getIdentifier}. Not to be confused with application uid. * @param devices list of devices to which the audio stream of the application may be routed. * @param devices list of devices to which the audio stream of the application may be routed. * @return true if the change was successful, false otherwise. * @return true if the change was successful, false otherwise. */ */ @TestApi @TestApi @SystemApi @SystemApi public boolean setUserIdDeviceAffinity(int userId, @NonNull List<AudioDeviceInfo> devices) { public boolean setUserIdDeviceAffinity(@UserIdInt int userId, @NonNull List<AudioDeviceInfo> devices) { Objects.requireNonNull(devices, "Illegal null list of audio devices"); Objects.requireNonNull(devices, "Illegal null list of audio devices"); synchronized (mLock) { synchronized (mLock) { if (mStatus != POLICY_STATUS_REGISTERED) { if (mStatus != POLICY_STATUS_REGISTERED) { Loading