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

Commit d8f5f3bb authored by Eric Laurent's avatar Eric Laurent Committed by Android (Google) Code Review
Browse files

Merge changes from topic "call_redirection_apis"

* changes:
  audio: add call audio redirection APIs
  Add permission for call audio redirection
parents 328acb2b 78eef3ab
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ package android {
    field public static final String BROADCAST_CLOSE_SYSTEM_DIALOGS = "android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS";
    field @Deprecated public static final String BROADCAST_NETWORK_PRIVILEGED = "android.permission.BROADCAST_NETWORK_PRIVILEGED";
    field public static final String BYPASS_ROLE_QUALIFICATION = "android.permission.BYPASS_ROLE_QUALIFICATION";
    field public static final String CALL_AUDIO_INTERCEPTION = "android.permission.CALL_AUDIO_INTERCEPTION";
    field public static final String CAMERA_DISABLE_TRANSMIT_LED = "android.permission.CAMERA_DISABLE_TRANSMIT_LED";
    field public static final String CAMERA_OPEN_CLOSE_LISTENER = "android.permission.CAMERA_OPEN_CLOSE_LISTENER";
    field public static final String CAPTURE_AUDIO_HOTWORD = "android.permission.CAPTURE_AUDIO_HOTWORD";
@@ -5408,6 +5409,8 @@ package android.media {
    method @IntRange(from=0) public long getAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo);
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioProductStrategy> getAudioProductStrategies();
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioVolumeGroup> getAudioVolumeGroups();
    method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioRecord getCallDownlinkExtractionAudioRecord(@NonNull android.media.AudioFormat);
    method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioTrack getCallUplinkInjectionAudioTrack(@NonNull android.media.AudioFormat);
    method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, "android.permission.QUERY_AUDIO_STATE"}) public int getDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes);
    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, "android.permission.QUERY_AUDIO_STATE"}) public java.util.List<android.media.AudioDeviceAttributes> getDevicesForAttributes(@NonNull android.media.AudioAttributes);
    method @IntRange(from=0) public long getMaxAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo);
@@ -5420,6 +5423,7 @@ package android.media {
    method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
    method public boolean isAudioServerRunning();
    method public boolean isHdmiSystemAudioSupported();
    method @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public boolean isPstnCallAudioInterceptable();
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
    method public void registerVolumeGroupCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.VolumeGroupCallback);
    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDeviceForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener);
+3 −0
Original line number Diff line number Diff line
@@ -1445,6 +1445,8 @@ package android.media {

  public class AudioManager {
    method @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public int abandonAudioFocusForTest(@NonNull android.media.AudioFocusRequest, @NonNull String);
    method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioRecord getCallDownlinkExtractionAudioRecord(@NonNull android.media.AudioFormat);
    method @NonNull @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public android.media.AudioTrack getCallUplinkInjectionAudioTrack(@NonNull android.media.AudioFormat);
    method @Nullable public static android.media.AudioDeviceInfo getDeviceInfoFromType(int);
    method @IntRange(from=0) @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public long getFadeOutDurationOnFocusLossMillis(@NonNull android.media.AudioAttributes);
    method public static final int[] getPublicStreamTypes();
@@ -1453,6 +1455,7 @@ package android.media {
    method @NonNull public java.util.Map<java.lang.Integer,java.lang.Boolean> getSurroundFormats();
    method public boolean hasRegisteredDynamicPolicy();
    method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_AUDIO_ROUTING, android.Manifest.permission.QUERY_AUDIO_STATE}) public boolean isFullVolumeDevice();
    method @RequiresPermission(android.Manifest.permission.CALL_AUDIO_INTERCEPTION) public boolean isPstnCallAudioInterceptable();
    method @RequiresPermission("android.permission.QUERY_AUDIO_STATE") public int requestAudioFocusForTest(@NonNull android.media.AudioFocusRequest, @NonNull String, int, int);
    method public void setRampingRingerEnabled(boolean);
  }
+7 −0
Original line number Diff line number Diff line
@@ -4695,6 +4695,13 @@
    <permission android:name="android.permission.MODIFY_AUDIO_ROUTING"
        android:protectionLevel="signature|privileged|role" />

    <!-- @SystemApi Allows an application to access the uplink and downlink audio of an ongoing
        call.
         <p>Not for use by third-party applications.</p>
         @hide -->
    <permission android:name="android.permission.CALL_AUDIO_INTERCEPTION"
                android:protectionLevel="signature|privileged" />

    <!-- @TestApi Allows an application to query audio related state.
         @hide -->
    <permission android:name="android.permission.QUERY_AUDIO_STATE"
