/* * 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; /** * Class for the information of a UICC slot. * @hide */ @SystemApi public class UiccSlotInfo implements Parcelable { /** * Card state. * @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "CARD_STATE_INFO_" }, value = { CARD_STATE_INFO_ABSENT, CARD_STATE_INFO_PRESENT, CARD_STATE_INFO_ERROR, CARD_STATE_INFO_RESTRICTED }) public @interface CardStateInfo {} /** Card state absent. */ public static final int CARD_STATE_INFO_ABSENT = 1; /** Card state present. */ public static final int CARD_STATE_INFO_PRESENT = 2; /** Card state error. */ public static final int CARD_STATE_INFO_ERROR = 3; /** Card state restricted. */ public static final int CARD_STATE_INFO_RESTRICTED = 4; private final boolean mIsActive; private final boolean mIsEuicc; private final String mCardId; private final @CardStateInfo int mCardStateInfo; private final int mLogicalSlotIdx; private final boolean mIsExtendedApduSupported; private final boolean mIsRemovable; public static final @android.annotation.NonNull Creator CREATOR = new Creator() { @Override public UiccSlotInfo createFromParcel(Parcel in) { return new UiccSlotInfo(in); } @Override public UiccSlotInfo[] newArray(int size) { return new UiccSlotInfo[size]; } }; private UiccSlotInfo(Parcel in) { mIsActive = in.readByte() != 0; mIsEuicc = in.readByte() != 0; mCardId = in.readString(); mCardStateInfo = in.readInt(); mLogicalSlotIdx = in.readInt(); mIsExtendedApduSupported = in.readByte() != 0; mIsRemovable = in.readByte() != 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeByte((byte) (mIsActive ? 1 : 0)); dest.writeByte((byte) (mIsEuicc ? 1 : 0)); dest.writeString(mCardId); dest.writeInt(mCardStateInfo); dest.writeInt(mLogicalSlotIdx); dest.writeByte((byte) (mIsExtendedApduSupported ? 1 : 0)); dest.writeByte((byte) (mIsRemovable ? 1 : 0)); } @Override public int describeContents() { return 0; } /** * Construct a UiccSlotInfo. * @deprecated apps should not be constructing UiccSlotInfo objects */ @Deprecated public UiccSlotInfo(boolean isActive, boolean isEuicc, String cardId, @CardStateInfo int cardStateInfo, int logicalSlotIdx, boolean isExtendedApduSupported) { this.mIsActive = isActive; this.mIsEuicc = isEuicc; this.mCardId = cardId; this.mCardStateInfo = cardStateInfo; this.mLogicalSlotIdx = logicalSlotIdx; this.mIsExtendedApduSupported = isExtendedApduSupported; this.mIsRemovable = false; } /** * @hide */ public UiccSlotInfo(boolean isActive, boolean isEuicc, String cardId, @CardStateInfo int cardStateInfo, int logicalSlotIdx, boolean isExtendedApduSupported, boolean isRemovable) { this.mIsActive = isActive; this.mIsEuicc = isEuicc; this.mCardId = cardId; this.mCardStateInfo = cardStateInfo; this.mLogicalSlotIdx = logicalSlotIdx; this.mIsExtendedApduSupported = isExtendedApduSupported; this.mIsRemovable = isRemovable; } public boolean getIsActive() { return mIsActive; } public boolean getIsEuicc() { return mIsEuicc; } /** * Returns the ICCID of the card in the slot, or the EID of an active eUICC. *

* If the UICC slot is for an active eUICC, returns the EID. * If the UICC slot is for an inactive eUICC, returns the ICCID of the enabled profile, or the * root profile if all other profiles are disabled. * If the UICC slot is not an eUICC, returns the ICCID. */ public String getCardId() { return mCardId; } @CardStateInfo public int getCardStateInfo() { return mCardStateInfo; } public int getLogicalSlotIdx() { return mLogicalSlotIdx; } /** * @return {@code true} if this slot supports extended APDU from ATR, {@code false} otherwise. */ public boolean getIsExtendedApduSupported() { return mIsExtendedApduSupported; } /** * Return whether the UICC slot is for a removable UICC. *

* UICCs are generally removable, but eUICCs may be removable or built in to the device. * @return true if the slot is for removable UICCs */ public boolean isRemovable() { return mIsRemovable; } @Override public boolean equals(@Nullable Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } UiccSlotInfo that = (UiccSlotInfo) obj; return (mIsActive == that.mIsActive) && (mIsEuicc == that.mIsEuicc) && (Objects.equals(mCardId, that.mCardId)) && (mCardStateInfo == that.mCardStateInfo) && (mLogicalSlotIdx == that.mLogicalSlotIdx) && (mIsExtendedApduSupported == that.mIsExtendedApduSupported) && (mIsRemovable == that.mIsRemovable); } @Override public int hashCode() { int result = 1; result = 31 * result + (mIsActive ? 1 : 0); result = 31 * result + (mIsEuicc ? 1 : 0); result = 31 * result + Objects.hashCode(mCardId); result = 31 * result + mCardStateInfo; result = 31 * result + mLogicalSlotIdx; result = 31 * result + (mIsExtendedApduSupported ? 1 : 0); result = 31 * result + (mIsRemovable ? 1 : 0); return result; } @NonNull @Override public String toString() { return "UiccSlotInfo (mIsActive=" + mIsActive + ", mIsEuicc=" + mIsEuicc + ", mCardId=" + mCardId + ", cardState=" + mCardStateInfo + ", phoneId=" + mLogicalSlotIdx + ", mIsExtendedApduSupported=" + mIsExtendedApduSupported + ", mIsRemovable=" + mIsRemovable + ")"; } }