281 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Java
		
	
	
	
| /*
 | |
|  * Copyright (C) 2020 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.telecom;
 | |
| 
 | |
| import android.annotation.ElapsedRealtimeLong;
 | |
| import android.annotation.IntRange;
 | |
| import android.annotation.NonNull;
 | |
| import android.annotation.SystemApi;
 | |
| import android.os.Bundle;
 | |
| import android.os.Parcel;
 | |
| import android.os.Parcelable;
 | |
| 
 | |
| import java.util.Objects;
 | |
| 
 | |
| /**
 | |
|  * This class represents the quality report that bluetooth framework sends
 | |
|  * whenever there's a bad voice quality is detected from their side.
 | |
|  * It is sent as part of a call event via {@link Call#sendCallEvent(String, Bundle)}
 | |
|  * associated with extra EXTRA_BLUETOOTH_CALL_QUALITY_REPORT.
 | |
|  * Note that this report will be sent only during an active voice/voip call.
 | |
|  * @hide
 | |
|  */
 | |
| @SystemApi
 | |
| public final class BluetoothCallQualityReport implements Parcelable {
 | |
| 
 | |
|     /**
 | |
|      * Event that is sent via {@link Call#sendCallEvent(String, Bundle)} for a call quality report
 | |
|      */
 | |
|     public static final String EVENT_BLUETOOTH_CALL_QUALITY_REPORT =
 | |
|             "android.telecom.event.BLUETOOTH_CALL_QUALITY_REPORT";
 | |
| 
 | |
|     /**
 | |
|      * Extra key sent with {@link Call#sendCallEvent(String, Bundle)}
 | |
|      */
 | |
|     public static final String EXTRA_BLUETOOTH_CALL_QUALITY_REPORT =
 | |
|             "android.telecom.extra.BLUETOOTH_CALL_QUALITY_REPORT";
 | |
| 
 | |
|     private final long mSentTimestampMillis;
 | |
|     private final boolean mChoppyVoice;
 | |
|     private final int mRssiDbm;
 | |
|     private final int mSnrDb;
 | |
|     private final int mRetransmittedPacketsCount;
 | |
|     private final int mPacketsNotReceivedCount;
 | |
|     private final int mNegativeAcknowledgementCount;
 | |
| 
 | |
|     /**
 | |
|      * @return Time in milliseconds since the epoch. Designates when report was sent.
 | |
|      * Used to determine whether this report arrived too late to be useful.
 | |
|      */
 | |
|     public @ElapsedRealtimeLong long getSentTimestampMillis() {
 | |
|         return mSentTimestampMillis;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * When the bluetooth controller detects factors that cause choppy voice,
 | |
|      * the controller reports an (e)SCO Voice Choppy event to the host
 | |
|      * @return {@code true} when we receive (e)SCO Voice Choppy event from the controller
 | |
|      */
 | |
|     public boolean isChoppyVoice() {
 | |
|         return mChoppyVoice;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return Received Signal Strength Indication (RSSI) value in dBm.
 | |
|      * This value shall be an absolute received signal strength value.
 | |
|      */
 | |
|     public @IntRange(from = -127, to = 20) int getRssiDbm() {
 | |
|         return mRssiDbm;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return Signal-to-Noise Ratio (SNR) value in dB.
 | |
|      * The controller shall provide the average SNR of all the channels currently used by the link.
 | |
|      */
 | |
|     public int getSnrDb() {
 | |
|         return mSnrDb;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return The number of retransmissions since the last event.
 | |
|      * This count shall be reset after it is reported.
 | |
|      */
 | |
|     public @IntRange(from = 0) int getRetransmittedPacketsCount() {
 | |
|         return mRetransmittedPacketsCount;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return No RX count since the last event.
 | |
|      * The count increases when no packet is received at the scheduled time slot or the received
 | |
|      * packet is corrupted.
 | |
|      * This count shall be reset after it is reported.
 | |
|      */
 | |
|     public @IntRange(from = 0) int getPacketsNotReceivedCount() {
 | |
|         return mPacketsNotReceivedCount;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return NAK (Negative Acknowledge) count since the last event.
 | |
|      * This count shall be reset after it is reported.
 | |
|      */
 | |
|     public @IntRange(from = 0) int getNegativeAcknowledgementCount() {
 | |
|         return mNegativeAcknowledgementCount;
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Parcelable implementation
 | |
|     //
 | |
| 
 | |
|     @Override
 | |
|     public int describeContents() {
 | |
|         return 0;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public void writeToParcel(@NonNull Parcel out, int flags) {
 | |
|         out.writeLong(mSentTimestampMillis);
 | |
|         out.writeBoolean(mChoppyVoice);
 | |
|         out.writeInt(mRssiDbm);
 | |
|         out.writeInt(mSnrDb);
 | |
|         out.writeInt(mRetransmittedPacketsCount);
 | |
|         out.writeInt(mPacketsNotReceivedCount);
 | |
|         out.writeInt(mNegativeAcknowledgementCount);
 | |
|     }
 | |
| 
 | |
|     public static final @android.annotation.NonNull Creator<BluetoothCallQualityReport> CREATOR =
 | |
|             new Creator<BluetoothCallQualityReport>() {
 | |
|                 @Override
 | |
|                 public BluetoothCallQualityReport createFromParcel(Parcel in) {
 | |
|                     return new BluetoothCallQualityReport(in);
 | |
|                 }
 | |
| 
 | |
|                 @Override
 | |
|                 public BluetoothCallQualityReport[] newArray(int size) {
 | |
|                     return new BluetoothCallQualityReport[size];
 | |
|                 }
 | |
|             };
 | |
| 
 | |
|     @Override
 | |
|     public boolean equals(Object o) {
 | |
|         if (this == o) return true;
 | |
|         if (o == null || getClass() != o.getClass()) return false;
 | |
|         BluetoothCallQualityReport that = (BluetoothCallQualityReport) o;
 | |
|         return mSentTimestampMillis == that.mSentTimestampMillis
 | |
|                 && mChoppyVoice == that.mChoppyVoice && mRssiDbm == that.mRssiDbm
 | |
|                 && mSnrDb == that.mSnrDb
 | |
|                 && mRetransmittedPacketsCount == that.mRetransmittedPacketsCount
 | |
|                 && mPacketsNotReceivedCount == that.mPacketsNotReceivedCount
 | |
|                 && mNegativeAcknowledgementCount == that.mNegativeAcknowledgementCount;
 | |
|     }
 | |
| 
 | |
|     @Override
 | |
|     public int hashCode() {
 | |
|         return Objects.hash(mSentTimestampMillis, mChoppyVoice, mRssiDbm, mSnrDb,
 | |
|                 mRetransmittedPacketsCount, mPacketsNotReceivedCount,
 | |
|                 mNegativeAcknowledgementCount);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Builder class for {@link ConnectionRequest}
 | |
|      */
 | |
|     public static final class Builder {
 | |
|         private long mSentTimestampMillis;
 | |
|         private boolean mChoppyVoice;
 | |
|         private int mRssiDbm;
 | |
|         private int mSnrDb;
 | |
|         private int mRetransmittedPacketsCount;
 | |
|         private int mPacketsNotReceivedCount;
 | |
|         private int mNegativeAcknowledgementCount;
 | |
| 
 | |
|         public Builder() { }
 | |
| 
 | |
|         /**
 | |
|          * Set the time when report was sent in milliseconds since the epoch.
 | |
|          * @param sentTimestampMillis
 | |
|          */
 | |
|         public @NonNull Builder setSentTimestampMillis(long sentTimestampMillis) {
 | |
|             mSentTimestampMillis = sentTimestampMillis;
 | |
|             return this;
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Set if bluetooth hardware detects voice is choppy
 | |
|          * @param choppyVoice
 | |
|          */
 | |
|         public @NonNull Builder setChoppyVoice(boolean choppyVoice) {
 | |
|             mChoppyVoice = choppyVoice;
 | |
|             return this;
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Set Received Signal Strength Indication (RSSI) value in dBm.
 | |
|          * @param rssiDbm
 | |
|          */
 | |
|         public @NonNull Builder setRssiDbm(int rssiDbm) {
 | |
|             mRssiDbm = rssiDbm;
 | |
|             return this;
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Set Signal-to-Noise Ratio (SNR) value in dB.
 | |
|          * @param snrDb
 | |
|          */
 | |
|         public @NonNull Builder setSnrDb(int snrDb) {
 | |
|             mSnrDb = snrDb;
 | |
|             return this;
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Set The number of retransmissions since the last event.
 | |
|          * @param retransmittedPacketsCount
 | |
|          */
 | |
|         public @NonNull Builder setRetransmittedPacketsCount(
 | |
|                 int retransmittedPacketsCount) {
 | |
|             mRetransmittedPacketsCount = retransmittedPacketsCount;
 | |
|             return this;
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Set No RX count since the last event.
 | |
|          * @param packetsNotReceivedCount
 | |
|          */
 | |
|         public @NonNull Builder setPacketsNotReceivedCount(
 | |
|                 int packetsNotReceivedCount) {
 | |
|             mPacketsNotReceivedCount = packetsNotReceivedCount;
 | |
|             return this;
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Set NAK (Negative Acknowledge) count since the last event.
 | |
|          * @param negativeAcknowledgementCount
 | |
|          */
 | |
|         public @NonNull Builder setNegativeAcknowledgementCount(
 | |
|                 int negativeAcknowledgementCount) {
 | |
|             mNegativeAcknowledgementCount = negativeAcknowledgementCount;
 | |
|             return this;
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Build the {@link BluetoothCallQualityReport}
 | |
|          * @return Result of the builder
 | |
|          */
 | |
|         public @NonNull BluetoothCallQualityReport build() {
 | |
|             return new BluetoothCallQualityReport(this);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private BluetoothCallQualityReport(Parcel in) {
 | |
|         mSentTimestampMillis = in.readLong();
 | |
|         mChoppyVoice = in.readBoolean();
 | |
|         mRssiDbm = in.readInt();
 | |
|         mSnrDb = in.readInt();
 | |
|         mRetransmittedPacketsCount = in.readInt();
 | |
|         mPacketsNotReceivedCount = in.readInt();
 | |
|         mNegativeAcknowledgementCount = in.readInt();
 | |
|     }
 | |
| 
 | |
|     private BluetoothCallQualityReport(Builder builder) {
 | |
|         mSentTimestampMillis = builder.mSentTimestampMillis;
 | |
|         mChoppyVoice = builder.mChoppyVoice;
 | |
|         mRssiDbm = builder.mRssiDbm;
 | |
|         mSnrDb = builder.mSnrDb;
 | |
|         mRetransmittedPacketsCount = builder.mRetransmittedPacketsCount;
 | |
|         mPacketsNotReceivedCount = builder.mPacketsNotReceivedCount;
 | |
|         mNegativeAcknowledgementCount = builder.mNegativeAcknowledgementCount;
 | |
|     }
 | |
| }
 |