/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.telephony; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Objects; /** * Parcelable object to handle call quality. *

* Currently this supports IMS calls. *

* It provides the call quality level, duration, and additional information related to RTP packets, * jitter and delay. *

* If there are multiple active calls, the CallQuality will pertain to the call in the foreground. * * @hide */ @SystemApi public final class CallQuality implements Parcelable { // Constants representing the call quality level (see #CallQuality); public static final int CALL_QUALITY_EXCELLENT = 0; public static final int CALL_QUALITY_GOOD = 1; public static final int CALL_QUALITY_FAIR = 2; public static final int CALL_QUALITY_POOR = 3; public static final int CALL_QUALITY_BAD = 4; public static final int CALL_QUALITY_NOT_AVAILABLE = 5; /** * Call quality * @hide */ @IntDef(prefix = { "CALL_QUALITY_" }, value = { CALL_QUALITY_EXCELLENT, CALL_QUALITY_GOOD, CALL_QUALITY_FAIR, CALL_QUALITY_POOR, CALL_QUALITY_BAD, CALL_QUALITY_NOT_AVAILABLE, }) @Retention(RetentionPolicy.SOURCE) public @interface CallQualityLevel {} @CallQualityLevel private int mDownlinkCallQualityLevel; @CallQualityLevel private int mUplinkCallQualityLevel; private int mCallDuration; private int mNumRtpPacketsTransmitted; private int mNumRtpPacketsReceived; private int mNumRtpPacketsTransmittedLost; private int mNumRtpPacketsNotReceived; private int mAverageRelativeJitter; private int mMaxRelativeJitter; private int mAverageRoundTripTime; private int mCodecType; private boolean mRtpInactivityDetected; private boolean mRxSilenceDetected; private boolean mTxSilenceDetected; private int mNumVoiceFrames; private int mNumNoDataFrames; private int mNumDroppedRtpPackets; private long mMinPlayoutDelayMillis; private long mMaxPlayoutDelayMillis; private int mNumRtpSidPacketsReceived; private int mNumRtpDuplicatePackets; /** @hide **/ public CallQuality(Parcel in) { mDownlinkCallQualityLevel = in.readInt(); mUplinkCallQualityLevel = in.readInt(); mCallDuration = in.readInt(); mNumRtpPacketsTransmitted = in.readInt(); mNumRtpPacketsReceived = in.readInt(); mNumRtpPacketsTransmittedLost = in.readInt(); mNumRtpPacketsNotReceived = in.readInt(); mAverageRelativeJitter = in.readInt(); mMaxRelativeJitter = in.readInt(); mAverageRoundTripTime = in.readInt(); mCodecType = in.readInt(); mRtpInactivityDetected = in.readBoolean(); mRxSilenceDetected = in.readBoolean(); mTxSilenceDetected = in.readBoolean(); mNumVoiceFrames = in.readInt(); mNumNoDataFrames = in.readInt(); mNumDroppedRtpPackets = in.readInt(); mMinPlayoutDelayMillis = in.readLong(); mMaxPlayoutDelayMillis = in.readLong(); mNumRtpSidPacketsReceived = in.readInt(); mNumRtpDuplicatePackets = in.readInt(); } /** @hide **/ public CallQuality() { } /** * Constructor. * * @param callQualityLevel the call quality level (see #CallQualityLevel) * @param callDuration the call duration in milliseconds * @param numRtpPacketsTransmitted RTP packets sent to network * @param numRtpPacketsReceived RTP packets received from network * @param numRtpPacketsTransmittedLost RTP packets which were lost in network and never * transmitted * @param numRtpPacketsNotReceived RTP packets which were lost in network and never received * @param averageRelativeJitter average relative jitter in milliseconds * @param maxRelativeJitter maximum relative jitter in milliseconds * @param averageRoundTripTime average round trip delay in milliseconds * @param codecType the codec type */ public CallQuality( @CallQualityLevel int downlinkCallQualityLevel, @CallQualityLevel int uplinkCallQualityLevel, int callDuration, int numRtpPacketsTransmitted, int numRtpPacketsReceived, int numRtpPacketsTransmittedLost, int numRtpPacketsNotReceived, int averageRelativeJitter, int maxRelativeJitter, int averageRoundTripTime, int codecType) { this(downlinkCallQualityLevel, uplinkCallQualityLevel, callDuration, numRtpPacketsTransmitted, numRtpPacketsReceived, numRtpPacketsTransmittedLost, numRtpPacketsNotReceived, averageRelativeJitter, maxRelativeJitter, averageRoundTripTime, codecType, false, false, false); } /** * Constructor. * * @param callQualityLevel the call quality level (see #CallQualityLevel) * @param callDuration the call duration in milliseconds * @param numRtpPacketsTransmitted RTP packets sent to network * @param numRtpPacketsReceived RTP packets received from network * @param numRtpPacketsTransmittedLost RTP packets which were lost in network and never * transmitted * @param numRtpPacketsNotReceived RTP packets which were lost in network and never received * @param averageRelativeJitter average relative jitter in milliseconds * @param maxRelativeJitter maximum relative jitter in milliseconds * @param averageRoundTripTime average round trip delay in milliseconds * @param codecType the codec type * @param rtpInactivityDetected True if no incoming RTP is received for a continuous duration of * 4 seconds * @param rxSilenceDetected True if only silence RTP packets are received for 20 seconds * immediately after call is connected * @param txSilenceDetected True if only silence RTP packets are sent for 20 seconds immediately * after call is connected */ public CallQuality( @CallQualityLevel int downlinkCallQualityLevel, @CallQualityLevel int uplinkCallQualityLevel, int callDuration, int numRtpPacketsTransmitted, int numRtpPacketsReceived, int numRtpPacketsTransmittedLost, int numRtpPacketsNotReceived, int averageRelativeJitter, int maxRelativeJitter, int averageRoundTripTime, int codecType, boolean rtpInactivityDetected, boolean rxSilenceDetected, boolean txSilenceDetected) { this.mDownlinkCallQualityLevel = downlinkCallQualityLevel; this.mUplinkCallQualityLevel = uplinkCallQualityLevel; this.mCallDuration = callDuration; this.mNumRtpPacketsTransmitted = numRtpPacketsTransmitted; this.mNumRtpPacketsReceived = numRtpPacketsReceived; this.mNumRtpPacketsTransmittedLost = numRtpPacketsTransmittedLost; this.mNumRtpPacketsNotReceived = numRtpPacketsNotReceived; this.mAverageRelativeJitter = averageRelativeJitter; this.mMaxRelativeJitter = maxRelativeJitter; this.mAverageRoundTripTime = averageRoundTripTime; this.mCodecType = codecType; this.mRtpInactivityDetected = rtpInactivityDetected; this.mRxSilenceDetected = rxSilenceDetected; this.mTxSilenceDetected = txSilenceDetected; } // getters /** * Returns the downlink CallQualityLevel for a given ongoing call. */ @CallQualityLevel public int getDownlinkCallQualityLevel() { return mDownlinkCallQualityLevel; } /** * Returns the uplink CallQualityLevel for a given ongoing call. */ @CallQualityLevel public int getUplinkCallQualityLevel() { return mUplinkCallQualityLevel; } /** * Returns the duration of the call, in milliseconds. */ public int getCallDuration() { return mCallDuration; } /** * Returns the total number of RTP packets transmitted by this device for a given ongoing call. */ public int getNumRtpPacketsTransmitted() { return mNumRtpPacketsTransmitted; } /** * Returns the total number of RTP packets received by this device for a given ongoing call. */ public int getNumRtpPacketsReceived() { return mNumRtpPacketsReceived; } /** * Returns the number of RTP packets which were sent by this device but were lost in the * network before reaching the other party. */ public int getNumRtpPacketsTransmittedLost() { return mNumRtpPacketsTransmittedLost; } /** * Returns the number of RTP packets which were sent by the other party but were lost in the * network before reaching this device. */ public int getNumRtpPacketsNotReceived() { return mNumRtpPacketsNotReceived; } /** * Returns the average relative jitter in milliseconds. Jitter represents the amount of variance * in interarrival time of packets, for example, if two packets are sent 2 milliseconds apart * but received 3 milliseconds apart, the relative jitter between those packets is 1 * millisecond. * *

See RFC 3550 for more information on jitter calculations. */ public int getAverageRelativeJitter() { return mAverageRelativeJitter; } /** * Returns the maximum relative jitter for a given ongoing call. Jitter represents the amount of * variance in interarrival time of packets, for example, if two packets are sent 2 milliseconds * apart but received 3 milliseconds apart, the relative jitter between those packets is 1 * millisecond. * *

See RFC 3550 for more information on jitter calculations. */ public int getMaxRelativeJitter() { return mMaxRelativeJitter; } /** * Returns the average round trip time in milliseconds. */ public int getAverageRoundTripTime() { return mAverageRoundTripTime; } /** * Returns true if no rtp packets are received continuously for the last 4 seconds */ public boolean isRtpInactivityDetected() { return mRtpInactivityDetected; } /** * Returns true if only silence rtp packets are received for a duration of 20 seconds starting * at call setup */ public boolean isIncomingSilenceDetectedAtCallSetup() { return mRxSilenceDetected; } /** * Returns true if only silence rtp packets are sent for a duration of 20 seconds starting at * call setup */ public boolean isOutgoingSilenceDetectedAtCallSetup() { return mTxSilenceDetected; } /** * Returns the number of Voice frames sent by jitter buffer to audio */ public int getNumVoiceFrames() { return mNumVoiceFrames; } /** * Returns the number of no-data frames sent by jitter buffer to audio */ public int getNumNoDataFrames() { return mNumNoDataFrames; } /** * Returns the number of RTP voice packets dropped by jitter buffer */ public int getNumDroppedRtpPackets() { return mNumDroppedRtpPackets; } /** * Returns the minimum playout delay in the reporting interval * in milliseconds. */ public long getMinPlayoutDelayMillis() { return mMinPlayoutDelayMillis; } /** * Returns the maximum playout delay in the reporting interval * in milliseconds. */ public long getMaxPlayoutDelayMillis() { return mMaxPlayoutDelayMillis; } /** * Returns the total number of RTP SID (Silence Insertion Descriptor) packets * received by this device for an ongoing call */ public int getNumRtpSidPacketsReceived() { return mNumRtpSidPacketsReceived; } /** * Returns the total number of RTP duplicate packets received by this device * for an ongoing call */ public int getNumRtpDuplicatePackets() { return mNumRtpDuplicatePackets; } /** * Returns the codec type. This value corresponds to the AUDIO_QUALITY_* constants in * {@link ImsStreamMediaProfile}. * * @see ImsStreamMediaProfile#AUDIO_QUALITY_NONE * @see ImsStreamMediaProfile#AUDIO_QUALITY_AMR * @see ImsStreamMediaProfile#AUDIO_QUALITY_AMR_WB * @see ImsStreamMediaProfile#AUDIO_QUALITY_QCELP13K * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVRC * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVRC_B * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVRC_WB * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVRC_NW * @see ImsStreamMediaProfile#AUDIO_QUALITY_GSM_EFR * @see ImsStreamMediaProfile#AUDIO_QUALITY_GSM_FR * @see ImsStreamMediaProfile#AUDIO_QUALITY_GSM_HR * @see ImsStreamMediaProfile#AUDIO_QUALITY_G711U * @see ImsStreamMediaProfile#AUDIO_QUALITY_G723 * @see ImsStreamMediaProfile#AUDIO_QUALITY_G711A * @see ImsStreamMediaProfile#AUDIO_QUALITY_G722 * @see ImsStreamMediaProfile#AUDIO_QUALITY_G711AB * @see ImsStreamMediaProfile#AUDIO_QUALITY_G729 * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVS_NB * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVS_WB * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVS_SWB * @see ImsStreamMediaProfile#AUDIO_QUALITY_EVS_FB */ public int getCodecType() { return mCodecType; } // Parcelable things @NonNull @Override public String toString() { return "CallQuality: {downlinkCallQualityLevel=" + mDownlinkCallQualityLevel + " uplinkCallQualityLevel=" + mUplinkCallQualityLevel + " callDuration=" + mCallDuration + " numRtpPacketsTransmitted=" + mNumRtpPacketsTransmitted + " numRtpPacketsReceived=" + mNumRtpPacketsReceived + " numRtpPacketsTransmittedLost=" + mNumRtpPacketsTransmittedLost + " numRtpPacketsNotReceived=" + mNumRtpPacketsNotReceived + " averageRelativeJitter=" + mAverageRelativeJitter + " maxRelativeJitter=" + mMaxRelativeJitter + " averageRoundTripTime=" + mAverageRoundTripTime + " codecType=" + mCodecType + " rtpInactivityDetected=" + mRtpInactivityDetected + " txSilenceDetected=" + mTxSilenceDetected + " rxSilenceDetected=" + mRxSilenceDetected + " numVoiceFrames=" + mNumVoiceFrames + " numNoDataFrames=" + mNumNoDataFrames + " numDroppedRtpPackets=" + mNumDroppedRtpPackets + " minPlayoutDelayMillis=" + mMinPlayoutDelayMillis + " maxPlayoutDelayMillis=" + mMaxPlayoutDelayMillis + " numRtpSidPacketsReceived=" + mNumRtpSidPacketsReceived + " numRtpDuplicatePackets=" + mNumRtpDuplicatePackets + "}"; } @Override public int hashCode() { return Objects.hash( mDownlinkCallQualityLevel, mUplinkCallQualityLevel, mCallDuration, mNumRtpPacketsTransmitted, mNumRtpPacketsReceived, mNumRtpPacketsTransmittedLost, mNumRtpPacketsNotReceived, mAverageRelativeJitter, mMaxRelativeJitter, mAverageRoundTripTime, mCodecType, mRtpInactivityDetected, mRxSilenceDetected, mTxSilenceDetected, mNumVoiceFrames, mNumNoDataFrames, mNumDroppedRtpPackets, mMinPlayoutDelayMillis, mMaxPlayoutDelayMillis, mNumRtpSidPacketsReceived, mNumRtpDuplicatePackets); } @Override public boolean equals(@Nullable Object o) { if (o == null || !(o instanceof CallQuality) || hashCode() != o.hashCode()) { return false; } if (this == o) { return true; } CallQuality s = (CallQuality) o; return (mDownlinkCallQualityLevel == s.mDownlinkCallQualityLevel && mUplinkCallQualityLevel == s.mUplinkCallQualityLevel && mCallDuration == s.mCallDuration && mNumRtpPacketsTransmitted == s.mNumRtpPacketsTransmitted && mNumRtpPacketsReceived == s.mNumRtpPacketsReceived && mNumRtpPacketsTransmittedLost == s.mNumRtpPacketsTransmittedLost && mNumRtpPacketsNotReceived == s.mNumRtpPacketsNotReceived && mAverageRelativeJitter == s.mAverageRelativeJitter && mMaxRelativeJitter == s.mMaxRelativeJitter && mAverageRoundTripTime == s.mAverageRoundTripTime && mCodecType == s.mCodecType && mRtpInactivityDetected == s.mRtpInactivityDetected && mRxSilenceDetected == s.mRxSilenceDetected && mTxSilenceDetected == s.mTxSilenceDetected && mNumVoiceFrames == s.mNumVoiceFrames && mNumNoDataFrames == s.mNumNoDataFrames && mNumDroppedRtpPackets == s.mNumDroppedRtpPackets && mMinPlayoutDelayMillis == s.mMinPlayoutDelayMillis && mMaxPlayoutDelayMillis == s.mMaxPlayoutDelayMillis && mNumRtpSidPacketsReceived == s.mNumRtpSidPacketsReceived && mNumRtpDuplicatePackets == s.mNumRtpDuplicatePackets); } /** * {@link Parcelable#describeContents} */ public int describeContents() { return 0; } /** * {@link Parcelable#writeToParcel} */ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mDownlinkCallQualityLevel); dest.writeInt(mUplinkCallQualityLevel); dest.writeInt(mCallDuration); dest.writeInt(mNumRtpPacketsTransmitted); dest.writeInt(mNumRtpPacketsReceived); dest.writeInt(mNumRtpPacketsTransmittedLost); dest.writeInt(mNumRtpPacketsNotReceived); dest.writeInt(mAverageRelativeJitter); dest.writeInt(mMaxRelativeJitter); dest.writeInt(mAverageRoundTripTime); dest.writeInt(mCodecType); dest.writeBoolean(mRtpInactivityDetected); dest.writeBoolean(mRxSilenceDetected); dest.writeBoolean(mTxSilenceDetected); dest.writeInt(mNumVoiceFrames); dest.writeInt(mNumNoDataFrames); dest.writeInt(mNumDroppedRtpPackets); dest.writeLong(mMinPlayoutDelayMillis); dest.writeLong(mMaxPlayoutDelayMillis); dest.writeInt(mNumRtpSidPacketsReceived); dest.writeInt(mNumRtpDuplicatePackets); } public static final @android.annotation.NonNull Parcelable.Creator CREATOR = new Parcelable.Creator() { public CallQuality createFromParcel(Parcel in) { return new CallQuality(in); } public CallQuality[] newArray(int size) { return new CallQuality[size]; } }; /** * Provides a convenient way to set the fields of a {@link CallQuality} when creating a new * instance. * *

The example below shows how you might create a new {@code CallQuality}: * *


     *
     * CallQuality callQuality = new CallQuality.Builder()
     *     .setNumRtpPacketsTransmitted(150)
     *     .setNumRtpPacketsReceived(200)
     *     .build();
     * 
*/ public static final class Builder { private int mDownlinkCallQualityLevel; private int mUplinkCallQualityLevel; private int mCallDuration; private int mNumRtpPacketsTransmitted; private int mNumRtpPacketsReceived; private int mNumRtpPacketsTransmittedLost; private int mNumRtpPacketsNotReceived; private int mAverageRelativeJitter; private int mMaxRelativeJitter; private int mAverageRoundTripTime; private int mCodecType; private boolean mRtpInactivityDetected; private boolean mRxSilenceDetected; private boolean mTxSilenceDetected; private int mNumVoiceFrames; private int mNumNoDataFrames; private int mNumDroppedRtpPackets; private long mMinPlayoutDelayMillis; private long mMaxPlayoutDelayMillis; private int mNumRtpSidPacketsReceived; private int mNumRtpDuplicatePackets; /** * Set the downlink call quality level for ongoing call. * * @param downlinkCallQualityLevel the Downlink call quality level * @return The same instance of the builder. */ public @NonNull Builder setDownlinkCallQualityLevel( @CallQualityLevel int downlinkCallQualityLevel) { mDownlinkCallQualityLevel = downlinkCallQualityLevel; return this; } /** * Set the uplink call quality level for ongoing call. * * @param uplinkCallQualityLevel the Uplink call quality level * @return The same instance of the builder. */ public @NonNull Builder setUplinkCallQualityLevel( @CallQualityLevel int uplinkCallQualityLevel) { mUplinkCallQualityLevel = uplinkCallQualityLevel; return this; } /** * Set the call duration in milliseconds. * * @param callDuration the call duration in milliseconds * @return The same instance of the builder. */ // Newer builder includes guidelines compliant units; existing method does not. @NonNull @SuppressWarnings("MissingGetterMatchingBuilder") public Builder setCallDurationMillis(int callDurationMillis) { mCallDuration = callDurationMillis; return this; } /** * Set the number of RTP packets sent for ongoing call. * * @param numRtpPacketsTransmitted RTP packets sent to network * @return The same instance of the builder. */ public @NonNull Builder setNumRtpPacketsTransmitted(int numRtpPacketsTransmitted) { mNumRtpPacketsTransmitted = numRtpPacketsTransmitted; return this; } /** * Set the number of RTP packets received for ongoing call. * * @param numRtpPacketsReceived RTP packets received from network * @return The same instance of the builder. */ public @NonNull Builder setNumRtpPacketsReceived(int numRtpPacketsReceived) { mNumRtpPacketsReceived = numRtpPacketsReceived; return this; } /** * Set the number of RTP packets which were lost in network and never * transmitted. * * @param numRtpPacketsTransmittedLost RTP packets which were lost in network and never * transmitted * @return The same instance of the builder. */ public @NonNull Builder setNumRtpPacketsTransmittedLost(int numRtpPacketsTransmittedLost) { mNumRtpPacketsTransmittedLost = numRtpPacketsTransmittedLost; return this; } /** * Set the number of RTP packets which were lost in network and never received. * * @param numRtpPacketsNotReceived RTP packets which were lost in network and * never received * @return The same instance of the builder. */ public @NonNull Builder setNumRtpPacketsNotReceived(int numRtpPacketsNotReceived) { mNumRtpPacketsNotReceived = numRtpPacketsNotReceived; return this; } /** * Set the average relative jitter in milliseconds. * * @param averageRelativeJitter average relative jitter in milliseconds * @return The same instance of the builder. */ public @NonNull Builder setAverageRelativeJitter(int averageRelativeJitter) { mAverageRelativeJitter = averageRelativeJitter; return this; } /** * Set the maximum relative jitter in milliseconds. * * @param maxRelativeJitter maximum relative jitter in milliseconds * @return The same instance of the builder. */ public @NonNull Builder setMaxRelativeJitter(int maxRelativeJitter) { mMaxRelativeJitter = maxRelativeJitter; return this; } /** * Set the average round trip delay in milliseconds. * * @param averageRoundTripTime average round trip delay in milliseconds * @return The same instance of the builder. */ // Newer builder includes guidelines compliant units; existing method does not. @NonNull @SuppressWarnings("MissingGetterMatchingBuilder") public Builder setAverageRoundTripTimeMillis(int averageRoundTripTimeMillis) { mAverageRoundTripTime = averageRoundTripTimeMillis; return this; } /** * Set the codec type used in the ongoing call. * * @param codecType the codec type. * @return The same instance of the builder. */ public @NonNull Builder setCodecType(int codecType) { mCodecType = codecType; return this; } /** * Set to be True if no incoming RTP is received for a continuous * duration of 4 seconds. * * @param rtpInactivityDetected True if no incoming RTP is received for * a continuous duration of 4 seconds * @return The same instance of the builder. */ public @NonNull Builder setRtpInactivityDetected(boolean rtpInactivityDetected) { mRtpInactivityDetected = rtpInactivityDetected; return this; } /** * Set to be True if only silence RTP packets are received for 20 seconds * immediately after call is connected. * * @param rxSilenceDetected True if only silence RTP packets are received for 20 seconds * immediately after call is connected * @return The same instance of the builder. */ public @NonNull Builder setIncomingSilenceDetectedAtCallSetup(boolean rxSilenceDetected) { mRxSilenceDetected = rxSilenceDetected; return this; } /** * Set to be True if only silence RTP packets are sent for 20 seconds immediately * after call is connected. * * @param txSilenceDetected True if only silence RTP packets are sent for * 20 seconds immediately after call is connected. * @return The same instance of the builder. */ public @NonNull Builder setOutgoingSilenceDetectedAtCallSetup(boolean txSilenceDetected) { mTxSilenceDetected = txSilenceDetected; return this; } /** * Set the number of voice frames sent by jitter buffer to audio. * * @param numVoiceFrames Voice frames sent by jitter buffer to audio. * @return The same instance of the builder. */ public @NonNull Builder setNumVoiceFrames(int numVoiceFrames) { mNumVoiceFrames = numVoiceFrames; return this; } /** * Set the number of no-data frames sent by jitter buffer to audio. * * @param numNoDataFrames no-data frames sent by jitter buffer to audio * @return The same instance of the builder. */ public @NonNull Builder setNumNoDataFrames(int numNoDataFrames) { mNumNoDataFrames = numNoDataFrames; return this; } /** * Set the number of RTP Voice packets dropped by jitter buffer. * * @param numDroppedRtpPackets number of RTP Voice packets dropped by jitter buffer * @return The same instance of the builder. */ public @NonNull Builder setNumDroppedRtpPackets(int numDroppedRtpPackets) { mNumDroppedRtpPackets = numDroppedRtpPackets; return this; } /** * Set the minimum playout delay in the reporting interval in milliseconds. * * @param minPlayoutDelayMillis minimum playout delay in the reporting interval * @return The same instance of the builder. */ public @NonNull Builder setMinPlayoutDelayMillis(long minPlayoutDelayMillis) { mMinPlayoutDelayMillis = minPlayoutDelayMillis; return this; } /** * Set the maximum Playout delay in the reporting interval in milliseconds. * * @param maxPlayoutDelayMillis maximum Playout delay in the reporting interval * @return The same instance of the builder. */ public @NonNull Builder setMaxPlayoutDelayMillis(long maxPlayoutDelayMillis) { mMaxPlayoutDelayMillis = maxPlayoutDelayMillis; return this; } /** * Set the total number of RTP SID (Silence Insertion Descriptor) * packets received by this device for an ongoing call. * * @param numRtpSidPacketsReceived the total number of RTP SID packets received * by this device for an ongoing call. * @return The same instance of the builder. */ public @NonNull Builder setNumRtpSidPacketsReceived(int numRtpSidPacketsReceived) { mNumRtpSidPacketsReceived = numRtpSidPacketsReceived; return this; } /** * Set the total number of RTP duplicate packets received by this device * for an ongoing call. * * @param numRtpDuplicatePackets the total number of RTP duplicate packets * received by this device for an ongoing call * @return The same instance of the builder. */ public @NonNull Builder setNumRtpDuplicatePackets(int numRtpDuplicatePackets) { mNumRtpDuplicatePackets = numRtpDuplicatePackets; return this; } /** * Build the CallQuality. * * @return the CallQuality object. */ public @NonNull CallQuality build() { CallQuality callQuality = new CallQuality(); callQuality.mDownlinkCallQualityLevel = mDownlinkCallQualityLevel; callQuality.mUplinkCallQualityLevel = mUplinkCallQualityLevel; callQuality.mCallDuration = mCallDuration; callQuality.mNumRtpPacketsTransmitted = mNumRtpPacketsTransmitted; callQuality.mNumRtpPacketsReceived = mNumRtpPacketsReceived; callQuality.mNumRtpPacketsTransmittedLost = mNumRtpPacketsTransmittedLost; callQuality.mNumRtpPacketsNotReceived = mNumRtpPacketsNotReceived; callQuality.mAverageRelativeJitter = mAverageRelativeJitter; callQuality.mMaxRelativeJitter = mMaxRelativeJitter; callQuality.mAverageRoundTripTime = mAverageRoundTripTime; callQuality.mCodecType = mCodecType; callQuality.mRtpInactivityDetected = mRtpInactivityDetected; callQuality.mTxSilenceDetected = mTxSilenceDetected; callQuality.mRxSilenceDetected = mRxSilenceDetected; callQuality.mNumVoiceFrames = mNumVoiceFrames; callQuality.mNumNoDataFrames = mNumNoDataFrames; callQuality.mNumDroppedRtpPackets = mNumDroppedRtpPackets; callQuality.mMinPlayoutDelayMillis = mMinPlayoutDelayMillis; callQuality.mMaxPlayoutDelayMillis = mMaxPlayoutDelayMillis; callQuality.mNumRtpSidPacketsReceived = mNumRtpSidPacketsReceived; callQuality.mNumRtpDuplicatePackets = mNumRtpDuplicatePackets; return callQuality; } } }