Loading src/java/com/android/internal/telephony/dataconnection/DcController.java +35 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.os.Build; import android.os.Handler; import android.os.Message; import android.telephony.Rlog; import com.android.internal.telephony.DctConstants; import com.android.internal.telephony.PhoneBase; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.dataconnection.DataConnection.UpdateLinkPropertyResult; Loading Loading @@ -208,7 +209,19 @@ class DcController extends StateMachine { // and any that are in active need to be retried. ArrayList<ApnContext> apnsToCleanup = new ArrayList<ApnContext>(); boolean isAnyDataCallDormant = false; boolean isAnyDataCallActive = false; for (DataCallResponse newState : dcsList) { // Check if we should start or stop polling, by looking // for dormant and active connections. if (newState.active == DATA_CONNECTION_ACTIVE_PH_LINK_UP) { isAnyDataCallActive = true; } if (newState.active == DATA_CONNECTION_ACTIVE_PH_LINK_DORMANT) { isAnyDataCallDormant = true; } DataConnection dc = mDcListActiveByCid.get(newState.cid); if (dc == null) { // UNSOL_DATA_CALL_LIST_CHANGED arrived before SETUP_DATA_CALL completed. Loading Loading @@ -298,7 +311,27 @@ class DcController extends StateMachine { } } } mPhone.notifyDataActivity(); if (isAnyDataCallDormant && !isAnyDataCallActive) { // There is no way to indicate link activity per APN right now. So // Link Activity will be considered dormant only when all data calls // are dormant. // If a single data call is in dormant state and none of the data // calls are active broadcast overall link state as dormant. if (DBG) { log("onDataStateChanged: Data Activity updated to DORMANT. stopNetStatePoll"); } mDct.sendStopNetStatPoll(DctConstants.Activity.DORMANT); } else { if (DBG) { log("onDataStateChanged: Data Activity updated to NONE. " + "isAnyDataCallActive = " + isAnyDataCallActive + " isAnyDataCallDormant = " + isAnyDataCallDormant); } if (isAnyDataCallActive) { mDct.sendStartNetStatPoll(DctConstants.Activity.NONE); } } if (DBG) { lr("onDataStateChanged: dcsToRetry=" + dcsToRetry Loading src/java/com/android/internal/telephony/dataconnection/DcTracker.java +1 −78 Original line number Diff line number Diff line Loading @@ -162,8 +162,7 @@ public class DcTracker extends DcTrackerBase { p.mCi.registerForAvailable (this, DctConstants.EVENT_RADIO_AVAILABLE, null); p.mCi.registerForOffOrNotAvailable(this, DctConstants.EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); p.mCi.registerForDataNetworkStateChanged (this, DctConstants.EVENT_DATA_STATE_CHANGED, null); p.getCallTracker().registerForVoiceCallEnded (this, DctConstants.EVENT_VOICE_CALL_ENDED, null); p.getCallTracker().registerForVoiceCallStarted (this, DctConstants.EVENT_VOICE_CALL_STARTED, Loading Loading @@ -1247,67 +1246,6 @@ public class DcTracker extends DcTrackerBase { return null; } /** * @param ar is the result of RIL_REQUEST_DATA_CALL_LIST * or RIL_UNSOL_DATA_CALL_LIST_CHANGED */ private void onDataStateChanged (AsyncResult ar) { ArrayList<DataCallResponse> dataCallStates; if (DBG) log("onDataStateChanged(ar): E"); dataCallStates = (ArrayList<DataCallResponse>)(ar.result); if (ar.exception != null) { // This is probably "radio not available" or something // of that sort. If so, the whole connection is going // to come down soon anyway if (DBG) log("onDataStateChanged(ar): exception; likely radio not available, ignore"); return; } if (DBG) log("onDataStateChanged(ar): DataCallResponse size=" + dataCallStates.size()); // Create a hash map to store the dataCallState of each DataConnectionAc HashMap<DataCallResponse, DcAsyncChannel> dataCallStateToDcac; dataCallStateToDcac = new HashMap<DataCallResponse, DcAsyncChannel>(); for (DataCallResponse dataCallState : dataCallStates) { DcAsyncChannel dcac = findDataConnectionAcByCid(dataCallState.cid); if (dcac != null) dataCallStateToDcac.put(dataCallState, dcac); } // Check if we should start or stop polling, by looking // for dormant and active connections. boolean isAnyDataCallDormant = false; boolean isAnyDataCallActive = false; for (DataCallResponse newState : dataCallStates) { if (newState.active == DATA_CONNECTION_ACTIVE_PH_LINK_UP) isAnyDataCallActive = true; if (newState.active == DATA_CONNECTION_ACTIVE_PH_LINK_DOWN) isAnyDataCallDormant = true; } if (isAnyDataCallDormant && !isAnyDataCallActive) { // There is no way to indicate link activity per APN right now. So // Link Activity will be considered dormant only when all data calls // are dormant. // If a single data call is in dormant state and none of the data // calls are active broadcast overall link state as dormant. mActivity = DctConstants.Activity.DORMANT; if (DBG) { log("onDataStateChanged: Data Activity updated to DORMANT. stopNetStatePoll"); } stopNetStatPoll(); } else { mActivity = DctConstants.Activity.NONE; if (DBG) { log("onDataStateChanged: Data Activity updated to NONE. " + "isAnyDataCallActive = " + isAnyDataCallActive + " isAnyDataCallDormant = " + isAnyDataCallDormant); } if (isAnyDataCallActive) startNetStatPoll(); } if (DBG) log("onDataStateChanged(ar): X"); } // TODO: For multiple Active APNs not exactly sure how to do this. @Override protected void gotoIdleAndNotifyDataConnection(String reason) { Loading Loading @@ -2090,13 +2028,6 @@ public class DcTracker extends DcTrackerBase { mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getDataProfileType()); } protected void onPollPdp() { if (getOverallState() == DctConstants.State.CONNECTED) { // only poll when connected mPhone.mCi.getDataCallList(obtainMessage(DctConstants.EVENT_DATA_STATE_CHANGED)); sendMessageDelayed(obtainMessage(DctConstants.EVENT_POLL_PDP), POLL_PDP_MILLIS); } } @Override protected void onVoiceCallStarted() { Loading Loading @@ -2492,14 +2423,6 @@ public class DcTracker extends DcTrackerBase { onDataConnectionAttached(); break; case DctConstants.EVENT_DATA_STATE_CHANGED: onDataStateChanged((AsyncResult) msg.obj); break; case DctConstants.EVENT_POLL_PDP: onPollPdp(); break; case DctConstants.EVENT_DO_RECOVERY: doRecovery(); break; Loading src/java/com/android/internal/telephony/dataconnection/DcTrackerBase.java +42 −0 Original line number Diff line number Diff line Loading @@ -620,6 +620,12 @@ public abstract class DcTrackerBase extends Handler { return mActivity; } private void setActivity(DctConstants.Activity activity) { log("setActivity ="+activity); mActivity = activity; mPhone.notifyDataActivity(); } public boolean isApnTypeActive(String type) { // TODO: support simultaneous with List instead if (PhoneConstants.APN_TYPE_DUN.equals(type)) { Loading Loading @@ -965,6 +971,14 @@ public abstract class DcTrackerBase extends Handler { 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; } default: Rlog.e("DATA", "Unidentified event msg=" + msg); break; Loading Loading @@ -1431,12 +1445,40 @@ public abstract class DcTrackerBase extends Handler { } } public void sendStartNetStatPoll(DctConstants.Activity activity) { Message msg = obtainMessage(DctConstants.CMD_NET_STAT_POLL, DctConstants.ENABLED, -1, activity); sendMessage(msg); } protected void handleStartNetStatPoll(DctConstants.Activity activity) { startNetStatPoll(); startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); setActivity(activity); } protected void stopNetStatPoll() { mNetStatPollEnabled = false; removeCallbacks(mPollNetStat); if (DBG) log("stopNetStatPoll"); } public void sendStopNetStatPoll(DctConstants.Activity activity) { Message msg = obtainMessage(DctConstants.CMD_NET_STAT_POLL, DctConstants.DISABLED, -1, activity); sendMessage(msg); } protected void handleStopNetStatPoll(DctConstants.Activity activity) { stopNetStatPoll(); stopDataStallAlarm(); setActivity(activity); } public void updateDataActivity() { long sent, received; Loading Loading
src/java/com/android/internal/telephony/dataconnection/DcController.java +35 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.os.Build; import android.os.Handler; import android.os.Message; import android.telephony.Rlog; import com.android.internal.telephony.DctConstants; import com.android.internal.telephony.PhoneBase; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.dataconnection.DataConnection.UpdateLinkPropertyResult; Loading Loading @@ -208,7 +209,19 @@ class DcController extends StateMachine { // and any that are in active need to be retried. ArrayList<ApnContext> apnsToCleanup = new ArrayList<ApnContext>(); boolean isAnyDataCallDormant = false; boolean isAnyDataCallActive = false; for (DataCallResponse newState : dcsList) { // Check if we should start or stop polling, by looking // for dormant and active connections. if (newState.active == DATA_CONNECTION_ACTIVE_PH_LINK_UP) { isAnyDataCallActive = true; } if (newState.active == DATA_CONNECTION_ACTIVE_PH_LINK_DORMANT) { isAnyDataCallDormant = true; } DataConnection dc = mDcListActiveByCid.get(newState.cid); if (dc == null) { // UNSOL_DATA_CALL_LIST_CHANGED arrived before SETUP_DATA_CALL completed. Loading Loading @@ -298,7 +311,27 @@ class DcController extends StateMachine { } } } mPhone.notifyDataActivity(); if (isAnyDataCallDormant && !isAnyDataCallActive) { // There is no way to indicate link activity per APN right now. So // Link Activity will be considered dormant only when all data calls // are dormant. // If a single data call is in dormant state and none of the data // calls are active broadcast overall link state as dormant. if (DBG) { log("onDataStateChanged: Data Activity updated to DORMANT. stopNetStatePoll"); } mDct.sendStopNetStatPoll(DctConstants.Activity.DORMANT); } else { if (DBG) { log("onDataStateChanged: Data Activity updated to NONE. " + "isAnyDataCallActive = " + isAnyDataCallActive + " isAnyDataCallDormant = " + isAnyDataCallDormant); } if (isAnyDataCallActive) { mDct.sendStartNetStatPoll(DctConstants.Activity.NONE); } } if (DBG) { lr("onDataStateChanged: dcsToRetry=" + dcsToRetry Loading
src/java/com/android/internal/telephony/dataconnection/DcTracker.java +1 −78 Original line number Diff line number Diff line Loading @@ -162,8 +162,7 @@ public class DcTracker extends DcTrackerBase { p.mCi.registerForAvailable (this, DctConstants.EVENT_RADIO_AVAILABLE, null); p.mCi.registerForOffOrNotAvailable(this, DctConstants.EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); p.mCi.registerForDataNetworkStateChanged (this, DctConstants.EVENT_DATA_STATE_CHANGED, null); p.getCallTracker().registerForVoiceCallEnded (this, DctConstants.EVENT_VOICE_CALL_ENDED, null); p.getCallTracker().registerForVoiceCallStarted (this, DctConstants.EVENT_VOICE_CALL_STARTED, Loading Loading @@ -1247,67 +1246,6 @@ public class DcTracker extends DcTrackerBase { return null; } /** * @param ar is the result of RIL_REQUEST_DATA_CALL_LIST * or RIL_UNSOL_DATA_CALL_LIST_CHANGED */ private void onDataStateChanged (AsyncResult ar) { ArrayList<DataCallResponse> dataCallStates; if (DBG) log("onDataStateChanged(ar): E"); dataCallStates = (ArrayList<DataCallResponse>)(ar.result); if (ar.exception != null) { // This is probably "radio not available" or something // of that sort. If so, the whole connection is going // to come down soon anyway if (DBG) log("onDataStateChanged(ar): exception; likely radio not available, ignore"); return; } if (DBG) log("onDataStateChanged(ar): DataCallResponse size=" + dataCallStates.size()); // Create a hash map to store the dataCallState of each DataConnectionAc HashMap<DataCallResponse, DcAsyncChannel> dataCallStateToDcac; dataCallStateToDcac = new HashMap<DataCallResponse, DcAsyncChannel>(); for (DataCallResponse dataCallState : dataCallStates) { DcAsyncChannel dcac = findDataConnectionAcByCid(dataCallState.cid); if (dcac != null) dataCallStateToDcac.put(dataCallState, dcac); } // Check if we should start or stop polling, by looking // for dormant and active connections. boolean isAnyDataCallDormant = false; boolean isAnyDataCallActive = false; for (DataCallResponse newState : dataCallStates) { if (newState.active == DATA_CONNECTION_ACTIVE_PH_LINK_UP) isAnyDataCallActive = true; if (newState.active == DATA_CONNECTION_ACTIVE_PH_LINK_DOWN) isAnyDataCallDormant = true; } if (isAnyDataCallDormant && !isAnyDataCallActive) { // There is no way to indicate link activity per APN right now. So // Link Activity will be considered dormant only when all data calls // are dormant. // If a single data call is in dormant state and none of the data // calls are active broadcast overall link state as dormant. mActivity = DctConstants.Activity.DORMANT; if (DBG) { log("onDataStateChanged: Data Activity updated to DORMANT. stopNetStatePoll"); } stopNetStatPoll(); } else { mActivity = DctConstants.Activity.NONE; if (DBG) { log("onDataStateChanged: Data Activity updated to NONE. " + "isAnyDataCallActive = " + isAnyDataCallActive + " isAnyDataCallDormant = " + isAnyDataCallDormant); } if (isAnyDataCallActive) startNetStatPoll(); } if (DBG) log("onDataStateChanged(ar): X"); } // TODO: For multiple Active APNs not exactly sure how to do this. @Override protected void gotoIdleAndNotifyDataConnection(String reason) { Loading Loading @@ -2090,13 +2028,6 @@ public class DcTracker extends DcTrackerBase { mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getDataProfileType()); } protected void onPollPdp() { if (getOverallState() == DctConstants.State.CONNECTED) { // only poll when connected mPhone.mCi.getDataCallList(obtainMessage(DctConstants.EVENT_DATA_STATE_CHANGED)); sendMessageDelayed(obtainMessage(DctConstants.EVENT_POLL_PDP), POLL_PDP_MILLIS); } } @Override protected void onVoiceCallStarted() { Loading Loading @@ -2492,14 +2423,6 @@ public class DcTracker extends DcTrackerBase { onDataConnectionAttached(); break; case DctConstants.EVENT_DATA_STATE_CHANGED: onDataStateChanged((AsyncResult) msg.obj); break; case DctConstants.EVENT_POLL_PDP: onPollPdp(); break; case DctConstants.EVENT_DO_RECOVERY: doRecovery(); break; Loading
src/java/com/android/internal/telephony/dataconnection/DcTrackerBase.java +42 −0 Original line number Diff line number Diff line Loading @@ -620,6 +620,12 @@ public abstract class DcTrackerBase extends Handler { return mActivity; } private void setActivity(DctConstants.Activity activity) { log("setActivity ="+activity); mActivity = activity; mPhone.notifyDataActivity(); } public boolean isApnTypeActive(String type) { // TODO: support simultaneous with List instead if (PhoneConstants.APN_TYPE_DUN.equals(type)) { Loading Loading @@ -965,6 +971,14 @@ public abstract class DcTrackerBase extends Handler { 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; } default: Rlog.e("DATA", "Unidentified event msg=" + msg); break; Loading Loading @@ -1431,12 +1445,40 @@ public abstract class DcTrackerBase extends Handler { } } public void sendStartNetStatPoll(DctConstants.Activity activity) { Message msg = obtainMessage(DctConstants.CMD_NET_STAT_POLL, DctConstants.ENABLED, -1, activity); sendMessage(msg); } protected void handleStartNetStatPoll(DctConstants.Activity activity) { startNetStatPoll(); startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); setActivity(activity); } protected void stopNetStatPoll() { mNetStatPollEnabled = false; removeCallbacks(mPollNetStat); if (DBG) log("stopNetStatPoll"); } public void sendStopNetStatPoll(DctConstants.Activity activity) { Message msg = obtainMessage(DctConstants.CMD_NET_STAT_POLL, DctConstants.DISABLED, -1, activity); sendMessage(msg); } protected void handleStopNetStatPoll(DctConstants.Activity activity) { stopNetStatPoll(); stopDataStallAlarm(); setActivity(activity); } public void updateDataActivity() { long sent, received; Loading