am 73876a17: IMS phone instantiation: add polling on base phone creation
* commit '73876a17e45f57e36013eeffc1cac61e6cb12482':
IMS phone instantiation: add polling on base phone creation
diff --git a/src/java/com/android/internal/telephony/BaseCommands.java b/src/java/com/android/internal/telephony/BaseCommands.java
index 45f720c..9ba5243 100644
--- a/src/java/com/android/internal/telephony/BaseCommands.java
+++ b/src/java/com/android/internal/telephony/BaseCommands.java
@@ -748,14 +748,14 @@
mRilConnectedRegistrants.remove(h);
}
- public void registerForSubscriptionStatusChanged(Handler h, int what, Object obj) {
- Registrant r = new Registrant (h, what, obj);
- mSubscriptionStatusRegistrants.add(r);
- }
+ public void registerForSubscriptionStatusChanged(Handler h, int what, Object obj) {
+ Registrant r = new Registrant (h, what, obj);
+ mSubscriptionStatusRegistrants.add(r);
+ }
- public void unregisterForSubscriptionStatusChanged(Handler h) {
- mSubscriptionStatusRegistrants.remove(h);
- }
+ public void unregisterForSubscriptionStatusChanged(Handler h) {
+ mSubscriptionStatusRegistrants.remove(h);
+ }
//***** Protected Methods
/**
diff --git a/src/java/com/android/internal/telephony/Connection.java b/src/java/com/android/internal/telephony/Connection.java
index 79aebec..04c4a89 100644
--- a/src/java/com/android/internal/telephony/Connection.java
+++ b/src/java/com/android/internal/telephony/Connection.java
@@ -45,6 +45,7 @@
public void onVideoStateChanged(int videoState);
public void onLocalVideoCapabilityChanged(boolean capable);
public void onRemoteVideoCapabilityChanged(boolean capable);
+ public void onWifiChanged(boolean isWifi);
public void onVideoProviderChanged(
android.telecom.Connection.VideoProvider videoProvider);
public void onAudioQualityChanged(int audioQuality);
@@ -62,6 +63,8 @@
@Override
public void onRemoteVideoCapabilityChanged(boolean capable) {}
@Override
+ public void onWifiChanged(boolean isWifi) {}
+ @Override
public void onVideoProviderChanged(
android.telecom.Connection.VideoProvider videoProvider) {}
@Override
@@ -108,6 +111,7 @@
private int mVideoState;
private boolean mLocalVideoCapable;
private boolean mRemoteVideoCapable;
+ private boolean mIsWifi;
private int mAudioQuality;
private android.telecom.Connection.VideoProvider mVideoProvider;
public Call.State mPreHandoverState = Call.State.IDLE;
@@ -487,6 +491,15 @@
}
/**
+ * Returns whether the connection is using a wifi network.
+ *
+ * @return {@code True} if the connection is using a wifi network.
+ */
+ public boolean isWifi() {
+ return mIsWifi;
+ }
+
+ /**
* Returns the {@link android.telecom.Connection.VideoProvider} for the connection.
*
* @return The {@link android.telecom.Connection.VideoProvider}.
@@ -542,6 +555,18 @@
}
/**
+ * Sets whether a wifi network is used for the connection.
+ *
+ * @param isWifi {@code True} if wifi is being used.
+ */
+ public void setWifi(boolean isWifi) {
+ mIsWifi = isWifi;
+ for (Listener l : mListeners) {
+ l.onWifiChanged(mIsWifi);
+ }
+ }
+
+ /**
* Set the audio quality for the connection.
*
* @param audioQuality The audio quality.
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index 32966ae..1c6a0c2 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -110,6 +110,7 @@
static final String REASON_SINGLE_PDN_ARBITRATION = "SinglePdnArbitration";
static final String REASON_DATA_SPECIFIC_DISABLED = "specificDisabled";
static final String REASON_SIM_NOT_READY = "simNotReady";
+ static final String REASON_IWLAN_AVAILABLE = "iwlanAvailable";
// Used for band mode selection methods
static final int BM_UNSPECIFIED = 0; // selected by baseband automatically
@@ -1924,6 +1925,11 @@
public boolean isRadioAvailable();
/**
+ * Is Radio turned on
+ */
+ public boolean isRadioOn();
+
+ /**
* shutdown Radio gracefully
*/
public void shutdownRadio();
diff --git a/src/java/com/android/internal/telephony/PhoneBase.java b/src/java/com/android/internal/telephony/PhoneBase.java
index e1444ee..35ee313 100644
--- a/src/java/com/android/internal/telephony/PhoneBase.java
+++ b/src/java/com/android/internal/telephony/PhoneBase.java
@@ -2106,6 +2106,11 @@
}
@Override
+ public boolean isRadioOn() {
+ return mCi.getRadioState().isOn();
+ }
+
+ @Override
public void shutdownRadio() {
getServiceStateTracker().requestShutdown();
}
@@ -2135,6 +2140,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/PhoneProxy.java b/src/java/com/android/internal/telephony/PhoneProxy.java
index 3c71012..152df18 100644
--- a/src/java/com/android/internal/telephony/PhoneProxy.java
+++ b/src/java/com/android/internal/telephony/PhoneProxy.java
@@ -1470,6 +1470,11 @@
}
@Override
+ public boolean isRadioOn() {
+ return mCommandsInterface.getRadioState().isOn();
+ }
+
+ @Override
public void shutdownRadio() {
mActivePhone.shutdownRadio();
}
diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java
index 76dd32b..6970698 100644
--- a/src/java/com/android/internal/telephony/RIL.java
+++ b/src/java/com/android/internal/telephony/RIL.java
@@ -3052,7 +3052,7 @@
break;
case RIL_UNSOL_OEM_HOOK_RAW:
- if (RILJ_LOGD) unsljLogvRet(response, IccUtils.bytesToHexString((byte[])ret));
+ if (RILJ_LOGD) unsljLogvRet(response, IccUtils.bytesToHexString((byte[]) ret));
if (mUnsolOemHookRawRegistrant != null) {
mUnsolOemHookRawRegistrant.notifyRegistrant(new AsyncResult(null, ret, null));
}
diff --git a/src/java/com/android/internal/telephony/ServiceStateTracker.java b/src/java/com/android/internal/telephony/ServiceStateTracker.java
index e7ec0ea..343c0a6 100644
--- a/src/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -39,6 +39,9 @@
import android.util.Log;
import android.util.Pair;
import android.util.TimeUtils;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.content.Context;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -1058,4 +1061,26 @@
protected int getPhoneId() {
return mPhoneBase.getPhoneId();
}
+
+ /* Reset Service state when IWLAN is enabled as polling in airplane mode
+ * causes state to go to OUT_OF_SERVICE state instead of STATE_OFF
+ */
+ protected void resetServiceStateInIwlanMode() {
+ if (mCi.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {
+ boolean resetIwlanRatVal = false;
+ log("set service state as POWER_OFF");
+ if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN
+ == mNewSS.getRilDataRadioTechnology()) {
+ log("pollStateDone: mNewSS = " + mNewSS);
+ log("pollStateDone: reset iwlan RAT value");
+ resetIwlanRatVal = true;
+ }
+ mNewSS.setStateOff();
+ if (resetIwlanRatVal) {
+ mNewSS.setRilDataRadioTechnology(ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN);
+ mNewSS.setDataRegState(ServiceState.STATE_IN_SERVICE);
+ log("pollStateDone: mNewSS = " + mNewSS);
+ }
+ }
+ }
}
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/cdma/CdmaLteServiceStateTracker.java b/src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
index fac1012b..8412087 100644
--- a/src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
@@ -25,7 +25,10 @@
import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.dataconnection.DcTrackerBase;
+import com.android.internal.telephony.PhoneConstants;
import android.telephony.CellInfo;
import android.telephony.CellInfoLte;
@@ -276,8 +279,10 @@
setSignalStrengthDefaultValues();
mGotCountryCode = false;
- pollStateDone();
- break;
+ if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN
+ != mSS.getRilDataRadioTechnology()) {
+ pollStateDone();
+ }
default:
// Issue all poll-related commands at once, then count
@@ -362,6 +367,8 @@
boolean hasLocationChanged = !mNewCellLoc.equals(mCellLoc);
+ resetServiceStateInIwlanMode();
+
boolean has4gHandoff =
mNewSS.getDataRegState() == ServiceState.STATE_IN_SERVICE &&
(((mSS.getRilDataRadioTechnology() == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) &&
@@ -427,7 +434,12 @@
if (hasDataRadioTechnologyChanged) {
tm.setDataNetworkTypeForPhone(mPhone.getPhoneId(), mSS.getRilDataRadioTechnology());
- }
+
+ if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN
+ == mSS.getRilDataRadioTechnology()) {
+ log("pollStateDone: IWLAN enabled");
+ }
+ }
if (hasRegistered) {
mNetworkAttachedRegistrants.notifyRegistrants();
@@ -538,7 +550,12 @@
if ((hasCdmaDataConnectionChanged || hasDataRadioTechnologyChanged)) {
notifyDataRegStateRilRadioTechnologyChanged();
- mPhone.notifyDataConnection(null);
+ if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN
+ == mSS.getRilDataRadioTechnology()) {
+ mPhone.notifyDataConnection(Phone.REASON_IWLAN_AVAILABLE);
+ } else {
+ mPhone.notifyDataConnection(null);
+ }
}
if (hasVoiceRoamingOn) {
diff --git a/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
index 2ff9c51..adb59e5 100644
--- a/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
@@ -815,12 +815,6 @@
return;
}
- if (!mCi.getRadioState().isOn()) {
- // Radio has crashed or turned off.
- cancelPollState();
- return;
- }
-
if (err != CommandException.Error.OP_NOT_ALLOWED_BEFORE_REG_NW) {
loge("handlePollStateResult: RIL returned an error where it must succeed"
+ ar.exception);
@@ -1022,8 +1016,10 @@
setSignalStrengthDefaultValues();
mGotCountryCode = false;
- pollStateDone();
- break;
+ if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN
+ != mSS.getRilDataRadioTechnology()) {
+ pollStateDone();
+ }
default:
// Issue all poll-related commands at once, then count
@@ -1170,6 +1166,8 @@
boolean hasLocationChanged = !mNewCellLoc.equals(mCellLoc);
+ resetServiceStateInIwlanMode();
+
TelephonyManager tm =
(TelephonyManager) mPhone.getContext().getSystemService(Context.TELEPHONY_SERVICE);
@@ -1198,6 +1196,11 @@
if (hasRilDataRadioTechnologyChanged) {
tm.setDataNetworkTypeForPhone(mPhone.getPhoneId(), mSS.getRilDataRadioTechnology());
+
+ if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN
+ == mSS.getRilDataRadioTechnology()) {
+ log("pollStateDone: IWLAN enabled");
+ }
}
if (hasRegistered) {
@@ -1283,7 +1286,12 @@
if (hasCdmaDataConnectionChanged || hasRilDataRadioTechnologyChanged) {
notifyDataRegStateRilRadioTechnologyChanged();
- mPhone.notifyDataConnection(null);
+ if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN
+ == mSS.getRilDataRadioTechnology()) {
+ mPhone.notifyDataConnection(Phone.REASON_IWLAN_AVAILABLE);
+ } else {
+ mPhone.notifyDataConnection(null);
+ }
}
if (hasVoiceRoamingOn) {
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
index 21bc671..0b39944 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
@@ -581,7 +581,9 @@
discReason = RILConstants.DEACTIVATE_REASON_PDP_RESET;
}
}
- if (mPhone.mCi.getRadioState().isOn()) {
+ if (mPhone.mCi.getRadioState().isOn()
+ || (mPhone.getServiceState().getRilDataRadioTechnology()
+ == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN )) {
if (DBG) log("tearDownData radio is on, call deactivateDataCall");
mPhone.mCi.deactivateDataCall(mCid, discReason,
obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o));
diff --git a/src/java/com/android/internal/telephony/dataconnection/DcTracker.java b/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
index 5a456d0..f1d6dcb 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DcTracker.java
@@ -380,6 +380,14 @@
boolean dataAllowed = isEmergencyApn || isDataAllowed();
boolean possible = dataAllowed && apnTypePossible;
+ if ((apnContext.getApnType().equals(PhoneConstants.APN_TYPE_DEFAULT)
+ || apnContext.getApnType().equals(PhoneConstants.APN_TYPE_IA))
+ && (mPhone.getServiceState().getRilDataRadioTechnology()
+ == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN)) {
+ log("Default data call activation not possible in iwlan.");
+ possible = false;
+ }
+
if (VDBG) {
log(String.format("isDataPossible(%s): possible=%b isDataAllowed=%b " +
"apnTypePossible=%b apnContextisEnabled=%b apnContextState()=%s",
@@ -660,7 +668,17 @@
}
private boolean isDataAllowed(ApnContext apnContext) {
- return apnContext.isReady() && isDataAllowed();
+ //If RAT is iwlan then dont allow default/IA PDP at all.
+ //Rest of APN types can be evaluated for remaining conditions.
+ if ((apnContext.getApnType().equals(PhoneConstants.APN_TYPE_DEFAULT)
+ || apnContext.getApnType().equals(PhoneConstants.APN_TYPE_IA))
+ && (mPhone.getServiceState().getRilDataRadioTechnology()
+ == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN)) {
+ log("Default data call activation not allowed in iwlan.");
+ return false;
+ } else {
+ return apnContext.isReady() && isDataAllowed();
+ }
}
//****** Called from ServiceStateTracker
@@ -707,6 +725,11 @@
boolean attachedState = mAttached.get();
boolean desiredPowerState = mPhone.getServiceStateTracker().getDesiredPowerState();
+ int radioTech = mPhone.getServiceState().getRilDataRadioTechnology();
+ if (radioTech == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN) {
+ desiredPowerState = true;
+ }
+
IccRecords r = mIccRecords.get();
boolean recordsLoaded = false;
if (r != null) {
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/gsm/GsmServiceStateTracker.java b/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
index 1541c49..4d759d7 100755
--- a/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
@@ -76,6 +76,7 @@
import com.android.internal.telephony.uicc.UiccCard;
import com.android.internal.telephony.uicc.UiccCardApplication;
import com.android.internal.telephony.uicc.UiccController;
+import com.android.internal.telephony.PhoneConstants;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -696,12 +697,6 @@
return;
}
- if (!mCi.getRadioState().isOn()) {
- // Radio has crashed or turned off
- cancelPollState();
- return;
- }
-
if (err != CommandException.Error.OP_NOT_ALLOWED_BEFORE_REG_NW) {
loge("RIL implementation has returned an error where it must succeed" +
ar.exception);
@@ -950,8 +945,10 @@
setSignalStrengthDefaultValues();
mGotCountryCode = false;
mNitzUpdatedTime = false;
- pollStateDone();
- break;
+ if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN
+ != mSS.getRilDataRadioTechnology()) {
+ pollStateDone();
+ }
default:
// Issue all poll-related commands at once
@@ -1038,6 +1035,8 @@
boolean hasLocationChanged = !mNewCellLoc.equals(mCellLoc);
+ resetServiceStateInIwlanMode();
+
TelephonyManager tm =
(TelephonyManager) mPhone.getContext().getSystemService(Context.TELEPHONY_SERVICE);
@@ -1092,6 +1091,11 @@
if (hasRilDataRadioTechnologyChanged) {
tm.setDataNetworkTypeForPhone(mPhone.getPhoneId(), mSS.getRilVoiceRadioTechnology());
+
+ if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN
+ == mSS.getRilDataRadioTechnology()) {
+ log("pollStateDone: IWLAN enabled");
+ }
}
if (hasRegistered) {
@@ -1250,7 +1254,13 @@
if (hasDataRegStateChanged || hasRilDataRadioTechnologyChanged) {
notifyDataRegStateRilRadioTechnologyChanged();
- mPhone.notifyDataConnection(null);
+
+ if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN
+ == mSS.getRilDataRadioTechnology()) {
+ mPhone.notifyDataConnection(Phone.REASON_IWLAN_AVAILABLE);
+ } else {
+ mPhone.notifyDataConnection(null);
+ }
}
if (hasVoiceRoamingOn) {
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..a21c9a4 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,37 @@
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;
+ // Check enabledFeatures to determine capabilities. We ignore disabledFeatures.
+ for (int i = ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE;
+ i <= ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI; i++) {
+ if (enabledFeatures[i] == i) {
+ // If the feature is set to its own integer value it is enabled.
+ if (DBG) log("onFeatureCapabilityChanged: i=" + i + ", value=true");
+ mImsFeatureEnabled[i] = true;
+ } else if (enabledFeatures[i]
+ == ImsConfig.FeatureConstants.FEATURE_TYPE_UNKNOWN) {
+ // FEATURE_TYPE_UNKNOWN indicates that a feature is disabled.
+ if (DBG) log("onFeatureCapabilityChanged: i=" + i + ", value=false");
+ mImsFeatureEnabled[i] = false;
+ } else {
+ // Feature has unknown state; it is not its own value or -1.
+ if (DBG) {
+ loge("onFeatureCapabilityChanged: i=" + i + ", unexpectedValue="
+ + enabledFeatures[i]);
+ }
+ }
}
- 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;
+
+ // TODO: Use the ImsCallSession or ImsCallProfile to tell the initial Wifi state and
+ // {@link ImsCallSession.Listener#callSessionHandover} to listen for changes to
+ // wifi capability caused by a handover.
+ if (DBG) log("onFeatureCapabilityChanged: isVowifiEnabled=" + isVowifiEnabled());
+ for (ImsPhoneConnection connection : mConnections) {
+ connection.updateWifiState();
}
}
- if (DBG) log("onFeatureCapabilityChanged, mIsVolteEnabled = " + mIsVolteEnabled
- + " mIsVtEnabled = " + mIsVtEnabled);
+
+ if (DBG) log("onFeatureCapabilityChanged: mImsFeatureEnabled=" + mImsFeatureEnabled);
}
};
@@ -1466,11 +1477,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() {
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java
index 2c93f5a..f83aba0 100755
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java
@@ -144,6 +144,8 @@
//mIndex = index;
+ updateWifiState();
+
mParent = parent;
mParent.attach(this, ImsPhoneCall.State.INCOMING);
}
@@ -572,7 +574,8 @@
boolean updateParent = mParent.update(this, imsCall, state);
boolean updateMediaCapabilities = updateMediaCapabilities(imsCall);
- return updateParent || updateMediaCapabilities;
+ boolean updateWifiState = updateWifiState();
+ return updateParent || updateMediaCapabilities || updateWifiState;
}
@Override
@@ -674,6 +677,21 @@
}
/**
+ * Check for a change in the wifi state of the ImsPhoneCallTracker and update the
+ * {@link ImsPhoneConnection} with this information.
+ *
+ * @return Whether the ImsPhoneCallTracker's usage of wifi has been changed.
+ */
+ public boolean updateWifiState() {
+ Rlog.d(LOG_TAG, "updateWifiState: " + mOwner.isVowifiEnabled());
+ if (isWifi() != mOwner.isVowifiEnabled()) {
+ setWifi(mOwner.isVowifiEnabled());
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Determines the {@link ImsPhoneConnection} audio quality based on the local and remote
* {@link ImsCallProfile}. If indicate a HQ audio call if the local stream profile
* indicates AMR_WB or EVRC_WB and there is no remote restrict cause.