IMS: add api to indicate the current availability of IMS call on IWLAN.
Also add the WIFI only handle.
Change-Id: Ia96d8a3a6e3146603b76760cec02593bf5f1e3b6
diff --git a/src/java/com/android/internal/telephony/PhoneBase.java b/src/java/com/android/internal/telephony/PhoneBase.java
index ce69689..c134bd2 100644
--- a/src/java/com/android/internal/telephony/PhoneBase.java
+++ b/src/java/com/android/internal/telephony/PhoneBase.java
@@ -2129,6 +2129,21 @@
mCi.unregisterForRadioCapabilityChanged(this);
}
+ /**
+ * Determines if IMS is enabled for call.
+ *
+ * @return {@code true} if IMS calling is enabled.
+ */
+ public boolean isImsUseEnabled() {
+ boolean imsUseEnabled =
+ ((ImsManager.isVolteEnabledByPlatform(mContext) &&
+ ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mContext)) ||
+ (ImsManager.isWfcEnabledByPlatform(mContext) &&
+ ImsManager.isWfcEnabledByUser(mContext)) &&
+ ImsManager.isNonTtyOrTtyOnVolteEnabled(mContext));
+ return imsUseEnabled;
+ }
+
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("PhoneBase: subId=" + getSubId());
pw.println(" mPhoneId=" + mPhoneId);
diff --git a/src/java/com/android/internal/telephony/cdma/CDMAPhone.java b/src/java/com/android/internal/telephony/cdma/CDMAPhone.java
index 0fdd3db..a190a67 100644
--- a/src/java/com/android/internal/telephony/cdma/CDMAPhone.java
+++ b/src/java/com/android/internal/telephony/cdma/CDMAPhone.java
@@ -46,6 +46,7 @@
import android.telephony.TelephonyManager;
+import com.android.ims.ImsConfig;
import com.android.ims.ImsManager;
import com.android.internal.telephony.Call;
import com.android.internal.telephony.CallStateException;
@@ -409,10 +410,8 @@
dial (String dialString, int videoState) throws CallStateException {
ImsPhone imsPhone = mImsPhone;
- boolean imsUseEnabled =
- ImsManager.isVolteEnabledByPlatform(mContext) &&
- ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mContext) &&
- ImsManager.isNonTtyOrTtyOnVolteEnabled(mContext);
+ boolean imsUseEnabled = isImsUseEnabled();
+
if (!imsUseEnabled) {
Rlog.w(LOG_TAG, "IMS is disabled: forced to CS");
}
@@ -421,11 +420,28 @@
Rlog.d(LOG_TAG, "imsUseEnabled=" + imsUseEnabled + ", imsPhone=" + imsPhone
+ ", imsPhone.isVolteEnabled()="
+ ((imsPhone != null) ? imsPhone.isVolteEnabled() : "N/A")
+ + ", imsPhone.isVowifiEnabled()="
+ + ((imsPhone != null) ? imsPhone.isVowifiEnabled() : "N/A")
+ ", imsPhone.getServiceState().getState()="
+ ((imsPhone != null) ? imsPhone.getServiceState().getState() : "N/A"));
}
- if (imsUseEnabled && imsPhone != null && imsPhone.isVolteEnabled()
+ if (imsPhone == null ||
+ (imsPhone != null && !imsPhone.isVowifiEnabled())) {
+ boolean wfcWiFiOnly = (ImsManager.isWfcEnabledByPlatform(mContext) &&
+ ImsManager.isWfcEnabledByUser(mContext) &&
+ (ImsManager.getWfcMode(mContext) ==
+ ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY));
+ if (wfcWiFiOnly == true) {
+ if (DBG) Rlog.d(LOG_TAG, "WIFI only mode, but no VoWIFI enabled");
+ CallStateException ce = new CallStateException(
+ "WFC Wi-Fi Only Mode: IMS stack on WIFI not available");
+ throw ce;
+ }
+ }
+
+ if (imsUseEnabled && imsPhone != null
+ && (imsPhone.isVolteEnabled() || imsPhone.isVowifiEnabled())
&& ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE
&& !PhoneNumberUtils.isEmergencyNumber(dialString))
|| (PhoneNumberUtils.isEmergencyNumber(dialString)
diff --git a/src/java/com/android/internal/telephony/gsm/GSMPhone.java b/src/java/com/android/internal/telephony/gsm/GSMPhone.java
index 70636ce..f562701 100755
--- a/src/java/com/android/internal/telephony/gsm/GSMPhone.java
+++ b/src/java/com/android/internal/telephony/gsm/GSMPhone.java
@@ -36,6 +36,7 @@
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import com.android.ims.ImsConfig;
import com.android.ims.ImsManager;
import com.android.internal.telephony.CallTracker;
@@ -805,10 +806,8 @@
dial (String dialString, UUSInfo uusInfo, int videoState) throws CallStateException {
ImsPhone imsPhone = mImsPhone;
- boolean imsUseEnabled =
- ImsManager.isVolteEnabledByPlatform(mContext) &&
- ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mContext) &&
- ImsManager.isNonTtyOrTtyOnVolteEnabled(mContext);
+ boolean imsUseEnabled = isImsUseEnabled();
+
if (!imsUseEnabled) {
Rlog.w(LOG_TAG, "IMS is disabled: forced to CS");
}
@@ -817,11 +816,28 @@
Rlog.d(LOG_TAG, "imsUseEnabled=" + imsUseEnabled + ", imsPhone=" + imsPhone
+ ", imsPhone.isVolteEnabled()="
+ ((imsPhone != null) ? imsPhone.isVolteEnabled() : "N/A")
+ + ", imsPhone.isVowifiEnabled()="
+ + ((imsPhone != null) ? imsPhone.isVowifiEnabled() : "N/A")
+ ", imsPhone.getServiceState().getState()="
+ ((imsPhone != null) ? imsPhone.getServiceState().getState() : "N/A"));
}
- if (imsUseEnabled && imsPhone != null && imsPhone.isVolteEnabled()
+ if (imsPhone == null ||
+ (imsPhone != null && !imsPhone.isVowifiEnabled())) {
+ boolean wfcWiFiOnly = (ImsManager.isWfcEnabledByPlatform(mContext) &&
+ ImsManager.isWfcEnabledByUser(mContext) &&
+ (ImsManager.getWfcMode(mContext) ==
+ ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY));
+ if (wfcWiFiOnly == true) {
+ if (LOCAL_DEBUG) Rlog.d(LOG_TAG, "WIFI only mode, but no VoWIFI enabled");
+ CallStateException ce = new CallStateException(
+ "WFC Wi-Fi Only Mode: IMS stack on WIFI not available");
+ throw ce;
+ }
+ }
+
+ if (imsUseEnabled && imsPhone != null
+ && (imsPhone.isVolteEnabled() || imsPhone.isVowifiEnabled())
&& ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE
&& !PhoneNumberUtils.isEmergencyNumber(dialString))
|| (PhoneNumberUtils.isEmergencyNumber(dialString)
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
index efc53c4..cd73894 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
@@ -1238,6 +1238,10 @@
return mCT.isVolteEnabled();
}
+ public boolean isVowifiEnabled() {
+ return mCT.isVowifiEnabled();
+ }
+
public boolean isVtEnabled() {
return mCT.isVtEnabled();
}
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
index d148713..59230d2b 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
@@ -74,8 +74,7 @@
private static final boolean DBG = true;
- private boolean mIsVolteEnabled = false;
- private boolean mIsVtEnabled = false;
+ private boolean[] mImsFeatureEnabled = {false, false, false, false};
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
@@ -1304,25 +1303,17 @@
public void onFeatureCapabilityChanged(int serviceClass,
int[] enabledFeatures, int[] disabledFeatures) {
if (serviceClass == ImsServiceClass.MMTEL) {
- if (enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE] ==
- ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE) {
- mIsVolteEnabled = true;
- }
- if (enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE] ==
- ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE) {
- mIsVtEnabled = true;
- }
- if (disabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE] ==
- ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE) {
- mIsVolteEnabled = false;
- }
- if (disabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE] ==
- ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE) {
- mIsVtEnabled = false;
+ for (int i = ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE;
+ i <= ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI; i++) {
+ if (enabledFeatures[i] == i) {
+ mImsFeatureEnabled[i] = true;
+ }
+ if (disabledFeatures[i] == i) {
+ mImsFeatureEnabled[i] = false;
+ }
}
}
- if (DBG) log("onFeatureCapabilityChanged, mIsVolteEnabled = " + mIsVolteEnabled
- + " mIsVtEnabled = " + mIsVtEnabled);
+ if (DBG) log("onFeatureCapabilityChanged, mImsFeatureEnabled=" + mImsFeatureEnabled);
}
};
@@ -1466,11 +1457,16 @@
}
public boolean isVolteEnabled() {
- return mIsVolteEnabled;
+ return mImsFeatureEnabled[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE];
+ }
+
+ public boolean isVowifiEnabled() {
+ return mImsFeatureEnabled[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_WIFI];
}
public boolean isVtEnabled() {
- return mIsVtEnabled;
+ return (mImsFeatureEnabled[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE]
+ || mImsFeatureEnabled[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI]);
}
@Override
public PhoneConstants.State getState() {