Telephony: Implementation of IWLAN
- Allow registration polling in radio off state.
- Disable default APN if current RAT is IWLAN.
- Allow non-default PDP activation in radio off state provided
current RAT is IWLAN.
Set data registration state in APM for IWLAN RAT
- APM causes data registration state to be POWER_OFF. Set it
to IN_SERVICE for iwlan case
- In APM, UNSOL_VOICE_NETWORK_STATE_CHANGED resets data RAT and
registration state to POWER_OFF. Ensure that this is done only
when current RAT is not IWLAN or when iwlan feature is not
available.
Change-Id: I419f3df987ef90bb5f31b0e381257a81dcc57c3b
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/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index 77bf580..47c1b5c 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -109,6 +109,7 @@
static final String REASON_CONNECTED = "connected";
static final String REASON_SINGLE_PDN_ARBITRATION = "SinglePdnArbitration";
static final String REASON_DATA_SPECIFIC_DISABLED = "specificDisabled";
+ static final String REASON_IWLAN_AVAILABLE = "iwlanAvailable";
// Used for band mode selection methods
static final int BM_UNSPECIFIED = 0; // selected by baseband automatically
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/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 60bc558..469f683 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/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) {