Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4e4d6e3b authored by Oscar Azucena's avatar Oscar Azucena
Browse files

Remove user id based audio captured API.

Removed recently added user id based routing for audio playback capture.
The original goal of the user id based routing was for the routing to be
controlled by audio policy and to controll where audio from a user
could play. The audio playback capture was added to match similar API
provided for audio playback capture based on application's uid.
Currently, there is no appropiate use case for capturing based on user
id. While this could prove useful in the future the appropiate use case
research must be completed. Updated comments for audio policy user id
based routing.

Bug: 149419551
Test: atest AudioPlaybackCaptureTest
Test: atest
com.google.android.gts.audio.AudioHostTest#testUserIdDeviceAffinity

Change-Id: I174cba618c4f66d11185e7ab5630094b4a8cb35b
parent 9d0ab78e
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -24376,10 +24376,8 @@ package android.media {
  public final class AudioPlaybackCaptureConfiguration {
    method @NonNull public int[] getExcludeUids();
    method @NonNull public int[] getExcludeUsages();
    method @NonNull public int[] getExcludeUserIds();
    method @NonNull public int[] getMatchingUids();
    method @NonNull public int[] getMatchingUsages();
    method @NonNull public int[] getMatchingUserIds();
    method @NonNull public android.media.projection.MediaProjection getMediaProjection();
  }
@@ -24387,11 +24385,9 @@ package android.media {
    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 addMatchingUsage(int);
    method @NonNull public android.media.AudioPlaybackCaptureConfiguration.Builder addMatchingUserId(int);
    method @NonNull public android.media.AudioPlaybackCaptureConfiguration build();
    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 excludeUserId(int);
  }
  public final class AudioPlaybackConfiguration implements android.os.Parcelable {
+0 −48
Original line number Diff line number Diff line
@@ -102,12 +102,6 @@ public final class AudioPlaybackCaptureConfiguration {
                                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)}. */
    @AttributeUsage
    public @NonNull int[] getExcludeUsages() {
@@ -121,12 +115,6 @@ public final class AudioPlaybackCaptureConfiguration {
                                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,
                                   ToIntFunction<AudioMixMatchCriterion> getPredicate) {
        return mAudioMixingRule.getCriteria().stream()
@@ -165,7 +153,6 @@ public final class AudioPlaybackCaptureConfiguration {
        private final MediaProjection mProjection;
        private int mUsageMatchType = MATCH_TYPE_UNSPECIFIED;
        private int mUidMatchType = MATCH_TYPE_UNSPECIFIED;
        private int mUserIdMatchType = MATCH_TYPE_UNSPECIFIED;

        /** @param projection A MediaProjection that supports audio projection. */
        public Builder(@NonNull MediaProjection projection) {
@@ -214,23 +201,6 @@ public final class AudioPlaybackCaptureConfiguration {
            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}.
         *
@@ -267,24 +237,6 @@ public final class AudioPlaybackCaptureConfiguration {
            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.
         *
+8 −4
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -481,12 +482,13 @@ public class AudioPolicy {
     * @hide
     * Removes audio device affinity previously set by
     * {@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.
     */
    @TestApi
    @SystemApi
    public boolean removeUserIdDeviceAffinity(int userId) {
    public boolean removeUserIdDeviceAffinity(@UserIdInt int userId) {
        synchronized (mLock) {
            if (mStatus != POLICY_STATUS_REGISTERED) {
                throw new IllegalStateException("Cannot use unregistered AudioPolicy");
@@ -512,13 +514,15 @@ public class AudioPolicy {
     * 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
     * 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.
     * @return true if the change was successful, false otherwise.
     */
    @TestApi
    @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");
        synchronized (mLock) {
            if (mStatus != POLICY_STATUS_REGISTERED) {