Loading api/system-current.txt +25 −0 Original line number Original line Diff line number Diff line Loading @@ -11786,6 +11786,7 @@ package android.telephony.ims { ctor public ImsCallProfile(int, int); ctor public ImsCallProfile(int, int); ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile); ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile); method public int describeContents(); method public int describeContents(); method @NonNull public java.util.Set<android.telephony.ims.RtpHeaderExtensionType> getAcceptedRtpHeaderExtensionTypes(); method public String getCallExtra(String); method public String getCallExtra(String); method public String getCallExtra(String, String); method public String getCallExtra(String, String); method public boolean getCallExtraBoolean(String); method public boolean getCallExtraBoolean(String); Loading @@ -11800,6 +11801,7 @@ package android.telephony.ims { method public int getEmergencyServiceCategories(); method public int getEmergencyServiceCategories(); method @NonNull public java.util.List<java.lang.String> getEmergencyUrns(); method @NonNull public java.util.List<java.lang.String> getEmergencyUrns(); method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); method @NonNull public java.util.Set<android.telephony.ims.RtpHeaderExtensionType> getOfferedRtpHeaderExtensionTypes(); method @NonNull public android.os.Bundle getProprietaryCallExtras(); method @NonNull public android.os.Bundle getProprietaryCallExtras(); method public int getRestrictCause(); method public int getRestrictCause(); method public int getServiceType(); method public int getServiceType(); Loading @@ -11810,6 +11812,7 @@ package android.telephony.ims { method public boolean isVideoCall(); method public boolean isVideoCall(); method public boolean isVideoPaused(); method public boolean isVideoPaused(); method public static int presentationToOir(int); method public static int presentationToOir(int); method public void setAcceptedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>); method public void setCallExtra(String, String); method public void setCallExtra(String, String); method public void setCallExtraBoolean(String, boolean); method public void setCallExtraBoolean(String, boolean); method public void setCallExtraInt(String, int); method public void setCallExtraInt(String, int); Loading @@ -11820,6 +11823,7 @@ package android.telephony.ims { method public void setEmergencyServiceCategories(int); method public void setEmergencyServiceCategories(int); method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>); method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>); method public void setHasKnownUserIntentEmergency(boolean); method public void setHasKnownUserIntentEmergency(boolean); method public void setOfferedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>); method public void updateCallExtras(android.telephony.ims.ImsCallProfile); method public void updateCallExtras(android.telephony.ims.ImsCallProfile); method public void updateCallType(android.telephony.ims.ImsCallProfile); method public void updateCallType(android.telephony.ims.ImsCallProfile); method public void updateMediaProfile(android.telephony.ims.ImsCallProfile); method public void updateMediaProfile(android.telephony.ims.ImsCallProfile); Loading Loading @@ -11879,6 +11883,7 @@ package android.telephony.ims { method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState); method public void callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState); method public void callSessionDtmfReceived(char); method @Deprecated public void callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo); method @Deprecated public void callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo); method @Deprecated public void callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo); method @Deprecated public void callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo); method public void callSessionHeld(android.telephony.ims.ImsCallProfile); method public void callSessionHeld(android.telephony.ims.ImsCallProfile); Loading @@ -11899,6 +11904,7 @@ package android.telephony.ims { method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo); method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo); method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile); method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile); method public void callSessionResumed(android.telephony.ims.ImsCallProfile); method public void callSessionResumed(android.telephony.ims.ImsCallProfile); method public void callSessionRtpHeaderExtensionsReceived(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtension>); method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile); method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile); method public void callSessionRttMessageReceived(String); method public void callSessionRttMessageReceived(String); method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile); method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile); Loading Loading @@ -12255,6 +12261,24 @@ package android.telephony.ims { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException; } } public final class RtpHeaderExtension implements android.os.Parcelable { ctor public RtpHeaderExtension(@IntRange(from=1, to=14) int, @NonNull byte[]); method public int describeContents(); method @NonNull public byte[] getExtensionData(); method @IntRange(from=1, to=14) public int getLocalIdentifier(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RtpHeaderExtension> CREATOR; } public final class RtpHeaderExtensionType implements android.os.Parcelable { ctor public RtpHeaderExtensionType(@IntRange(from=1, to=14) int, @NonNull android.net.Uri); method public int describeContents(); method @IntRange(from=1, to=14) public int getLocalIdentifier(); method @NonNull public android.net.Uri getUri(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RtpHeaderExtensionType> CREATOR; } public class SipDelegateManager { public class SipDelegateManager { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSupported() throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSupported() throws android.telephony.ims.ImsException; } } Loading Loading @@ -12371,6 +12395,7 @@ package android.telephony.ims.stub { method public void removeParticipants(String[]); method public void removeParticipants(String[]); method public void resume(android.telephony.ims.ImsStreamMediaProfile); method public void resume(android.telephony.ims.ImsStreamMediaProfile); method public void sendDtmf(char, android.os.Message); method public void sendDtmf(char, android.os.Message); method public void sendRtpHeaderExtensions(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtension>); method public void sendRttMessage(String); method public void sendRttMessage(String); method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile); method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile); method public void sendRttModifyResponse(boolean); method public void sendRttModifyResponse(boolean); core/api/system-current.txt +25 −0 Original line number Original line Diff line number Diff line Loading @@ -10668,6 +10668,7 @@ package android.telephony.ims { ctor public ImsCallProfile(int, int); ctor public ImsCallProfile(int, int); ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile); ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile); method public int describeContents(); method public int describeContents(); method @NonNull public java.util.Set<android.telephony.ims.RtpHeaderExtensionType> getAcceptedRtpHeaderExtensionTypes(); method public String getCallExtra(String); method public String getCallExtra(String); method public String getCallExtra(String, String); method public String getCallExtra(String, String); method public boolean getCallExtraBoolean(String); method public boolean getCallExtraBoolean(String); Loading @@ -10682,6 +10683,7 @@ package android.telephony.ims { method public int getEmergencyServiceCategories(); method public int getEmergencyServiceCategories(); method @NonNull public java.util.List<java.lang.String> getEmergencyUrns(); method @NonNull public java.util.List<java.lang.String> getEmergencyUrns(); method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); method @NonNull public java.util.Set<android.telephony.ims.RtpHeaderExtensionType> getOfferedRtpHeaderExtensionTypes(); method @NonNull public android.os.Bundle getProprietaryCallExtras(); method @NonNull public android.os.Bundle getProprietaryCallExtras(); method public int getRestrictCause(); method public int getRestrictCause(); method public int getServiceType(); method public int getServiceType(); Loading @@ -10692,6 +10694,7 @@ package android.telephony.ims { method public boolean isVideoCall(); method public boolean isVideoCall(); method public boolean isVideoPaused(); method public boolean isVideoPaused(); method public static int presentationToOir(int); method public static int presentationToOir(int); method public void setAcceptedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>); method public void setCallExtra(String, String); method public void setCallExtra(String, String); method public void setCallExtraBoolean(String, boolean); method public void setCallExtraBoolean(String, boolean); method public void setCallExtraInt(String, int); method public void setCallExtraInt(String, int); Loading @@ -10702,6 +10705,7 @@ package android.telephony.ims { method public void setEmergencyServiceCategories(int); method public void setEmergencyServiceCategories(int); method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>); method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>); method public void setHasKnownUserIntentEmergency(boolean); method public void setHasKnownUserIntentEmergency(boolean); method public void setOfferedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>); method public void updateCallExtras(android.telephony.ims.ImsCallProfile); method public void updateCallExtras(android.telephony.ims.ImsCallProfile); method public void updateCallType(android.telephony.ims.ImsCallProfile); method public void updateCallType(android.telephony.ims.ImsCallProfile); method public void updateMediaProfile(android.telephony.ims.ImsCallProfile); method public void updateMediaProfile(android.telephony.ims.ImsCallProfile); Loading Loading @@ -10761,6 +10765,7 @@ package android.telephony.ims { method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState); method public void callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState); method public void callSessionDtmfReceived(char); method @Deprecated public void callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo); method @Deprecated public void callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo); method @Deprecated public void callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo); method @Deprecated public void callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo); method public void callSessionHeld(android.telephony.ims.ImsCallProfile); method public void callSessionHeld(android.telephony.ims.ImsCallProfile); Loading @@ -10781,6 +10786,7 @@ package android.telephony.ims { method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo); method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo); method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile); method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile); method public void callSessionResumed(android.telephony.ims.ImsCallProfile); method public void callSessionResumed(android.telephony.ims.ImsCallProfile); method public void callSessionRtpHeaderExtensionsReceived(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtension>); method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile); method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile); method public void callSessionRttMessageReceived(String); method public void callSessionRttMessageReceived(String); method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile); method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile); Loading Loading @@ -11137,6 +11143,24 @@ package android.telephony.ims { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException; } } public final class RtpHeaderExtension implements android.os.Parcelable { ctor public RtpHeaderExtension(@IntRange(from=1, to=14) int, @NonNull byte[]); method public int describeContents(); method @NonNull public byte[] getExtensionData(); method @IntRange(from=1, to=14) public int getLocalIdentifier(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RtpHeaderExtension> CREATOR; } public final class RtpHeaderExtensionType implements android.os.Parcelable { ctor public RtpHeaderExtensionType(@IntRange(from=1, to=14) int, @NonNull android.net.Uri); method public int describeContents(); method @IntRange(from=1, to=14) public int getLocalIdentifier(); method @NonNull public android.net.Uri getUri(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RtpHeaderExtensionType> CREATOR; } public class SipDelegateManager { public class SipDelegateManager { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSupported() throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSupported() throws android.telephony.ims.ImsException; } } Loading Loading @@ -11253,6 +11277,7 @@ package android.telephony.ims.stub { method public void removeParticipants(String[]); method public void removeParticipants(String[]); method public void resume(android.telephony.ims.ImsStreamMediaProfile); method public void resume(android.telephony.ims.ImsStreamMediaProfile); method public void sendDtmf(char, android.os.Message); method public void sendDtmf(char, android.os.Message); method public void sendRtpHeaderExtensions(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtension>); method public void sendRttMessage(String); method public void sendRttMessage(String); method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile); method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile); method public void sendRttModifyResponse(boolean); method public void sendRttModifyResponse(boolean); telephony/java/android/telephony/ims/ImsCallProfile.java +81 −1 Original line number Original line Diff line number Diff line Loading @@ -28,6 +28,8 @@ import android.telecom.VideoProfile; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting; import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting; import android.telephony.emergency.EmergencyNumber.EmergencyServiceCategories; import android.telephony.emergency.EmergencyNumber.EmergencyServiceCategories; import android.telephony.ims.feature.MmTelFeature; import android.util.ArraySet; import android.util.Log; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; Loading @@ -37,7 +39,10 @@ import com.android.internal.telephony.util.TelephonyUtils; import java.lang.annotation.Retention; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** /** * A Parcelable object to handle the IMS call profile, which provides the service, call type, and * A Parcelable object to handle the IMS call profile, which provides the service, call type, and Loading Loading @@ -444,6 +449,10 @@ public final class ImsCallProfile implements Parcelable { /** Indicates if we have known the intent of the user for the call is emergency */ /** Indicates if we have known the intent of the user for the call is emergency */ private boolean mHasKnownUserIntentEmergency = false; private boolean mHasKnownUserIntentEmergency = false; private Set<RtpHeaderExtensionType> mOfferedRtpHeaderExtensionTypes = new ArraySet<>(); private Set<RtpHeaderExtensionType> mAcceptedRtpHeaderExtensionTypes = new ArraySet<>(); /** /** * Extras associated with this {@link ImsCallProfile}. * Extras associated with this {@link ImsCallProfile}. * <p> * <p> Loading Loading @@ -682,6 +691,8 @@ public final class ImsCallProfile implements Parcelable { out.writeBoolean(mHasKnownUserIntentEmergency); out.writeBoolean(mHasKnownUserIntentEmergency); out.writeInt(mRestrictCause); out.writeInt(mRestrictCause); out.writeInt(mCallerNumberVerificationStatus); out.writeInt(mCallerNumberVerificationStatus); out.writeArray(mOfferedRtpHeaderExtensionTypes.toArray()); out.writeArray(mAcceptedRtpHeaderExtensionTypes.toArray()); } } private void readFromParcel(Parcel in) { private void readFromParcel(Parcel in) { Loading @@ -696,9 +707,16 @@ public final class ImsCallProfile implements Parcelable { mHasKnownUserIntentEmergency = in.readBoolean(); mHasKnownUserIntentEmergency = in.readBoolean(); mRestrictCause = in.readInt(); mRestrictCause = in.readInt(); mCallerNumberVerificationStatus = in.readInt(); mCallerNumberVerificationStatus = in.readInt(); Object[] offered = in.readArray(RtpHeaderExtensionType.class.getClassLoader()); mOfferedRtpHeaderExtensionTypes = Arrays.stream(offered) .map(o -> (RtpHeaderExtensionType) o).collect(Collectors.toSet()); Object[] accepted = in.readArray(RtpHeaderExtensionType.class.getClassLoader()); mAcceptedRtpHeaderExtensionTypes = Arrays.stream(accepted) .map(o -> (RtpHeaderExtensionType) o).collect(Collectors.toSet()); } } public static final @android.annotation.NonNull Creator<ImsCallProfile> CREATOR = new Creator<ImsCallProfile>() { public static final @android.annotation.NonNull Creator<ImsCallProfile> CREATOR = new Creator<ImsCallProfile>() { @Override @Override public ImsCallProfile createFromParcel(Parcel in) { public ImsCallProfile createFromParcel(Parcel in) { return new ImsCallProfile(in); return new ImsCallProfile(in); Loading Loading @@ -1085,4 +1103,66 @@ public final class ImsCallProfile implements Parcelable { public boolean hasKnownUserIntentEmergency() { public boolean hasKnownUserIntentEmergency() { return mHasKnownUserIntentEmergency; return mHasKnownUserIntentEmergency; } } /** * For an incoming or outgoing call, indicates the {@link RtpHeaderExtensionType}s which the * caller is offering to make available. * <p> * For outgoing calls, an {@link ImsService} will reserve * {@link RtpHeaderExtensionType#getLocalIdentifier()} identifiers the telephony stack has * proposed to use and not use these same local identifiers. The offered header extension * types for an outgoing call can be found in the * {@link ImsCallProfile#getOfferedRtpHeaderExtensionTypes()} and will be available to the * {@link ImsService} in {@link MmTelFeature#createCallSession(ImsCallProfile)}. * The {@link ImsService} sets the accepted {@link #setAcceptedRtpHeaderExtensionTypes(Set)} * when the SDP offer/accept process has completed. * <p> * According to RFC8285, RTP header extensions available to a call are determined using the * offer/accept phase of the SDP protocol (see RFC4566). * * @return the {@link RtpHeaderExtensionType}s which were offered by other end of the call. */ public @NonNull Set<RtpHeaderExtensionType> getOfferedRtpHeaderExtensionTypes() { return mOfferedRtpHeaderExtensionTypes; } /** * Sets the offered {@link RtpHeaderExtensionType}s for this call. * <p> * According to RFC8285, RTP header extensions available to a call are determined using the * offer/accept phase of the SDP protocol (see RFC4566). * * @param rtpHeaderExtensions the {@link RtpHeaderExtensionType}s which are offered. */ public void setOfferedRtpHeaderExtensionTypes(@NonNull Set<RtpHeaderExtensionType> rtpHeaderExtensions) { mOfferedRtpHeaderExtensionTypes.clear(); mOfferedRtpHeaderExtensionTypes.addAll(rtpHeaderExtensions); } /** * Gets the {@link RtpHeaderExtensionType}s which have been accepted by both ends of the call. * <p> * According to RFC8285, RTP header extensions available to a call are determined using the * offer/accept phase of the SDP protocol (see RFC4566). * * @return the {@link RtpHeaderExtensionType}s which were accepted by the other end of the call. */ public @NonNull Set<RtpHeaderExtensionType> getAcceptedRtpHeaderExtensionTypes() { return mAcceptedRtpHeaderExtensionTypes; } /** * Sets the accepted {@link RtpHeaderExtensionType}s for this call. * <p> * According to RFC8285, RTP header extensions available to a call are determined using the * offer/accept phase of the SDP protocol (see RFC4566). * * @param rtpHeaderExtensions */ public void setAcceptedRtpHeaderExtensionTypes(@NonNull Set<RtpHeaderExtensionType> rtpHeaderExtensions) { mAcceptedRtpHeaderExtensionTypes.clear(); mAcceptedRtpHeaderExtensionTypes.addAll(rtpHeaderExtensions); } } } telephony/java/android/telephony/ims/ImsCallSession.java +74 −0 Original line number Original line Diff line number Diff line Loading @@ -22,11 +22,16 @@ import android.os.Message; import android.os.RemoteException; import android.os.RemoteException; import android.telephony.CallQuality; import android.telephony.CallQuality; import android.telephony.ims.aidl.IImsCallSessionListener; import android.telephony.ims.aidl.IImsCallSessionListener; import android.util.ArraySet; import android.util.Log; import android.util.Log; import com.android.ims.internal.IImsCallSession; import com.android.ims.internal.IImsCallSession; import com.android.ims.internal.IImsVideoCallProvider; import com.android.ims.internal.IImsVideoCallProvider; import java.util.ArrayList; import java.util.List; import java.util.Set; /** /** * Provides the call initiation/termination, and media exchange between two IMS endpoints. * Provides the call initiation/termination, and media exchange between two IMS endpoints. * It directly communicates with IMS service which implements the IMS protocol behavior. * It directly communicates with IMS service which implements the IMS protocol behavior. Loading Loading @@ -467,12 +472,32 @@ public class ImsCallSession { // no-op // no-op } } /** * Informs the framework of a DTMF digit which was received from the network. * <p> * According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833 sec 3.10</a>, * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to * 12 ~ 15. * @param digit the DTMF digit */ public void callSessionDtmfReceived(char digit) { // no-op } /** /** * Called when the IMS service reports a change to the call quality. * Called when the IMS service reports a change to the call quality. */ */ public void callQualityChanged(CallQuality callQuality) { public void callQualityChanged(CallQuality callQuality) { // no-op // no-op } } /** * Called when the IMS service reports incoming RTP header extension data. */ public void callSessionRtpHeaderExtensionsReceived( @NonNull Set<RtpHeaderExtension> extensions) { // no-op } } } private final IImsCallSession miSession; private final IImsCallSession miSession; Loading Loading @@ -1118,6 +1143,31 @@ public class ImsCallSession { } } } } /** * Requests that {@code rtpHeaderExtensions} are sent as a header extension with the next * RTP packet sent by the IMS stack. * <p> * The {@link RtpHeaderExtensionType}s negotiated during SDP (Session Description Protocol) * signalling determine the {@link RtpHeaderExtension}s which can be sent using this method. * See RFC8285 for more information. * <p> * By specification, the RTP header extension is an unacknowledged transmission and there is no * guarantee that the header extension will be delivered by the network to the other end of the * call. * @param rtpHeaderExtensions The header extensions to be included in the next RTP header. */ public void sendRtpHeaderExtensions(@NonNull Set<RtpHeaderExtension> rtpHeaderExtensions) { if (mClosed) { return; } try { miSession.sendRtpHeaderExtensions( new ArrayList<RtpHeaderExtension>(rtpHeaderExtensions)); } catch (RemoteException e) { } } /** /** * A listener type for receiving notification on IMS call session events. * A listener type for receiving notification on IMS call session events. * When an event is generated for an {@link IImsCallSession}, * When an event is generated for an {@link IImsCallSession}, Loading Loading @@ -1476,6 +1526,17 @@ public class ImsCallSession { } } } } /** * DTMF digit received. * @param dtmf The DTMF digit. */ @Override public void callSessionDtmfReceived(char dtmf) { if (mListener != null) { mListener.callSessionDtmfReceived(dtmf); } } /** /** * Call quality updated * Call quality updated */ */ Loading @@ -1485,6 +1546,19 @@ public class ImsCallSession { mListener.callQualityChanged(callQuality); mListener.callQualityChanged(callQuality); } } } } /** * RTP header extension data received. * @param extensions The header extension data. */ @Override public void callSessionRtpHeaderExtensionsReceived( @NonNull List<RtpHeaderExtension> extensions) { if (mListener != null) { mListener.callSessionRtpHeaderExtensionsReceived( new ArraySet<RtpHeaderExtension>(extensions)); } } } } /** /** Loading telephony/java/android/telephony/ims/ImsCallSessionListener.java +57 −0 Original line number Original line Diff line number Diff line Loading @@ -28,6 +28,10 @@ import android.telephony.ims.stub.ImsCallSessionImplBase; import com.android.ims.internal.IImsCallSession; import com.android.ims.internal.IImsCallSession; import java.util.ArrayList; import java.util.Objects; import java.util.Set; /** /** * Listener interface for notifying the Framework's {@link ImsCallSession} for updates to an ongoing * Listener interface for notifying the Framework's {@link ImsCallSession} for updates to an ongoing * IMS call. * IMS call. Loading Loading @@ -682,6 +686,59 @@ public class ImsCallSessionListener { } } } } /** * The {@link ImsService} calls this method to inform the framework of a DTMF digit which was * received from the network. * <p> * According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833 sec 3.10</a>, * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15. * <p> * <em>Note:</em> Alpha DTMF digits are converted from lower-case to upper-case. * * @param dtmf The DTMF digit received, '0'-'9', *, #, A, B, C, or D. * @throws IllegalArgumentException If an invalid DTMF character is provided. */ public void callSessionDtmfReceived(char dtmf) { if (!(dtmf >= '0' && dtmf <= '9' || dtmf >= 'A' && dtmf <= 'D' || dtmf >= 'a' && dtmf <= 'd' || dtmf == '*' || dtmf == '#')) { throw new IllegalArgumentException("DTMF digit must be 0-9, *, #, A, B, C, D"); } try { mListener.callSessionDtmfReceived(Character.toUpperCase(dtmf)); } catch (RemoteException e) { e.rethrowFromSystemServer(); } } /** * The {@link ImsService} calls this method to inform the framework of RTP header extension data * which was received from the network. * <p> * The set of {@link RtpHeaderExtension} data are identified by local identifiers which were * negotiated during SDP signalling. See RFC8285, * {@link ImsCallProfile#getAcceptedRtpHeaderExtensionTypes()} and * {@link RtpHeaderExtensionType} for more information. * <p> * By specification, the RTP header extension is an unacknowledged transmission and there is no * guarantee that the header extension will be delivered by the network to the other end of the * call. * * @param extensions The RTP header extension data received. */ public void callSessionRtpHeaderExtensionsReceived( @NonNull Set<RtpHeaderExtension> extensions) { Objects.requireNonNull(extensions, "extensions are required."); try { mListener.callSessionRtpHeaderExtensionsReceived( new ArrayList<RtpHeaderExtension>(extensions)); } catch (RemoteException e) { e.rethrowFromSystemServer(); } } /** /** * Notifies the result of transfer request. * Notifies the result of transfer request. * @hide * @hide Loading Loading
api/system-current.txt +25 −0 Original line number Original line Diff line number Diff line Loading @@ -11786,6 +11786,7 @@ package android.telephony.ims { ctor public ImsCallProfile(int, int); ctor public ImsCallProfile(int, int); ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile); ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile); method public int describeContents(); method public int describeContents(); method @NonNull public java.util.Set<android.telephony.ims.RtpHeaderExtensionType> getAcceptedRtpHeaderExtensionTypes(); method public String getCallExtra(String); method public String getCallExtra(String); method public String getCallExtra(String, String); method public String getCallExtra(String, String); method public boolean getCallExtraBoolean(String); method public boolean getCallExtraBoolean(String); Loading @@ -11800,6 +11801,7 @@ package android.telephony.ims { method public int getEmergencyServiceCategories(); method public int getEmergencyServiceCategories(); method @NonNull public java.util.List<java.lang.String> getEmergencyUrns(); method @NonNull public java.util.List<java.lang.String> getEmergencyUrns(); method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); method @NonNull public java.util.Set<android.telephony.ims.RtpHeaderExtensionType> getOfferedRtpHeaderExtensionTypes(); method @NonNull public android.os.Bundle getProprietaryCallExtras(); method @NonNull public android.os.Bundle getProprietaryCallExtras(); method public int getRestrictCause(); method public int getRestrictCause(); method public int getServiceType(); method public int getServiceType(); Loading @@ -11810,6 +11812,7 @@ package android.telephony.ims { method public boolean isVideoCall(); method public boolean isVideoCall(); method public boolean isVideoPaused(); method public boolean isVideoPaused(); method public static int presentationToOir(int); method public static int presentationToOir(int); method public void setAcceptedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>); method public void setCallExtra(String, String); method public void setCallExtra(String, String); method public void setCallExtraBoolean(String, boolean); method public void setCallExtraBoolean(String, boolean); method public void setCallExtraInt(String, int); method public void setCallExtraInt(String, int); Loading @@ -11820,6 +11823,7 @@ package android.telephony.ims { method public void setEmergencyServiceCategories(int); method public void setEmergencyServiceCategories(int); method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>); method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>); method public void setHasKnownUserIntentEmergency(boolean); method public void setHasKnownUserIntentEmergency(boolean); method public void setOfferedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>); method public void updateCallExtras(android.telephony.ims.ImsCallProfile); method public void updateCallExtras(android.telephony.ims.ImsCallProfile); method public void updateCallType(android.telephony.ims.ImsCallProfile); method public void updateCallType(android.telephony.ims.ImsCallProfile); method public void updateMediaProfile(android.telephony.ims.ImsCallProfile); method public void updateMediaProfile(android.telephony.ims.ImsCallProfile); Loading Loading @@ -11879,6 +11883,7 @@ package android.telephony.ims { method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState); method public void callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState); method public void callSessionDtmfReceived(char); method @Deprecated public void callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo); method @Deprecated public void callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo); method @Deprecated public void callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo); method @Deprecated public void callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo); method public void callSessionHeld(android.telephony.ims.ImsCallProfile); method public void callSessionHeld(android.telephony.ims.ImsCallProfile); Loading @@ -11899,6 +11904,7 @@ package android.telephony.ims { method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo); method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo); method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile); method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile); method public void callSessionResumed(android.telephony.ims.ImsCallProfile); method public void callSessionResumed(android.telephony.ims.ImsCallProfile); method public void callSessionRtpHeaderExtensionsReceived(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtension>); method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile); method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile); method public void callSessionRttMessageReceived(String); method public void callSessionRttMessageReceived(String); method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile); method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile); Loading Loading @@ -12255,6 +12261,24 @@ package android.telephony.ims { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException; } } public final class RtpHeaderExtension implements android.os.Parcelable { ctor public RtpHeaderExtension(@IntRange(from=1, to=14) int, @NonNull byte[]); method public int describeContents(); method @NonNull public byte[] getExtensionData(); method @IntRange(from=1, to=14) public int getLocalIdentifier(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RtpHeaderExtension> CREATOR; } public final class RtpHeaderExtensionType implements android.os.Parcelable { ctor public RtpHeaderExtensionType(@IntRange(from=1, to=14) int, @NonNull android.net.Uri); method public int describeContents(); method @IntRange(from=1, to=14) public int getLocalIdentifier(); method @NonNull public android.net.Uri getUri(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RtpHeaderExtensionType> CREATOR; } public class SipDelegateManager { public class SipDelegateManager { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSupported() throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSupported() throws android.telephony.ims.ImsException; } } Loading Loading @@ -12371,6 +12395,7 @@ package android.telephony.ims.stub { method public void removeParticipants(String[]); method public void removeParticipants(String[]); method public void resume(android.telephony.ims.ImsStreamMediaProfile); method public void resume(android.telephony.ims.ImsStreamMediaProfile); method public void sendDtmf(char, android.os.Message); method public void sendDtmf(char, android.os.Message); method public void sendRtpHeaderExtensions(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtension>); method public void sendRttMessage(String); method public void sendRttMessage(String); method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile); method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile); method public void sendRttModifyResponse(boolean); method public void sendRttModifyResponse(boolean);
core/api/system-current.txt +25 −0 Original line number Original line Diff line number Diff line Loading @@ -10668,6 +10668,7 @@ package android.telephony.ims { ctor public ImsCallProfile(int, int); ctor public ImsCallProfile(int, int); ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile); ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile); method public int describeContents(); method public int describeContents(); method @NonNull public java.util.Set<android.telephony.ims.RtpHeaderExtensionType> getAcceptedRtpHeaderExtensionTypes(); method public String getCallExtra(String); method public String getCallExtra(String); method public String getCallExtra(String, String); method public String getCallExtra(String, String); method public boolean getCallExtraBoolean(String); method public boolean getCallExtraBoolean(String); Loading @@ -10682,6 +10683,7 @@ package android.telephony.ims { method public int getEmergencyServiceCategories(); method public int getEmergencyServiceCategories(); method @NonNull public java.util.List<java.lang.String> getEmergencyUrns(); method @NonNull public java.util.List<java.lang.String> getEmergencyUrns(); method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); method @NonNull public java.util.Set<android.telephony.ims.RtpHeaderExtensionType> getOfferedRtpHeaderExtensionTypes(); method @NonNull public android.os.Bundle getProprietaryCallExtras(); method @NonNull public android.os.Bundle getProprietaryCallExtras(); method public int getRestrictCause(); method public int getRestrictCause(); method public int getServiceType(); method public int getServiceType(); Loading @@ -10692,6 +10694,7 @@ package android.telephony.ims { method public boolean isVideoCall(); method public boolean isVideoCall(); method public boolean isVideoPaused(); method public boolean isVideoPaused(); method public static int presentationToOir(int); method public static int presentationToOir(int); method public void setAcceptedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>); method public void setCallExtra(String, String); method public void setCallExtra(String, String); method public void setCallExtraBoolean(String, boolean); method public void setCallExtraBoolean(String, boolean); method public void setCallExtraInt(String, int); method public void setCallExtraInt(String, int); Loading @@ -10702,6 +10705,7 @@ package android.telephony.ims { method public void setEmergencyServiceCategories(int); method public void setEmergencyServiceCategories(int); method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>); method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>); method public void setHasKnownUserIntentEmergency(boolean); method public void setHasKnownUserIntentEmergency(boolean); method public void setOfferedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>); method public void updateCallExtras(android.telephony.ims.ImsCallProfile); method public void updateCallExtras(android.telephony.ims.ImsCallProfile); method public void updateCallType(android.telephony.ims.ImsCallProfile); method public void updateCallType(android.telephony.ims.ImsCallProfile); method public void updateMediaProfile(android.telephony.ims.ImsCallProfile); method public void updateMediaProfile(android.telephony.ims.ImsCallProfile); Loading Loading @@ -10761,6 +10765,7 @@ package android.telephony.ims { method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); method public void callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState); method public void callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState); method public void callSessionDtmfReceived(char); method @Deprecated public void callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo); method @Deprecated public void callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo); method @Deprecated public void callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo); method @Deprecated public void callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo); method public void callSessionHeld(android.telephony.ims.ImsCallProfile); method public void callSessionHeld(android.telephony.ims.ImsCallProfile); Loading @@ -10781,6 +10786,7 @@ package android.telephony.ims { method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo); method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo); method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile); method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile); method public void callSessionResumed(android.telephony.ims.ImsCallProfile); method public void callSessionResumed(android.telephony.ims.ImsCallProfile); method public void callSessionRtpHeaderExtensionsReceived(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtension>); method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile); method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile); method public void callSessionRttMessageReceived(String); method public void callSessionRttMessageReceived(String); method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile); method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile); Loading Loading @@ -11137,6 +11143,24 @@ package android.telephony.ims { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException; } } public final class RtpHeaderExtension implements android.os.Parcelable { ctor public RtpHeaderExtension(@IntRange(from=1, to=14) int, @NonNull byte[]); method public int describeContents(); method @NonNull public byte[] getExtensionData(); method @IntRange(from=1, to=14) public int getLocalIdentifier(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RtpHeaderExtension> CREATOR; } public final class RtpHeaderExtensionType implements android.os.Parcelable { ctor public RtpHeaderExtensionType(@IntRange(from=1, to=14) int, @NonNull android.net.Uri); method public int describeContents(); method @IntRange(from=1, to=14) public int getLocalIdentifier(); method @NonNull public android.net.Uri getUri(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RtpHeaderExtensionType> CREATOR; } public class SipDelegateManager { public class SipDelegateManager { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSupported() throws android.telephony.ims.ImsException; method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSupported() throws android.telephony.ims.ImsException; } } Loading Loading @@ -11253,6 +11277,7 @@ package android.telephony.ims.stub { method public void removeParticipants(String[]); method public void removeParticipants(String[]); method public void resume(android.telephony.ims.ImsStreamMediaProfile); method public void resume(android.telephony.ims.ImsStreamMediaProfile); method public void sendDtmf(char, android.os.Message); method public void sendDtmf(char, android.os.Message); method public void sendRtpHeaderExtensions(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtension>); method public void sendRttMessage(String); method public void sendRttMessage(String); method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile); method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile); method public void sendRttModifyResponse(boolean); method public void sendRttModifyResponse(boolean);
telephony/java/android/telephony/ims/ImsCallProfile.java +81 −1 Original line number Original line Diff line number Diff line Loading @@ -28,6 +28,8 @@ import android.telecom.VideoProfile; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting; import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting; import android.telephony.emergency.EmergencyNumber.EmergencyServiceCategories; import android.telephony.emergency.EmergencyNumber.EmergencyServiceCategories; import android.telephony.ims.feature.MmTelFeature; import android.util.ArraySet; import android.util.Log; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; Loading @@ -37,7 +39,10 @@ import com.android.internal.telephony.util.TelephonyUtils; import java.lang.annotation.Retention; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** /** * A Parcelable object to handle the IMS call profile, which provides the service, call type, and * A Parcelable object to handle the IMS call profile, which provides the service, call type, and Loading Loading @@ -444,6 +449,10 @@ public final class ImsCallProfile implements Parcelable { /** Indicates if we have known the intent of the user for the call is emergency */ /** Indicates if we have known the intent of the user for the call is emergency */ private boolean mHasKnownUserIntentEmergency = false; private boolean mHasKnownUserIntentEmergency = false; private Set<RtpHeaderExtensionType> mOfferedRtpHeaderExtensionTypes = new ArraySet<>(); private Set<RtpHeaderExtensionType> mAcceptedRtpHeaderExtensionTypes = new ArraySet<>(); /** /** * Extras associated with this {@link ImsCallProfile}. * Extras associated with this {@link ImsCallProfile}. * <p> * <p> Loading Loading @@ -682,6 +691,8 @@ public final class ImsCallProfile implements Parcelable { out.writeBoolean(mHasKnownUserIntentEmergency); out.writeBoolean(mHasKnownUserIntentEmergency); out.writeInt(mRestrictCause); out.writeInt(mRestrictCause); out.writeInt(mCallerNumberVerificationStatus); out.writeInt(mCallerNumberVerificationStatus); out.writeArray(mOfferedRtpHeaderExtensionTypes.toArray()); out.writeArray(mAcceptedRtpHeaderExtensionTypes.toArray()); } } private void readFromParcel(Parcel in) { private void readFromParcel(Parcel in) { Loading @@ -696,9 +707,16 @@ public final class ImsCallProfile implements Parcelable { mHasKnownUserIntentEmergency = in.readBoolean(); mHasKnownUserIntentEmergency = in.readBoolean(); mRestrictCause = in.readInt(); mRestrictCause = in.readInt(); mCallerNumberVerificationStatus = in.readInt(); mCallerNumberVerificationStatus = in.readInt(); Object[] offered = in.readArray(RtpHeaderExtensionType.class.getClassLoader()); mOfferedRtpHeaderExtensionTypes = Arrays.stream(offered) .map(o -> (RtpHeaderExtensionType) o).collect(Collectors.toSet()); Object[] accepted = in.readArray(RtpHeaderExtensionType.class.getClassLoader()); mAcceptedRtpHeaderExtensionTypes = Arrays.stream(accepted) .map(o -> (RtpHeaderExtensionType) o).collect(Collectors.toSet()); } } public static final @android.annotation.NonNull Creator<ImsCallProfile> CREATOR = new Creator<ImsCallProfile>() { public static final @android.annotation.NonNull Creator<ImsCallProfile> CREATOR = new Creator<ImsCallProfile>() { @Override @Override public ImsCallProfile createFromParcel(Parcel in) { public ImsCallProfile createFromParcel(Parcel in) { return new ImsCallProfile(in); return new ImsCallProfile(in); Loading Loading @@ -1085,4 +1103,66 @@ public final class ImsCallProfile implements Parcelable { public boolean hasKnownUserIntentEmergency() { public boolean hasKnownUserIntentEmergency() { return mHasKnownUserIntentEmergency; return mHasKnownUserIntentEmergency; } } /** * For an incoming or outgoing call, indicates the {@link RtpHeaderExtensionType}s which the * caller is offering to make available. * <p> * For outgoing calls, an {@link ImsService} will reserve * {@link RtpHeaderExtensionType#getLocalIdentifier()} identifiers the telephony stack has * proposed to use and not use these same local identifiers. The offered header extension * types for an outgoing call can be found in the * {@link ImsCallProfile#getOfferedRtpHeaderExtensionTypes()} and will be available to the * {@link ImsService} in {@link MmTelFeature#createCallSession(ImsCallProfile)}. * The {@link ImsService} sets the accepted {@link #setAcceptedRtpHeaderExtensionTypes(Set)} * when the SDP offer/accept process has completed. * <p> * According to RFC8285, RTP header extensions available to a call are determined using the * offer/accept phase of the SDP protocol (see RFC4566). * * @return the {@link RtpHeaderExtensionType}s which were offered by other end of the call. */ public @NonNull Set<RtpHeaderExtensionType> getOfferedRtpHeaderExtensionTypes() { return mOfferedRtpHeaderExtensionTypes; } /** * Sets the offered {@link RtpHeaderExtensionType}s for this call. * <p> * According to RFC8285, RTP header extensions available to a call are determined using the * offer/accept phase of the SDP protocol (see RFC4566). * * @param rtpHeaderExtensions the {@link RtpHeaderExtensionType}s which are offered. */ public void setOfferedRtpHeaderExtensionTypes(@NonNull Set<RtpHeaderExtensionType> rtpHeaderExtensions) { mOfferedRtpHeaderExtensionTypes.clear(); mOfferedRtpHeaderExtensionTypes.addAll(rtpHeaderExtensions); } /** * Gets the {@link RtpHeaderExtensionType}s which have been accepted by both ends of the call. * <p> * According to RFC8285, RTP header extensions available to a call are determined using the * offer/accept phase of the SDP protocol (see RFC4566). * * @return the {@link RtpHeaderExtensionType}s which were accepted by the other end of the call. */ public @NonNull Set<RtpHeaderExtensionType> getAcceptedRtpHeaderExtensionTypes() { return mAcceptedRtpHeaderExtensionTypes; } /** * Sets the accepted {@link RtpHeaderExtensionType}s for this call. * <p> * According to RFC8285, RTP header extensions available to a call are determined using the * offer/accept phase of the SDP protocol (see RFC4566). * * @param rtpHeaderExtensions */ public void setAcceptedRtpHeaderExtensionTypes(@NonNull Set<RtpHeaderExtensionType> rtpHeaderExtensions) { mAcceptedRtpHeaderExtensionTypes.clear(); mAcceptedRtpHeaderExtensionTypes.addAll(rtpHeaderExtensions); } } }
telephony/java/android/telephony/ims/ImsCallSession.java +74 −0 Original line number Original line Diff line number Diff line Loading @@ -22,11 +22,16 @@ import android.os.Message; import android.os.RemoteException; import android.os.RemoteException; import android.telephony.CallQuality; import android.telephony.CallQuality; import android.telephony.ims.aidl.IImsCallSessionListener; import android.telephony.ims.aidl.IImsCallSessionListener; import android.util.ArraySet; import android.util.Log; import android.util.Log; import com.android.ims.internal.IImsCallSession; import com.android.ims.internal.IImsCallSession; import com.android.ims.internal.IImsVideoCallProvider; import com.android.ims.internal.IImsVideoCallProvider; import java.util.ArrayList; import java.util.List; import java.util.Set; /** /** * Provides the call initiation/termination, and media exchange between two IMS endpoints. * Provides the call initiation/termination, and media exchange between two IMS endpoints. * It directly communicates with IMS service which implements the IMS protocol behavior. * It directly communicates with IMS service which implements the IMS protocol behavior. Loading Loading @@ -467,12 +472,32 @@ public class ImsCallSession { // no-op // no-op } } /** * Informs the framework of a DTMF digit which was received from the network. * <p> * According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833 sec 3.10</a>, * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to * 12 ~ 15. * @param digit the DTMF digit */ public void callSessionDtmfReceived(char digit) { // no-op } /** /** * Called when the IMS service reports a change to the call quality. * Called when the IMS service reports a change to the call quality. */ */ public void callQualityChanged(CallQuality callQuality) { public void callQualityChanged(CallQuality callQuality) { // no-op // no-op } } /** * Called when the IMS service reports incoming RTP header extension data. */ public void callSessionRtpHeaderExtensionsReceived( @NonNull Set<RtpHeaderExtension> extensions) { // no-op } } } private final IImsCallSession miSession; private final IImsCallSession miSession; Loading Loading @@ -1118,6 +1143,31 @@ public class ImsCallSession { } } } } /** * Requests that {@code rtpHeaderExtensions} are sent as a header extension with the next * RTP packet sent by the IMS stack. * <p> * The {@link RtpHeaderExtensionType}s negotiated during SDP (Session Description Protocol) * signalling determine the {@link RtpHeaderExtension}s which can be sent using this method. * See RFC8285 for more information. * <p> * By specification, the RTP header extension is an unacknowledged transmission and there is no * guarantee that the header extension will be delivered by the network to the other end of the * call. * @param rtpHeaderExtensions The header extensions to be included in the next RTP header. */ public void sendRtpHeaderExtensions(@NonNull Set<RtpHeaderExtension> rtpHeaderExtensions) { if (mClosed) { return; } try { miSession.sendRtpHeaderExtensions( new ArrayList<RtpHeaderExtension>(rtpHeaderExtensions)); } catch (RemoteException e) { } } /** /** * A listener type for receiving notification on IMS call session events. * A listener type for receiving notification on IMS call session events. * When an event is generated for an {@link IImsCallSession}, * When an event is generated for an {@link IImsCallSession}, Loading Loading @@ -1476,6 +1526,17 @@ public class ImsCallSession { } } } } /** * DTMF digit received. * @param dtmf The DTMF digit. */ @Override public void callSessionDtmfReceived(char dtmf) { if (mListener != null) { mListener.callSessionDtmfReceived(dtmf); } } /** /** * Call quality updated * Call quality updated */ */ Loading @@ -1485,6 +1546,19 @@ public class ImsCallSession { mListener.callQualityChanged(callQuality); mListener.callQualityChanged(callQuality); } } } } /** * RTP header extension data received. * @param extensions The header extension data. */ @Override public void callSessionRtpHeaderExtensionsReceived( @NonNull List<RtpHeaderExtension> extensions) { if (mListener != null) { mListener.callSessionRtpHeaderExtensionsReceived( new ArraySet<RtpHeaderExtension>(extensions)); } } } } /** /** Loading
telephony/java/android/telephony/ims/ImsCallSessionListener.java +57 −0 Original line number Original line Diff line number Diff line Loading @@ -28,6 +28,10 @@ import android.telephony.ims.stub.ImsCallSessionImplBase; import com.android.ims.internal.IImsCallSession; import com.android.ims.internal.IImsCallSession; import java.util.ArrayList; import java.util.Objects; import java.util.Set; /** /** * Listener interface for notifying the Framework's {@link ImsCallSession} for updates to an ongoing * Listener interface for notifying the Framework's {@link ImsCallSession} for updates to an ongoing * IMS call. * IMS call. Loading Loading @@ -682,6 +686,59 @@ public class ImsCallSessionListener { } } } } /** * The {@link ImsService} calls this method to inform the framework of a DTMF digit which was * received from the network. * <p> * According to <a href="http://tools.ietf.org/html/rfc2833">RFC 2833 sec 3.10</a>, * event 0 ~ 9 maps to decimal value 0 ~ 9, '*' to 10, '#' to 11, event 'A' ~ 'D' to 12 ~ 15. * <p> * <em>Note:</em> Alpha DTMF digits are converted from lower-case to upper-case. * * @param dtmf The DTMF digit received, '0'-'9', *, #, A, B, C, or D. * @throws IllegalArgumentException If an invalid DTMF character is provided. */ public void callSessionDtmfReceived(char dtmf) { if (!(dtmf >= '0' && dtmf <= '9' || dtmf >= 'A' && dtmf <= 'D' || dtmf >= 'a' && dtmf <= 'd' || dtmf == '*' || dtmf == '#')) { throw new IllegalArgumentException("DTMF digit must be 0-9, *, #, A, B, C, D"); } try { mListener.callSessionDtmfReceived(Character.toUpperCase(dtmf)); } catch (RemoteException e) { e.rethrowFromSystemServer(); } } /** * The {@link ImsService} calls this method to inform the framework of RTP header extension data * which was received from the network. * <p> * The set of {@link RtpHeaderExtension} data are identified by local identifiers which were * negotiated during SDP signalling. See RFC8285, * {@link ImsCallProfile#getAcceptedRtpHeaderExtensionTypes()} and * {@link RtpHeaderExtensionType} for more information. * <p> * By specification, the RTP header extension is an unacknowledged transmission and there is no * guarantee that the header extension will be delivered by the network to the other end of the * call. * * @param extensions The RTP header extension data received. */ public void callSessionRtpHeaderExtensionsReceived( @NonNull Set<RtpHeaderExtension> extensions) { Objects.requireNonNull(extensions, "extensions are required."); try { mListener.callSessionRtpHeaderExtensionsReceived( new ArrayList<RtpHeaderExtension>(extensions)); } catch (RemoteException e) { e.rethrowFromSystemServer(); } } /** /** * Notifies the result of transfer request. * Notifies the result of transfer request. * @hide * @hide Loading