From b5592dc9f4c2b97b00c24d801b90339d1d622ec3 Mon Sep 17 00:00:00 2001 From: fionaxu Date: Fri, 8 Apr 2016 13:19:31 -0700 Subject: [PATCH] Cold Sim issue fix Bug: 25203607 Change-Id: Ibde6a483477cb7c94f75b656d5e41748b13b23b2 --- .../policy/NetworkControllerImpl.java | 2 +- .../telephony/CarrierConfigManager.java | 18 ++++++ .../android/telephony/SubscriptionInfo.java | 29 +++++++++- .../telephony/SubscriptionManager.java | 57 +++++++++++++++++++ .../internal/telephony/DctConstants.java | 1 + .../com/android/internal/telephony/ISub.aidl | 11 ++++ .../internal/telephony/TelephonyIntents.java | 28 +++++++++ 7 files changed, 142 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 40eb71d8327b1..40dacd3b991d1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -791,7 +791,7 @@ public class NetworkControllerImpl extends BroadcastReceiver private SubscriptionInfo addSignalController(int id, int simSlotIndex) { SubscriptionInfo info = new SubscriptionInfo(id, "", simSlotIndex, "", "", 0, 0, "", 0, - null, 0, 0, ""); + null, 0, 0, "", SubscriptionManager.SIM_PROVISIONED); mMobileSignalControllers.put(id, new MobileSignalController(mContext, mConfig, mHasMobileDataFeature, mPhone, mCallbackHandler, this, info, mSubDefaults, mReceiverHandler.getLooper())); diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 5ac697f99e18c..15d76fd3ff590 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -629,6 +629,20 @@ public class CarrierConfigManager { public static final String KEY_MMS_UA_PROF_URL_STRING = "uaProfUrl"; public static final String KEY_MMS_USER_AGENT_STRING = "userAgent"; + /** + * If carriers require differentiate un-provisioned status: cold sim or out of credit sim + * a package name and activity name can be provided to launch a supported carrier application + * that check the sim provisioning status + * The first element is the package name and the second element is the activity name + * of the provisioning app + * example: + * com.google.android.carrierPackageName + * com.google.android.carrierPackageName.CarrierActivityName + * @hide + */ + public static final String KEY_SIM_PROVISIONING_STATUS_DETECTION_CARRIER_APP_STRING_ARRAY = + "sim_state_detection_carrier_app_string_array"; + /** * Determines whether the carrier supports making non-emergency phone calls while the phone is * in emergency callback mode. Default value is {@code true}, meaning that non-emergency calls @@ -798,6 +812,10 @@ public class CarrierConfigManager { sDefaults.putString(KEY_MMS_USER_AGENT_STRING, ""); sDefaults.putBoolean(KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL, true); sDefaults.putBoolean(KEY_USE_RCS_PRESENCE_BOOL, false); + + // Used for Sim card State detection app + sDefaults.putStringArray(KEY_SIM_PROVISIONING_STATUS_DETECTION_CARRIER_APP_STRING_ARRAY, + null); } /** diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index 6229ed921bcc7..b5cf212e67e60 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -89,6 +89,14 @@ public class SubscriptionInfo implements Parcelable { */ private int mDataRoaming; + /** + * Sim Provisioning Status: + * {@See SubscriptionManager#SIM_PROVISIONED} + * {@See SubscriptionManager#SIM_UNPROVISIONED_COLD} + * {@See SubscriptionManager#SIM_UNPROVISIONED_OUT_OF_CREDIT} + */ + private int mSimProvisioningStatus; + /** * SIM Icon bitmap */ @@ -114,7 +122,7 @@ public class SubscriptionInfo implements Parcelable { */ public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName, CharSequence carrierName, int nameSource, int iconTint, String number, int roaming, - Bitmap icon, int mcc, int mnc, String countryIso) { + Bitmap icon, int mcc, int mnc, String countryIso, int simProvisioningStatus) { this.mId = id; this.mIccId = iccId; this.mSimSlotIndex = simSlotIndex; @@ -128,6 +136,7 @@ public class SubscriptionInfo implements Parcelable { this.mMcc = mcc; this.mMnc = mnc; this.mCountryIso = countryIso; + this.mSimProvisioningStatus = simProvisioningStatus; } /** @@ -263,6 +272,17 @@ public class SubscriptionInfo implements Parcelable { return this.mDataRoaming; } + /** + * @return Sim Provisioning Status + * {@See SubscriptionManager#SIM_PROVISIONED} + * {@See SubscriptionManager#SIM_UNPROVISIONED_COLD} + * {@See SubscriptionManager#SIM_UNPROVISIONED_OUT_OF_CREDIT} + * @hide + */ + public int getSimProvisioningStatus() { + return this.mSimProvisioningStatus; + } + /** * @return the MCC. */ @@ -299,10 +319,12 @@ public class SubscriptionInfo implements Parcelable { int mcc = source.readInt(); int mnc = source.readInt(); String countryIso = source.readString(); + int simProvisioningStatus = source.readInt(); Bitmap iconBitmap = Bitmap.CREATOR.createFromParcel(source); return new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName, - nameSource, iconTint, number, dataRoaming, iconBitmap, mcc, mnc, countryIso); + nameSource, iconTint, number, dataRoaming, iconBitmap, mcc, mnc, countryIso, + simProvisioningStatus); } @Override @@ -325,6 +347,7 @@ public class SubscriptionInfo implements Parcelable { dest.writeInt(mMcc); dest.writeInt(mMnc); dest.writeString(mCountryIso); + dest.writeInt(mSimProvisioningStatus); mIconBitmap.writeToParcel(dest, flags); } @@ -355,6 +378,6 @@ public class SubscriptionInfo implements Parcelable { + " displayName=" + mDisplayName + " carrierName=" + mCarrierName + " nameSource=" + mNameSource + " iconTint=" + mIconTint + " dataRoaming=" + mDataRoaming + " iconBitmap=" + mIconBitmap + " mcc " + mMcc - + " mnc " + mMnc + "}"; + + " mnc " + mMnc + " SimProvisioningStatus " + mSimProvisioningStatus +"}"; } } diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index f3b0ce22081e6..c49966a62925b 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -232,6 +232,22 @@ public class SubscriptionManager { /** Indicates that data roaming is disabled for a subscription */ public static final int DATA_ROAMING_DISABLE = 0; + /** Sim provisioning status: provisioned */ + /** @hide */ + public static final int SIM_PROVISIONED = 0; + + /** Sim provisioning status: un-provisioned due to cold sim */ + /** @hide */ + public static final int SIM_UNPROVISIONED_COLD = 1; + + /** Sim provisioning status: un-provisioned due to out of credit */ + /** @hide */ + public static final int SIM_UNPROVISIONED_OUT_OF_CREDIT = 2; + + /** Maximum possible sim provisioning status */ + /** @hide */ + public static final int MAX_SIM_PROVISIONING_STATUS = SIM_UNPROVISIONED_OUT_OF_CREDIT; + /** @hide */ public static final int DATA_ROAMING_DEFAULT = DATA_ROAMING_DISABLE; @@ -249,6 +265,13 @@ public class SubscriptionManager { */ public static final String MNC = "mnc"; + /** + * TelephonyProvider column name for the sim provisioning status associated with a SIM. + *

Type: INTEGER (int)

+ * @hide + */ + public static final String SIM_PROVISIONING_STATUS = "sim_provisioning_status"; + /** * TelephonyProvider column name for extreme threat in CB settings * @hide @@ -819,6 +842,40 @@ public class SubscriptionManager { return result; } + /** + * Set Sim Provisioning Status by subscription ID + * @param simProvisioningStatus with the subscription + * {@See SubscriptionManager#SIM_PROVISIONED} + * {@See SubscriptionManager#SIM_UNPROVISIONED_COLD} + * {@See SubscriptionManager#SIM_UNPROVISIONED_OUT_OF_CREDIT} + * @param subId the unique SubInfoRecord index in database + * @return the number of records updated + * Permissions android.Manifest.permission.MODIFY_PHONE_STATE is required + * @hide + */ + public int setSimProvisioningStatus(int simProvisioningStatus, int subId) { + if (VDBG) { + logd("[setSimProvisioningStatus]+ status:" + simProvisioningStatus + " subId:" + subId); + } + if (simProvisioningStatus < 0 || simProvisioningStatus > MAX_SIM_PROVISIONING_STATUS || + !isValidSubscriptionId(subId)) { + logd("[setSimProvisioningStatus]- fail"); + return -1; + } + + int result = 0; + + try { + ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); + if (iSub != null) { + result = iSub.setSimProvisioningStatus(simProvisioningStatus, subId); + } + } catch (RemoteException ex) { + // ignore it + } + return result; + } + /** * Get slotId associated with the subscription. * @return slotId as a positive integer or a negative value if an error either diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java index ccabace44763b..e4981ce7cddd9 100644 --- a/telephony/java/com/android/internal/telephony/DctConstants.java +++ b/telephony/java/com/android/internal/telephony/DctConstants.java @@ -103,6 +103,7 @@ public class DctConstants { public static final int EVENT_DATA_RAT_CHANGED = BASE + 41; public static final int CMD_CLEAR_PROVISIONING_SPINNER = BASE + 42; public static final int EVENT_DEVICE_PROVISIONED_CHANGE = BASE + 43; + public static final int EVENT_REDIRECTION_DETECTED = BASE + 44; /***** Constants *****/ diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl index f6aef0859e906..c61ed2a7e62ca 100755 --- a/telephony/java/com/android/internal/telephony/ISub.aidl +++ b/telephony/java/com/android/internal/telephony/ISub.aidl @@ -117,6 +117,17 @@ interface ISub { */ int setDisplayName(String displayName, int subId); + /** + * Set Sim Provisioning Status by subscription ID + * @param simProvisionStatus with the subscription: + * {@See SubscriptionManager#SIM_PROVISIONED} + * {@See SubscriptionManager#SIM_UNPROVISIONED_COLD} + * {@See SubscriptionManager#SIM_UNPROVISIONED_OUT_OF_CREDIT} + * @param subId the unique SubInfoRecord index in database + * @return the number of records updated + */ + int setSimProvisioningStatus(int simProvisioningStatus, int subId); + /** * Set display name by simInfo index with name source * @param displayName the display name of SIM card diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java index c70f8cf2fdfc0..eafb3d40d17e2 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java +++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java @@ -395,4 +395,32 @@ public class TelephonyIntents { */ public static final String ACTION_SET_RADIO_CAPABILITY_FAILED = "android.intent.action.ACTION_SET_RADIO_CAPABILITY_FAILED"; + + /** + *

Broadcast Action: when data connections get redirected with validation failure. + * intended for sim/account status checks and only sent to the specified carrier app + * feedback is via carrier/system APIs to report cold-sim, out-of-credit-sim, etc + * The intent will have the following extra values:

+ * + *

This is a protected intent that can only be sent by the system.

+ */ + public static final String ACTION_DATA_CONNECTION_REDIRECTED = + "android.intent.action.REDIRECTION_DETECTED"; + /** + *

Broadcast Action: when data connections setup fails. + * intended for sim/account status checks and only sent to the specified carrier app + * feedback is via carrier/system APIs to report cold-sim, out-of-credit-sim, etc + * The intent will have the following extra values:

+ * + *

This is a protected intent that can only be sent by the system.

+ */ + public static final String ACTION_REQUEST_NETWORK_FAILED = + "android.intent.action.REQUEST_NETWORK_FAILED"; }