854 lines
32 KiB
Java
854 lines
32 KiB
Java
![]() |
/*
|
||
|
* 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.
|
||
|
* <p>
|
||
|
* Currently this supports IMS calls.
|
||
|
* <p>
|
||
|
* It provides the call quality level, duration, and additional information related to RTP packets,
|
||
|
* jitter and delay.
|
||
|
* <p>
|
||
|
* 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.
|
||
|
*
|
||
|
* <p>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.
|
||
|
*
|
||
|
* <p>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<CallQuality> 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.
|
||
|
*
|
||
|
* <p>The example below shows how you might create a new {@code CallQuality}:
|
||
|
*
|
||
|
* <pre><code>
|
||
|
*
|
||
|
* CallQuality callQuality = new CallQuality.Builder()
|
||
|
* .setNumRtpPacketsTransmitted(150)
|
||
|
* .setNumRtpPacketsReceived(200)
|
||
|
* .build();
|
||
|
* </code></pre>
|
||
|
*/
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|