+2 −0
Original line number Diff line number Diff line
@@ -495,6 +495,8 @@ applications that come with the platform
        <!-- Permission required for CTS test - SystemMediaRouter2Test -->
        <permission name="android.permission.MEDIA_CONTENT_CONTROL"/>
        <permission name="android.permission.MODIFY_AUDIO_ROUTING"/>
        <!-- Permission required for CTS test - CallAudioInterceptionTest -->
        <permission name="android.permission.CALL_AUDIO_INTERCEPTION"/>
        <!-- Permission required for CTS test - CtsPermission5TestCases -->
        <permission name="android.permission.RENOUNCE_PERMISSIONS" />
        <permission name="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" />
+41 −1
Original line number Diff line number Diff line
@@ -481,13 +481,20 @@ public final class AudioAttributes implements Parcelable {
     */
    public static final int FLAG_NEVER_SPATIALIZE = 0x1 << 15;

    /**
     * @hide
     * Flag indicating the audio is part of a call redirection.
     * Valid for playback and capture.
     */
    public static final int FLAG_CALL_REDIRECTION = 0x1 << 16;

    // Note that even though FLAG_MUTE_HAPTIC is stored as a flag bit, it is not here since
    // it is known as a boolean value outside of AudioAttributes.
    private static final int FLAG_ALL = FLAG_AUDIBILITY_ENFORCED | FLAG_SECURE | FLAG_SCO
            | FLAG_BEACON | FLAG_HW_AV_SYNC | FLAG_HW_HOTWORD | FLAG_BYPASS_INTERRUPTION_POLICY
            | FLAG_BYPASS_MUTE | FLAG_LOW_LATENCY | FLAG_DEEP_BUFFER | FLAG_NO_MEDIA_PROJECTION
            | FLAG_NO_SYSTEM_CAPTURE | FLAG_CAPTURE_PRIVATE | FLAG_CONTENT_SPATIALIZED
            | FLAG_NEVER_SPATIALIZE;
            | FLAG_NEVER_SPATIALIZE | FLAG_CALL_REDIRECTION;
    private final static int FLAG_ALL_PUBLIC = FLAG_AUDIBILITY_ENFORCED |
            FLAG_HW_AV_SYNC | FLAG_LOW_LATENCY;
    /* mask of flags that can be set by SDK and System APIs through the Builder */
@@ -707,6 +714,14 @@ public final class AudioAttributes implements Parcelable {
        return ALLOW_CAPTURE_BY_ALL;
    }

    /**
     * @hide
     * Indicates if the audio is used for call redirection
     * @return true if used for call redirection, false otherwise.
     */
    public boolean isForCallRedirection() {
        return (mFlags & FLAG_CALL_REDIRECTION) == FLAG_CALL_REDIRECTION;
    }

    /**
     * Builder class for {@link AudioAttributes} objects.
@@ -763,11 +778,15 @@ public final class AudioAttributes implements Parcelable {
        public Builder(AudioAttributes aa) {
            mUsage = aa.mUsage;
            mContentType = aa.mContentType;
            mSource = aa.mSource;
            mFlags = aa.getAllFlags();
            mTags = (HashSet<String>) aa.mTags.clone();
            mMuteHapticChannels = aa.areHapticChannelsMuted();
            mIsContentSpatialized = aa.isContentSpatialized();
            mSpatializationBehavior = aa.getSpatializationBehavior();
            if ((mFlags & FLAG_CAPTURE_PRIVATE) != 0) {
                mPrivacySensitive = PRIVACY_SENSITIVE_ENABLED;
            }
        }

        /**
@@ -1070,6 +1089,17 @@ public final class AudioAttributes implements Parcelable {
            return this;
        }

        /**
         * @hide
         * Replace all custom tags
         * @param tags
         * @return the same Builder instance.
         */
        public Builder replaceTags(HashSet<String> tags) {
            mTags = (HashSet<String>) tags.clone();
            return this;
        }

        /**
         * Sets attributes as inferred from the legacy stream types.
         * Warning: do not use this method in combination with setting any other attributes such as
@@ -1245,6 +1275,16 @@ public final class AudioAttributes implements Parcelable {
                privacySensitive ? PRIVACY_SENSITIVE_ENABLED : PRIVACY_SENSITIVE_DISABLED;
            return this;
        }

        /**
         * @hide
         * Designates the audio to be used for call redirection
         * @return the same Builder instance.
         */
        public Builder setForCallRedirection() {
            mFlags |= FLAG_CALL_REDIRECTION;
            return this;
        }
    };

    @Override
Loading