aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/java/com/android/ims/ImsManager.java247
1 files changed, 68 insertions, 179 deletions
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index 8f2e7633..32d21e93 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -20,10 +20,7 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Handler;
import android.os.IBinder;
-import android.os.Looper;
import android.os.Message;
import android.os.Parcel;
import android.os.PersistableBundle;
@@ -47,15 +44,14 @@ import com.android.ims.internal.IImsRegistrationListener;
import com.android.ims.internal.IImsUt;
import com.android.ims.internal.ImsCallSession;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.telephony.ExponentialBackoff;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.HashSet;
import java.util.Set;
+import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.CopyOnWriteArraySet;
/**
@@ -163,6 +159,11 @@ public class ImsManager {
*/
public static final String EXTRA_IS_UNKNOWN_CALL = "android:isUnknown";
+ private static final int SYSTEM_PROPERTY_NOT_SET = -1;
+
+ // -1 indicates a subscriptionProperty value that is never set.
+ private static final int SUB_PROPERTY_NOT_INITIALIZED = -1;
+
private static final String TAG = "ImsManager";
private static final boolean DBG = true;
@@ -208,14 +209,6 @@ public class ImsManager {
private boolean mHasRegisteredForProxy = false;
private final Object mHasRegisteredLock = new Object();
- // SystemProperties used as cache
- private static final String VOLTE_PROVISIONED_PROP = "net.lte.ims.volte.provisioned";
- private static final String WFC_PROVISIONED_PROP = "net.lte.ims.wfc.provisioned";
- private static final String VT_PROVISIONED_PROP = "net.lte.ims.vt.provisioned";
- // Flag indicating data enabled or not. This flag should be in sync with
- // DcTracker.isDataEnabled(). The flag will be set later during boot up.
- private static final String DATA_ENABLED_PROP = "net.lte.ims.data.enabled";
-
public static final String TRUE = "true";
public static final String FALSE = "false";
@@ -224,19 +217,6 @@ public class ImsManager {
private ConcurrentLinkedDeque<ImsReasonInfo> mRecentDisconnectReasons =
new ConcurrentLinkedDeque<>();
- // Exponential backoff for provisioning cache update. May be null for instances of ImsManager
- // that are not on a thread supporting a looper.
- private ExponentialBackoff mProvisionBackoff;
- // Initial Provisioning check delay in ms
- private static final long BACKOFF_INITIAL_DELAY_MS = 500;
- // Max Provisioning check delay in ms (5 Minutes)
- private static final long BACKOFF_MAX_DELAY_MS = 300000;
- // Multiplier for exponential delay
- private static final int BACKOFF_MULTIPLIER = 2;
- // -1 indicates a subscriptionProperty value that is never set.
- private static final int SUB_PROPERTY_NOT_INITIALIZED = -1;
-
-
/**
* Gets a manager instance.
*
@@ -280,9 +260,12 @@ public class ImsManager {
/**
* Returns the user configuration of Enhanced 4G LTE Mode setting for slot. If the option is
- * not editable ({@link CarrierConfigManager#KEY_EDITABLE_ENHANCED_4G_LTE_BOOL} is false),
- * this method will return default value specified by
+ * not editable ({@link CarrierConfigManager#KEY_EDITABLE_ENHANCED_4G_LTE_BOOL} is false), or
+ * the setting is not initialized, this method will return default value specified by
* {@link CarrierConfigManager#KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL}.
+ *
+ * Note that even if the setting was set, it may no longer be editable. If this is the case we
+ * return the default value.
*/
public boolean isEnhanced4gLteModeSettingEnabledByUser() {
int setting = SubscriptionManager.getIntegerSubscriptionProperty(
@@ -402,8 +385,13 @@ public class ImsManager {
* basis.
*/
public boolean isVolteEnabledByPlatform() {
- if (SystemProperties.getInt(PROPERTY_DBG_VOLTE_AVAIL_OVERRIDE,
- PROPERTY_DBG_VOLTE_AVAIL_OVERRIDE_DEFAULT) == 1) {
+ // We first read the per slot value. If doesn't exist, we read the general value. If still
+ // doesn't exist, we use the hardcoded default value.
+ if (SystemProperties.getInt(
+ PROPERTY_DBG_VOLTE_AVAIL_OVERRIDE + Integer.toString(mPhoneId),
+ SYSTEM_PROPERTY_NOT_SET) == 1 ||
+ SystemProperties.getInt(PROPERTY_DBG_VOLTE_AVAIL_OVERRIDE,
+ SYSTEM_PROPERTY_NOT_SET) == 1) {
return true;
}
@@ -536,8 +524,12 @@ public class ImsManager {
* which must be done correctly).
*/
public boolean isVtEnabledByPlatform() {
- if (SystemProperties.getInt(PROPERTY_DBG_VT_AVAIL_OVERRIDE,
- PROPERTY_DBG_VT_AVAIL_OVERRIDE_DEFAULT) == 1) {
+ // We first read the per slot value. If doesn't exist, we read the general value. If still
+ // doesn't exist, we use the hardcoded default value.
+ if (SystemProperties.getInt(PROPERTY_DBG_VT_AVAIL_OVERRIDE +
+ Integer.toString(mPhoneId), SYSTEM_PROPERTY_NOT_SET) == 1 ||
+ SystemProperties.getInt(
+ PROPERTY_DBG_VT_AVAIL_OVERRIDE, SYSTEM_PROPERTY_NOT_SET) == 1) {
return true;
}
@@ -572,7 +564,8 @@ public class ImsManager {
SUB_PROPERTY_NOT_INITIALIZED, mContext);
// If it's never set, by default we return true.
- return (setting == SUB_PROPERTY_NOT_INITIALIZED || setting == 1);
+ return (setting == SUB_PROPERTY_NOT_INITIALIZED
+ || setting == ImsConfig.FeatureValueConstants.ON);
}
/**
@@ -640,10 +633,15 @@ public class ImsManager {
* The platform property may override the carrier config.
*/
private boolean isTurnOffImsAllowedByPlatform() {
- if (SystemProperties.getInt(PROPERTY_DBG_ALLOW_IMS_OFF_OVERRIDE,
- PROPERTY_DBG_ALLOW_IMS_OFF_OVERRIDE_DEFAULT) == 1) {
+ // We first read the per slot value. If doesn't exist, we read the general value. If still
+ // doesn't exist, we use the hardcoded default value.
+ if (SystemProperties.getInt(PROPERTY_DBG_ALLOW_IMS_OFF_OVERRIDE +
+ Integer.toString(mPhoneId), SYSTEM_PROPERTY_NOT_SET) == 1 ||
+ SystemProperties.getInt(
+ PROPERTY_DBG_ALLOW_IMS_OFF_OVERRIDE, SYSTEM_PROPERTY_NOT_SET) == 1) {
return true;
}
+
return getBooleanCarrierConfig(
CarrierConfigManager.KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL);
}
@@ -678,7 +676,7 @@ public class ImsManager {
return getBooleanCarrierConfig(
CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL);
} else {
- return setting == 1;
+ return setting == ImsConfig.FeatureValueConstants.ON;
}
}
@@ -963,7 +961,7 @@ public class ImsManager {
return getBooleanCarrierConfig(
CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_ENABLED_BOOL);
} else {
- return (setting == 1);
+ return setting == ImsConfig.FeatureValueConstants.ON;
}
}
@@ -1029,8 +1027,12 @@ public class ImsManager {
* configuration settings which must be done correctly).
*/
public boolean isWfcEnabledByPlatform() {
- if (SystemProperties.getInt(PROPERTY_DBG_WFC_AVAIL_OVERRIDE,
- PROPERTY_DBG_WFC_AVAIL_OVERRIDE_DEFAULT) == 1) {
+ // We first read the per slot value. If doesn't exist, we read the general value. If still
+ // doesn't exist, we use the hardcoded default value.
+ if (SystemProperties.getInt(PROPERTY_DBG_WFC_AVAIL_OVERRIDE +
+ Integer.toString(mPhoneId), SYSTEM_PROPERTY_NOT_SET) == 1 ||
+ SystemProperties.getInt(
+ PROPERTY_DBG_WFC_AVAIL_OVERRIDE, SYSTEM_PROPERTY_NOT_SET) == 1) {
return true;
}
@@ -1065,116 +1067,28 @@ public class ImsManager {
}
/**
- * This function should be called when ImsConfig.ACTION_IMS_CONFIG_CHANGED is received.
- *
- * We cannot register receiver in ImsManager because this would lead to resource leak.
- * ImsManager can be created in different processes and it is not notified when that process
- * is about to be terminated.
- *
- * @hide
- * */
- public static void onProvisionedValueChanged(Context context, int item, String value) {
- if (DBG) Rlog.d(TAG, "onProvisionedValueChanged: item=" + item + " val=" + value);
- ImsManager mgr = ImsManager.getInstance(context,
- SubscriptionManager.getDefaultVoicePhoneId());
-
- switch (item) {
- case ImsConfig.ConfigConstants.VLT_SETTING_ENABLED:
- mgr.setVolteProvisionedProperty(value.equals("1"));
- if (DBG) Rlog.d(TAG,"isVoLteProvisioned = " + mgr.isVolteProvisioned());
- break;
-
- case ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED:
- mgr.setWfcProvisionedProperty(value.equals("1"));
- if (DBG) Rlog.d(TAG,"isWfcProvisioned = " + mgr.isWfcProvisioned());
- break;
-
- case ImsConfig.ConfigConstants.LVC_SETTING_ENABLED:
- mgr.setVtProvisionedProperty(value.equals("1"));
- if (DBG) Rlog.d(TAG,"isVtProvisioned = " + mgr.isVtProvisioned());
- break;
-
- }
- }
-
- private class AsyncUpdateProvisionedValues extends AsyncTask<Void, Void, Boolean> {
- @Override
- protected Boolean doInBackground(Void... params) {
- // disable on any error
- setVolteProvisionedProperty(false);
- setWfcProvisionedProperty(false);
- setVtProvisionedProperty(false);
-
- try {
- ImsConfig config = getConfigInterface();
- if (config != null) {
- setVolteProvisionedProperty(getProvisionedBool(config,
- ImsConfig.ConfigConstants.VLT_SETTING_ENABLED));
- if (DBG) Rlog.d(TAG, "isVoLteProvisioned = " + isVolteProvisioned());
-
- setWfcProvisionedProperty(getProvisionedBool(config,
- ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED));
- if (DBG) Rlog.d(TAG, "isWfcProvisioned = " + isWfcProvisioned());
-
- setVtProvisionedProperty(getProvisionedBool(config,
- ImsConfig.ConfigConstants.LVC_SETTING_ENABLED));
- if (DBG) Rlog.d(TAG, "isVtProvisioned = " + isVtProvisioned());
-
- }
- } catch (ImsException ie) {
- Rlog.e(TAG, "AsyncUpdateProvisionedValues error: ", ie);
- return false;
- }
-
- return true;
- }
-
- @Override
- protected void onPostExecute(Boolean completed) {
- if (mProvisionBackoff == null) {
- return;
- }
- if (!completed) {
- mProvisionBackoff.notifyFailed();
- } else {
- mProvisionBackoff.stop();
- }
- }
-
- /**
- * Will return with config value or throw an ImsException if we receive an error from
- * ImsConfig for that value.
- */
- private boolean getProvisionedBool(ImsConfig config, int item) throws ImsException {
- int value = config.getProvisionedValue(item);
- if (value == ImsConfig.FeatureValueConstants.ERROR) {
- throw new ImsException("getProvisionedBool failed with error for item: " + item,
- ImsReasonInfo.CODE_LOCAL_INTERNAL_ERROR);
- }
- return config.getProvisionedValue(item) == ImsConfig.FeatureValueConstants.ON;
- }
- }
-
- // used internally only, use #updateProvisionedValues instead.
- private void handleUpdateProvisionedValues() {
- if (getBooleanCarrierConfig(
- CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
-
- new AsyncUpdateProvisionedValues().execute();
+ * Will return with config value or throw an ImsException if we receive an error from
+ * ImsConfig for that value.
+ */
+ private boolean getProvisionedBool(ImsConfig config, int item) throws ImsException {
+ int value = config.getProvisionedValue(item);
+ if (value == ImsConfig.OperationStatusConstants.UNKNOWN) {
+ throw new ImsException("getProvisionedBool failed with error for item: " + item,
+ ImsReasonInfo.CODE_LOCAL_INTERNAL_ERROR);
}
+ return config.getProvisionedValue(item) == ImsConfig.FeatureValueConstants.ON;
}
/**
- * Asynchronously get VoLTE, WFC, VT provisioning statuses. If ImsConfig is not available, we
- * will retry with exponential backoff.
+ * Will return with config value or return false if we receive an error from
+ * ImsConfig for that value.
*/
- private void updateProvisionedValues() {
- // Start trying to receive provisioning status after BACKOFF_INITIAL_DELAY_MS.
- if (mProvisionBackoff != null) {
- mProvisionBackoff.start();
- } else {
- // bypass and launch async thread once without backoff.
- handleUpdateProvisionedValues();
+ private boolean getProvisionedBoolNoException(int item) {
+ try {
+ ImsConfig config = getConfigInterface();
+ return getProvisionedBool(config, item);
+ } catch (ImsException ex) {
+ return false;
}
}
@@ -1199,8 +1113,6 @@ public class ImsManager {
/**
* Sync carrier config and user settings with ImsConfig.
*
- * @param context for the manager object
- * @param phoneId phone id
* @param force update
*/
public void updateImsServiceConfig(boolean force) {
@@ -1215,8 +1127,6 @@ public class ImsManager {
if (!mConfigUpdated || force) {
try {
- updateProvisionedValues();
-
// TODO: Extend ImsConfig API and set all feature values in single function call.
// Note: currently the order of updates is set to produce different order of
@@ -1354,11 +1264,6 @@ public class ImsManager {
com.android.internal.R.bool.config_dynamic_bind_ims);
mConfigManager = (CarrierConfigManager) context.getSystemService(
Context.CARRIER_CONFIG_SERVICE);
- if (Looper.getMainLooper() != null) {
- mProvisionBackoff = new ExponentialBackoff(BACKOFF_INITIAL_DELAY_MS,
- BACKOFF_MAX_DELAY_MS, BACKOFF_MULTIPLIER,
- new Handler(Looper.getMainLooper()), this::handleUpdateProvisionedValues);
- }
createImsService();
}
@@ -2449,7 +2354,9 @@ public class ImsManager {
public void factoryReset() {
// Set VoLTE to default
SubscriptionManager.setSubscriptionProperty(getSubId(),
- SubscriptionManager.ENHANCED_4G_MODE_ENABLED, booleanToPropertyString(true));
+ SubscriptionManager.ENHANCED_4G_MODE_ENABLED,
+ booleanToPropertyString(getBooleanCarrierConfig(
+ CarrierConfigManager.KEY_ENHANCED_4G_LTE_ON_BY_DEFAULT_BOOL)));
// Set VoWiFi to default
SubscriptionManager.setSubscriptionProperty(getSubId(),
@@ -2478,40 +2385,22 @@ public class ImsManager {
}
private boolean isDataEnabled() {
- return SystemProperties.getBoolean(DATA_ENABLED_PROP, true);
- }
-
- /**
- * Set data enabled/disabled flag.
- * @param enabled True if data is enabled, otherwise disabled.
- */
- public void setDataEnabled(boolean enabled) {
- log("setDataEnabled: " + enabled);
- SystemProperties.set(DATA_ENABLED_PROP, enabled ? TRUE : FALSE);
+ return new TelephonyManager(mContext, getSubId()).isMobileDataEnabled();
}
private boolean isVolteProvisioned() {
- return SystemProperties.getBoolean(VOLTE_PROVISIONED_PROP, true);
- }
-
- private void setVolteProvisionedProperty(boolean provisioned) {
- SystemProperties.set(VOLTE_PROVISIONED_PROP, provisioned ? TRUE : FALSE);
+ return getProvisionedBoolNoException(
+ ImsConfig.ConfigConstants.VLT_SETTING_ENABLED);
}
private boolean isWfcProvisioned() {
- return SystemProperties.getBoolean(WFC_PROVISIONED_PROP, true);
- }
-
- private void setWfcProvisionedProperty(boolean provisioned) {
- SystemProperties.set(WFC_PROVISIONED_PROP, provisioned ? TRUE : FALSE);
+ return getProvisionedBoolNoException(
+ ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED);
}
private boolean isVtProvisioned() {
- return SystemProperties.getBoolean(VT_PROVISIONED_PROP, true);
- }
-
- private void setVtProvisionedProperty(boolean provisioned) {
- SystemProperties.set(VT_PROVISIONED_PROP, provisioned ? TRUE : FALSE);
+ return getProvisionedBoolNoException(
+ ImsConfig.ConfigConstants.LVC_SETTING_ENABLED);
}
private static String booleanToPropertyString(boolean bool) {