/* * 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.ims.feature; import android.annotation.IntDef; import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Provides details on why transmitting IMS traffic failed. * * @hide */ public final class ConnectionFailureInfo implements Parcelable { /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef( prefix = "REASON_", value = { REASON_NONE, REASON_ACCESS_DENIED, REASON_NAS_FAILURE, REASON_RACH_FAILURE, REASON_RLC_FAILURE, REASON_RRC_REJECT, REASON_RRC_TIMEOUT, REASON_NO_SERVICE, REASON_PDN_NOT_AVAILABLE, REASON_RF_BUSY, REASON_UNSPECIFIED }) public @interface FailureReason {} /** Default value */ public static final int REASON_NONE = 0; /** Access class check failed */ public static final int REASON_ACCESS_DENIED = 1; /** 3GPP Non-access stratum failure */ public static final int REASON_NAS_FAILURE = 2; /** Random access failure */ public static final int REASON_RACH_FAILURE = 3; /** Radio link failure */ public static final int REASON_RLC_FAILURE = 4; /** Radio connection establishment rejected by network */ public static final int REASON_RRC_REJECT = 5; /** Radio connection establishment timed out */ public static final int REASON_RRC_TIMEOUT = 6; /** Device currently not in service */ public static final int REASON_NO_SERVICE = 7; /** The PDN is no more active */ public static final int REASON_PDN_NOT_AVAILABLE = 8; /** Radio resource is busy with another subscription */ public static final int REASON_RF_BUSY = 9; /** Unspecified reason */ public static final int REASON_UNSPECIFIED = 0xFFFF; private static final SparseArray sReasonMap; static { sReasonMap = new SparseArray<>(); sReasonMap.set(REASON_NONE, "NONE"); sReasonMap.set(REASON_ACCESS_DENIED, "ACCESS_DENIED"); sReasonMap.set(REASON_NAS_FAILURE, "NAS_FAILURE"); sReasonMap.set(REASON_RACH_FAILURE, "RACH_FAILURE"); sReasonMap.set(REASON_RLC_FAILURE, "RLC_FAILURE"); sReasonMap.set(REASON_RRC_REJECT, "RRC_REJECT"); sReasonMap.set(REASON_RRC_TIMEOUT, "RRC_TIMEOUT"); sReasonMap.set(REASON_NO_SERVICE, "NO_SERVICE"); sReasonMap.set(REASON_PDN_NOT_AVAILABLE, "PDN_NOT_AVAILABLE"); sReasonMap.set(REASON_RF_BUSY, "RF_BUSY"); sReasonMap.set(REASON_UNSPECIFIED, "UNSPECIFIED"); } /** The reason of failure */ private final @FailureReason int mReason; /** * Failure cause code from network or modem specific to the failure * * Reference: 3GPP TS 24.401 Annex A (Cause values for EPS mobility management) * Reference: 3GPP TS 24.501 Annex A (Cause values for 5GS mobility management) */ private final int mCauseCode; /** Retry wait time provided by network in milliseconds */ private final int mWaitTimeMillis; private ConnectionFailureInfo(Parcel in) { mReason = in.readInt(); mCauseCode = in.readInt(); mWaitTimeMillis = in.readInt(); } /** * Constructor. * * @param reason The reason of failure. * @param causeCode Failure cause code from network or modem specific to the failure. * See 3GPP TS 24.401 Annex A (Cause values for EPS mobility management) and * 3GPP TS 24.501 Annex A (Cause values for 5GS mobility management). * @param waitTimeMillis Retry wait time provided by network in milliseconds. * @hide */ public ConnectionFailureInfo(@FailureReason int reason, int causeCode, int waitTimeMillis) { mReason = reason; mCauseCode = causeCode; mWaitTimeMillis = waitTimeMillis; } /** * @return the reason for the failure. */ public @FailureReason int getReason() { return mReason; } /** * @return the cause code from the network or modem specific to the failure. */ public int getCauseCode() { return mCauseCode; } /** * @return the retry wait time provided by the network in milliseconds. */ public int getWaitTimeMillis() { return mWaitTimeMillis; } /** * @return the string format of {@link ConnectionFailureInfo} */ @NonNull @Override public String toString() { String reason = sReasonMap.get(mReason, "UNKNOWN"); return "ConnectionFailureInfo :: {" + mReason + " : " + reason + ", " + mCauseCode + ", " + mWaitTimeMillis + "}"; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(@NonNull Parcel out, int flags) { out.writeInt(mReason); out.writeInt(mCauseCode); out.writeInt(mWaitTimeMillis); } public static final @NonNull Creator CREATOR = new Creator() { @Override public ConnectionFailureInfo createFromParcel(Parcel in) { return new ConnectionFailureInfo(in); } @Override public ConnectionFailureInfo[] newArray(int size) { return new ConnectionFailureInfo[size]; } }; }