Merge tag 'AU_LINUX_ANDROID_LA.BF64.1.2.1_RB2.05.00.02.081.002' into HEAD
AU_LINUX_ANDROID_LA.BF64.1.2.1_RB2.05.00.02.081.002 based on quic/aosp/LA.BF64.1.2.1_rb2
* tag 'AU_LINUX_ANDROID_LA.BF64.1.2.1_RB2.05.00.02.081.002':
Revert "IMS-VT: Change call data usage parameters"
IMS L-MR1 Compilation Fixes
Add a global override for VoLTE calls (which leaves user setting in place)
Turning off extended IMS logging (STOPSHIP item).
MSIM IMS: convert to phone ID based selection.
Telecom API updates (6/6)
TTY over IMS: Notify the user that TTY mode changed in the far device
Adding toString methods to IMS classes to aid logging.
Separate VoLTE and VT configuration API.
Change subId to int from long
Separated VoLTE and VT configurations.
IMS: This patch includes: 1. change setProvisionedValue/setProvisionedStringValue to return operation result. 2 . add additional IMS config.
IMS:change enhanced 4g setting to store in setting db.
Revert "Fixed compilation error"
Revert "compilation fix net ims"
Fixed compilation error
compilation fix net ims
Conflicts:
src/java/com/android/ims/ImsCall.java
Change-Id: Ic399d525928f32a877ebbe72a5f3013bd4834cd1
diff --git a/src/java/com/android/ims/ImsCall.java b/src/java/com/android/ims/ImsCall.java
old mode 100644
new mode 100755
index be722c7..0a98d8e
--- a/src/java/com/android/ims/ImsCall.java
+++ b/src/java/com/android/ims/ImsCall.java
@@ -28,9 +28,13 @@
import android.net.Uri;
import android.os.Bundle;
import android.os.Message;
+import android.provider.Settings;
import android.telecom.ConferenceParticipant;
import android.telecom.Connection;
+import android.telecom.TelecomManager;
import android.telephony.Rlog;
+import android.util.Log;
+import android.widget.Toast;
import com.android.ims.internal.CallGroup;
import com.android.ims.internal.CallGroupManager;
@@ -54,7 +58,9 @@
public static final int USSD_MODE_REQUEST = 1;
private static final String TAG = "ImsCall";
- private static final boolean DBG = true;
+ private static final boolean FORCE_DEBUG = false; /* STOPSHIP if true */
+ private static final boolean DBG = FORCE_DEBUG || Rlog.isLoggable(TAG, Log.DEBUG);
+ private static final boolean VDBG = FORCE_DEBUG || Rlog.isLoggable(TAG, Log.VERBOSE);
private List<ConferenceParticipant> mConferenceParticipants;
private boolean mIsCEPPresent = false;
@@ -2935,6 +2941,40 @@
}
}
}
+
+ @Override
+ public void callSessionTtyModeReceived(ImsCallSession session, int mode) {
+ if (DBG) {
+ log("callSessionTtyModeReceived :: session=" + session
+ + ", mode=" + mode);
+ }
+
+ int settingsTtyMode = Settings.Secure.getInt(
+ mContext.getContentResolver(),
+ Settings.Secure.PREFERRED_TTY_MODE,
+ TelecomManager.TTY_MODE_OFF);
+ if (settingsTtyMode == TelecomManager.TTY_MODE_OFF) {
+ // Notify the user that TTY mode changed in the far device
+ int resId = 0;
+ switch (mode) {
+ case TelecomManager.TTY_MODE_FULL:
+ resId = com.android.internal.R.string.peerTtyModeFull;
+ break;
+ case TelecomManager.TTY_MODE_HCO:
+ resId = com.android.internal.R.string.peerTtyModeHco;
+ break;
+ case TelecomManager.TTY_MODE_VCO:
+ resId = com.android.internal.R.string.peerTtyModeVco;
+ break;
+ case TelecomManager.TTY_MODE_OFF:
+ resId = com.android.internal.R.string.peerTtyModeOff;
+ break;
+ }
+ if (resId != 0) {
+ Toast.makeText(mContext, resId, Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
}
/**
@@ -2962,4 +3002,54 @@
}
}
}
+
+ /**
+ * Provides a human-readable string representation of an update request.
+ *
+ * @param updateRequest The update request.
+ * @return The string representation.
+ */
+ private String updateRequestToString(int updateRequest) {
+ switch (updateRequest) {
+ case UPDATE_NONE:
+ return "NONE";
+ case UPDATE_HOLD:
+ return "HOLD";
+ case UPDATE_HOLD_MERGE:
+ return "HOLD_MERGE";
+ case UPDATE_RESUME:
+ return "RESUME";
+ case UPDATE_MERGE:
+ return "MERGE";
+ case UPDATE_EXTEND_TO_CONFERENCE:
+ return "EXTEND_TO_CONFERENCE";
+ case UPDATE_UNSPECIFIED:
+ return "UNSPECIFIED";
+ default:
+ return "UNKNOWN";
+ }
+ }
+
+ /**
+ * Provides a string representation of the {@link ImsCall}. Primarily intended for use in log
+ * statements.
+ *
+ * @return String representation of call.
+ */
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("[ImsCall objId:");
+ sb.append(System.identityHashCode(this));
+ sb.append(" multiParty:");
+ sb.append(isMultiparty()?"Y":"N");
+ sb.append(" session:");
+ sb.append(mSession);
+ sb.append(" updateRequest:");
+ sb.append(updateRequestToString(mUpdateRequest));
+ sb.append(" transientSession:");
+ sb.append(mTransientConferenceSession);
+ sb.append("]");
+ return sb.toString();
+ }
}
diff --git a/src/java/com/android/ims/ImsConfig.java b/src/java/com/android/ims/ImsConfig.java
index 32f2e4b..94f4e73 100644
--- a/src/java/com/android/ims/ImsConfig.java
+++ b/src/java/com/android/ims/ImsConfig.java
@@ -16,6 +16,7 @@
package com.android.ims;
+import android.content.Context;
import android.os.RemoteException;
import android.telephony.Rlog;
@@ -34,6 +35,8 @@
private static final String TAG = "ImsConfig";
private boolean DBG = true;
private final IImsConfig miConfig;
+ private Context mContext;
+ private static final String MODIFY_PHONE_STATE = android.Manifest.permission.MODIFY_PHONE_STATE;
/**
* Defines IMS service/capability feature constants.
@@ -114,7 +117,7 @@
public static final int MIN_SE = 3;
/**
- * SIP_INVITE cancellation time out value. Integer format.
+ * SIP_INVITE cancellation time out value (in milliseconds). Integer format.
* Value is in Integer format.
*/
public static final int CANCELLATION_TIMER = 4;
@@ -132,19 +135,19 @@
public static final int SILENT_REDIAL_ENABLE = 6;
/**
- * SIP T1 timer value in seconds. See RFC 3261 for define.
+ * SIP T1 timer value in milliseconds. See RFC 3261 for define.
* Value is in Integer format.
*/
public static final int SIP_T1_TIMER = 7;
/**
- * SIP T2 timer value in seconds. See RFC 3261 for define.
+ * SIP T2 timer value in milliseconds. See RFC 3261 for define.
* Value is in Integer format.
*/
public static final int SIP_T2_TIMER = 8;
/**
- * SIP TF timer value in seconds. See RFC 3261 for define.
+ * SIP TF timer value in milliseconds. See RFC 3261 for define.
* Value is in Integer format.
*/
public static final int SIP_TF_TIMER = 9;
@@ -160,10 +163,74 @@
* Value is in Integer format.
*/
public static final int LVC_SETTING_ENABLED = 11;
-
+ /**
+ * Domain Name for the device to populate the request URI for REGISTRATION.
+ * Value is in String format.
+ */
+ public static final int DOMAIN_NAME = 12;
+ /**
+ * Device Outgoing SMS based on either 3GPP or 3GPP2 standards.
+ * Value is in Integer format. 3GPP2(0), 3GPP(1)
+ */
+ public static final int SMS_FORMAT = 13;
+ /**
+ * Turns IMS ON/OFF on the device.
+ * Value is in Integer format. ON (1), OFF(0).
+ */
+ public static final int SMS_OVER_IP = 14;
+ /**
+ * Requested expiration for Published Online availability.
+ * Value is in Integer format.
+ */
+ public static final int PUBLISH_TIMER = 15;
+ /**
+ * Requested expiration for Published Offline availability.
+ * Value is in Integer format.
+ */
+ public static final int PUBLISH_TIMER_EXTENDED = 16;
+ /**
+ * Period of time the capability information of the contact is cached on handset.
+ * Value is in Integer format.
+ */
+ public static final int CAPABILITIES_CACHE_EXPIRATION = 17;
+ /**
+ * Peiod of time the availability information of a contact is cached on device.
+ * Value is in Integer format.
+ */
+ public static final int AVAILABILITY_CACHE_EXPIRATION = 18;
+ /**
+ * Interval between successive capabilities polling.
+ * Value is in Integer format.
+ */
+ public static final int CAPABILITIES_POLL_INTERVAL = 19;
+ /**
+ * Minimum time between two published messages from the device.
+ * Value is in Integer format.
+ */
+ public static final int SOURCE_THROTTLE_PUBLISH = 20;
+ /**
+ * The Maximum number of MDNs contained in one Request Contained List.
+ * Value is in Integer format.
+ */
+ public static final int MAX_NUMENTRIES_IN_RCL = 21;
+ /**
+ * Expiration timer for subscription of a Request Contained List, used in capability polling.
+ * Value is in Integer format.
+ */
+ public static final int CAPAB_POLL_LIST_SUB_EXP = 22;
+ /**
+ * Applies compression to LIST Subscription.
+ * Value is in Integer format. Enable (1), Disable(0).
+ */
+ public static final int GZIP_FLAG = 23;
+ /**
+ * VOLTE Status for EAB/s status of Enabled (1), or Disabled (0).
+ * Value is in Integer format.
+ */
+ public static final int EAB_SETTING_ENABLED = 24;
// Expand the operator config items as needed here, need to change
// PROVISIONED_CONFIG_END after that.
- public static final int PROVISIONED_CONFIG_END = LVC_SETTING_ENABLED;
+ public static final int PROVISIONED_CONFIG_END = EAB_SETTING_ENABLED;
// Expand the operator config items as needed here.
}
@@ -200,9 +267,10 @@
public static final int ON = 1;
}
- public ImsConfig(IImsConfig iconfig) {
+ public ImsConfig(IImsConfig iconfig, Context context) {
if (DBG) Rlog.d(TAG, "ImsConfig creates");
miConfig = iconfig;
+ mContext = context;
}
/**
@@ -243,7 +311,7 @@
try {
ret = miConfig.getMasterStringValue(item);
} catch (RemoteException e) {
- throw new ImsException("getStringValue()", e,
+ throw new ImsException("getMasterStringValue()", e,
ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
}
if (DBG) Rlog.d(TAG, "getMasterStringValue(): item = " + item + ", ret =" + ret);
@@ -252,55 +320,115 @@
}
/**
- * Sets the value for IMS service/capabilities parameters by
- * the operator device management entity.
- * This function should not be called from main thread as it could block
- * mainthread to cause ANR.
+ * Gets the provisioned value for IMS service/capabilities parameters used by IMS stack.
+ * This function should not be called from the mainthread as it could block the
+ * mainthread.
*
* @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
- * @param value in Integer format.
- * @return void
+ * @return the value in Integer format.
*
* @throws ImsException if calling the IMS service results in an error.
*/
- public void setProvisionedValue(int item, int value)
- throws ImsException {
- // TODO: ADD PERMISSION CHECK
- if (DBG) {
- Rlog.d(TAG, "setProvisionedValue(): item = " + item +
- "value = " + value);
- }
+ public int getProvisionedValue(int item) throws ImsException {
+ int ret = 0;
+ /*
try {
- miConfig.setProvisionedValue(item, value);
+ ret = miConfig.getProvisionedValue(item);
} catch (RemoteException e) {
- throw new ImsException("setProvisionedValue()", e,
+ throw new ImsException("getValue()", e,
ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
}
+ */
+ if (DBG) Rlog.d(TAG, "getProvisionedValue(): item = " + item + ", ret =" + ret);
+
+ return ret;
+ }
+
+ /**
+ * Gets the provisioned value for IMS service/capabilities parameters used by IMS stack.
+ * This function should not be called from the mainthread as it could block the
+ * mainthread.
+ *
+ * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
+ * @return value in String format.
+ *
+ * @throws ImsException if calling the IMS service results in an error.
+ */
+ public String getProvisionedStringValue(int item) throws ImsException {
+ String ret = "Unknown";
+ /*
+ try {
+ ret = miConfig.getProvisionedStringValue(item);
+ } catch (RemoteException e) {
+ throw new ImsException("getProvisionedStringValue()", e,
+ ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
+ }
+ */
+ if (DBG) Rlog.d(TAG, "getProvisionedStringValue(): item = " + item + ", ret =" + ret);
+
+ return ret;
}
/**
* Sets the value for IMS service/capabilities parameters by
* the operator device management entity.
+ * This function should not be called from main thread as it could block
+ * mainthread.
*
* @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
- * @param value in String format.
- * @return void.
+ * @param value in Integer format.
+ * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants
*
* @throws ImsException if calling the IMS service results in an error.
*/
- public void setProvisionedStringValue(int item, String value)
+ public int setProvisionedValue(int item, int value)
throws ImsException {
- // TODO: ADD PERMISSION CHECK
+ mContext.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null);
+ int ret = ImsConfig.OperationStatusConstants.UNKNOWN;
if (DBG) {
- Rlog.d(TAG, "setProvisionedStringValue(): item = " + item +
- ", value =" + value);
+ Rlog.d(TAG, "setProvisionedValue(): item = " + item +
+ "value = " + value);
}
try {
- miConfig.setProvisionedStringValue(item, value);
+ ret = miConfig.setProvisionedValue(item, value);
+ } catch (RemoteException e) {
+ throw new ImsException("setProvisionedValue()", e,
+ ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
+ }
+ if (DBG) {
+ Rlog.d(TAG, "setProvisionedValue(): item = " + item +
+ " value = " + value + " ret = " + ret);
+ }
+ return ret;
+ }
+
+ /**
+ * Sets the value for IMS service/capabilities parameters by
+ * the operator device management entity.
+ * This function should not be called from main thread as it could block
+ * mainthread.
+ *
+ * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
+ * @param value in String format.
+ * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants
+ *
+ * @throws ImsException if calling the IMS service results in an error.
+ */
+ public int setProvisionedStringValue(int item, String value)
+ throws ImsException {
+ mContext.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null);
+ int ret = ImsConfig.OperationStatusConstants.UNKNOWN;
+ try {
+ ret = miConfig.setProvisionedStringValue(item, value);
} catch (RemoteException e) {
throw new ImsException("setProvisionedStringValue()", e,
ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
}
+ if (DBG) {
+ Rlog.d(TAG, "setProvisionedStringValue(): item = " + item +
+ ", value =" + value);
+ }
+ return ret;
}
/**
@@ -340,7 +468,7 @@
*/
public void setFeatureValue(int feature, int network, int value,
ImsConfigListener listener) throws ImsException {
- // TODO: ADD PERMISSION CHECK (should there be permission, same as provisioning?)
+ mContext.enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, null);
if (DBG) {
Rlog.d(TAG, "setFeatureValue: feature = " + feature + ", network =" + network +
", value =" + value + ", listener =" + listener);
@@ -387,4 +515,25 @@
ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
}
}
+
+ /**
+ * Gets the value for IMS Volte provisioned.
+ * It should be the same as operator provisioned value if applies.
+ *
+ * @return boolean
+ *
+ * @throws ImsException if calling the IMS service results in an error.
+ */
+ public boolean getVolteProvisioned() throws ImsException {
+ Rlog.d(TAG, "getVolteProvisioned() forced to return true!");
+ /*
+ try {
+ return miConfig.getVolteProvisioned();
+ } catch (RemoteException e) {
+ throw new ImsException("getVolteProvisioned()", e,
+ ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
+ }
+ */
+ return true;
+ }
}
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index 27a9924..5aaf68f 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -27,7 +27,9 @@
import android.os.ServiceManager;
import android.os.SystemProperties;
import android.provider.Settings;
+import android.telecom.TelecomManager;
import android.telephony.Rlog;
+import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import com.android.ims.internal.IImsCallSession;
@@ -52,18 +54,14 @@
* @hide
*/
public class ImsManager {
- /*
- * Shared preference constants storing the "Enhanced 4G LTE Mode" configuration
- */
- public static final String IMS_SHARED_PREFERENCES = "IMS_PREFERENCES";
- public static final String KEY_IMS_ON = "IMS";
- public static final boolean IMS_DEFAULT_SETTING = true;
/*
* Debug flag to override configuration flag
*/
- public static final String PROPERTY_DBG_VOLTE_VT_AVAIL_OVERRIDE = "persist.dbg.volte_avail_ovr";
- public static final int PROPERTY_DBG_VOLTE_VT_AVAIL_OVERRIDE_DEFAULT = 0;
+ public static final String PROPERTY_DBG_VOLTE_AVAIL_OVERRIDE = "persist.dbg.volte_avail_ovr";
+ public static final int PROPERTY_DBG_VOLTE_AVAIL_OVERRIDE_DEFAULT = 0;
+ public static final String PROPERTY_DBG_VT_AVAIL_OVERRIDE = "persist.dbg.vt_avail_ovr";
+ public static final int PROPERTY_DBG_VT_AVAIL_OVERRIDE_DEFAULT = 0;
/**
* For accessing the IMS related service.
@@ -102,19 +100,11 @@
/**
* Part of the ACTION_IMS_SERVICE_UP or _DOWN intents.
- * A long value; the subId corresponding to the IMS service coming up or down.
+ * A long value; the phone ID corresponding to the IMS service coming up or down.
* Internal use only.
* @hide
*/
- public static final String EXTRA_SUBID = "android:subid";
-
- /**
- * Part of the ACTION_IMS_SERVICE_UP or _DOWN intents.
- * A int value; the phoneId corresponding to the IMS service coming up or down.
- * Internal use only.
- * @hide
- */
- public static final String EXTRA_PHONEID = "android:phoneid";
+ public static final String EXTRA_PHONE_ID = "android:phone_id";
/**
* Action for the incoming call intent for the Phone app.
@@ -207,11 +197,11 @@
private static final String TAG = "ImsManager";
private static final boolean DBG = true;
- private static HashMap<Long, ImsManager> sImsManagerInstances =
- new HashMap<Long, ImsManager>();
+ private static HashMap<Integer, ImsManager> sImsManagerInstances =
+ new HashMap<Integer, ImsManager>();
private Context mContext;
- private long mSubId;
+ private int mPhoneId;
private IImsService mImsService = null;
private ImsServiceDeathRecipient mDeathRecipient = new ImsServiceDeathRecipient();
// Ut interface for the supplementary service configuration
@@ -226,16 +216,16 @@
* Gets a manager instance.
*
* @param context application context for creating the manager object
- * @param subId the subscription ID for the IMS Service
- * @return the manager instance corresponding to the subId
+ * @param phoneId the phone ID for the IMS Service
+ * @return the manager instance corresponding to the phoneId
*/
- public static ImsManager getInstance(Context context, long subId) {
+ public static ImsManager getInstance(Context context, int phoneId) {
synchronized (sImsManagerInstances) {
- if (sImsManagerInstances.containsKey(subId))
- return sImsManagerInstances.get(subId);
+ if (sImsManagerInstances.containsKey(phoneId))
+ return sImsManagerInstances.get(phoneId);
- ImsManager mgr = new ImsManager(context, subId);
- sImsManagerInstances.put(subId, mgr);
+ ImsManager mgr = new ImsManager(context, phoneId);
+ sImsManagerInstances.put(phoneId, mgr);
return mgr;
}
@@ -245,34 +235,115 @@
* Returns the user configuration of Enhanced 4G LTE Mode setting
*/
public static boolean isEnhanced4gLteModeSettingEnabledByUser(Context context) {
- boolean imsEnabled = IMS_DEFAULT_SETTING;
- try {
- imsEnabled = (Settings.System.getInt(context.getContentResolver(),
- KEY_IMS_ON)) == 1 ? true : false;
- } catch(Exception e) {
- }
- return imsEnabled;
+ int enabled = android.provider.Settings.Global.getInt(
+ context.getContentResolver(),
+ android.provider.Settings.Global.ENHANCED_4G_MODE_ENABLED, ImsConfig.FeatureValueConstants.ON);
+ return (enabled == 1)? true:false;
}
/**
- * Returns a platform configuration which may override the user setting.
+ * Change persistent Enhanced 4G LTE Mode setting
*/
- public static boolean isEnhanced4gLteModeSettingEnabledByPlatform(Context context) {
- if (SystemProperties.getInt(PROPERTY_DBG_VOLTE_VT_AVAIL_OVERRIDE,
- PROPERTY_DBG_VOLTE_VT_AVAIL_OVERRIDE_DEFAULT) == 1) {
+ public static void setEnhanced4gLteModeSetting(Context context, boolean enabled) {
+ int value = enabled ? 1 : 0;
+ android.provider.Settings.Global.putInt(
+ context.getContentResolver(),
+ android.provider.Settings.Global.ENHANCED_4G_MODE_ENABLED, value);
+
+ if (isNonTtyOrTtyOnVolteEnabled(context)) {
+ ImsManager imsManager = ImsManager.getInstance(context,
+ SubscriptionManager.getDefaultVoicePhoneId());
+ if (imsManager != null) {
+ try {
+ imsManager.setAdvanced4GMode(enabled);
+ } catch (ImsException ie) {
+ // do nothing
+ }
+ }
+ }
+ }
+
+ /**
+ * Indicates whether the call is non-TTY or if TTY - whether TTY on VoLTE is
+ * supported.
+ */
+ public static boolean isNonTtyOrTtyOnVolteEnabled(Context context) {
+ if (context.getResources().getBoolean(
+ com.android.internal.R.bool.config_carrier_volte_tty_supported)) {
+ return true;
+ }
+
+ return Settings.Secure.getInt(context.getContentResolver(),
+ Settings.Secure.PREFERRED_TTY_MODE, TelecomManager.TTY_MODE_OFF)
+ == TelecomManager.TTY_MODE_OFF;
+ }
+
+ /**
+ * Returns a platform configuration for VoLTE which may override the user setting.
+ */
+ public static boolean isVolteEnabledByPlatform(Context context) {
+ if (SystemProperties.getInt(PROPERTY_DBG_VOLTE_AVAIL_OVERRIDE,
+ PROPERTY_DBG_VOLTE_AVAIL_OVERRIDE_DEFAULT) == 1) {
+ return true;
+ }
+
+ boolean disabledByGlobalSetting = android.provider.Settings.Global.getInt(
+ context.getContentResolver(),
+ android.provider.Settings.Global.VOLTE_FEATURE_DISABLED, 0) == 1;
+
+ return context.getResources().getBoolean(
+ com.android.internal.R.bool.config_device_volte_available) && context.getResources()
+ .getBoolean(com.android.internal.R.bool.config_carrier_volte_available)
+ && !disabledByGlobalSetting;
+ }
+
+ /*
+ * Indicates whether VoLTE is provisioned on device
+ */
+ public static boolean isVolteProvisionedOnDevice(Context context) {
+ boolean isProvisioned = true;
+ if (context.getResources().getBoolean(
+ com.android.internal.R.bool.config_carrier_volte_provisioned)) {
+ isProvisioned = false; // disable on any error
+ ImsManager mgr = ImsManager.getInstance(context,
+ SubscriptionManager.getDefaultVoiceSubId());
+ if (mgr != null) {
+ try {
+ ImsConfig config = mgr.getConfigInterface();
+ if (config != null) {
+ isProvisioned = config.getVolteProvisioned();
+ }
+ } catch (ImsException ie) {
+ // do nothing
+ }
+ }
+ }
+
+ return isProvisioned;
+ }
+
+ /**
+ * Returns a platform configuration for VT which may override the user setting.
+ *
+ * Note: VT presumes that VoLTE is enabled (these are configuration settings
+ * which must be done correctly).
+ */
+ public static boolean isVtEnabledByPlatform(Context context) {
+ if (SystemProperties.getInt(PROPERTY_DBG_VT_AVAIL_OVERRIDE,
+ PROPERTY_DBG_VT_AVAIL_OVERRIDE_DEFAULT) == 1) {
return true;
}
return
context.getResources().getBoolean(
- com.android.internal.R.bool.config_device_volte_vt_available) &&
+ com.android.internal.R.bool.config_device_vt_available) &&
context.getResources().getBoolean(
- com.android.internal.R.bool.config_carrier_volte_vt_available);
+ com.android.internal.R.bool.config_carrier_vt_available);
}
- private ImsManager(Context context, long subId) {
+ private ImsManager(Context context, int phoneId) {
mContext = context;
- mSubId = subId;
+ mPhoneId = phoneId;
createImsService(true);
}
@@ -314,7 +385,7 @@
int result = 0;
try {
- result = mImsService.open(serviceClass, incomingCallPendingIntent,
+ result = mImsService.open(mPhoneId, serviceClass, incomingCallPendingIntent,
createRegistrationListenerProxy(serviceClass, listener));
} catch (RemoteException e) {
throw new ImsException("open()", e,
@@ -566,12 +637,12 @@
checkAndThrowExceptionIfServiceUnavailable();
try {
- IImsConfig config = mImsService.getConfigInterface();
+ IImsConfig config = mImsService.getConfigInterface(mPhoneId);
if (config == null) {
throw new ImsException("getConfigInterface()",
ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
}
- mConfig = new ImsConfig(config);
+ mConfig = new ImsConfig(config, mContext);
} catch (RemoteException e) {
throw new ImsException("getConfigInterface()", e,
ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
@@ -581,17 +652,31 @@
return mConfig;
}
- public void setUiTTYMode(int serviceId, int uiTtyMode, Message onComplete)
+ public void setUiTTYMode(Context context, int serviceId, int uiTtyMode, Message onComplete)
throws ImsException {
- checkAndThrowExceptionIfServiceUnavailable();
+ checkAndThrowExceptionIfServiceUnavailable();
- try {
- mImsService.setUiTTYMode(serviceId, uiTtyMode, onComplete);
- } catch (RemoteException e) {
- throw new ImsException("setTTYMode()", e,
- ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
- }
+ try {
+ mImsService.setUiTTYMode(serviceId, uiTtyMode, onComplete);
+ } catch (RemoteException e) {
+ throw new ImsException("setTTYMode()", e,
+ ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
+ }
+
+ /* TODO: config_carrier_volte_tty_supported needs to be enabled for
+ carriers that support it in their respective MCC-MNC config.xml
+ Example: values-mcc310-mnc230
+ Uncomment the code below after the change is done. Leaving this
+ commented so that TTY over VoLTE call is not blocked from apps.
+ */
+ /*
+ if (!context.getResources().getBoolean(
+ com.android.internal.R.bool.config_carrier_volte_tty_supported)) {
+ setAdvanced4GMode((uiTtyMode == TelecomManager.TTY_MODE_OFF) &&
+ isEnhanced4gLteModeSettingEnabledByUser(context));
+ }
+ */
}
/**
@@ -637,9 +722,8 @@
}
}
- private static String getImsServiceName(long subId) {
- // TODO: MSIM implementation needs to decide on service name as a function of subId
- // or value derived from subId (slot ID?)
+ private static String getImsServiceName(int phoneId) {
+ // TODO: MSIM implementation needs to decide on service name as a function of phoneId
return IMS_SERVICE;
}
@@ -648,14 +732,14 @@
*/
private void createImsService(boolean checkService) {
if (checkService) {
- IBinder binder = ServiceManager.checkService(getImsServiceName(mSubId));
+ IBinder binder = ServiceManager.checkService(getImsServiceName(mPhoneId));
if (binder == null) {
return;
}
}
- IBinder b = ServiceManager.getService(getImsServiceName(mSubId));
+ IBinder b = ServiceManager.getService(getImsServiceName(mPhoneId));
if (b != null) {
try {
@@ -710,7 +794,7 @@
checkAndThrowExceptionIfServiceUnavailable();
try {
- mImsService.turnOnIms();
+ mImsService.turnOnIms(mPhoneId);
} catch (RemoteException e) {
throw new ImsException("turnOnIms() ", e, ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
}
@@ -719,16 +803,16 @@
public void setAdvanced4GMode(boolean turnOn) throws ImsException {
checkAndThrowExceptionIfServiceUnavailable();
- try {
- ImsConfig config = getConfigInterface();
- if (config != null) {
- config.setFeatureValue(ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE,
- TelephonyManager.NETWORK_TYPE_LTE, turnOn ? 1 : 0, null);
+ ImsConfig config = getConfigInterface();
+ if (config != null) {
+ config.setFeatureValue(ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE,
+ TelephonyManager.NETWORK_TYPE_LTE, turnOn ? 1 : 0, null);
+ if (isVtEnabledByPlatform(mContext)) {
+ // TODO: once VT is available on platform replace the '1' with the current
+ // user configuration of VT.
config.setFeatureValue(ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE,
TelephonyManager.NETWORK_TYPE_LTE, turnOn ? 1 : 0, null);
}
- } catch (ImsException e) {
- log("setAdvanced4GMode() : " + e);
}
if (turnOn) {
turnOnIms();
@@ -747,7 +831,7 @@
checkAndThrowExceptionIfServiceUnavailable();
try {
- mImsService.turnOffIms();
+ mImsService.turnOffIms(mPhoneId);
} catch (RemoteException e) {
throw new ImsException("turnOffIms() ", e, ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
}
@@ -766,7 +850,7 @@
if (mContext != null) {
Intent intent = new Intent(ACTION_IMS_SERVICE_DOWN);
- intent.putExtra(EXTRA_SUBID, mSubId);
+ intent.putExtra(EXTRA_PHONE_ID, mPhoneId);
mContext.sendBroadcast(new Intent(intent));
}
}
diff --git a/src/java/com/android/ims/internal/ImsCallSession.java b/src/java/com/android/ims/internal/ImsCallSession.java
index 69dcd7e..6075d70 100644
--- a/src/java/com/android/ims/internal/ImsCallSession.java
+++ b/src/java/com/android/ims/internal/ImsCallSession.java
@@ -377,6 +377,16 @@
ImsSuppServiceNotification suppServiceInfo) {
}
+ /**
+ * Called when TTY mode of remote party changed
+ *
+ * @param session IMS session object
+ * @param mode TTY mode of remote party
+ */
+ public void callSessionTtyModeReceived(ImsCallSession session,
+ int mode) {
+ // no-op
+ }
}
private final IImsCallSession miSession;
@@ -1206,8 +1216,7 @@
public void callSessionTtyModeReceived(IImsCallSession session,
int mode) {
if (mListener != null) {
- //TODO: UI specific implementation.
- //Vendor UI can listen to this callback to take action on received TTY mode.
+ mListener.callSessionTtyModeReceived(ImsCallSession.this, mode);
}
}
@@ -1240,4 +1249,23 @@
}
}
+
+ /**
+ * Provides a string representation of the {@link ImsCallSession}. Primarily intended for
+ * use in log statements.
+ *
+ * @return String representation of session.
+ */
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("[ImsCallSession objId:");
+ sb.append(System.identityHashCode(this));
+ sb.append(" state:");
+ sb.append(State.toString(getState()));
+ sb.append(" callId:");
+ sb.append(getCallId());
+ sb.append("]");
+ return sb.toString();
+ }
}
diff --git a/src/java/com/android/ims/internal/ImsVideoCallProvider.java b/src/java/com/android/ims/internal/ImsVideoCallProvider.java
index ae70e92..416a4e2 100644
--- a/src/java/com/android/ims/internal/ImsVideoCallProvider.java
+++ b/src/java/com/android/ims/internal/ImsVideoCallProvider.java
@@ -222,7 +222,7 @@
}
/** @see Connection.VideoProvider#changeCallDataUsage */
- public void changeCallDataUsage(long dataUsage) {
+ public void changeCallDataUsage(int dataUsage) {
if (mCallback != null) {
try {
mCallback.changeCallDataUsage(dataUsage);
diff --git a/src/java/com/android/ims/internal/ImsVideoCallProviderWrapper.java b/src/java/com/android/ims/internal/ImsVideoCallProviderWrapper.java
index f562707..86211a2 100644
--- a/src/java/com/android/ims/internal/ImsVideoCallProviderWrapper.java
+++ b/src/java/com/android/ims/internal/ImsVideoCallProviderWrapper.java
@@ -97,7 +97,7 @@
}
@Override
- public void changeCallDataUsage(long dataUsage) {
+ public void changeCallDataUsage(int dataUsage) {
mHandler.obtainMessage(MSG_CHANGE_CALL_DATA_USAGE, dataUsage).sendToTarget();
}
@@ -143,7 +143,7 @@
}
break;
case MSG_CHANGE_CALL_DATA_USAGE:
- changeCallDataUsage((long) msg.obj);
+ changeCallDataUsage(msg.arg1);
break;
case MSG_CHANGE_CAMERA_CAPABILITIES:
changeCameraCapabilities((CameraCapabilities) msg.obj);
@@ -237,7 +237,7 @@
}
/** @inheritDoc */
- public void onRequestCallDataUsage() {
+ public void onRequestConnectionDataUsage() {
try {
mVideoCallProvider.requestCallDataUsage();
} catch (RemoteException e) {