diff options
| -rw-r--r-- | api/system-current.txt | 21 | ||||
| -rw-r--r-- | telephony/java/android/telephony/TelephonyManager.java | 52 | ||||
| -rw-r--r-- | telephony/java/android/telephony/UiccSlotInfo.aidl | 19 | ||||
| -rw-r--r-- | telephony/java/android/telephony/UiccSlotInfo.java | 158 | ||||
| -rw-r--r-- | telephony/java/com/android/internal/telephony/ITelephony.aidl | 16 |
5 files changed, 262 insertions, 4 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 5e703957214e..e2c0ab2b43f9 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4046,6 +4046,7 @@ package android.telephony { method public int getSimApplicationState(); method public int getSimCardState(); method public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms(); + method public android.telephony.UiccSlotInfo[] getUiccSlotsInfo(); method public android.os.Bundle getVisualVoicemailSettings(); method public boolean handlePinMmi(java.lang.String); method public boolean handlePinMmiForSubscriber(int, java.lang.String); @@ -4067,6 +4068,7 @@ package android.telephony { method public int[] supplyPinReportResult(java.lang.String); method public boolean supplyPuk(java.lang.String, java.lang.String); method public int[] supplyPukReportResult(java.lang.String, java.lang.String); + method public boolean switchSlots(int[]); method public void toggleRadioOnOff(); method public void updateServiceLocation(); field public static final java.lang.String ACTION_SIM_APPLICATION_STATE_CHANGED = "android.telephony.action.SIM_APPLICATION_STATE_CHANGED"; @@ -4083,6 +4085,25 @@ package android.telephony { field public static final int SIM_STATE_PRESENT = 11; // 0xb } + public class UiccSlotInfo implements android.os.Parcelable { + ctor public UiccSlotInfo(boolean, boolean, java.lang.String, int); + method public int describeContents(); + method public java.lang.String getCardId(); + method public int getCardStateInfo(); + method public boolean getIsActive(); + method public boolean getIsEuicc(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int CARD_STATE_INFO_ABSENT = 1; // 0x1 + field public static final int CARD_STATE_INFO_ERROR = 3; // 0x3 + field public static final int CARD_STATE_INFO_PRESENT = 2; // 0x2 + field public static final int CARD_STATE_INFO_RESTRICTED = 4; // 0x4 + field public static final android.os.Parcelable.Creator<android.telephony.UiccSlotInfo> CREATOR; + field public final java.lang.String cardId; + field public final int cardStateInfo; + field public final boolean isActive; + field public final boolean isEuicc; + } + public abstract class VisualVoicemailService extends android.app.Service { method public static final void sendVisualVoicemailSms(android.content.Context, android.telecom.PhoneAccountHandle, java.lang.String, short, java.lang.String, android.app.PendingIntent); method public static final void setSmsFilterSettings(android.content.Context, android.telecom.PhoneAccountHandle, android.telephony.VisualVoicemailSmsFilterSettings); diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 04cbbd87328e..ada697f3d65d 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -22,14 +22,13 @@ import android.annotation.IntDef; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SdkConstant; -import android.annotation.SuppressLint; import android.annotation.SdkConstant.SdkConstantType; +import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.WorkerThread; import android.app.ActivityThread; import android.app.PendingIntent; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; @@ -43,7 +42,6 @@ import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ServiceManager; import android.os.SystemProperties; -import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.service.carrier.CarrierIdentifier; import android.telecom.PhoneAccount; @@ -62,7 +60,6 @@ import com.android.internal.telephony.CellNetworkScanResult; import com.android.internal.telephony.IPhoneSubInfo; import com.android.internal.telephony.ITelephony; import com.android.internal.telephony.ITelephonyRegistry; -import com.android.internal.telephony.OperatorInfo; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.RILConstants; import com.android.internal.telephony.TelephonyProperties; @@ -2561,6 +2558,53 @@ public class TelephonyManager { } } + /** + * Gets all the UICC slots. + * + * @return UiccSlotInfo array. + * + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public UiccSlotInfo[] getUiccSlotsInfo() { + try { + ITelephony telephony = getITelephony(); + if (telephony == null) { + return null; + } + return telephony.getUiccSlotsInfo(); + } catch (RemoteException e) { + return null; + } + } + + /** + * Map logicalSlot to physicalSlot, and activate the physicalSlot if it is inactive. For + * example, passing the physicalSlots array [1, 0] means mapping the first item 1, which is + * physical slot index 1, to the logical slot 0; and mapping the second item 0, which is + * physical slot index 0, to the logical slot 1. The index of the array means the index of the + * logical slots. + * + * @param physicalSlots Index i in the array representing physical slot for phone i. The array + * size should be same as {@link #getPhoneCount()}. + * @return boolean Return true if the switch succeeds, false if the switch fails. + * @hide + */ + @SystemApi + @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) + public boolean switchSlots(int[] physicalSlots) { + try { + ITelephony telephony = getITelephony(); + if (telephony == null) { + return false; + } + return telephony.switchSlots(physicalSlots); + } catch (RemoteException e) { + return false; + } + } + // // // Subscriber Info diff --git a/telephony/java/android/telephony/UiccSlotInfo.aidl b/telephony/java/android/telephony/UiccSlotInfo.aidl new file mode 100644 index 000000000000..5571a6c35225 --- /dev/null +++ b/telephony/java/android/telephony/UiccSlotInfo.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 UiccSlotInfo; diff --git a/telephony/java/android/telephony/UiccSlotInfo.java b/telephony/java/android/telephony/UiccSlotInfo.java new file mode 100644 index 000000000000..0b3cbad0d2e2 --- /dev/null +++ b/telephony/java/android/telephony/UiccSlotInfo.java @@ -0,0 +1,158 @@ +/* + * 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.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.Objects; + +import android.annotation.IntDef; + +/** + * 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; + + public final boolean isActive; + public final boolean isEuicc; + public final String cardId; + public final @CardStateInfo int cardStateInfo; + + public static final Creator<UiccSlotInfo> CREATOR = new Creator<UiccSlotInfo>() { + @Override + public UiccSlotInfo createFromParcel(Parcel in) { + return new UiccSlotInfo(in); + } + + @Override + public UiccSlotInfo[] newArray(int size) { + return new UiccSlotInfo[size]; + } + }; + + private UiccSlotInfo(Parcel in) { + isActive = in.readByte() != 0; + isEuicc = in.readByte() != 0; + cardId = in.readString(); + cardStateInfo = in.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeByte((byte) (isActive ? 1 : 0)); + dest.writeByte((byte) (isEuicc ? 1 : 0)); + dest.writeString(cardId); + dest.writeInt(cardStateInfo); + } + + @Override + public int describeContents() { + return 0; + } + + public UiccSlotInfo(boolean isActive, boolean isEuicc, String cardId, + @CardStateInfo int cardStateInfo) { + this.isActive = isActive; + this.isEuicc = isEuicc; + this.cardId = cardId; + this.cardStateInfo = cardStateInfo; + } + + public boolean getIsActive() { + return isActive; + } + + public boolean getIsEuicc() { + return isEuicc; + } + + public String getCardId() { + return cardId; + } + + @CardStateInfo + public int getCardStateInfo() { + return cardStateInfo; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + + UiccSlotInfo that = (UiccSlotInfo) obj; + return (isActive == that.isActive) + && (isEuicc == that.isEuicc) + && (cardId == that.cardId) + && (cardStateInfo == that.cardStateInfo); + } + + @Override + public int hashCode() { + int result = 1; + result = 31 * result + (isActive ? 1 : 0); + result = 31 * result + (isEuicc ? 1 : 0); + result = 31 * result + Objects.hashCode(cardId); + result = 31 * result + cardStateInfo; + return result; + } + + @Override + public String toString() { + return "UiccSlotInfo (isActive=" + + isActive + + ", isEuicc=" + + isEuicc + + ", cardId=" + + cardId + + ", cardState=" + + cardStateInfo + + ")"; + } +} diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index fba82ee17f77..dfb3c344cb93 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -47,6 +47,7 @@ import com.android.internal.telephony.OperatorInfo; import java.util.List; +import android.telephony.UiccSlotInfo; /** * Interface used to interact with the phone. Mostly this is used by the @@ -1444,4 +1445,19 @@ interface ITelephony { * @hide */ SignalStrength getSignalStrength(int subId); + + /** + * Get slot info for all the UICC slots. + * @return UiccSlotInfo array. + * @hide + */ + UiccSlotInfo[] getUiccSlotsInfo(); + + /** + * Map logicalSlot to physicalSlot, and activate the physicalSlot if it is inactive. + * @param physicalSlots Index i in the array representing physical slot for phone i. The array + * size should be same as getPhoneCount(). + * @return boolean Return true if the switch succeeds, false if the switch fails. + */ + boolean switchSlots(in int[] physicalSlots); } |