| /* |
| * Copyright (C) 2022 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.NonNull; |
| import android.annotation.Nullable; |
| import android.annotation.SystemApi; |
| import android.os.Parcel; |
| import android.os.Parcelable; |
| import android.telephony.Annotation.ImsCallServiceType; |
| import android.telephony.Annotation.ImsCallType; |
| import android.telephony.Annotation.NetworkType; |
| import android.telephony.Annotation.PreciseCallStates; |
| import android.telephony.ims.ImsCallProfile; |
| import android.telephony.ims.ImsCallSession; |
| |
| import java.util.Objects; |
| |
| /** |
| * Contains information about various states for a call. |
| * @hide |
| */ |
| @SystemApi |
| public final class CallState implements Parcelable { |
| |
| /** |
| * Call classifications are just used for backward compatibility of deprecated API {@link |
| * TelephonyCallback#CallAttributesListener#onCallAttributesChanged}, Since these will be |
| * removed when the deprecated API is removed, they should not be opened. |
| */ |
| /** |
| * Call classification is not valid. It should not be opened. |
| * @hide |
| */ |
| public static final int CALL_CLASSIFICATION_UNKNOWN = -1; |
| |
| /** |
| * Call classification indicating foreground call |
| * @hide |
| */ |
| public static final int CALL_CLASSIFICATION_RINGING = 0; |
| |
| /** |
| * Call classification indicating background call |
| * @hide |
| */ |
| public static final int CALL_CLASSIFICATION_FOREGROUND = 1; |
| |
| /** |
| * Call classification indicating ringing call |
| * @hide |
| */ |
| public static final int CALL_CLASSIFICATION_BACKGROUND = 2; |
| |
| /** |
| * Call classification Max value. |
| * @hide |
| */ |
| public static final int CALL_CLASSIFICATION_MAX = CALL_CLASSIFICATION_BACKGROUND + 1; |
| |
| @PreciseCallStates |
| private final int mPreciseCallState; |
| |
| @NetworkType |
| private final int mNetworkType; // TelephonyManager.NETWORK_TYPE_* ints |
| private final CallQuality mCallQuality; |
| |
| private final int mCallClassification; |
| /** |
| * IMS call session ID. {@link ImsCallSession#getCallId()} |
| */ |
| @Nullable |
| private String mImsCallId; |
| |
| /** |
| * IMS call service type of this call |
| */ |
| @ImsCallServiceType |
| private int mImsCallServiceType; |
| |
| /** |
| * IMS call type of this call. |
| */ |
| @ImsCallType |
| private int mImsCallType; |
| |
| /** |
| * Constructor of CallAttributes |
| * |
| * @param callState call state defined in {@link PreciseCallState} |
| * @param networkType network type for this call attributes |
| * @param callQuality call quality for this call attributes, only CallState in |
| * {@link PreciseCallState#PRECISE_CALL_STATE_ACTIVE} will have valid call |
| * quality. |
| * @param callClassification call classification |
| * @param imsCallId IMS call session ID for this call attributes |
| * @param imsCallServiceType IMS call service type for this call attributes |
| * @param imsCallType IMS call type for this call attributes |
| */ |
| private CallState(@PreciseCallStates int callState, @NetworkType int networkType, |
| @NonNull CallQuality callQuality, int callClassification, @Nullable String imsCallId, |
| @ImsCallServiceType int imsCallServiceType, @ImsCallType int imsCallType) { |
| this.mPreciseCallState = callState; |
| this.mNetworkType = networkType; |
| this.mCallQuality = callQuality; |
| this.mCallClassification = callClassification; |
| this.mImsCallId = imsCallId; |
| this.mImsCallServiceType = imsCallServiceType; |
| this.mImsCallType = imsCallType; |
| } |
| |
| @NonNull |
| @Override |
| public String toString() { |
| return "mPreciseCallState=" + mPreciseCallState + " mNetworkType=" + mNetworkType |
| + " mCallQuality=" + mCallQuality + " mCallClassification" + mCallClassification |
| + " mImsCallId=" + mImsCallId + " mImsCallServiceType=" + mImsCallServiceType |
| + " mImsCallType=" + mImsCallType; |
| } |
| |
| private CallState(Parcel in) { |
| this.mPreciseCallState = in.readInt(); |
| this.mNetworkType = in.readInt(); |
| this.mCallQuality = in.readParcelable( |
| CallQuality.class.getClassLoader(), CallQuality.class); |
| this.mCallClassification = in.readInt(); |
| this.mImsCallId = in.readString(); |
| this.mImsCallServiceType = in.readInt(); |
| this.mImsCallType = in.readInt(); |
| } |
| |
| // getters |
| /** |
| * Returns the precise call state of the call. |
| */ |
| @PreciseCallStates |
| public int getCallState() { |
| return mPreciseCallState; |
| } |
| |
| /** |
| * Returns the {@link TelephonyManager#NetworkType} of the call. |
| * |
| * @see TelephonyManager#NETWORK_TYPE_UNKNOWN |
| * @see TelephonyManager#NETWORK_TYPE_GPRS |
| * @see TelephonyManager#NETWORK_TYPE_EDGE |
| * @see TelephonyManager#NETWORK_TYPE_UMTS |
| * @see TelephonyManager#NETWORK_TYPE_CDMA |
| * @see TelephonyManager#NETWORK_TYPE_EVDO_0 |
| * @see TelephonyManager#NETWORK_TYPE_EVDO_A |
| * @see TelephonyManager#NETWORK_TYPE_1xRTT |
| * @see TelephonyManager#NETWORK_TYPE_HSDPA |
| * @see TelephonyManager#NETWORK_TYPE_HSUPA |
| * @see TelephonyManager#NETWORK_TYPE_HSPA |
| * @see TelephonyManager#NETWORK_TYPE_IDEN |
| * @see TelephonyManager#NETWORK_TYPE_EVDO_B |
| * @see TelephonyManager#NETWORK_TYPE_LTE |
| * @see TelephonyManager#NETWORK_TYPE_EHRPD |
| * @see TelephonyManager#NETWORK_TYPE_HSPAP |
| * @see TelephonyManager#NETWORK_TYPE_GSM |
| * @see TelephonyManager#NETWORK_TYPE_TD_SCDMA |
| * @see TelephonyManager#NETWORK_TYPE_IWLAN |
| * @see TelephonyManager#NETWORK_TYPE_LTE_CA |
| * @see TelephonyManager#NETWORK_TYPE_NR |
| */ |
| @NetworkType |
| public int getNetworkType() { |
| return mNetworkType; |
| } |
| |
| /** |
| * Returns the {#link CallQuality} of the call. |
| * @return call quality for this call attributes, only CallState in {@link |
| * PreciseCallState#PRECISE_CALL_STATE_ACTIVE} will have valid call quality. It will be |
| * null for the call which is not in {@link PreciseCallState#PRECISE_CALL_STATE_ACTIVE}. |
| */ |
| @Nullable |
| public CallQuality getCallQuality() { |
| return mCallQuality; |
| } |
| |
| /** |
| * Returns the call classification. |
| * @hide |
| */ |
| public int getCallClassification() { |
| return mCallClassification; |
| } |
| |
| /** |
| * Returns the IMS call session ID. |
| */ |
| @Nullable |
| public String getImsCallSessionId() { |
| return mImsCallId; |
| } |
| |
| /** |
| * Returns the IMS call service type. |
| */ |
| @ImsCallServiceType |
| public int getImsCallServiceType() { |
| return mImsCallServiceType; |
| } |
| |
| /** |
| * Returns the IMS call type. |
| */ |
| @ImsCallType |
| public int getImsCallType() { |
| return mImsCallType; |
| } |
| |
| @Override |
| public int hashCode() { |
| return Objects.hash(mPreciseCallState, mNetworkType, mCallQuality, mCallClassification, |
| mImsCallId, mImsCallServiceType, mImsCallType); |
| } |
| |
| @Override |
| public boolean equals(@Nullable Object o) { |
| if (o == null || !(o instanceof CallState) || hashCode() != o.hashCode()) { |
| return false; |
| } |
| |
| if (this == o) { |
| return true; |
| } |
| |
| CallState s = (CallState) o; |
| |
| return (mPreciseCallState == s.mPreciseCallState |
| && mNetworkType == s.mNetworkType |
| && Objects.equals(mCallQuality, s.mCallQuality) |
| && mCallClassification == s.mCallClassification |
| && Objects.equals(mImsCallId, s.mImsCallId) |
| && mImsCallType == s.mImsCallType |
| && mImsCallServiceType == s.mImsCallServiceType); |
| } |
| |
| /** |
| * {@link Parcelable#describeContents} |
| */ |
| public int describeContents() { |
| return 0; |
| } |
| |
| /** |
| * {@link Parcelable#writeToParcel} |
| */ |
| public void writeToParcel(@Nullable Parcel dest, int flags) { |
| dest.writeInt(mPreciseCallState); |
| dest.writeInt(mNetworkType); |
| dest.writeParcelable(mCallQuality, flags); |
| dest.writeInt(mCallClassification); |
| dest.writeString(mImsCallId); |
| dest.writeInt(mImsCallServiceType); |
| dest.writeInt(mImsCallType); |
| } |
| |
| public static final @NonNull Creator<CallState> CREATOR = new Creator() { |
| public CallState createFromParcel(Parcel in) { |
| return new CallState(in); |
| } |
| |
| public CallState[] newArray(int size) { |
| return new CallState[size]; |
| } |
| }; |
| |
| /** |
| * Builder of {@link CallState} |
| * |
| * <p>The example below shows how you might create a new {@code CallState}. A precise call state |
| * {@link PreciseCallStates} is mandatory to build a CallState. |
| * |
| * <pre><code> |
| * |
| * CallState = new CallState.Builder({@link PreciseCallStates}) |
| * .setNetworkType({@link TelephonyManager#NETWORK_TYPE_LTE}) |
| * .setCallQuality({@link CallQuality}) |
| * .setImsCallSessionId({@link String}) |
| * .setImsCallServiceType({@link ImsCallProfile#SERVICE_TYPE_NORMAL}) |
| * .setImsCallType({@link ImsCallProfile#CALL_TYPE_VOICE}) |
| * .build(); |
| * </code></pre> |
| */ |
| public static final class Builder { |
| private @PreciseCallStates int mPreciseCallState; |
| private @NetworkType int mNetworkType = TelephonyManager.NETWORK_TYPE_UNKNOWN; |
| private CallQuality mCallQuality = null; |
| private int mCallClassification = CALL_CLASSIFICATION_UNKNOWN; |
| private String mImsCallId; |
| private @ImsCallServiceType int mImsCallServiceType = ImsCallProfile.SERVICE_TYPE_NONE; |
| private @ImsCallType int mImsCallType = ImsCallProfile.CALL_TYPE_NONE; |
| |
| |
| /** |
| * Default constructor for the Builder. |
| */ |
| public Builder(@PreciseCallStates int preciseCallState) { |
| mPreciseCallState = preciseCallState; |
| } |
| |
| /** |
| * Set network type of this call. |
| * |
| * @param networkType the transport type. |
| * @return The same instance of the builder. |
| */ |
| @NonNull |
| public CallState.Builder setNetworkType(@NetworkType int networkType) { |
| this.mNetworkType = networkType; |
| return this; |
| } |
| |
| /** |
| * Set the call quality {@link CallQuality} of this call. |
| * |
| * @param callQuality call quality of active call. |
| * @return The same instance of the builder. |
| */ |
| @NonNull |
| public CallState.Builder setCallQuality(@Nullable CallQuality callQuality) { |
| this.mCallQuality = callQuality; |
| return this; |
| } |
| |
| /** |
| * Set call classification for this call. |
| * |
| * @param classification call classification type defined in this class. |
| * @return The same instance of the builder. |
| * @hide |
| */ |
| @NonNull |
| public CallState.Builder setCallClassification(int classification) { |
| this.mCallClassification = classification; |
| return this; |
| } |
| |
| /** |
| * Set IMS call session ID of this call. |
| * |
| * @param imsCallId IMS call session ID. |
| * @return The same instance of the builder. |
| */ |
| @NonNull |
| public CallState.Builder setImsCallSessionId(@Nullable String imsCallId) { |
| this.mImsCallId = imsCallId; |
| return this; |
| } |
| |
| /** |
| * Set IMS call service type of this call. |
| * |
| * @param serviceType IMS call service type defined in {@link ImsCallProfile}. |
| * @return The same instance of the builder. |
| */ |
| @NonNull |
| public CallState.Builder setImsCallServiceType(@ImsCallServiceType int serviceType) { |
| this.mImsCallServiceType = serviceType; |
| return this; |
| } |
| |
| /** |
| * Set IMS call type of this call. |
| * |
| * @param callType IMS call type defined in {@link ImsCallProfile}. |
| * @return The same instance of the builder. |
| */ |
| @NonNull |
| public CallState.Builder setImsCallType(@ImsCallType int callType) { |
| this.mImsCallType = callType; |
| return this; |
| } |
| |
| /** |
| * Build the {@link CallState} |
| * |
| * @return the {@link CallState} object |
| */ |
| @NonNull |
| public CallState build() { |
| return new CallState( |
| mPreciseCallState, |
| mNetworkType, |
| mCallQuality, |
| mCallClassification, |
| mImsCallId, |
| mImsCallServiceType, |
| mImsCallType); |
| } |
| } |
| } |