/* * 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 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} * *

The example below shows how you might create a new {@code CallState}. A precise call state * {@link PreciseCallStates} is mandatory to build a CallState. * *


     *
     * 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();
     * 
*/ 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); } } }