From 11374f4fb1b454d01d37baab359532fd6a388a1d Mon Sep 17 00:00:00 2001 From: Jordan Liu Date: Tue, 18 Dec 2018 15:42:38 -0800 Subject: Add UiccCardInfo APIs UiccCardInfo is available through a system API and gives information about a currently inserted UICC or eUICC. Bug: 80097562 Test: manual and UiccControllerTest.java Change-Id: Ica8bd9e1703f5d974f959ea91ca47b832a017143 --- api/system-current.txt | 13 ++ .../java/android/telephony/TelephonyManager.java | 23 +++ telephony/java/android/telephony/UiccCardInfo.aidl | 19 +++ telephony/java/android/telephony/UiccCardInfo.java | 156 +++++++++++++++++++++ .../com/android/internal/telephony/ITelephony.aidl | 12 ++ 5 files changed, 223 insertions(+) create mode 100644 telephony/java/android/telephony/UiccCardInfo.aidl create mode 100644 telephony/java/android/telephony/UiccCardInfo.java diff --git a/api/system-current.txt b/api/system-current.txt index b09ee82cdcf3..b8ea63f93ade 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5247,6 +5247,7 @@ package android.telephony { method public int getSimCardState(); method public int getSupportedRadioAccessFamily(); method public java.util.List getTelephonyHistograms(); + method public android.telephony.UiccCardInfo[] getUiccCardsInfo(); method public android.telephony.UiccSlotInfo[] getUiccSlotsInfo(); method public android.os.Bundle getVisualVoicemailSettings(); method public int getVoiceActivationState(); @@ -5364,6 +5365,18 @@ package android.telephony { field public static final android.os.Parcelable.Creator CREATOR; } + public class UiccCardInfo implements android.os.Parcelable { + ctor public UiccCardInfo(boolean, int, java.lang.String, java.lang.String, int); + method public int describeContents(); + method public int getCardId(); + method public java.lang.String getEid(); + method public java.lang.String getIccId(); + method public int getSlotIndex(); + method public boolean isEuicc(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator CREATOR; + } + public class UiccSlotInfo implements android.os.Parcelable { ctor public UiccSlotInfo(boolean, boolean, java.lang.String, int, int, boolean); method public int describeContents(); diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index bb48d535392a..0c1064a2a215 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -3126,6 +3126,29 @@ public class TelephonyManager { } } + /** + * Gets information about currently inserted UICCs and eUICCs. See {@link UiccCardInfo} for more + * details on the kind of information available. + * + * @return UiccCardInfo an array of UiccCardInfo objects, representing information on the + * currently inserted UICCs and eUICCs. + * + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public UiccCardInfo[] getUiccCardsInfo() { + try { + ITelephony telephony = getITelephony(); + if (telephony == null) { + return null; + } + return telephony.getUiccCardsInfo(); + } catch (RemoteException e) { + return null; + } + } + /** * Gets all the UICC slots. The objects in the array can be null if the slot info is not * available, which is possible between phone process starting and getting slot info from modem. diff --git a/telephony/java/android/telephony/UiccCardInfo.aidl b/telephony/java/android/telephony/UiccCardInfo.aidl new file mode 100644 index 000000000000..882c2333909f --- /dev/null +++ b/telephony/java/android/telephony/UiccCardInfo.aidl @@ -0,0 +1,19 @@ +/* + * 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; + +parcelable UiccCardInfo; diff --git a/telephony/java/android/telephony/UiccCardInfo.java b/telephony/java/android/telephony/UiccCardInfo.java new file mode 100644 index 000000000000..45e4704e8894 --- /dev/null +++ b/telephony/java/android/telephony/UiccCardInfo.java @@ -0,0 +1,156 @@ +/* + * 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.SystemApi; +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.Objects; + +/** + * The UiccCardInfo represents information about a currently inserted UICC or embedded eUICC. + * @hide + */ +@SystemApi +public class UiccCardInfo implements Parcelable { + + private final boolean mIsEuicc; + private final int mCardId; + private final String mEid; + private final String mIccId; + private final int mSlotIndex; + + public static final Creator CREATOR = new Creator() { + @Override + public UiccCardInfo createFromParcel(Parcel in) { + return new UiccCardInfo(in); + } + + @Override + public UiccCardInfo[] newArray(int size) { + return new UiccCardInfo[size]; + } + }; + + private UiccCardInfo(Parcel in) { + mIsEuicc = in.readByte() != 0; + mCardId = in.readInt(); + mEid = in.readString(); + mIccId = in.readString(); + mSlotIndex = in.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeByte((byte) (mIsEuicc ? 1 : 0)); + dest.writeInt(mCardId); + dest.writeString(mEid); + dest.writeString(mIccId); + dest.writeInt(mSlotIndex); + } + + @Override + public int describeContents() { + return 0; + } + + public UiccCardInfo(boolean isEuicc, int cardId, String eid, String iccId, int slotIndex) { + this.mIsEuicc = isEuicc; + this.mCardId = cardId; + this.mEid = eid; + this.mIccId = iccId; + this.mSlotIndex = slotIndex; + } + + /** + * Return whether the UiccCardInfo is an eUICC. + * @return true if the UICC is an eUICC. + */ + public boolean isEuicc() { + return mIsEuicc; + } + + /** + * Get the card ID of the UICC. See {@link TelephonyManager#getCardIdForDefaultEuicc()} for more + * details on card ID. + */ + public int getCardId() { + return mCardId; + } + + /** + * Get the embedded ID (EID) of the eUICC. If the UiccCardInfo is not an eUICC + * (see {@link #isEuicc()}), returns null. + */ + public String getEid() { + if (!mIsEuicc) { + return null; + } + return mEid; + } + + /** + * Get the ICCID of the UICC. + */ + public String getIccId() { + return mIccId; + } + + /** + * Gets the slot index for the slot that the UICC is currently inserted in. + */ + public int getSlotIndex() { + return mSlotIndex; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + + UiccCardInfo that = (UiccCardInfo) obj; + return ((mIsEuicc == that.mIsEuicc) + && (mCardId == that.mCardId) + && (Objects.equals(mEid, that.mEid)) + && (Objects.equals(mIccId, that.mIccId)) + && (mSlotIndex == that.mSlotIndex)); + } + + @Override + public int hashCode() { + return Objects.hash(mIsEuicc, mCardId, mEid, mIccId, mSlotIndex); + } + + @Override + public String toString() { + return "UiccCardInfo (mIsEuicc=" + + mIsEuicc + + ", mCardId=" + + mCardId + + ", mEid=" + + mEid + + ", mIccId=" + + mIccId + + ", mSlotIndex=" + + mSlotIndex + + ")"; + } +} diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 5034bcc8ef26..99d362a84924 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -56,6 +56,7 @@ import com.android.internal.telephony.OperatorInfo; import java.util.List; import java.util.Map; +import android.telephony.UiccCardInfo; import android.telephony.UiccSlotInfo; /** @@ -1485,6 +1486,17 @@ interface ITelephony { */ int getCardIdForDefaultEuicc(int subId, String callingPackage); + /** + * Gets information about currently inserted UICCs and eUICCs. See {@link UiccCardInfo} for more + * details on the kind of information available. + * + * @return UiccCardInfo an array of UiccCardInfo objects, representing information on the + * currently inserted UICCs and eUICCs. + * + * @hide + */ + UiccCardInfo[] getUiccCardsInfo(); + /** * Get slot info for all the UICC slots. * @return UiccSlotInfo array. -- cgit v1.2.3-59-g8ed1b