Loading src/java/com/android/internal/telephony/data/DataConfigManager.java +10 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.text.TextUtils; import android.util.IndentingPrintWriter; import com.android.internal.R; Loading Loading @@ -813,6 +814,15 @@ public class DataConfigManager extends Handler { CarrierConfigManager.KEY_DATA_STALL_RECOVERY_SHOULD_SKIP_BOOL_ARRAY); } /** * @return The default preferred APN. An empty string if not configured. This is used for the * first time boot up where preferred APN is not set. */ public @NonNull String getDefaultPreferredApn() { return TextUtils.emptyIfNull(mCarrierConfig.getString( CarrierConfigManager.KEY_DEFAULT_PREFERRED_APN_NAME_STRING)); } /** * Registration point for subscription info ready * Loading src/java/com/android/internal/telephony/data/DataEvaluation.java +6 −2 Original line number Diff line number Diff line Loading @@ -182,7 +182,7 @@ public class DataEvaluation { /** When emergency call started or ended. */ EMERGENCY_CALL_CHANGED, /** When data disconnected, re-evaluate later to see if data could be brought up again. */ DATA_NETWORK_DISCONNECTED, RETRY_AFTER_DISCONNECTED, /** Data setup retry. */ DATA_RETRY, } Loading Loading @@ -225,7 +225,11 @@ public class DataEvaluation { /** There is already a retry setup scheduled for this data profile. */ RETRY_SCHEDULED(true), /** Network has explicitly request to throttle setup attempt. */ DATA_THROTTLED(true); DATA_THROTTLED(true), /** Data profile becomes invalid. (could be removed by the user, or SIM refresh, etc..) */ DATA_PROFILE_INVALID(true), /** Data profile not preferred (i.e. users switch preferred profile in APN editor.) */ DATA_PROFILE_NOT_PREFERRED(true); private final boolean mIsHardReason; Loading src/java/com/android/internal/telephony/data/DataNetwork.java +2 −2 Original line number Diff line number Diff line Loading @@ -1880,7 +1880,7 @@ public class DataNetwork extends StateMachine { /** * @return {@code true} if in handover state. */ public boolean isUnderHandover() { public boolean isHandoverInProgress() { return getCurrentState() == mHandoverState; } Loading Loading @@ -1912,7 +1912,7 @@ public class DataNetwork extends StateMachine { return TelephonyManager.DATA_CONNECTED; } else if (isDisconnecting()) { return TelephonyManager.DATA_DISCONNECTING; } else if (isUnderHandover()) { } else if (isHandoverInProgress()) { return TelephonyManager.DATA_HANDOVER_IN_PROGRESS; } Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +51 −25 Original line number Diff line number Diff line Loading @@ -145,9 +145,6 @@ public class DataNetworkController extends Handler { /** Event for SIM state changed. */ private static final int EVENT_SIM_STATE_CHANGED = 9; /** Event for data profile changed. */ private static final int EVENT_DATA_PROFILES_CHANGED = 10; /** Event for tearing down all data networks. */ private static final int EVENT_TEAR_DOWN_ALL_DATA_NETWORKS = 12; Loading Loading @@ -461,8 +458,13 @@ public class DataNetworkController extends Handler { public void onInternetDataNetworkValidationStatusChanged( @ValidationStatus int validationStatus) {} /** Called when internet data network is connected. */ public void onInternetDataNetworkConnected() {} /** * Called when internet data network is connected. * * @param dataProfiles The data profiles of the connected internet data network. It should * be only one in most of the cases. */ public void onInternetDataNetworkConnected(@NonNull List<DataProfile> dataProfiles) {} /** Called when internet data network is disconnected. */ public void onInternetDataNetworkDisconnected() {} Loading Loading @@ -677,7 +679,10 @@ public class DataNetworkController extends Handler { new DataProfileManagerCallback(this::post) { @Override public void onDataProfilesChanged() { DataNetworkController.this.onDataStallReestablishInternet(); sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS, DataEvaluationReason.DATA_PROFILES_CHANGED)); sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.DATA_PROFILES_CHANGED)); } }); mDataStallRecoveryManager = new DataStallRecoveryManager(mPhone, this, mDataServiceManagers Loading Loading @@ -829,12 +834,6 @@ public class DataNetworkController extends Handler { int simState = msg.arg1; onSimStateChanged(simState); break; case EVENT_DATA_PROFILES_CHANGED: sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS, DataEvaluationReason.DATA_PROFILES_CHANGED)); sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.DATA_PROFILES_CHANGED)); break; case EVENT_TEAR_DOWN_ALL_DATA_NETWORKS: onTearDownAllDataNetworks(msg.arg1); break; Loading Loading @@ -1128,7 +1127,8 @@ public class DataNetworkController extends Handler { if (dataProfile == null) { evaluation.addDataDisallowedReason(DataDisallowedReason.NO_SUITABLE_DATA_PROFILE); } else if (reason == DataEvaluationReason.NEW_REQUEST && mDataRetryManager.isAnySetupRetryScheduled(dataProfile)) { && (mDataRetryManager.isAnySetupRetryScheduled(dataProfile) || mDataRetryManager.isSimilarNetworkRequestRetryScheduled(networkRequest))) { // If this is a new request, check if there is any retry already scheduled. For all // other evaluation reasons, since they are all condition changes, so if there is any // retry scheduled, we still want to go ahead and setup the data network. Loading Loading @@ -1277,6 +1277,18 @@ public class DataNetworkController extends Handler { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_DISABLED); } // Check if the data profile is still valid, sometimes the users can remove it from the APN // editor. if (!mDataProfileManager.isDataProfileValid(dataProfile)) { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_PROFILE_INVALID); } // If users switch preferred profile in APN editor, we need to tear down network. if (dataNetwork.isInternetSupported() && !mDataProfileManager.isDataProfilePreferred(dataProfile)) { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_PROFILE_NOT_PREFERRED); } if (evaluation.isDataAllowed()) { evaluation.addDataAllowedReason(DataAllowedReason.NORMAL); } Loading Loading @@ -1740,8 +1752,14 @@ public class DataNetworkController extends Handler { private void onDataNetworkSetupRetry(@NonNull DataSetupRetryEntry dataSetupRetryEntry) { TelephonyNetworkRequest telephonyNetworkRequest = dataSetupRetryEntry.networkRequestList.get(0); if (!mAllNetworkRequestList.contains(telephonyNetworkRequest)) { log("onDataNetworkSetupRetry: " + telephonyNetworkRequest + " no longer in the list."); // Since this is a retry, the network request might be already removed. So we need to double // check and remove request if necessary. dataSetupRetryEntry.networkRequestList.removeIf( networkRequest -> !mAllNetworkRequestList.contains(networkRequest)); if (dataSetupRetryEntry.networkRequestList.isEmpty()) { log("onDataNetworkSetupRetry: all network requests in the retry entry has been " + "released. Retry cancelled."); dataSetupRetryEntry.setState(DataRetryEntry.RETRY_STATE_CANCELLED); return; } Loading @@ -1761,7 +1779,11 @@ public class DataNetworkController extends Handler { DataEvaluation evaluation = evaluateNetworkRequest( telephonyNetworkRequest, DataEvaluationReason.DATA_RETRY); if (evaluation.isDataAllowed()) { setupDataNetwork(dataSetupRetryEntry.dataProfile, dataSetupRetryEntry); DataProfile dataProfile = dataSetupRetryEntry.dataProfile; if (dataProfile == null) { dataProfile = evaluation.getCandidateDataProfile(); } setupDataNetwork(dataProfile, dataSetupRetryEntry); } } Loading Loading @@ -1887,9 +1909,9 @@ public class DataNetworkController extends Handler { // Sometimes network was unsolicitedly reported lost for reasons. We should re-evaluate // and see if data network can be re-established again. //TODO: Add some dalays here sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.DATA_NETWORK_DISCONNECTED)); sendMessageDelayed(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.RETRY_AFTER_DISCONNECTED), mDataConfigManager.getRetrySetupAfterDisconnectMillis()); } /** Loading Loading @@ -2176,11 +2198,12 @@ public class DataNetworkController extends Handler { private void updateOverallInternetDataState() { boolean anyInternetConnected = mDataNetworkList.stream() .anyMatch(dataNetwork -> dataNetwork.isInternetSupported() && (dataNetwork.isConnected() || dataNetwork.isUnderHandover())); && (dataNetwork.isConnected() || dataNetwork.isHandoverInProgress())); // If any one is not suspended, then the overall is not suspended. List<DataNetwork> allConnectedInternetDataNetworks = mDataNetworkList.stream() .filter(DataNetwork::isInternetSupported) .filter(dataNetwork -> dataNetwork.isConnected() || dataNetwork.isUnderHandover()) .filter(dataNetwork -> dataNetwork.isConnected() || dataNetwork.isHandoverInProgress()) .collect(Collectors.toList()); boolean isSuspended = !allConnectedInternetDataNetworks.isEmpty() && allConnectedInternetDataNetworks.stream().allMatch(DataNetwork::isSuspended); Loading @@ -2199,14 +2222,17 @@ public class DataNetworkController extends Handler { + TelephonyUtils.dataStateToString(mInternetDataNetworkState) + " to " + TelephonyUtils.dataStateToString(dataNetworkState) + "."); // TODO: Create a new route to notify TelephonyRegistry. mInternetDataNetworkState = dataNetworkState; if (mInternetDataNetworkState == TelephonyManager.DATA_CONNECTED) { if (dataNetworkState == TelephonyManager.DATA_CONNECTED) { mDataNetworkControllerCallbacks.forEach(callback -> callback.invokeFromExecutor( callback::onInternetDataNetworkConnected)); } else if (mInternetDataNetworkState == TelephonyManager.DATA_DISCONNECTED) { () -> callback.onInternetDataNetworkConnected( allConnectedInternetDataNetworks.stream() .map(DataNetwork::getDataProfile) .collect(Collectors.toList())))); } else if (dataNetworkState == TelephonyManager.DATA_DISCONNECTED) { mDataNetworkControllerCallbacks.forEach(callback -> callback.invokeFromExecutor( callback::onInternetDataNetworkDisconnected)); } // TODO: Add suspended callback if needed. mInternetDataNetworkState = dataNetworkState; } } Loading src/java/com/android/internal/telephony/data/DataProfileManager.java +193 −67 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
src/java/com/android/internal/telephony/data/DataConfigManager.java +10 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.text.TextUtils; import android.util.IndentingPrintWriter; import com.android.internal.R; Loading Loading @@ -813,6 +814,15 @@ public class DataConfigManager extends Handler { CarrierConfigManager.KEY_DATA_STALL_RECOVERY_SHOULD_SKIP_BOOL_ARRAY); } /** * @return The default preferred APN. An empty string if not configured. This is used for the * first time boot up where preferred APN is not set. */ public @NonNull String getDefaultPreferredApn() { return TextUtils.emptyIfNull(mCarrierConfig.getString( CarrierConfigManager.KEY_DEFAULT_PREFERRED_APN_NAME_STRING)); } /** * Registration point for subscription info ready * Loading
src/java/com/android/internal/telephony/data/DataEvaluation.java +6 −2 Original line number Diff line number Diff line Loading @@ -182,7 +182,7 @@ public class DataEvaluation { /** When emergency call started or ended. */ EMERGENCY_CALL_CHANGED, /** When data disconnected, re-evaluate later to see if data could be brought up again. */ DATA_NETWORK_DISCONNECTED, RETRY_AFTER_DISCONNECTED, /** Data setup retry. */ DATA_RETRY, } Loading Loading @@ -225,7 +225,11 @@ public class DataEvaluation { /** There is already a retry setup scheduled for this data profile. */ RETRY_SCHEDULED(true), /** Network has explicitly request to throttle setup attempt. */ DATA_THROTTLED(true); DATA_THROTTLED(true), /** Data profile becomes invalid. (could be removed by the user, or SIM refresh, etc..) */ DATA_PROFILE_INVALID(true), /** Data profile not preferred (i.e. users switch preferred profile in APN editor.) */ DATA_PROFILE_NOT_PREFERRED(true); private final boolean mIsHardReason; Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +2 −2 Original line number Diff line number Diff line Loading @@ -1880,7 +1880,7 @@ public class DataNetwork extends StateMachine { /** * @return {@code true} if in handover state. */ public boolean isUnderHandover() { public boolean isHandoverInProgress() { return getCurrentState() == mHandoverState; } Loading Loading @@ -1912,7 +1912,7 @@ public class DataNetwork extends StateMachine { return TelephonyManager.DATA_CONNECTED; } else if (isDisconnecting()) { return TelephonyManager.DATA_DISCONNECTING; } else if (isUnderHandover()) { } else if (isHandoverInProgress()) { return TelephonyManager.DATA_HANDOVER_IN_PROGRESS; } Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +51 −25 Original line number Diff line number Diff line Loading @@ -145,9 +145,6 @@ public class DataNetworkController extends Handler { /** Event for SIM state changed. */ private static final int EVENT_SIM_STATE_CHANGED = 9; /** Event for data profile changed. */ private static final int EVENT_DATA_PROFILES_CHANGED = 10; /** Event for tearing down all data networks. */ private static final int EVENT_TEAR_DOWN_ALL_DATA_NETWORKS = 12; Loading Loading @@ -461,8 +458,13 @@ public class DataNetworkController extends Handler { public void onInternetDataNetworkValidationStatusChanged( @ValidationStatus int validationStatus) {} /** Called when internet data network is connected. */ public void onInternetDataNetworkConnected() {} /** * Called when internet data network is connected. * * @param dataProfiles The data profiles of the connected internet data network. It should * be only one in most of the cases. */ public void onInternetDataNetworkConnected(@NonNull List<DataProfile> dataProfiles) {} /** Called when internet data network is disconnected. */ public void onInternetDataNetworkDisconnected() {} Loading Loading @@ -677,7 +679,10 @@ public class DataNetworkController extends Handler { new DataProfileManagerCallback(this::post) { @Override public void onDataProfilesChanged() { DataNetworkController.this.onDataStallReestablishInternet(); sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS, DataEvaluationReason.DATA_PROFILES_CHANGED)); sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.DATA_PROFILES_CHANGED)); } }); mDataStallRecoveryManager = new DataStallRecoveryManager(mPhone, this, mDataServiceManagers Loading Loading @@ -829,12 +834,6 @@ public class DataNetworkController extends Handler { int simState = msg.arg1; onSimStateChanged(simState); break; case EVENT_DATA_PROFILES_CHANGED: sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS, DataEvaluationReason.DATA_PROFILES_CHANGED)); sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.DATA_PROFILES_CHANGED)); break; case EVENT_TEAR_DOWN_ALL_DATA_NETWORKS: onTearDownAllDataNetworks(msg.arg1); break; Loading Loading @@ -1128,7 +1127,8 @@ public class DataNetworkController extends Handler { if (dataProfile == null) { evaluation.addDataDisallowedReason(DataDisallowedReason.NO_SUITABLE_DATA_PROFILE); } else if (reason == DataEvaluationReason.NEW_REQUEST && mDataRetryManager.isAnySetupRetryScheduled(dataProfile)) { && (mDataRetryManager.isAnySetupRetryScheduled(dataProfile) || mDataRetryManager.isSimilarNetworkRequestRetryScheduled(networkRequest))) { // If this is a new request, check if there is any retry already scheduled. For all // other evaluation reasons, since they are all condition changes, so if there is any // retry scheduled, we still want to go ahead and setup the data network. Loading Loading @@ -1277,6 +1277,18 @@ public class DataNetworkController extends Handler { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_DISABLED); } // Check if the data profile is still valid, sometimes the users can remove it from the APN // editor. if (!mDataProfileManager.isDataProfileValid(dataProfile)) { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_PROFILE_INVALID); } // If users switch preferred profile in APN editor, we need to tear down network. if (dataNetwork.isInternetSupported() && !mDataProfileManager.isDataProfilePreferred(dataProfile)) { evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_PROFILE_NOT_PREFERRED); } if (evaluation.isDataAllowed()) { evaluation.addDataAllowedReason(DataAllowedReason.NORMAL); } Loading Loading @@ -1740,8 +1752,14 @@ public class DataNetworkController extends Handler { private void onDataNetworkSetupRetry(@NonNull DataSetupRetryEntry dataSetupRetryEntry) { TelephonyNetworkRequest telephonyNetworkRequest = dataSetupRetryEntry.networkRequestList.get(0); if (!mAllNetworkRequestList.contains(telephonyNetworkRequest)) { log("onDataNetworkSetupRetry: " + telephonyNetworkRequest + " no longer in the list."); // Since this is a retry, the network request might be already removed. So we need to double // check and remove request if necessary. dataSetupRetryEntry.networkRequestList.removeIf( networkRequest -> !mAllNetworkRequestList.contains(networkRequest)); if (dataSetupRetryEntry.networkRequestList.isEmpty()) { log("onDataNetworkSetupRetry: all network requests in the retry entry has been " + "released. Retry cancelled."); dataSetupRetryEntry.setState(DataRetryEntry.RETRY_STATE_CANCELLED); return; } Loading @@ -1761,7 +1779,11 @@ public class DataNetworkController extends Handler { DataEvaluation evaluation = evaluateNetworkRequest( telephonyNetworkRequest, DataEvaluationReason.DATA_RETRY); if (evaluation.isDataAllowed()) { setupDataNetwork(dataSetupRetryEntry.dataProfile, dataSetupRetryEntry); DataProfile dataProfile = dataSetupRetryEntry.dataProfile; if (dataProfile == null) { dataProfile = evaluation.getCandidateDataProfile(); } setupDataNetwork(dataProfile, dataSetupRetryEntry); } } Loading Loading @@ -1887,9 +1909,9 @@ public class DataNetworkController extends Handler { // Sometimes network was unsolicitedly reported lost for reasons. We should re-evaluate // and see if data network can be re-established again. //TODO: Add some dalays here sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.DATA_NETWORK_DISCONNECTED)); sendMessageDelayed(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS, DataEvaluationReason.RETRY_AFTER_DISCONNECTED), mDataConfigManager.getRetrySetupAfterDisconnectMillis()); } /** Loading Loading @@ -2176,11 +2198,12 @@ public class DataNetworkController extends Handler { private void updateOverallInternetDataState() { boolean anyInternetConnected = mDataNetworkList.stream() .anyMatch(dataNetwork -> dataNetwork.isInternetSupported() && (dataNetwork.isConnected() || dataNetwork.isUnderHandover())); && (dataNetwork.isConnected() || dataNetwork.isHandoverInProgress())); // If any one is not suspended, then the overall is not suspended. List<DataNetwork> allConnectedInternetDataNetworks = mDataNetworkList.stream() .filter(DataNetwork::isInternetSupported) .filter(dataNetwork -> dataNetwork.isConnected() || dataNetwork.isUnderHandover()) .filter(dataNetwork -> dataNetwork.isConnected() || dataNetwork.isHandoverInProgress()) .collect(Collectors.toList()); boolean isSuspended = !allConnectedInternetDataNetworks.isEmpty() && allConnectedInternetDataNetworks.stream().allMatch(DataNetwork::isSuspended); Loading @@ -2199,14 +2222,17 @@ public class DataNetworkController extends Handler { + TelephonyUtils.dataStateToString(mInternetDataNetworkState) + " to " + TelephonyUtils.dataStateToString(dataNetworkState) + "."); // TODO: Create a new route to notify TelephonyRegistry. mInternetDataNetworkState = dataNetworkState; if (mInternetDataNetworkState == TelephonyManager.DATA_CONNECTED) { if (dataNetworkState == TelephonyManager.DATA_CONNECTED) { mDataNetworkControllerCallbacks.forEach(callback -> callback.invokeFromExecutor( callback::onInternetDataNetworkConnected)); } else if (mInternetDataNetworkState == TelephonyManager.DATA_DISCONNECTED) { () -> callback.onInternetDataNetworkConnected( allConnectedInternetDataNetworks.stream() .map(DataNetwork::getDataProfile) .collect(Collectors.toList())))); } else if (dataNetworkState == TelephonyManager.DATA_DISCONNECTED) { mDataNetworkControllerCallbacks.forEach(callback -> callback.invokeFromExecutor( callback::onInternetDataNetworkDisconnected)); } // TODO: Add suspended callback if needed. mInternetDataNetworkState = dataNetworkState; } } Loading
src/java/com/android/internal/telephony/data/DataProfileManager.java +193 −67 File changed.Preview size limit exceeded, changes collapsed. Show changes