Loading src/java/com/android/internal/telephony/Phone.java +14 −5 Original line number Diff line number Diff line Loading @@ -2546,9 +2546,16 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { /** Send notification with an updated PreciseDataConnectionState to all data connections */ public void notifyAllActiveDataConnections() { String types[] = getActiveApnTypes(); for (String apnType : types) { mNotifier.notifyDataConnection(this, apnType, getPreciseDataConnectionState(apnType)); if (mTransportManager != null) { for (int transportType : mTransportManager.getAvailableTransports()) { DcTracker dct = getDcTracker(transportType); if (dct != null) { for (String apnType : dct.getConnectedApnTypes()) { mNotifier.notifyDataConnection( this, apnType, getPreciseDataConnectionState(apnType)); } } } } } Loading Loading @@ -4185,7 +4192,8 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { public boolean areAllDataDisconnected() { if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null && !getDcTracker(transport).isDisconnected()) { if (getDcTracker(transport) != null && !getDcTracker(transport).areAllDataDisconnected()) { return false; } } Loading @@ -4197,7 +4205,8 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { mAllDataDisconnectedRegistrants.addUnique(h, what, null); if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null && !getDcTracker(transport).isDisconnected()) { if (getDcTracker(transport) != null && !getDcTracker(transport).areAllDataDisconnected()) { getDcTracker(transport).registerForAllDataDisconnected( this, EVENT_ALL_DATA_DISCONNECTED); } Loading src/java/com/android/internal/telephony/dataconnection/DcTracker.java +41 −78 Original line number Diff line number Diff line Loading @@ -1094,6 +1094,18 @@ public class DcTracker extends Handler { return result.toArray(new String[0]); } /** * Get ApnTypes with connected data connections. This is different than getActiveApnTypes() * which returns apn types that with active apn contexts. * @return apn types */ public String[] getConnectedApnTypes() { return mApnContexts.values().stream() .filter(ac -> ac.getState() == DctConstants.State.CONNECTED) .map(ApnContext::getApnType) .toArray(String[]::new); } @VisibleForTesting public Collection<ApnContext> getApnContexts() { return mPrioritySortedApnContexts; Loading Loading @@ -1209,52 +1221,6 @@ public class DcTracker extends Handler { return false; } // Return state of overall public DctConstants.State getOverallState() { boolean isConnecting = false; boolean isFailed = true; // All enabled Apns should be FAILED. boolean isAnyEnabled = false; for (ApnContext apnContext : mApnContexts.values()) { if (apnContext.isEnabled()) { isAnyEnabled = true; switch (apnContext.getState()) { case CONNECTED: case DISCONNECTING: if (VDBG) log("overall state is CONNECTED"); return DctConstants.State.CONNECTED; case CONNECTING: isConnecting = true; isFailed = false; break; case IDLE: case RETRYING: isFailed = false; break; default: isAnyEnabled = true; break; } } } if (!isAnyEnabled) { // Nothing enabled. return IDLE. if (VDBG) log( "overall state is IDLE"); return DctConstants.State.IDLE; } if (isConnecting) { if (VDBG) log( "overall state is CONNECTING"); return DctConstants.State.CONNECTING; } else if (!isFailed) { if (VDBG) log( "overall state is IDLE"); return DctConstants.State.IDLE; } else { if (VDBG) log( "overall state is FAILED"); return DctConstants.State.FAILED; } } //****** Called from ServiceStateTracker /** * Invoked when ServiceStateTracker observes a transition from GPRS Loading @@ -1275,7 +1241,7 @@ public class DcTracker extends Handler { private void onDataConnectionAttached() { if (DBG) log("onDataConnectionAttached"); mAttached.set(true); if (getOverallState() == DctConstants.State.CONNECTED) { if (isAnyDataConnected()) { if (DBG) log("onDataConnectionAttached: start polling notify attached"); startNetStatPoll(); startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); Loading Loading @@ -2162,10 +2128,6 @@ public class DcTracker extends Handler { * Handles changes to the APN database. */ private void onApnChanged() { DctConstants.State overallState = getOverallState(); boolean isDisconnected = (overallState == DctConstants.State.IDLE || overallState == DctConstants.State.FAILED); if (mPhone instanceof GsmCdmaPhone) { // The "current" may no longer be valid. MMS depends on this to send properly. TBD ((GsmCdmaPhone)mPhone).updateCurrentCarrierInProvider(); Loading @@ -2177,7 +2139,7 @@ public class DcTracker extends Handler { createAllApnList(); setDataProfilesAsNeeded(); setInitialAttachApn(); cleanUpConnectionsOnUpdatedApns(!isDisconnected, Phone.REASON_APN_CHANGED); cleanUpConnectionsOnUpdatedApns(isAnyDataConnected(), Phone.REASON_APN_CHANGED); // FIXME: See bug 17426028 maybe no conditional is needed. if (mPhone.getSubId() == SubscriptionManager.getDefaultDataSubscriptionId()) { Loading Loading @@ -2779,7 +2741,7 @@ public class DcTracker extends Handler { log("onRadioAvailable: We're on the simulator; assuming data is connected"); } if (getOverallState() != DctConstants.State.IDLE) { if (!areAllDataDisconnected()) { cleanUpConnectionInternal(true, RELEASE_TYPE_DETACH, null); } } Loading Loading @@ -3083,7 +3045,7 @@ public class DcTracker extends Handler { } // if all data connection are gone, check whether Airplane mode request was // pending. if (isDisconnected()) { if (areAllDataDisconnected()) { if (mPhone.getServiceStateTracker().processPendingRadioPowerOffAfterDataOff()) { if (DBG) log("onDisconnectDone: radio will be turned off, no retries"); // Radio will be turned off. No need to retry data setup Loading Loading @@ -3147,7 +3109,8 @@ public class DcTracker extends Handler { private void onVoiceCallStarted() { if (DBG) log("onVoiceCallStarted"); mInVoiceCall = true; if (isConnected() && ! mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { if (isAnyDataConnected() && !mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { if (DBG) log("onVoiceCallStarted stop polling"); stopNetStatPoll(); stopDataStallAlarm(); Loading @@ -3158,7 +3121,7 @@ public class DcTracker extends Handler { protected void onVoiceCallEnded() { if (DBG) log("onVoiceCallEnded"); mInVoiceCall = false; if (isConnected()) { if (isAnyDataConnected()) { if (!mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { startNetStatPoll(); startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); Loading @@ -3171,26 +3134,28 @@ public class DcTracker extends Handler { // reset reconnect timer setupDataOnAllConnectableApns(Phone.REASON_VOICE_CALL_ENDED, RetryFailures.ALWAYS); } protected boolean isConnected() { for (ApnContext apnContext : mApnContexts.values()) { if (apnContext.getState() == DctConstants.State.CONNECTED) { // At least one context is connected, return true /** * @return {@code true} if there is any data in connected state. */ @VisibleForTesting public boolean isAnyDataConnected() { for (DataConnection dc : mDataConnections.values()) { if (dc.isActive()) { return true; } } // There are not any contexts connected, return false return false; } public boolean isDisconnected() { for (ApnContext apnContext : mApnContexts.values()) { if (!apnContext.isDisconnected()) { // At least one context was not disconnected return false /** * @return {@code true} if all data connections are in disconnected state. */ public boolean areAllDataDisconnected() { for (DataConnection dc : mDataConnections.values()) { if (!dc.isInactive()) { return false; } } // All contexts were disconnected so return true return true; } Loading Loading @@ -3566,7 +3531,7 @@ public class DcTracker extends Handler { */ if (DBG) log("EVENT_PS_RESTRICT_DISABLED " + mIsPsRestricted); mIsPsRestricted = false; if (isConnected()) { if (isAnyDataConnected()) { startNetStatPoll(); startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); } else { Loading Loading @@ -3749,7 +3714,7 @@ public class DcTracker extends Handler { mDataStallNoRxEnabled = !enabled; if (mDsRecoveryHandler.isNoRxDataStallDetectionEnabled() && (getOverallState() == DctConstants.State.CONNECTED) && isAnyDataConnected() && (!mInVoiceCall || mPhone.getServiceStateTracker() .isConcurrentVoiceAndDataAllowed())) { Loading Loading @@ -4000,7 +3965,7 @@ public class DcTracker extends Handler { public void registerForAllDataDisconnected(Handler h, int what) { mAllDataDisconnectedRegistrants.addUnique(h, what, null); if (isDisconnected()) { if (areAllDataDisconnected()) { log("notify All Data Disconnected"); notifyAllDataDisconnected(); } Loading Loading @@ -4283,7 +4248,7 @@ public class DcTracker extends Handler { pw.println(" mReregisterOnReconnectFailure=" + mReregisterOnReconnectFailure); pw.println(" canSetPreferApn=" + mCanSetPreferApn); pw.println(" mApnObserver=" + mApnObserver); pw.println(" getOverallState=" + getOverallState()); pw.println(" isAnyDataConnected=" + isAnyDataConnected()); pw.println(" mAttached=" + mAttached.get()); mDataEnabledSettings.dump(fd, pw, args); pw.flush(); Loading Loading @@ -4426,7 +4391,7 @@ public class DcTracker extends Handler { } } if (!isConnected()) { if (!isAnyDataConnected()) { stopNetStatPoll(); stopDataStallAlarm(); } Loading @@ -4449,8 +4414,7 @@ public class DcTracker extends Handler { } protected void startNetStatPoll() { if (getOverallState() == DctConstants.State.CONNECTED && mNetStatPollEnabled == false) { if (isAnyDataConnected() && !mNetStatPollEnabled) { if (DBG) { log("startNetStatPoll"); } Loading Loading @@ -4729,7 +4693,7 @@ public class DcTracker extends Handler { } public void doRecovery() { if (getOverallState() == DctConstants.State.CONNECTED) { if (isAnyDataConnected()) { // Go through a series of recovery steps, each action transitions to the next action @RecoveryAction final int recoveryAction = getRecoveryAction(); final int signalStrength = mPhone.getSignalStrength().getLevel(); Loading Loading @@ -4893,8 +4857,7 @@ public class DcTracker extends Handler { protected void startDataStallAlarm(boolean suspectedStall) { int delayInMs; if (mDsRecoveryHandler.isNoRxDataStallDetectionEnabled() && getOverallState() == DctConstants.State.CONNECTED) { if (mDsRecoveryHandler.isNoRxDataStallDetectionEnabled() && isAnyDataConnected()) { // If screen is on or data stall is currently suspected, set the alarm // with an aggressive timeout. if (mIsScreenOn || suspectedStall || mDsRecoveryHandler.isAggressiveRecovery()) { Loading Loading @@ -4940,7 +4903,7 @@ public class DcTracker extends Handler { } private void restartDataStallAlarm() { if (isConnected() == false) return; if (!isAnyDataConnected()) return; // To be called on screen status change. // Do not cancel the alarm if it is set with aggressive timeout. if (mDsRecoveryHandler.isAggressiveRecovery()) { Loading src/java/com/android/internal/telephony/vendor/dataconnection/VendorDcTracker.java +4 −19 Original line number Diff line number Diff line Loading @@ -17,32 +17,17 @@ package com.android.internal.telephony.vendor.dataconnection; import android.app.AlertDialog; import android.view.WindowManager; import android.telephony.AccessNetworkConstants; import android.telephony.Annotation.DataFailureCause; import android.telephony.CarrierConfigManager; import android.telephony.DataFailCause; import android.telephony.data.ApnSetting; import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.view.WindowManager; import com.android.internal.telephony.dataconnection.ApnContext; import com.android.internal.telephony.dataconnection.DcTracker; import com.android.internal.telephony.DctConstants; import com.android.internal.telephony.GsmCdmaPhone; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.uicc.IccRecords; import com.android.internal.util.ArrayUtils; import com.android.internal.util.AsyncChannel; import android.database.Cursor; import android.content.Context; import android.os.PersistableBundle; import android.provider.Telephony; import com.android.internal.telephony.dataconnection.ApnContext; import com.android.internal.telephony.dataconnection.DcTracker; import java.util.HashSet; import java.util.Iterator; Loading Loading @@ -115,7 +100,7 @@ public class VendorDcTracker extends DcTracker { protected void onVoiceCallEnded() { if (DBG) log("onVoiceCallEnded"); mInVoiceCall = false; if (isConnected()) { if (isAnyDataConnected()) { if (!mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { startNetStatPoll(); startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); Loading tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -229,7 +229,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { doReturn(mIwlanNetworkServiceStub).when(mIwlanNetworkServiceStub).asBinder(); addNetworkService(); doReturn(true).when(mDcTracker).isDisconnected(); doReturn(true).when(mDcTracker).areAllDataDisconnected(); doReturn(new ServiceState()).when(mPhone).getServiceState(); Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java +10 −10 Original line number Diff line number Diff line Loading @@ -611,7 +611,7 @@ public class DcTrackerTest extends TelephonyTest { assertEquals(apnSetting, mDct.getActiveApnString(PhoneConstants.APN_TYPE_DEFAULT)); assertArrayEquals(new String[]{PhoneConstants.APN_TYPE_DEFAULT}, mDct.getActiveApnTypes()); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT)); LinkProperties linkProperties = mDct.getLinkProperties(PhoneConstants.APN_TYPE_DEFAULT); Loading Loading @@ -817,7 +817,7 @@ public class DcTrackerTest extends TelephonyTest { verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall( eq(DataService.REQUEST_REASON_NORMAL), anyInt(), any(Message.class)); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT)); assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_IMS)); } Loading Loading @@ -928,7 +928,7 @@ public class DcTrackerTest extends TelephonyTest { verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall( eq(DataService.REQUEST_REASON_NORMAL), anyInt(), any(Message.class)); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT)); assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_IMS)); Loading Loading @@ -966,7 +966,7 @@ public class DcTrackerTest extends TelephonyTest { any(Message.class)); verifyDataProfile(dpCaptor.getValue(), FAKE_APN3, 2, 64, 0, 0); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT)); assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_IMS)); Loading Loading @@ -1014,7 +1014,7 @@ public class DcTrackerTest extends TelephonyTest { eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(), any(Message.class)); verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 5, 1, NETWORK_TYPE_LTE_BITMASK); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); AsyncResult ar = new AsyncResult(null, new Pair<>(false, DataEnabledSettings.REASON_DATA_ENABLED_BY_CARRIER), null); Loading @@ -1027,7 +1027,7 @@ public class DcTrackerTest extends TelephonyTest { verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall( eq(DataService.REQUEST_REASON_NORMAL), anyInt(), any(Message.class)); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT)); } Loading Loading @@ -1297,7 +1297,7 @@ public class DcTrackerTest extends TelephonyTest { eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(), any(Message.class)); verifyDataProfile(dpCaptor.getValue(), FAKE_APN4, 0, 21, 2, NETWORK_TYPE_EHRPD_BITMASK); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); //data rat change from ehrpd to lte logd("Sending EVENT_DATA_RAT_CHANGED"); Loading Loading @@ -1335,7 +1335,7 @@ public class DcTrackerTest extends TelephonyTest { eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(), any(Message.class)); verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); } // Test for fetchDunApns() Loading Loading @@ -1505,7 +1505,7 @@ public class DcTrackerTest extends TelephonyTest { eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(), any(Message.class)); verifyDataProfile(dpCaptor.getValue(), FAKE_APN4, 0, 21, 2, NETWORK_TYPE_EHRPD_BITMASK); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); // Data rat change from ehrpd to unknown due to OOS logd("Sending EVENT_DATA_RAT_CHANGED"); Loading Loading @@ -1537,7 +1537,7 @@ public class DcTrackerTest extends TelephonyTest { // Verify the same data connection assertEquals(FAKE_APN4, mDct.getActiveApnString(PhoneConstants.APN_TYPE_DEFAULT)); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); } // Test provisioning Loading Loading
src/java/com/android/internal/telephony/Phone.java +14 −5 Original line number Diff line number Diff line Loading @@ -2546,9 +2546,16 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { /** Send notification with an updated PreciseDataConnectionState to all data connections */ public void notifyAllActiveDataConnections() { String types[] = getActiveApnTypes(); for (String apnType : types) { mNotifier.notifyDataConnection(this, apnType, getPreciseDataConnectionState(apnType)); if (mTransportManager != null) { for (int transportType : mTransportManager.getAvailableTransports()) { DcTracker dct = getDcTracker(transportType); if (dct != null) { for (String apnType : dct.getConnectedApnTypes()) { mNotifier.notifyDataConnection( this, apnType, getPreciseDataConnectionState(apnType)); } } } } } Loading Loading @@ -4185,7 +4192,8 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { public boolean areAllDataDisconnected() { if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null && !getDcTracker(transport).isDisconnected()) { if (getDcTracker(transport) != null && !getDcTracker(transport).areAllDataDisconnected()) { return false; } } Loading @@ -4197,7 +4205,8 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { mAllDataDisconnectedRegistrants.addUnique(h, what, null); if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null && !getDcTracker(transport).isDisconnected()) { if (getDcTracker(transport) != null && !getDcTracker(transport).areAllDataDisconnected()) { getDcTracker(transport).registerForAllDataDisconnected( this, EVENT_ALL_DATA_DISCONNECTED); } Loading
src/java/com/android/internal/telephony/dataconnection/DcTracker.java +41 −78 Original line number Diff line number Diff line Loading @@ -1094,6 +1094,18 @@ public class DcTracker extends Handler { return result.toArray(new String[0]); } /** * Get ApnTypes with connected data connections. This is different than getActiveApnTypes() * which returns apn types that with active apn contexts. * @return apn types */ public String[] getConnectedApnTypes() { return mApnContexts.values().stream() .filter(ac -> ac.getState() == DctConstants.State.CONNECTED) .map(ApnContext::getApnType) .toArray(String[]::new); } @VisibleForTesting public Collection<ApnContext> getApnContexts() { return mPrioritySortedApnContexts; Loading Loading @@ -1209,52 +1221,6 @@ public class DcTracker extends Handler { return false; } // Return state of overall public DctConstants.State getOverallState() { boolean isConnecting = false; boolean isFailed = true; // All enabled Apns should be FAILED. boolean isAnyEnabled = false; for (ApnContext apnContext : mApnContexts.values()) { if (apnContext.isEnabled()) { isAnyEnabled = true; switch (apnContext.getState()) { case CONNECTED: case DISCONNECTING: if (VDBG) log("overall state is CONNECTED"); return DctConstants.State.CONNECTED; case CONNECTING: isConnecting = true; isFailed = false; break; case IDLE: case RETRYING: isFailed = false; break; default: isAnyEnabled = true; break; } } } if (!isAnyEnabled) { // Nothing enabled. return IDLE. if (VDBG) log( "overall state is IDLE"); return DctConstants.State.IDLE; } if (isConnecting) { if (VDBG) log( "overall state is CONNECTING"); return DctConstants.State.CONNECTING; } else if (!isFailed) { if (VDBG) log( "overall state is IDLE"); return DctConstants.State.IDLE; } else { if (VDBG) log( "overall state is FAILED"); return DctConstants.State.FAILED; } } //****** Called from ServiceStateTracker /** * Invoked when ServiceStateTracker observes a transition from GPRS Loading @@ -1275,7 +1241,7 @@ public class DcTracker extends Handler { private void onDataConnectionAttached() { if (DBG) log("onDataConnectionAttached"); mAttached.set(true); if (getOverallState() == DctConstants.State.CONNECTED) { if (isAnyDataConnected()) { if (DBG) log("onDataConnectionAttached: start polling notify attached"); startNetStatPoll(); startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); Loading Loading @@ -2162,10 +2128,6 @@ public class DcTracker extends Handler { * Handles changes to the APN database. */ private void onApnChanged() { DctConstants.State overallState = getOverallState(); boolean isDisconnected = (overallState == DctConstants.State.IDLE || overallState == DctConstants.State.FAILED); if (mPhone instanceof GsmCdmaPhone) { // The "current" may no longer be valid. MMS depends on this to send properly. TBD ((GsmCdmaPhone)mPhone).updateCurrentCarrierInProvider(); Loading @@ -2177,7 +2139,7 @@ public class DcTracker extends Handler { createAllApnList(); setDataProfilesAsNeeded(); setInitialAttachApn(); cleanUpConnectionsOnUpdatedApns(!isDisconnected, Phone.REASON_APN_CHANGED); cleanUpConnectionsOnUpdatedApns(isAnyDataConnected(), Phone.REASON_APN_CHANGED); // FIXME: See bug 17426028 maybe no conditional is needed. if (mPhone.getSubId() == SubscriptionManager.getDefaultDataSubscriptionId()) { Loading Loading @@ -2779,7 +2741,7 @@ public class DcTracker extends Handler { log("onRadioAvailable: We're on the simulator; assuming data is connected"); } if (getOverallState() != DctConstants.State.IDLE) { if (!areAllDataDisconnected()) { cleanUpConnectionInternal(true, RELEASE_TYPE_DETACH, null); } } Loading Loading @@ -3083,7 +3045,7 @@ public class DcTracker extends Handler { } // if all data connection are gone, check whether Airplane mode request was // pending. if (isDisconnected()) { if (areAllDataDisconnected()) { if (mPhone.getServiceStateTracker().processPendingRadioPowerOffAfterDataOff()) { if (DBG) log("onDisconnectDone: radio will be turned off, no retries"); // Radio will be turned off. No need to retry data setup Loading Loading @@ -3147,7 +3109,8 @@ public class DcTracker extends Handler { private void onVoiceCallStarted() { if (DBG) log("onVoiceCallStarted"); mInVoiceCall = true; if (isConnected() && ! mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { if (isAnyDataConnected() && !mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { if (DBG) log("onVoiceCallStarted stop polling"); stopNetStatPoll(); stopDataStallAlarm(); Loading @@ -3158,7 +3121,7 @@ public class DcTracker extends Handler { protected void onVoiceCallEnded() { if (DBG) log("onVoiceCallEnded"); mInVoiceCall = false; if (isConnected()) { if (isAnyDataConnected()) { if (!mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { startNetStatPoll(); startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); Loading @@ -3171,26 +3134,28 @@ public class DcTracker extends Handler { // reset reconnect timer setupDataOnAllConnectableApns(Phone.REASON_VOICE_CALL_ENDED, RetryFailures.ALWAYS); } protected boolean isConnected() { for (ApnContext apnContext : mApnContexts.values()) { if (apnContext.getState() == DctConstants.State.CONNECTED) { // At least one context is connected, return true /** * @return {@code true} if there is any data in connected state. */ @VisibleForTesting public boolean isAnyDataConnected() { for (DataConnection dc : mDataConnections.values()) { if (dc.isActive()) { return true; } } // There are not any contexts connected, return false return false; } public boolean isDisconnected() { for (ApnContext apnContext : mApnContexts.values()) { if (!apnContext.isDisconnected()) { // At least one context was not disconnected return false /** * @return {@code true} if all data connections are in disconnected state. */ public boolean areAllDataDisconnected() { for (DataConnection dc : mDataConnections.values()) { if (!dc.isInactive()) { return false; } } // All contexts were disconnected so return true return true; } Loading Loading @@ -3566,7 +3531,7 @@ public class DcTracker extends Handler { */ if (DBG) log("EVENT_PS_RESTRICT_DISABLED " + mIsPsRestricted); mIsPsRestricted = false; if (isConnected()) { if (isAnyDataConnected()) { startNetStatPoll(); startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); } else { Loading Loading @@ -3749,7 +3714,7 @@ public class DcTracker extends Handler { mDataStallNoRxEnabled = !enabled; if (mDsRecoveryHandler.isNoRxDataStallDetectionEnabled() && (getOverallState() == DctConstants.State.CONNECTED) && isAnyDataConnected() && (!mInVoiceCall || mPhone.getServiceStateTracker() .isConcurrentVoiceAndDataAllowed())) { Loading Loading @@ -4000,7 +3965,7 @@ public class DcTracker extends Handler { public void registerForAllDataDisconnected(Handler h, int what) { mAllDataDisconnectedRegistrants.addUnique(h, what, null); if (isDisconnected()) { if (areAllDataDisconnected()) { log("notify All Data Disconnected"); notifyAllDataDisconnected(); } Loading Loading @@ -4283,7 +4248,7 @@ public class DcTracker extends Handler { pw.println(" mReregisterOnReconnectFailure=" + mReregisterOnReconnectFailure); pw.println(" canSetPreferApn=" + mCanSetPreferApn); pw.println(" mApnObserver=" + mApnObserver); pw.println(" getOverallState=" + getOverallState()); pw.println(" isAnyDataConnected=" + isAnyDataConnected()); pw.println(" mAttached=" + mAttached.get()); mDataEnabledSettings.dump(fd, pw, args); pw.flush(); Loading Loading @@ -4426,7 +4391,7 @@ public class DcTracker extends Handler { } } if (!isConnected()) { if (!isAnyDataConnected()) { stopNetStatPoll(); stopDataStallAlarm(); } Loading @@ -4449,8 +4414,7 @@ public class DcTracker extends Handler { } protected void startNetStatPoll() { if (getOverallState() == DctConstants.State.CONNECTED && mNetStatPollEnabled == false) { if (isAnyDataConnected() && !mNetStatPollEnabled) { if (DBG) { log("startNetStatPoll"); } Loading Loading @@ -4729,7 +4693,7 @@ public class DcTracker extends Handler { } public void doRecovery() { if (getOverallState() == DctConstants.State.CONNECTED) { if (isAnyDataConnected()) { // Go through a series of recovery steps, each action transitions to the next action @RecoveryAction final int recoveryAction = getRecoveryAction(); final int signalStrength = mPhone.getSignalStrength().getLevel(); Loading Loading @@ -4893,8 +4857,7 @@ public class DcTracker extends Handler { protected void startDataStallAlarm(boolean suspectedStall) { int delayInMs; if (mDsRecoveryHandler.isNoRxDataStallDetectionEnabled() && getOverallState() == DctConstants.State.CONNECTED) { if (mDsRecoveryHandler.isNoRxDataStallDetectionEnabled() && isAnyDataConnected()) { // If screen is on or data stall is currently suspected, set the alarm // with an aggressive timeout. if (mIsScreenOn || suspectedStall || mDsRecoveryHandler.isAggressiveRecovery()) { Loading Loading @@ -4940,7 +4903,7 @@ public class DcTracker extends Handler { } private void restartDataStallAlarm() { if (isConnected() == false) return; if (!isAnyDataConnected()) return; // To be called on screen status change. // Do not cancel the alarm if it is set with aggressive timeout. if (mDsRecoveryHandler.isAggressiveRecovery()) { Loading
src/java/com/android/internal/telephony/vendor/dataconnection/VendorDcTracker.java +4 −19 Original line number Diff line number Diff line Loading @@ -17,32 +17,17 @@ package com.android.internal.telephony.vendor.dataconnection; import android.app.AlertDialog; import android.view.WindowManager; import android.telephony.AccessNetworkConstants; import android.telephony.Annotation.DataFailureCause; import android.telephony.CarrierConfigManager; import android.telephony.DataFailCause; import android.telephony.data.ApnSetting; import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.view.WindowManager; import com.android.internal.telephony.dataconnection.ApnContext; import com.android.internal.telephony.dataconnection.DcTracker; import com.android.internal.telephony.DctConstants; import com.android.internal.telephony.GsmCdmaPhone; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.uicc.IccRecords; import com.android.internal.util.ArrayUtils; import com.android.internal.util.AsyncChannel; import android.database.Cursor; import android.content.Context; import android.os.PersistableBundle; import android.provider.Telephony; import com.android.internal.telephony.dataconnection.ApnContext; import com.android.internal.telephony.dataconnection.DcTracker; import java.util.HashSet; import java.util.Iterator; Loading Loading @@ -115,7 +100,7 @@ public class VendorDcTracker extends DcTracker { protected void onVoiceCallEnded() { if (DBG) log("onVoiceCallEnded"); mInVoiceCall = false; if (isConnected()) { if (isAnyDataConnected()) { if (!mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { startNetStatPoll(); startDataStallAlarm(DATA_STALL_NOT_SUSPECTED); Loading
tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -229,7 +229,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { doReturn(mIwlanNetworkServiceStub).when(mIwlanNetworkServiceStub).asBinder(); addNetworkService(); doReturn(true).when(mDcTracker).isDisconnected(); doReturn(true).when(mDcTracker).areAllDataDisconnected(); doReturn(new ServiceState()).when(mPhone).getServiceState(); Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/DcTrackerTest.java +10 −10 Original line number Diff line number Diff line Loading @@ -611,7 +611,7 @@ public class DcTrackerTest extends TelephonyTest { assertEquals(apnSetting, mDct.getActiveApnString(PhoneConstants.APN_TYPE_DEFAULT)); assertArrayEquals(new String[]{PhoneConstants.APN_TYPE_DEFAULT}, mDct.getActiveApnTypes()); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT)); LinkProperties linkProperties = mDct.getLinkProperties(PhoneConstants.APN_TYPE_DEFAULT); Loading Loading @@ -817,7 +817,7 @@ public class DcTrackerTest extends TelephonyTest { verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall( eq(DataService.REQUEST_REASON_NORMAL), anyInt(), any(Message.class)); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT)); assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_IMS)); } Loading Loading @@ -928,7 +928,7 @@ public class DcTrackerTest extends TelephonyTest { verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall( eq(DataService.REQUEST_REASON_NORMAL), anyInt(), any(Message.class)); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT)); assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_IMS)); Loading Loading @@ -966,7 +966,7 @@ public class DcTrackerTest extends TelephonyTest { any(Message.class)); verifyDataProfile(dpCaptor.getValue(), FAKE_APN3, 2, 64, 0, 0); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT)); assertEquals(DctConstants.State.CONNECTED, mDct.getState(PhoneConstants.APN_TYPE_IMS)); Loading Loading @@ -1014,7 +1014,7 @@ public class DcTrackerTest extends TelephonyTest { eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(), any(Message.class)); verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 5, 1, NETWORK_TYPE_LTE_BITMASK); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); AsyncResult ar = new AsyncResult(null, new Pair<>(false, DataEnabledSettings.REASON_DATA_ENABLED_BY_CARRIER), null); Loading @@ -1027,7 +1027,7 @@ public class DcTrackerTest extends TelephonyTest { verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall( eq(DataService.REQUEST_REASON_NORMAL), anyInt(), any(Message.class)); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); assertEquals(DctConstants.State.IDLE, mDct.getState(PhoneConstants.APN_TYPE_DEFAULT)); } Loading Loading @@ -1297,7 +1297,7 @@ public class DcTrackerTest extends TelephonyTest { eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(), any(Message.class)); verifyDataProfile(dpCaptor.getValue(), FAKE_APN4, 0, 21, 2, NETWORK_TYPE_EHRPD_BITMASK); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); //data rat change from ehrpd to lte logd("Sending EVENT_DATA_RAT_CHANGED"); Loading Loading @@ -1335,7 +1335,7 @@ public class DcTrackerTest extends TelephonyTest { eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(), any(Message.class)); verifyDataProfile(dpCaptor.getValue(), FAKE_APN1, 0, 21, 1, NETWORK_TYPE_LTE_BITMASK); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); } // Test for fetchDunApns() Loading Loading @@ -1505,7 +1505,7 @@ public class DcTrackerTest extends TelephonyTest { eq(false), eq(false), eq(DataService.REQUEST_REASON_NORMAL), any(), any(Message.class)); verifyDataProfile(dpCaptor.getValue(), FAKE_APN4, 0, 21, 2, NETWORK_TYPE_EHRPD_BITMASK); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); // Data rat change from ehrpd to unknown due to OOS logd("Sending EVENT_DATA_RAT_CHANGED"); Loading Loading @@ -1537,7 +1537,7 @@ public class DcTrackerTest extends TelephonyTest { // Verify the same data connection assertEquals(FAKE_APN4, mDct.getActiveApnString(PhoneConstants.APN_TYPE_DEFAULT)); assertEquals(DctConstants.State.CONNECTED, mDct.getOverallState()); assertTrue(mDct.isAnyDataConnected()); } // Test provisioning Loading