aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/java/com/android/ims/ImsManager.java32
1 files changed, 29 insertions, 3 deletions
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index 26138f6a..0113f7b1 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -252,7 +252,8 @@ public class ImsManager {
return context.getResources().getBoolean(
com.android.internal.R.bool.config_device_volte_available)
&& getBooleanCarrierConfig(context,
- CarrierConfigManager.KEY_CARRIER_VOLTE_AVAILABLE_BOOL);
+ CarrierConfigManager.KEY_CARRIER_VOLTE_AVAILABLE_BOOL)
+ && isGbaValid(context);
}
/*
@@ -296,7 +297,8 @@ public class ImsManager {
context.getResources().getBoolean(
com.android.internal.R.bool.config_device_vt_available) &&
getBooleanCarrierConfig(context,
- CarrierConfigManager.KEY_CARRIER_VT_AVAILABLE_BOOL);
+ CarrierConfigManager.KEY_CARRIER_VT_AVAILABLE_BOOL) &&
+ isGbaValid(context);
}
/**
@@ -447,7 +449,31 @@ public class ImsManager {
context.getResources().getBoolean(
com.android.internal.R.bool.config_device_wfc_ims_available) &&
getBooleanCarrierConfig(context,
- CarrierConfigManager.KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL);
+ CarrierConfigManager.KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL) &&
+ isGbaValid(context);
+ }
+
+ /**
+ * If carrier requires that IMS is only available if GBA capable SIM is used,
+ * then this function checks GBA bit in EF IST.
+ *
+ * Format of EF IST is defined in 3GPP TS 31.103 (Section 4.2.7).
+ */
+ private static boolean isGbaValid(Context context) {
+ if (getBooleanCarrierConfig(context,
+ CarrierConfigManager.KEY_CARRIER_IMS_GBA_REQUIRED_BOOL)) {
+ final TelephonyManager telephonyManager = TelephonyManager.getDefault();
+ String efIst = telephonyManager.getIsimIst();
+ if (efIst == null) {
+ loge("ISF is NULL");
+ return true;
+ }
+ boolean result = efIst != null && efIst.length() > 1 &&
+ (0x02 & (byte)efIst.charAt(1)) != 0;
+ if (DBG) log("GBA capable=" + result + ", ISF=" + efIst);
+ return result;
+ }
+ return true;
}
/**