in com/android/internal/telephony/dataconnection/DcTracker.java [3666:4019]
public void handleMessage (Message msg) {
if (VDBG) log("handleMessage msg=" + msg);
switch (msg.what) {
case DctConstants.EVENT_RECORDS_LOADED:
// If onRecordsLoadedOrSubIdChanged() is not called here, it should be called on
// onSubscriptionsChanged() when a valid subId is available.
int subId = mPhone.getSubId();
if (SubscriptionManager.isValidSubscriptionId(subId)) {
onRecordsLoadedOrSubIdChanged();
} else {
log("Ignoring EVENT_RECORDS_LOADED as subId is not valid: " + subId);
}
break;
case DctConstants.EVENT_DATA_CONNECTION_DETACHED:
onDataConnectionDetached();
break;
case DctConstants.EVENT_DATA_CONNECTION_ATTACHED:
onDataConnectionAttached();
break;
case DctConstants.EVENT_DO_RECOVERY:
doRecovery();
break;
case DctConstants.EVENT_APN_CHANGED:
onApnChanged();
break;
case DctConstants.EVENT_PS_RESTRICT_ENABLED:
/**
* We don't need to explicitly to tear down the PDP context
* when PS restricted is enabled. The base band will deactive
* PDP context and notify us with PDP_CONTEXT_CHANGED.
* But we should stop the network polling and prevent reset PDP.
*/
if (DBG) log("EVENT_PS_RESTRICT_ENABLED " + mIsPsRestricted);
stopNetStatPoll();
stopDataStallAlarm();
mIsPsRestricted = true;
break;
case DctConstants.EVENT_PS_RESTRICT_DISABLED:
/**
* When PS restrict is removed, we need setup PDP connection if
* PDP connection is down.
*/
if (DBG) log("EVENT_PS_RESTRICT_DISABLED " + mIsPsRestricted);
mIsPsRestricted = false;
if (isConnected()) {
startNetStatPoll();
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
} else {
// TODO: Should all PDN states be checked to fail?
if (mState == DctConstants.State.FAILED) {
cleanUpAllConnections(false, Phone.REASON_PS_RESTRICT_ENABLED);
mReregisterOnReconnectFailure = false;
}
ApnContext apnContext = mApnContextsById.get(DctConstants.APN_DEFAULT_ID);
if (apnContext != null) {
apnContext.setReason(Phone.REASON_PS_RESTRICT_ENABLED);
trySetupData(apnContext);
} else {
loge("**** Default ApnContext not found ****");
if (Build.IS_DEBUGGABLE) {
throw new RuntimeException("Default ApnContext not found");
}
}
}
break;
case DctConstants.EVENT_TRY_SETUP_DATA:
if (msg.obj instanceof ApnContext) {
onTrySetupData((ApnContext)msg.obj);
} else if (msg.obj instanceof String) {
onTrySetupData((String)msg.obj);
} else {
loge("EVENT_TRY_SETUP request w/o apnContext or String");
}
break;
case DctConstants.EVENT_CLEAN_UP_CONNECTION:
boolean tearDown = (msg.arg1 == 0) ? false : true;
if (DBG) log("EVENT_CLEAN_UP_CONNECTION tearDown=" + tearDown);
if (msg.obj instanceof ApnContext) {
cleanUpConnection(tearDown, (ApnContext)msg.obj);
} else {
onCleanUpConnection(tearDown, msg.arg2, (String) msg.obj);
}
break;
case DctConstants.EVENT_SET_INTERNAL_DATA_ENABLE: {
final boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false;
onSetInternalDataEnabled(enabled, (Message) msg.obj);
break;
}
case DctConstants.EVENT_CLEAN_UP_ALL_CONNECTIONS:
if ((msg.obj != null) && (msg.obj instanceof String == false)) {
msg.obj = null;
}
onCleanUpAllConnections((String) msg.obj);
break;
case DctConstants.EVENT_DATA_RAT_CHANGED:
if (mPhone.getServiceState().getRilDataRadioTechnology()
== ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) {
// unknown rat is an exception for data rat change. It's only received when out
// of service and is not applicable for apn bearer bitmask. We should bypass the
// check of waiting apn list and keep the data connection on, and no need to
// setup a new one.
break;
}
cleanUpConnectionsOnUpdatedApns(false, Phone.REASON_NW_TYPE_CHANGED);
//May new Network allow setupData, so try it here
setupDataOnConnectableApns(Phone.REASON_NW_TYPE_CHANGED,
RetryFailures.ONLY_ON_CHANGE);
break;
case DctConstants.CMD_CLEAR_PROVISIONING_SPINNER:
// Check message sender intended to clear the current spinner.
if (mProvisioningSpinner == msg.obj) {
mProvisioningSpinner.dismiss();
mProvisioningSpinner = null;
}
break;
case AsyncChannel.CMD_CHANNEL_DISCONNECTED: {
log("DISCONNECTED_CONNECTED: msg=" + msg);
DcAsyncChannel dcac = (DcAsyncChannel) msg.obj;
mDataConnectionAcHashMap.remove(dcac.getDataConnectionIdSync());
dcac.disconnected();
break;
}
case DctConstants.EVENT_ENABLE_NEW_APN:
onEnableApn(msg.arg1, msg.arg2);
break;
case DctConstants.EVENT_DATA_STALL_ALARM:
onDataStallAlarm(msg.arg1);
break;
case DctConstants.EVENT_ROAMING_OFF:
onDataRoamingOff();
break;
case DctConstants.EVENT_ROAMING_ON:
case DctConstants.EVENT_ROAMING_SETTING_CHANGE:
onDataRoamingOnOrSettingsChanged(msg.what);
break;
case DctConstants.EVENT_DEVICE_PROVISIONED_CHANGE:
onDeviceProvisionedChange();
break;
case DctConstants.EVENT_REDIRECTION_DETECTED:
String url = (String) msg.obj;
log("dataConnectionTracker.handleMessage: EVENT_REDIRECTION_DETECTED=" + url);
onDataConnectionRedirected(url);
case DctConstants.EVENT_RADIO_AVAILABLE:
onRadioAvailable();
break;
case DctConstants.EVENT_RADIO_OFF_OR_NOT_AVAILABLE:
onRadioOffOrNotAvailable();
break;
case DctConstants.EVENT_DATA_SETUP_COMPLETE:
onDataSetupComplete((AsyncResult) msg.obj);
break;
case DctConstants.EVENT_DATA_SETUP_COMPLETE_ERROR:
onDataSetupCompleteError((AsyncResult) msg.obj);
break;
case DctConstants.EVENT_DISCONNECT_DONE:
log("DataConnectionTracker.handleMessage: EVENT_DISCONNECT_DONE msg=" + msg);
onDisconnectDone((AsyncResult) msg.obj);
break;
case DctConstants.EVENT_DISCONNECT_DC_RETRYING:
log("DataConnectionTracker.handleMessage: EVENT_DISCONNECT_DC_RETRYING msg=" + msg);
onDisconnectDcRetrying((AsyncResult) msg.obj);
break;
case DctConstants.EVENT_VOICE_CALL_STARTED:
onVoiceCallStarted();
break;
case DctConstants.EVENT_VOICE_CALL_ENDED:
onVoiceCallEnded();
break;
case DctConstants.CMD_SET_USER_DATA_ENABLE: {
final boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false;
if (DBG) log("CMD_SET_USER_DATA_ENABLE enabled=" + enabled);
onSetUserDataEnabled(enabled);
break;
}
// TODO - remove
case DctConstants.CMD_SET_DEPENDENCY_MET: {
boolean met = (msg.arg1 == DctConstants.ENABLED) ? true : false;
if (DBG) log("CMD_SET_DEPENDENCY_MET met=" + met);
Bundle bundle = msg.getData();
if (bundle != null) {
String apnType = (String)bundle.get(DctConstants.APN_TYPE_KEY);
if (apnType != null) {
onSetDependencyMet(apnType, met);
}
}
break;
}
case DctConstants.CMD_SET_POLICY_DATA_ENABLE: {
final boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false;
onSetPolicyDataEnabled(enabled);
break;
}
case DctConstants.CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: {
sEnableFailFastRefCounter += (msg.arg1 == DctConstants.ENABLED) ? 1 : -1;
if (DBG) {
log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: "
+ " sEnableFailFastRefCounter=" + sEnableFailFastRefCounter);
}
if (sEnableFailFastRefCounter < 0) {
final String s = "CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: "
+ "sEnableFailFastRefCounter:" + sEnableFailFastRefCounter + " < 0";
loge(s);
sEnableFailFastRefCounter = 0;
}
final boolean enabled = sEnableFailFastRefCounter > 0;
if (DBG) {
log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: enabled=" + enabled
+ " sEnableFailFastRefCounter=" + sEnableFailFastRefCounter);
}
if (mFailFast != enabled) {
mFailFast = enabled;
mDataStallDetectionEnabled = !enabled;
if (mDataStallDetectionEnabled
&& (getOverallState() == DctConstants.State.CONNECTED)
&& (!mInVoiceCall ||
mPhone.getServiceStateTracker()
.isConcurrentVoiceAndDataAllowed())) {
if (DBG) log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: start data stall");
stopDataStallAlarm();
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
} else {
if (DBG) log("CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA: stop data stall");
stopDataStallAlarm();
}
}
break;
}
case DctConstants.CMD_ENABLE_MOBILE_PROVISIONING: {
Bundle bundle = msg.getData();
if (bundle != null) {
try {
mProvisioningUrl = (String)bundle.get(DctConstants.PROVISIONING_URL_KEY);
} catch(ClassCastException e) {
loge("CMD_ENABLE_MOBILE_PROVISIONING: provisioning url not a string" + e);
mProvisioningUrl = null;
}
}
if (TextUtils.isEmpty(mProvisioningUrl)) {
loge("CMD_ENABLE_MOBILE_PROVISIONING: provisioning url is empty, ignoring");
mIsProvisioning = false;
mProvisioningUrl = null;
} else {
loge("CMD_ENABLE_MOBILE_PROVISIONING: provisioningUrl=" + mProvisioningUrl);
mIsProvisioning = true;
startProvisioningApnAlarm();
}
break;
}
case DctConstants.EVENT_PROVISIONING_APN_ALARM: {
if (DBG) log("EVENT_PROVISIONING_APN_ALARM");
ApnContext apnCtx = mApnContextsById.get(DctConstants.APN_DEFAULT_ID);
if (apnCtx.isProvisioningApn() && apnCtx.isConnectedOrConnecting()) {
if (mProvisioningApnAlarmTag == msg.arg1) {
if (DBG) log("EVENT_PROVISIONING_APN_ALARM: Disconnecting");
mIsProvisioning = false;
mProvisioningUrl = null;
stopProvisioningApnAlarm();
sendCleanUpConnection(true, apnCtx);
} else {
if (DBG) {
log("EVENT_PROVISIONING_APN_ALARM: ignore stale tag,"
+ " mProvisioningApnAlarmTag:" + mProvisioningApnAlarmTag
+ " != arg1:" + msg.arg1);
}
}
} else {
if (DBG) log("EVENT_PROVISIONING_APN_ALARM: Not connected ignore");
}
break;
}
case DctConstants.CMD_IS_PROVISIONING_APN: {
if (DBG) log("CMD_IS_PROVISIONING_APN");
boolean isProvApn;
try {
String apnType = null;
Bundle bundle = msg.getData();
if (bundle != null) {
apnType = (String)bundle.get(DctConstants.APN_TYPE_KEY);
}
if (TextUtils.isEmpty(apnType)) {
loge("CMD_IS_PROVISIONING_APN: apnType is empty");
isProvApn = false;
} else {
isProvApn = isProvisioningApn(apnType);
}
} catch (ClassCastException e) {
loge("CMD_IS_PROVISIONING_APN: NO provisioning url ignoring");
isProvApn = false;
}
if (DBG) log("CMD_IS_PROVISIONING_APN: ret=" + isProvApn);
mReplyAc.replyToMessage(msg, DctConstants.CMD_IS_PROVISIONING_APN,
isProvApn ? DctConstants.ENABLED : DctConstants.DISABLED);
break;
}
case DctConstants.EVENT_ICC_CHANGED: {
onUpdateIcc();
break;
}
case DctConstants.EVENT_RESTART_RADIO: {
restartRadio();
break;
}
case DctConstants.CMD_NET_STAT_POLL: {
if (msg.arg1 == DctConstants.ENABLED) {
handleStartNetStatPoll((DctConstants.Activity)msg.obj);
} else if (msg.arg1 == DctConstants.DISABLED) {
handleStopNetStatPoll((DctConstants.Activity)msg.obj);
}
break;
}
case DctConstants.EVENT_PCO_DATA_RECEIVED: {
handlePcoData((AsyncResult)msg.obj);
break;
}
case DctConstants.EVENT_SET_CARRIER_DATA_ENABLED:
onSetCarrierDataEnabled((AsyncResult) msg.obj);
break;
case DctConstants.EVENT_DATA_RECONNECT:
onDataReconnect(msg.getData());
break;
case DctConstants.EVENT_DATA_SERVICE_BINDING_CHANGED:
onDataServiceBindingChanged((Boolean) ((AsyncResult) msg.obj).result);
default:
Rlog.e("DcTracker", "Unhandled event=" + msg);
break;
}
}